From 199ef417dc88ab93f0eff60c3df941e94c7fcb3a Mon Sep 17 00:00:00 2001 From: Muhammad Rameen Farooqui Date: Fri, 13 Dec 2024 22:06:07 +0530 Subject: [PATCH] Added envs --- env/bin/Activate.ps1 | 247 + env/bin/activate | 70 + env/bin/activate.csh | 27 + env/bin/activate.fish | 69 + env/bin/dotenv | 8 + env/bin/normalizer | 8 + env/bin/pip | 8 + env/bin/pip3 | 8 + env/bin/pip3.12 | 8 + env/bin/python | 1 + env/bin/python3 | 1 + env/bin/python3.12 | 1 + env/bin/wsdump | 8 + .../PySocks-1.7.1.dist-info/INSTALLER | 1 + .../PySocks-1.7.1.dist-info/LICENSE | 22 + .../PySocks-1.7.1.dist-info/METADATA | 321 + .../PySocks-1.7.1.dist-info/RECORD | 10 + .../PySocks-1.7.1.dist-info/WHEEL | 5 + .../PySocks-1.7.1.dist-info/top_level.txt | 2 + .../__pycache__/socks.cpython-312.pyc | Bin 0 -> 34167 bytes .../__pycache__/sockshandler.cpython-312.pyc | Bin 0 -> 6802 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139410 bytes .../python3.12/site-packages/attr/__init__.py | 103 + .../site-packages/attr/__init__.pyi | 388 + .../attr/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2664 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 0 -> 5112 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3815 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 0 -> 1128 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 0 -> 15349 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 0 -> 91855 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 0 -> 24603 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 0 -> 3142 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 4260 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 3599 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 0 -> 3016 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 0 -> 1939 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 26224 bytes env/lib/python3.12/site-packages/attr/_cmp.py | 160 + .../python3.12/site-packages/attr/_cmp.pyi | 13 + .../python3.12/site-packages/attr/_compat.py | 103 + .../python3.12/site-packages/attr/_config.py | 31 + .../python3.12/site-packages/attr/_funcs.py | 522 + .../python3.12/site-packages/attr/_make.py | 2960 ++++++ .../site-packages/attr/_next_gen.py | 631 ++ .../site-packages/attr/_typing_compat.pyi | 15 + .../site-packages/attr/_version_info.py | 86 + .../site-packages/attr/_version_info.pyi | 9 + .../site-packages/attr/converters.py | 151 + .../site-packages/attr/converters.pyi | 13 + .../site-packages/attr/exceptions.py | 95 + .../site-packages/attr/exceptions.pyi | 17 + .../python3.12/site-packages/attr/filters.py | 72 + .../python3.12/site-packages/attr/filters.pyi | 6 + .../python3.12/site-packages/attr/py.typed | 0 .../python3.12/site-packages/attr/setters.py | 79 + .../python3.12/site-packages/attr/setters.pyi | 20 + .../site-packages/attr/validators.py | 711 ++ .../site-packages/attr/validators.pyi | 83 + .../attrs-24.2.0.dist-info/INSTALLER | 1 + .../attrs-24.2.0.dist-info/METADATA | 242 + .../attrs-24.2.0.dist-info/RECORD | 55 + .../attrs-24.2.0.dist-info/WHEEL | 4 + .../attrs-24.2.0.dist-info/licenses/LICENSE | 21 + .../site-packages/attrs/__init__.py | 67 + .../site-packages/attrs/__init__.pyi | 252 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1125 bytes .../__pycache__/converters.cpython-312.pyc | Bin 0 -> 237 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 237 bytes .../attrs/__pycache__/filters.cpython-312.pyc | Bin 0 -> 231 bytes .../attrs/__pycache__/setters.cpython-312.pyc | Bin 0 -> 231 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 237 bytes .../site-packages/attrs/converters.py | 3 + .../site-packages/attrs/exceptions.py | 3 + .../python3.12/site-packages/attrs/filters.py | 3 + .../python3.12/site-packages/attrs/py.typed | 0 .../python3.12/site-packages/attrs/setters.py | 3 + .../site-packages/attrs/validators.py | 3 + .../certifi-2024.8.30.dist-info/INSTALLER | 1 + .../certifi-2024.8.30.dist-info/LICENSE | 20 + .../certifi-2024.8.30.dist-info/METADATA | 67 + .../certifi-2024.8.30.dist-info/RECORD | 14 + .../certifi-2024.8.30.dist-info/WHEEL | 5 + .../certifi-2024.8.30.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 325 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 640 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3201 bytes .../site-packages/certifi/cacert.pem | 4929 ++++++++++ .../python3.12/site-packages/certifi/core.py | 114 + .../python3.12/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 695 ++ .../charset_normalizer-3.4.0.dist-info/RECORD | 35 + .../charset_normalizer-3.4.0.dist-info/WHEEL | 6 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 46 + .../charset_normalizer/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1744 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 314 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 17997 bytes .../__pycache__/cd.cpython-312.pyc | Bin 0 -> 13453 bytes .../__pycache__/constant.cpython-312.pyc | Bin 0 -> 38777 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 0 -> 2858 bytes .../__pycache__/md.cpython-312.pyc | Bin 0 -> 24926 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 17461 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 14331 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 341 bytes .../site-packages/charset_normalizer/api.py | 668 ++ .../site-packages/charset_normalizer/cd.py | 395 + .../charset_normalizer/cli/__init__.py | 6 + .../charset_normalizer/cli/__main__.py | 320 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 302 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 11026 bytes .../charset_normalizer/constant.py | 1997 ++++ .../charset_normalizer/legacy.py | 65 + .../md.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 16064 bytes .../site-packages/charset_normalizer/md.py | 628 ++ .../md__mypyc.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 276848 bytes .../charset_normalizer/models.py | 359 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 421 + .../charset_normalizer/version.py | 6 + .../site-packages/dotenv/__init__.py | 49 + .../site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1706 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 370 bytes .../dotenv/__pycache__/cli.cpython-312.pyc | Bin 0 -> 9713 bytes .../__pycache__/ipython.cpython-312.pyc | Bin 0 -> 1979 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 0 -> 16398 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 0 -> 10012 bytes .../__pycache__/variables.cpython-312.pyc | Bin 0 -> 5038 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 222 bytes .../python3.12/site-packages/dotenv/cli.py | 199 + .../site-packages/dotenv/ipython.py | 39 + .../python3.12/site-packages/dotenv/main.py | 392 + .../python3.12/site-packages/dotenv/parser.py | 175 + .../python3.12/site-packages/dotenv/py.typed | 1 + .../site-packages/dotenv/variables.py | 86 + .../site-packages/dotenv/version.py | 1 + .../h11-0.14.0.dist-info/INSTALLER | 1 + .../h11-0.14.0.dist-info/LICENSE.txt | 22 + .../h11-0.14.0.dist-info/METADATA | 193 + .../site-packages/h11-0.14.0.dist-info/RECORD | 52 + .../site-packages/h11-0.14.0.dist-info/WHEEL | 5 + .../h11-0.14.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/h11/__init__.py | 62 + .../h11/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1085 bytes .../h11/__pycache__/_abnf.cpython-312.pyc | Bin 0 -> 1791 bytes .../__pycache__/_connection.cpython-312.pyc | Bin 0 -> 22612 bytes .../h11/__pycache__/_events.cpython-312.pyc | Bin 0 -> 13291 bytes .../h11/__pycache__/_headers.cpython-312.pyc | Bin 0 -> 7858 bytes .../h11/__pycache__/_readers.cpython-312.pyc | Bin 0 -> 9420 bytes .../_receivebuffer.cpython-312.pyc | Bin 0 -> 4709 bytes .../h11/__pycache__/_state.cpython-312.pyc | Bin 0 -> 8544 bytes .../h11/__pycache__/_util.cpython-312.pyc | Bin 0 -> 4729 bytes .../h11/__pycache__/_version.cpython-312.pyc | Bin 0 -> 223 bytes .../h11/__pycache__/_writers.cpython-312.pyc | Bin 0 -> 6295 bytes env/lib/python3.12/site-packages/h11/_abnf.py | 132 + .../site-packages/h11/_connection.py | 633 ++ .../python3.12/site-packages/h11/_events.py | 369 + .../python3.12/site-packages/h11/_headers.py | 278 + .../python3.12/site-packages/h11/_readers.py | 247 + .../site-packages/h11/_receivebuffer.py | 153 + .../python3.12/site-packages/h11/_state.py | 367 + env/lib/python3.12/site-packages/h11/_util.py | 135 + .../python3.12/site-packages/h11/_version.py | 16 + .../python3.12/site-packages/h11/_writers.py | 145 + env/lib/python3.12/site-packages/h11/py.typed | 1 + .../site-packages/h11/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../tests/__pycache__/helpers.cpython-312.pyc | Bin 0 -> 4391 bytes .../test_against_stdlib_http.cpython-312.pyc | Bin 0 -> 6924 bytes .../test_connection.cpython-312.pyc | Bin 0 -> 57993 bytes .../__pycache__/test_events.cpython-312.pyc | Bin 0 -> 5455 bytes .../__pycache__/test_headers.cpython-312.pyc | Bin 0 -> 6969 bytes .../__pycache__/test_helpers.cpython-312.pyc | Bin 0 -> 1208 bytes .../tests/__pycache__/test_io.cpython-312.pyc | Bin 0 -> 19849 bytes .../test_receivebuffer.cpython-312.pyc | Bin 0 -> 3983 bytes .../__pycache__/test_state.cpython-312.pyc | Bin 0 -> 12545 bytes .../__pycache__/test_util.cpython-312.pyc | Bin 0 -> 6119 bytes .../site-packages/h11/tests/data/test-file | 1 + .../site-packages/h11/tests/helpers.py | 101 + .../h11/tests/test_against_stdlib_http.py | 115 + .../h11/tests/test_connection.py | 1122 +++ .../site-packages/h11/tests/test_events.py | 150 + .../site-packages/h11/tests/test_headers.py | 157 + .../site-packages/h11/tests/test_helpers.py | 32 + .../site-packages/h11/tests/test_io.py | 572 ++ .../h11/tests/test_receivebuffer.py | 135 + .../site-packages/h11/tests/test_state.py | 271 + .../site-packages/h11/tests/test_util.py | 112 + .../idna-3.10.dist-info/INSTALLER | 1 + .../idna-3.10.dist-info/LICENSE.md | 31 + .../idna-3.10.dist-info/METADATA | 250 + .../site-packages/idna-3.10.dist-info/RECORD | 22 + .../site-packages/idna-3.10.dist-info/WHEEL | 4 + .../python3.12/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 893 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4983 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 897 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16128 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99483 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2640 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 224 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158853 bytes .../python3.12/site-packages/idna/codec.py | 122 + .../python3.12/site-packages/idna/compat.py | 15 + env/lib/python3.12/site-packages/idna/core.py | 437 + .../python3.12/site-packages/idna/idnadata.py | 4243 ++++++++ .../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 | 8681 +++++++++++++++++ .../outcome-1.3.0.post0.dist-info/INSTALLER | 1 + .../outcome-1.3.0.post0.dist-info/LICENSE | 3 + .../LICENSE.APACHE2 | 202 + .../outcome-1.3.0.post0.dist-info/LICENSE.MIT | 20 + .../outcome-1.3.0.post0.dist-info/METADATA | 63 + .../outcome-1.3.0.post0.dist-info/RECORD | 17 + .../outcome-1.3.0.post0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/outcome/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 628 bytes .../outcome/__pycache__/_impl.cpython-312.pyc | Bin 0 -> 8908 bytes .../outcome/__pycache__/_util.cpython-312.pyc | Bin 0 -> 1983 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 386 bytes .../python3.12/site-packages/outcome/_impl.py | 239 + .../python3.12/site-packages/outcome/_util.py | 33 + .../site-packages/outcome/_version.py | 7 + .../python3.12/site-packages/outcome/py.typed | 0 .../packaging-24.2.dist-info/INSTALLER | 1 + .../packaging-24.2.dist-info/LICENSE | 3 + .../packaging-24.2.dist-info/LICENSE.APACHE | 177 + .../packaging-24.2.dist-info/LICENSE.BSD | 23 + .../packaging-24.2.dist-info/METADATA | 102 + .../packaging-24.2.dist-info/RECORD | 40 + .../packaging-24.2.dist-info/WHEEL | 4 + .../site-packages/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 565 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 5030 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9718 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4561 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 13992 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3248 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7922 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 11381 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 27219 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4417 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 39025 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 23012 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 6642 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 20481 bytes .../site-packages/packaging/_elffile.py | 110 + .../site-packages/packaging/_manylinux.py | 263 + .../site-packages/packaging/_musllinux.py | 85 + .../site-packages/packaging/_parser.py | 354 + .../site-packages/packaging/_structures.py | 61 + .../site-packages/packaging/_tokenizer.py | 194 + .../packaging/licenses/__init__.py | 145 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4115 bytes .../__pycache__/_spdx.cpython-312.pyc | Bin 0 -> 47371 bytes .../site-packages/packaging/licenses/_spdx.py | 759 ++ .../site-packages/packaging/markers.py | 331 + .../site-packages/packaging/metadata.py | 863 ++ .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 91 + .../site-packages/packaging/specifiers.py | 1020 ++ .../site-packages/packaging/tags.py | 617 ++ .../site-packages/packaging/utils.py | 163 + .../site-packages/packaging/version.py | 582 ++ .../pip-24.3.1.dist-info/AUTHORS.txt | 799 ++ .../pip-24.3.1.dist-info/INSTALLER | 1 + .../pip-24.3.1.dist-info/LICENSE.txt | 20 + .../pip-24.3.1.dist-info/METADATA | 90 + .../site-packages/pip-24.3.1.dist-info/RECORD | 853 ++ .../pip-24.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-24.3.1.dist-info/WHEEL | 5 + .../pip-24.3.1.dist-info/entry_points.txt | 3 + .../pip-24.3.1.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 0 -> 705 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 859 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2223 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 805 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14517 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12685 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17650 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 36863 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 688 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 5136 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10226 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13633 bytes .../site-packages/pip/_internal/build_env.py | 319 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 296 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8624 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10212 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30413 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1792 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 0 -> 7142 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2318 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4924 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15058 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 3862 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 12259 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7851 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 393 bytes .../pip/_internal/cli/autocompletion.py | 176 + .../pip/_internal/cli/base_command.py | 231 + .../pip/_internal/cli/cmdoptions.py | 1075 ++ .../pip/_internal/cli/command_context.py | 27 + .../pip/_internal/cli/index_command.py | 170 + .../site-packages/pip/_internal/cli/main.py | 80 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 94 + .../pip/_internal/cli/req_command.py | 329 + .../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 0 -> 4020 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9719 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2610 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5211 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13181 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10086 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7521 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4403 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2986 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1691 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6689 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3998 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 29132 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15775 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7536 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 10495 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4727 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8883 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 67 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 146 + .../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 | 783 ++ .../pip/_internal/commands/list.py | 375 + .../pip/_internal/commands/search.py | 172 + .../pip/_internal/commands/show.py | 217 + .../pip/_internal/commands/uninstall.py | 114 + .../pip/_internal/commands/wheel.py | 182 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 959 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2911 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1718 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8445 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2299 bytes .../pip/_internal/distributions/base.py | 53 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 158 + .../pip/_internal/distributions/wheel.py | 42 + .../site-packages/pip/_internal/exceptions.py | 809 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 250 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21635 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40666 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12542 bytes .../pip/_internal/index/collector.py | 494 + .../pip/_internal/index/package_finder.py | 1020 ++ .../pip/_internal/index/sources.py | 284 + .../pip/_internal/locations/__init__.py | 456 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16458 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6809 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8046 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3799 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 214 + .../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 0 -> 5887 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2944 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35216 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 16102 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 376 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 4509 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 12583 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11097 bytes .../_internal/metadata/importlib/_compat.py | 85 + .../_internal/metadata/importlib/_dists.py | 221 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 301 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 284 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1622 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 10862 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4241 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1712 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2295 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26635 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1041 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5005 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1869 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4971 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 6570 bytes .../pip/_internal/models/candidate.py | 25 + .../pip/_internal/models/direct_url.py | 224 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 590 ++ .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 127 + .../pip/_internal/models/selection_prefs.py | 53 + .../pip/_internal/models/target_python.py | 121 + .../pip/_internal/models/wheel.py | 118 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 272 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22117 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6469 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8497 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11625 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18892 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2273 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2967 bytes .../pip/_internal/network/auth.py | 566 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 187 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 522 + .../pip/_internal/network/utils.py | 98 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7122 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10146 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25790 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7685 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1875 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1909 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3029 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1695 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2034 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3864 bytes .../operations/build/build_tracker.py | 138 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 181 + .../pip/_internal/operations/freeze.py | 258 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 284 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1816 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 34121 bytes .../operations/install/editable_legacy.py | 47 + .../pip/_internal/operations/install/wheel.py | 741 ++ .../pip/_internal/operations/prepare.py | 732 ++ .../site-packages/pip/_internal/pyproject.py | 185 + .../pip/_internal/req/__init__.py | 90 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3463 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21273 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 22141 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38493 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 5501 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32112 bytes .../pip/_internal/req/constructors.py | 560 ++ .../pip/_internal/req/req_file.py | 574 ++ .../pip/_internal/req/req_install.py | 934 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 215 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1203 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 222 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22597 bytes .../_internal/resolution/legacy/resolver.py | 597 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 226 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8167 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 29426 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32537 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6811 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10541 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 5058 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 15374 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12332 bytes .../_internal/resolution/resolvelib/base.py | 139 + .../resolution/resolvelib/candidates.py | 574 ++ .../resolution/resolvelib/factory.py | 823 ++ .../resolution/resolvelib/found_candidates.py | 174 + .../resolution/resolvelib/provider.py | 258 + .../resolution/resolvelib/reporter.py | 81 + .../resolution/resolvelib/requirements.py | 245 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 244 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 210 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4545 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1881 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2425 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2922 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 6365 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 699 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4206 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3551 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3221 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2163 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4008 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7344 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1179 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2434 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7618 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13573 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 33466 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2598 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 0 -> 2123 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4565 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8654 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12039 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 13513 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2092 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4481 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5918 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 | 79 + .../pip/_internal/utils/compatibility_tags.py | 188 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 124 + .../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 | 149 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 101 + .../pip/_internal/utils/hashes.py | 147 + .../pip/_internal/utils/logging.py | 347 + .../site-packages/pip/_internal/utils/misc.py | 772 ++ .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/retry.py | 42 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 245 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 337 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../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 0 -> 549 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5070 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19035 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7623 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12542 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29015 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 527 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 688 ++ .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 116 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4568 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139470 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 921 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2665 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6483 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3806 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16243 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4366 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6713 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 5280 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1693 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 0 -> 454 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7782 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2752 bytes .../_vendor/cachecontrol/caches/file_cache.py | 182 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 499 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 337 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 664 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3230 bytes .../pip/_vendor/certifi/cacert.pem | 4929 ++++++++++ .../site-packages/pip/_vendor/certifi/core.py | 114 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1288 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45545 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 65600 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24335 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 59880 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15095 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7673 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41579 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17331 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19772 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88054 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30363 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 52564 bytes .../pip/_vendor/distlib/compat.py | 1137 +++ .../pip/_vendor/distlib/database.py | 1329 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1295 +++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 162 + .../pip/_vendor/distlib/metadata.py | 1031 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 447 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1984 ++++ .../pip/_vendor/distlib/version.py | 750 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1100 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 979 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 311 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53811 bytes .../pip/_vendor/distro/distro.py | 1403 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 900 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4995 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 906 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 15810 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99495 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2652 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158867 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 395 + .../pip/_vendor/idna/idnadata.py | 4245 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8598 ++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1760 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2044 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8189 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 42062 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 168 + .../pip/_vendor/msgpack/fallback.py | 951 ++ .../pip/_vendor/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 577 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 4986 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9704 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4573 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 14004 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3260 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7934 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 11030 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 24972 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4429 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 38758 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 23238 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 7360 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19526 bytes .../pip/_vendor/packaging/_elffile.py | 110 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 354 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/_tokenizer.py | 194 + .../pip/_vendor/packaging/markers.py | 325 + .../pip/_vendor/packaging/metadata.py | 804 ++ .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 + .../pip/_vendor/packaging/specifiers.py | 1009 ++ .../pip/_vendor/packaging/tags.py | 627 ++ .../pip/_vendor/packaging/utils.py | 174 + .../pip/_vendor/packaging/version.py | 563 ++ .../pip/_vendor/pkg_resources/__init__.py | 3676 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 161280 bytes .../pip/_vendor/platformdirs/__init__.py | 627 ++ .../pip/_vendor/platformdirs/__main__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19848 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1967 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 10716 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 12930 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 8026 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 15056 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 616 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13693 bytes .../pip/_vendor/platformdirs/android.py | 249 + .../pip/_vendor/platformdirs/api.py | 292 + .../pip/_vendor/platformdirs/macos.py | 130 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 275 + .../pip/_vendor/platformdirs/version.py | 16 + .../pip/_vendor/platformdirs/windows.py | 272 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3508 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 754 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26604 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2648 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3241 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4740 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38381 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1579 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2628 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4097 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4776 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 12118 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6713 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8209 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32992 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14089 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37931 bytes .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6922 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4235 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4242 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7313 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 41046 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 28568 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6075 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20145 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6897 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2978 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 13793 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9159 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5839 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15138 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 | 987 ++ .../pip/_vendor/pygments/formatters/img.py | 685 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 518 + .../pip/_vendor/pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 349 + .../pip/_vendor/pygments/formatters/svg.py | 185 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 963 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14641 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 68283 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42987 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 589 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 72 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2684 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 3668 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 633 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 394 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14713 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 0 -> 1100 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14373 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 179 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5273 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 604 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2044 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 28451 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7211 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13941 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 942 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1697 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25218 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7618 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4248 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1071 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35448 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1286 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27866 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6043 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5643 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36386 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 719 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 314 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 78 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 151 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1037 ++ .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1096 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 654 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6871 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2674 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25900 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10520 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 220 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 440 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/py.typed | 0 .../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 | 273 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7035 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10312 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7892 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205996 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1749 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2369 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 557 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 875 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12093 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4167 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1890 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3640 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5180 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 741 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6590 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13199 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 985 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 885 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28996 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2510 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3583 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 3346 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1628 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12307 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9086 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4292 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11858 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5830 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26589 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1721 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8604 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113456 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2278 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9230 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10961 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10386 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1508 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4232 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1865 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3591 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3092 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9907 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6055 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5228 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20178 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19029 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4909 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13574 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9587 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6398 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7144 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1831 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5317 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12203 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40167 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 74955 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10397 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14807 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1812 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 587 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6633 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6588 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3845 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2499 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28135 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6084 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6081 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33520 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2159 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39968 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43559 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3368 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 60869 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6355 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 334 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31531 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11456 bytes .../pip/_vendor/rich/_cell_widths.py | 454 + .../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 | 159 + .../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 | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../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 | 93 + .../site-packages/pip/_vendor/rich/box.py | 480 + .../site-packages/pip/_vendor/rich/cells.py | 167 + .../site-packages/pip/_vendor/rich/color.py | 621 ++ .../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 | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 112 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../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 | 312 + .../site-packages/pip/_vendor/rich/pretty.py | 995 ++ .../pip/_vendor/rich/progress.py | 1699 ++++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 375 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../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 | 738 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 958 ++ .../site-packages/pip/_vendor/rich/table.py | 1000 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1357 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 753 ++ .../site-packages/pip/_vendor/rich/tree.py | 249 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 404 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26919 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3928 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 386 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 36 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1364 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 16793 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 19007 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2225 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1119 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15785 bytes .../pip/_vendor/truststore/_api.py | 316 + .../pip/_vendor/truststore/_macos.py | 571 ++ .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 567 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3641 +++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3425 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16384 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 238 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20423 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36558 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13513 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10422 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4032 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20449 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7314 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33963 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1140 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1868 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11584 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5734 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24468 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35521 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7531 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 235 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17447 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14783 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 | 920 ++ .../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 0 -> 219 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41275 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 229 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1845 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7356 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 | 540 + .../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 0 -> 1166 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4767 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1572 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1372 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4203 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3012 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21742 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15384 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5071 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10773 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11159 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15805 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4423 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 | 504 + .../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 | 18 + env/lib/python3.12/site-packages/pip/py.typed | 4 + .../python_dotenv-1.0.1.dist-info/INSTALLER | 1 + .../python_dotenv-1.0.1.dist-info/LICENSE | 27 + .../python_dotenv-1.0.1.dist-info/METADATA | 692 ++ .../python_dotenv-1.0.1.dist-info/RECORD | 25 + .../python_dotenv-1.0.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../requests-2.32.3.dist-info/INSTALLER | 1 + .../requests-2.32.3.dist-info/LICENSE | 175 + .../requests-2.32.3.dist-info/METADATA | 119 + .../requests-2.32.3.dist-info/RECORD | 42 + .../requests-2.32.3.dist-info/WHEEL | 5 + .../requests-2.32.3.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 184 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5428 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 592 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2032 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 28366 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7199 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13929 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 674 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 2088 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25206 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7593 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4335 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1059 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35364 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1126 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27854 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6031 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5631 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36362 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 719 ++ .../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 | 94 + .../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 | 1037 ++ .../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 | 1096 +++ .../selenium-4.27.1.dist-info/INSTALLER | 1 + .../selenium-4.27.1.dist-info/LICENSE | 202 + .../selenium-4.27.1.dist-info/METADATA | 181 + .../selenium-4.27.1.dist-info/RECORD | 663 ++ .../selenium-4.27.1.dist-info/REQUESTED | 0 .../selenium-4.27.1.dist-info/WHEEL | 4 + .../site-packages/selenium/__init__.py | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 228 bytes .../__pycache__/types.cpython-312.pyc | Bin 0 -> 619 bytes .../site-packages/selenium/common/__init__.py | 88 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2085 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 14580 bytes .../selenium/common/exceptions.py | 291 + .../site-packages/selenium/py.typed | 0 .../site-packages/selenium/types.py | 25 + .../selenium/webdriver/__init__.py | 79 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1743 bytes .../selenium/webdriver/chrome/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 1352 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 1372 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 1920 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 1743 bytes .../selenium/webdriver/chrome/options.py | 35 + .../webdriver/chrome/remote_connection.py | 42 + .../selenium/webdriver/chrome/service.py | 50 + .../selenium/webdriver/chrome/webdriver.py | 51 + .../selenium/webdriver/chromium/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 7229 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 2541 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 2689 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 9034 bytes .../selenium/webdriver/chromium/options.py | 153 + .../webdriver/chromium/remote_connection.py | 60 + .../selenium/webdriver/chromium/service.py | 66 + .../selenium/webdriver/chromium/webdriver.py | 193 + .../selenium/webdriver/common/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/action_chains.cpython-312.pyc | Bin 0 -> 16512 bytes .../common/__pycache__/alert.cpython-312.pyc | Bin 0 -> 2966 bytes .../common/__pycache__/by.cpython-312.pyc | Bin 0 -> 1878 bytes .../desired_capabilities.cpython-312.pyc | Bin 0 -> 2064 bytes .../__pycache__/driver_finder.cpython-312.pyc | Bin 0 -> 4659 bytes .../common/__pycache__/keys.cpython-312.pyc | Bin 0 -> 2005 bytes .../common/__pycache__/log.cpython-312.pyc | Bin 0 -> 9295 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 13141 bytes .../print_page_options.cpython-312.pyc | Bin 0 -> 9845 bytes .../common/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 7286 bytes .../selenium_manager.cpython-312.pyc | Bin 0 -> 6419 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 12290 bytes .../__pycache__/timeouts.cpython-312.pyc | Bin 0 -> 3889 bytes .../common/__pycache__/utils.cpython-312.pyc | Bin 0 -> 5099 bytes .../virtual_authenticator.cpython-312.pyc | Bin 0 -> 10296 bytes .../common/__pycache__/window.cpython-312.pyc | Bin 0 -> 523 bytes .../webdriver/common/action_chains.py | 380 + .../webdriver/common/actions/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 224 bytes .../action_builder.cpython-312.pyc | Bin 0 -> 5673 bytes .../__pycache__/input_device.cpython-312.pyc | Bin 0 -> 1494 bytes .../__pycache__/interaction.cpython-312.pyc | Bin 0 -> 1707 bytes .../__pycache__/key_actions.cpython-312.pyc | Bin 0 -> 2411 bytes .../__pycache__/key_input.cpython-312.pyc | Bin 0 -> 2688 bytes .../__pycache__/mouse_button.cpython-312.pyc | Bin 0 -> 504 bytes .../pointer_actions.cpython-312.pyc | Bin 0 -> 6134 bytes .../__pycache__/pointer_input.cpython-312.pyc | Bin 0 -> 4224 bytes .../__pycache__/wheel_actions.cpython-312.pyc | Bin 0 -> 1387 bytes .../__pycache__/wheel_input.cpython-312.pyc | Bin 0 -> 3721 bytes .../common/actions/action_builder.py | 103 + .../webdriver/common/actions/input_device.py | 39 + .../webdriver/common/actions/interaction.py | 46 + .../webdriver/common/actions/key_actions.py | 54 + .../webdriver/common/actions/key_input.py | 49 + .../webdriver/common/actions/mouse_button.py | 24 + .../common/actions/pointer_actions.py | 205 + .../webdriver/common/actions/pointer_input.py | 81 + .../webdriver/common/actions/wheel_actions.py | 33 + .../webdriver/common/actions/wheel_input.py | 77 + .../selenium/webdriver/common/alert.py | 80 + .../webdriver/common/bidi/__init__.py | 16 + .../bidi/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../bidi/__pycache__/cdp.cpython-312.pyc | Bin 0 -> 26242 bytes .../bidi/__pycache__/console.cpython-312.pyc | Bin 0 -> 492 bytes .../bidi/__pycache__/script.cpython-312.pyc | Bin 0 -> 5018 bytes .../bidi/__pycache__/session.cpython-312.pyc | Bin 0 -> 871 bytes .../selenium/webdriver/common/bidi/cdp.py | 509 + .../selenium/webdriver/common/bidi/console.py | 24 + .../selenium/webdriver/common/bidi/script.py | 110 + .../selenium/webdriver/common/bidi/session.py | 46 + .../selenium/webdriver/common/by.py | 51 + .../webdriver/common/desired_capabilities.py | 100 + .../common/devtools/v129/__init__.py | 60 + .../v129/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2055 bytes .../__pycache__/accessibility.cpython-312.pyc | Bin 0 -> 27449 bytes .../__pycache__/animation.cpython-312.pyc | Bin 0 -> 16614 bytes .../v129/__pycache__/audits.cpython-312.pyc | Bin 0 -> 78098 bytes .../v129/__pycache__/autofill.cpython-312.pyc | Bin 0 -> 10957 bytes .../background_service.cpython-312.pyc | Bin 0 -> 8048 bytes .../bluetooth_emulation.cpython-312.pyc | Bin 0 -> 7539 bytes .../v129/__pycache__/browser.cpython-312.pyc | Bin 0 -> 26244 bytes .../__pycache__/cache_storage.cpython-312.pyc | Bin 0 -> 12126 bytes .../v129/__pycache__/cast.cpython-312.pyc | Bin 0 -> 5469 bytes .../v129/__pycache__/console.cpython-312.pyc | Bin 0 -> 3603 bytes .../v129/__pycache__/css.cpython-312.pyc | Bin 0 -> 87986 bytes .../v129/__pycache__/database.cpython-312.pyc | Bin 0 -> 6176 bytes .../v129/__pycache__/debugger.cpython-312.pyc | Bin 0 -> 54917 bytes .../__pycache__/device_access.cpython-312.pyc | Bin 0 -> 5429 bytes .../device_orientation.cpython-312.pyc | Bin 0 -> 1423 bytes .../v129/__pycache__/dom.cpython-312.pyc | Bin 0 -> 77475 bytes .../__pycache__/dom_debugger.cpython-312.pyc | Bin 0 -> 11056 bytes .../__pycache__/dom_snapshot.cpython-312.pyc | Bin 0 -> 41463 bytes .../__pycache__/dom_storage.cpython-312.pyc | Bin 0 -> 8711 bytes .../__pycache__/emulation.cpython-312.pyc | Bin 0 -> 42915 bytes .../event_breakpoints.cpython-312.pyc | Bin 0 -> 1663 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 5059 bytes .../v129/__pycache__/fed_cm.cpython-312.pyc | Bin 0 -> 10332 bytes .../v129/__pycache__/fetch.cpython-312.pyc | Bin 0 -> 21616 bytes .../__pycache__/file_system.cpython-312.pyc | Bin 0 -> 5077 bytes .../headless_experimental.cpython-312.pyc | Bin 0 -> 5041 bytes .../__pycache__/heap_profiler.cpython-312.pyc | Bin 0 -> 16599 bytes .../__pycache__/indexed_db.cpython-312.pyc | Bin 0 -> 19962 bytes .../v129/__pycache__/input_.cpython-312.pyc | Bin 0 -> 28497 bytes .../__pycache__/inspector.cpython-312.pyc | Bin 0 -> 2635 bytes .../v129/__pycache__/io.cpython-312.pyc | Bin 0 -> 4025 bytes .../__pycache__/layer_tree.cpython-312.pyc | Bin 0 -> 19212 bytes .../v129/__pycache__/log.cpython-312.pyc | Bin 0 -> 6962 bytes .../v129/__pycache__/media.cpython-312.pyc | Bin 0 -> 11890 bytes .../v129/__pycache__/memory.cpython-312.pyc | Bin 0 -> 8938 bytes .../v129/__pycache__/network.cpython-312.pyc | Bin 0 -> 160410 bytes .../v129/__pycache__/overlay.cpython-312.pyc | Bin 0 -> 56902 bytes .../v129/__pycache__/page.cpython-312.pyc | Bin 0 -> 152057 bytes .../__pycache__/performance.cpython-312.pyc | Bin 0 -> 4036 bytes .../performance_timeline.cpython-312.pyc | Bin 0 -> 9363 bytes .../v129/__pycache__/preload.cpython-312.pyc | Bin 0 -> 26908 bytes .../v129/__pycache__/profiler.cpython-312.pyc | Bin 0 -> 16808 bytes .../v129/__pycache__/pwa.cpython-312.pyc | Bin 0 -> 10851 bytes .../v129/__pycache__/runtime.cpython-312.pyc | Bin 0 -> 66310 bytes .../v129/__pycache__/schema.cpython-312.pyc | Bin 0 -> 1817 bytes .../v129/__pycache__/security.cpython-312.pyc | Bin 0 -> 20575 bytes .../service_worker.cpython-312.pyc | Bin 0 -> 14937 bytes .../v129/__pycache__/storage.cpython-312.pyc | Bin 0 -> 83223 bytes .../__pycache__/system_info.cpython-312.pyc | Bin 0 -> 14957 bytes .../v129/__pycache__/target.cpython-312.pyc | Bin 0 -> 28922 bytes .../__pycache__/tethering.cpython-312.pyc | Bin 0 -> 1983 bytes .../v129/__pycache__/tracing.cpython-312.pyc | Bin 0 -> 15578 bytes .../v129/__pycache__/util.cpython-312.pyc | Bin 0 -> 1114 bytes .../__pycache__/web_audio.cpython-312.pyc | Bin 0 -> 24977 bytes .../__pycache__/web_authn.cpython-312.pyc | Bin 0 -> 18661 bytes .../common/devtools/v129/accessibility.py | 647 ++ .../common/devtools/v129/animation.py | 491 + .../webdriver/common/devtools/v129/audits.py | 1532 +++ .../common/devtools/v129/autofill.py | 283 + .../devtools/v129/background_service.py | 213 + .../devtools/v129/bluetooth_emulation.py | 196 + .../webdriver/common/devtools/v129/browser.py | 725 ++ .../common/devtools/v129/cache_storage.py | 309 + .../webdriver/common/devtools/v129/cast.py | 170 + .../webdriver/common/devtools/v129/console.py | 105 + .../webdriver/common/devtools/v129/css.py | 2168 ++++ .../common/devtools/v129/database.py | 162 + .../common/devtools/v129/debugger.py | 1336 +++ .../common/devtools/v129/device_access.py | 139 + .../devtools/v129/device_orientation.py | 43 + .../webdriver/common/devtools/v129/dom.py | 2082 ++++ .../common/devtools/v129/dom_debugger.py | 312 + .../common/devtools/v129/dom_snapshot.py | 870 ++ .../common/devtools/v129/dom_storage.py | 220 + .../common/devtools/v129/emulation.py | 1195 +++ .../common/devtools/v129/event_breakpoints.py | 54 + .../common/devtools/v129/extensions.py | 144 + .../webdriver/common/devtools/v129/fed_cm.py | 281 + .../webdriver/common/devtools/v129/fetch.py | 503 + .../common/devtools/v129/file_system.py | 113 + .../devtools/v129/headless_experimental.py | 104 + .../common/devtools/v129/heap_profiler.py | 395 + .../common/devtools/v129/indexed_db.py | 525 + .../webdriver/common/devtools/v129/input_.py | 699 ++ .../common/devtools/v129/inspector.py | 76 + .../webdriver/common/devtools/v129/io.py | 99 + .../common/devtools/v129/layer_tree.py | 462 + .../webdriver/common/devtools/v129/log.py | 188 + .../webdriver/common/devtools/v129/media.py | 288 + .../webdriver/common/devtools/v129/memory.py | 261 + .../webdriver/common/devtools/v129/network.py | 4023 ++++++++ .../webdriver/common/devtools/v129/overlay.py | 1383 +++ .../webdriver/common/devtools/v129/page.py | 3814 ++++++++ .../common/devtools/v129/performance.py | 116 + .../devtools/v129/performance_timeline.py | 198 + .../webdriver/common/devtools/v129/preload.py | 527 + .../common/devtools/v129/profiler.py | 418 + .../webdriver/common/devtools/v129/pwa.py | 260 + .../webdriver/common/devtools/v129/py.typed | 0 .../webdriver/common/devtools/v129/runtime.py | 1583 +++ .../webdriver/common/devtools/v129/schema.py | 48 + .../common/devtools/v129/security.py | 507 + .../common/devtools/v129/service_worker.py | 414 + .../webdriver/common/devtools/v129/storage.py | 2053 ++++ .../common/devtools/v129/system_info.py | 366 + .../webdriver/common/devtools/v129/target.py | 713 ++ .../common/devtools/v129/tethering.py | 63 + .../webdriver/common/devtools/v129/tracing.py | 360 + .../webdriver/common/devtools/v129/util.py | 20 + .../common/devtools/v129/web_audio.py | 603 ++ .../common/devtools/v129/web_authn.py | 528 + .../common/devtools/v130/__init__.py | 60 + .../v130/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2055 bytes .../__pycache__/accessibility.cpython-312.pyc | Bin 0 -> 27449 bytes .../__pycache__/animation.cpython-312.pyc | Bin 0 -> 16614 bytes .../v130/__pycache__/audits.cpython-312.pyc | Bin 0 -> 78203 bytes .../v130/__pycache__/autofill.cpython-312.pyc | Bin 0 -> 10957 bytes .../background_service.cpython-312.pyc | Bin 0 -> 8048 bytes .../bluetooth_emulation.cpython-312.pyc | Bin 0 -> 7539 bytes .../v130/__pycache__/browser.cpython-312.pyc | Bin 0 -> 26296 bytes .../__pycache__/cache_storage.cpython-312.pyc | Bin 0 -> 12126 bytes .../v130/__pycache__/cast.cpython-312.pyc | Bin 0 -> 5469 bytes .../v130/__pycache__/console.cpython-312.pyc | Bin 0 -> 3603 bytes .../v130/__pycache__/css.cpython-312.pyc | Bin 0 -> 87986 bytes .../v130/__pycache__/database.cpython-312.pyc | Bin 0 -> 6176 bytes .../v130/__pycache__/debugger.cpython-312.pyc | Bin 0 -> 54917 bytes .../__pycache__/device_access.cpython-312.pyc | Bin 0 -> 5429 bytes .../device_orientation.cpython-312.pyc | Bin 0 -> 1423 bytes .../v130/__pycache__/dom.cpython-312.pyc | Bin 0 -> 78769 bytes .../__pycache__/dom_debugger.cpython-312.pyc | Bin 0 -> 11056 bytes .../__pycache__/dom_snapshot.cpython-312.pyc | Bin 0 -> 41463 bytes .../__pycache__/dom_storage.cpython-312.pyc | Bin 0 -> 8711 bytes .../__pycache__/emulation.cpython-312.pyc | Bin 0 -> 42915 bytes .../event_breakpoints.cpython-312.pyc | Bin 0 -> 1663 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 5059 bytes .../v130/__pycache__/fed_cm.cpython-312.pyc | Bin 0 -> 10332 bytes .../v130/__pycache__/fetch.cpython-312.pyc | Bin 0 -> 21616 bytes .../__pycache__/file_system.cpython-312.pyc | Bin 0 -> 5077 bytes .../headless_experimental.cpython-312.pyc | Bin 0 -> 5041 bytes .../__pycache__/heap_profiler.cpython-312.pyc | Bin 0 -> 16599 bytes .../__pycache__/indexed_db.cpython-312.pyc | Bin 0 -> 19962 bytes .../v130/__pycache__/input_.cpython-312.pyc | Bin 0 -> 28497 bytes .../__pycache__/inspector.cpython-312.pyc | Bin 0 -> 2635 bytes .../v130/__pycache__/io.cpython-312.pyc | Bin 0 -> 4025 bytes .../__pycache__/layer_tree.cpython-312.pyc | Bin 0 -> 19212 bytes .../v130/__pycache__/log.cpython-312.pyc | Bin 0 -> 6962 bytes .../v130/__pycache__/media.cpython-312.pyc | Bin 0 -> 11890 bytes .../v130/__pycache__/memory.cpython-312.pyc | Bin 0 -> 10515 bytes .../v130/__pycache__/network.cpython-312.pyc | Bin 0 -> 160451 bytes .../v130/__pycache__/overlay.cpython-312.pyc | Bin 0 -> 56902 bytes .../v130/__pycache__/page.cpython-312.pyc | Bin 0 -> 152894 bytes .../__pycache__/performance.cpython-312.pyc | Bin 0 -> 4036 bytes .../performance_timeline.cpython-312.pyc | Bin 0 -> 9363 bytes .../v130/__pycache__/preload.cpython-312.pyc | Bin 0 -> 26821 bytes .../v130/__pycache__/profiler.cpython-312.pyc | Bin 0 -> 16808 bytes .../v130/__pycache__/pwa.cpython-312.pyc | Bin 0 -> 10851 bytes .../v130/__pycache__/runtime.cpython-312.pyc | Bin 0 -> 66310 bytes .../v130/__pycache__/schema.cpython-312.pyc | Bin 0 -> 1817 bytes .../v130/__pycache__/security.cpython-312.pyc | Bin 0 -> 20575 bytes .../service_worker.cpython-312.pyc | Bin 0 -> 14937 bytes .../v130/__pycache__/storage.cpython-312.pyc | Bin 0 -> 85005 bytes .../__pycache__/system_info.cpython-312.pyc | Bin 0 -> 14957 bytes .../v130/__pycache__/target.cpython-312.pyc | Bin 0 -> 28922 bytes .../__pycache__/tethering.cpython-312.pyc | Bin 0 -> 1983 bytes .../v130/__pycache__/tracing.cpython-312.pyc | Bin 0 -> 15578 bytes .../v130/__pycache__/util.cpython-312.pyc | Bin 0 -> 1114 bytes .../__pycache__/web_audio.cpython-312.pyc | Bin 0 -> 24977 bytes .../__pycache__/web_authn.cpython-312.pyc | Bin 0 -> 18661 bytes .../common/devtools/v130/accessibility.py | 647 ++ .../common/devtools/v130/animation.py | 491 + .../webdriver/common/devtools/v130/audits.py | 1533 +++ .../common/devtools/v130/autofill.py | 283 + .../devtools/v130/background_service.py | 213 + .../devtools/v130/bluetooth_emulation.py | 196 + .../webdriver/common/devtools/v130/browser.py | 726 ++ .../common/devtools/v130/cache_storage.py | 309 + .../webdriver/common/devtools/v130/cast.py | 170 + .../webdriver/common/devtools/v130/console.py | 105 + .../webdriver/common/devtools/v130/css.py | 2168 ++++ .../common/devtools/v130/database.py | 162 + .../common/devtools/v130/debugger.py | 1336 +++ .../common/devtools/v130/device_access.py | 139 + .../devtools/v130/device_orientation.py | 43 + .../webdriver/common/devtools/v130/dom.py | 2115 ++++ .../common/devtools/v130/dom_debugger.py | 312 + .../common/devtools/v130/dom_snapshot.py | 870 ++ .../common/devtools/v130/dom_storage.py | 220 + .../common/devtools/v130/emulation.py | 1195 +++ .../common/devtools/v130/event_breakpoints.py | 54 + .../common/devtools/v130/extensions.py | 144 + .../webdriver/common/devtools/v130/fed_cm.py | 281 + .../webdriver/common/devtools/v130/fetch.py | 503 + .../common/devtools/v130/file_system.py | 113 + .../devtools/v130/headless_experimental.py | 104 + .../common/devtools/v130/heap_profiler.py | 395 + .../common/devtools/v130/indexed_db.py | 525 + .../webdriver/common/devtools/v130/input_.py | 699 ++ .../common/devtools/v130/inspector.py | 76 + .../webdriver/common/devtools/v130/io.py | 99 + .../common/devtools/v130/layer_tree.py | 462 + .../webdriver/common/devtools/v130/log.py | 188 + .../webdriver/common/devtools/v130/media.py | 288 + .../webdriver/common/devtools/v130/memory.py | 303 + .../webdriver/common/devtools/v130/network.py | 4023 ++++++++ .../webdriver/common/devtools/v130/overlay.py | 1383 +++ .../webdriver/common/devtools/v130/page.py | 3837 ++++++++ .../common/devtools/v130/performance.py | 116 + .../devtools/v130/performance_timeline.py | 198 + .../webdriver/common/devtools/v130/preload.py | 526 + .../common/devtools/v130/profiler.py | 418 + .../webdriver/common/devtools/v130/pwa.py | 260 + .../webdriver/common/devtools/v130/py.typed | 0 .../webdriver/common/devtools/v130/runtime.py | 1583 +++ .../webdriver/common/devtools/v130/schema.py | 48 + .../common/devtools/v130/security.py | 507 + .../common/devtools/v130/service_worker.py | 414 + .../webdriver/common/devtools/v130/storage.py | 2090 ++++ .../common/devtools/v130/system_info.py | 366 + .../webdriver/common/devtools/v130/target.py | 713 ++ .../common/devtools/v130/tethering.py | 63 + .../webdriver/common/devtools/v130/tracing.py | 360 + .../webdriver/common/devtools/v130/util.py | 20 + .../common/devtools/v130/web_audio.py | 603 ++ .../common/devtools/v130/web_authn.py | 528 + .../common/devtools/v131/__init__.py | 60 + .../v131/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2055 bytes .../__pycache__/accessibility.cpython-312.pyc | Bin 0 -> 27449 bytes .../__pycache__/animation.cpython-312.pyc | Bin 0 -> 16614 bytes .../v131/__pycache__/audits.cpython-312.pyc | Bin 0 -> 78352 bytes .../v131/__pycache__/autofill.cpython-312.pyc | Bin 0 -> 10957 bytes .../background_service.cpython-312.pyc | Bin 0 -> 8048 bytes .../bluetooth_emulation.cpython-312.pyc | Bin 0 -> 7539 bytes .../v131/__pycache__/browser.cpython-312.pyc | Bin 0 -> 26296 bytes .../__pycache__/cache_storage.cpython-312.pyc | Bin 0 -> 12126 bytes .../v131/__pycache__/cast.cpython-312.pyc | Bin 0 -> 5469 bytes .../v131/__pycache__/console.cpython-312.pyc | Bin 0 -> 3603 bytes .../v131/__pycache__/css.cpython-312.pyc | Bin 0 -> 87986 bytes .../v131/__pycache__/database.cpython-312.pyc | Bin 0 -> 6176 bytes .../v131/__pycache__/debugger.cpython-312.pyc | Bin 0 -> 56019 bytes .../__pycache__/device_access.cpython-312.pyc | Bin 0 -> 5429 bytes .../device_orientation.cpython-312.pyc | Bin 0 -> 1423 bytes .../v131/__pycache__/dom.cpython-312.pyc | Bin 0 -> 78769 bytes .../__pycache__/dom_debugger.cpython-312.pyc | Bin 0 -> 11056 bytes .../__pycache__/dom_snapshot.cpython-312.pyc | Bin 0 -> 41463 bytes .../__pycache__/dom_storage.cpython-312.pyc | Bin 0 -> 8711 bytes .../__pycache__/emulation.cpython-312.pyc | Bin 0 -> 42884 bytes .../event_breakpoints.cpython-312.pyc | Bin 0 -> 1663 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 5059 bytes .../v131/__pycache__/fed_cm.cpython-312.pyc | Bin 0 -> 10332 bytes .../v131/__pycache__/fetch.cpython-312.pyc | Bin 0 -> 21616 bytes .../__pycache__/file_system.cpython-312.pyc | Bin 0 -> 5077 bytes .../headless_experimental.cpython-312.pyc | Bin 0 -> 5041 bytes .../__pycache__/heap_profiler.cpython-312.pyc | Bin 0 -> 16599 bytes .../__pycache__/indexed_db.cpython-312.pyc | Bin 0 -> 19962 bytes .../v131/__pycache__/input_.cpython-312.pyc | Bin 0 -> 28497 bytes .../__pycache__/inspector.cpython-312.pyc | Bin 0 -> 2635 bytes .../v131/__pycache__/io.cpython-312.pyc | Bin 0 -> 4025 bytes .../__pycache__/layer_tree.cpython-312.pyc | Bin 0 -> 19212 bytes .../v131/__pycache__/log.cpython-312.pyc | Bin 0 -> 6962 bytes .../v131/__pycache__/media.cpython-312.pyc | Bin 0 -> 11890 bytes .../v131/__pycache__/memory.cpython-312.pyc | Bin 0 -> 10515 bytes .../v131/__pycache__/network.cpython-312.pyc | Bin 0 -> 160451 bytes .../v131/__pycache__/overlay.cpython-312.pyc | Bin 0 -> 56878 bytes .../v131/__pycache__/page.cpython-312.pyc | Bin 0 -> 153023 bytes .../__pycache__/performance.cpython-312.pyc | Bin 0 -> 4036 bytes .../performance_timeline.cpython-312.pyc | Bin 0 -> 9363 bytes .../v131/__pycache__/preload.cpython-312.pyc | Bin 0 -> 26950 bytes .../v131/__pycache__/profiler.cpython-312.pyc | Bin 0 -> 16808 bytes .../v131/__pycache__/pwa.cpython-312.pyc | Bin 0 -> 10851 bytes .../v131/__pycache__/runtime.cpython-312.pyc | Bin 0 -> 66310 bytes .../v131/__pycache__/schema.cpython-312.pyc | Bin 0 -> 1817 bytes .../v131/__pycache__/security.cpython-312.pyc | Bin 0 -> 20575 bytes .../service_worker.cpython-312.pyc | Bin 0 -> 14937 bytes .../v131/__pycache__/storage.cpython-312.pyc | Bin 0 -> 85005 bytes .../__pycache__/system_info.cpython-312.pyc | Bin 0 -> 14957 bytes .../v131/__pycache__/target.cpython-312.pyc | Bin 0 -> 28922 bytes .../__pycache__/tethering.cpython-312.pyc | Bin 0 -> 1983 bytes .../v131/__pycache__/tracing.cpython-312.pyc | Bin 0 -> 15578 bytes .../v131/__pycache__/util.cpython-312.pyc | Bin 0 -> 1114 bytes .../__pycache__/web_audio.cpython-312.pyc | Bin 0 -> 24977 bytes .../__pycache__/web_authn.cpython-312.pyc | Bin 0 -> 20526 bytes .../common/devtools/v131/accessibility.py | 647 ++ .../common/devtools/v131/animation.py | 491 + .../webdriver/common/devtools/v131/audits.py | 1535 +++ .../common/devtools/v131/autofill.py | 283 + .../devtools/v131/background_service.py | 213 + .../devtools/v131/bluetooth_emulation.py | 196 + .../webdriver/common/devtools/v131/browser.py | 726 ++ .../common/devtools/v131/cache_storage.py | 309 + .../webdriver/common/devtools/v131/cast.py | 170 + .../webdriver/common/devtools/v131/console.py | 105 + .../webdriver/common/devtools/v131/css.py | 2168 ++++ .../common/devtools/v131/database.py | 162 + .../common/devtools/v131/debugger.py | 1361 +++ .../common/devtools/v131/device_access.py | 139 + .../devtools/v131/device_orientation.py | 43 + .../webdriver/common/devtools/v131/dom.py | 2115 ++++ .../common/devtools/v131/dom_debugger.py | 312 + .../common/devtools/v131/dom_snapshot.py | 870 ++ .../common/devtools/v131/dom_storage.py | 220 + .../common/devtools/v131/emulation.py | 1194 +++ .../common/devtools/v131/event_breakpoints.py | 54 + .../common/devtools/v131/extensions.py | 144 + .../webdriver/common/devtools/v131/fed_cm.py | 281 + .../webdriver/common/devtools/v131/fetch.py | 503 + .../common/devtools/v131/file_system.py | 113 + .../devtools/v131/headless_experimental.py | 104 + .../common/devtools/v131/heap_profiler.py | 395 + .../common/devtools/v131/indexed_db.py | 525 + .../webdriver/common/devtools/v131/input_.py | 699 ++ .../common/devtools/v131/inspector.py | 76 + .../webdriver/common/devtools/v131/io.py | 99 + .../common/devtools/v131/layer_tree.py | 462 + .../webdriver/common/devtools/v131/log.py | 188 + .../webdriver/common/devtools/v131/media.py | 288 + .../webdriver/common/devtools/v131/memory.py | 303 + .../webdriver/common/devtools/v131/network.py | 4023 ++++++++ .../webdriver/common/devtools/v131/overlay.py | 1383 +++ .../webdriver/common/devtools/v131/page.py | 3839 ++++++++ .../common/devtools/v131/performance.py | 116 + .../devtools/v131/performance_timeline.py | 198 + .../webdriver/common/devtools/v131/preload.py | 528 + .../common/devtools/v131/profiler.py | 418 + .../webdriver/common/devtools/v131/pwa.py | 260 + .../webdriver/common/devtools/v131/py.typed | 0 .../webdriver/common/devtools/v131/runtime.py | 1583 +++ .../webdriver/common/devtools/v131/schema.py | 48 + .../common/devtools/v131/security.py | 507 + .../common/devtools/v131/service_worker.py | 414 + .../webdriver/common/devtools/v131/storage.py | 2090 ++++ .../common/devtools/v131/system_info.py | 366 + .../webdriver/common/devtools/v131/target.py | 713 ++ .../common/devtools/v131/tethering.py | 63 + .../webdriver/common/devtools/v131/tracing.py | 360 + .../webdriver/common/devtools/v131/util.py | 20 + .../common/devtools/v131/web_audio.py | 603 ++ .../common/devtools/v131/web_authn.py | 579 ++ .../webdriver/common/devtools/v85/__init__.py | 51 + .../v85/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1741 bytes .../__pycache__/accessibility.cpython-312.pyc | Bin 0 -> 19618 bytes .../v85/__pycache__/animation.cpython-312.pyc | Bin 0 -> 13779 bytes .../application_cache.cpython-312.pyc | Bin 0 -> 7976 bytes .../v85/__pycache__/audits.cpython-312.pyc | Bin 0 -> 24595 bytes .../background_service.cpython-312.pyc | Bin 0 -> 7904 bytes .../v85/__pycache__/browser.cpython-312.pyc | Bin 0 -> 21203 bytes .../__pycache__/cache_storage.cpython-312.pyc | Bin 0 -> 11056 bytes .../v85/__pycache__/cast.cpython-312.pyc | Bin 0 -> 5108 bytes .../v85/__pycache__/console.cpython-312.pyc | Bin 0 -> 3602 bytes .../v85/__pycache__/css.cpython-312.pyc | Bin 0 -> 54125 bytes .../v85/__pycache__/database.cpython-312.pyc | Bin 0 -> 6175 bytes .../v85/__pycache__/debugger.cpython-312.pyc | Bin 0 -> 48509 bytes .../device_orientation.cpython-312.pyc | Bin 0 -> 1422 bytes .../v85/__pycache__/dom.cpython-312.pyc | Bin 0 -> 63490 bytes .../__pycache__/dom_debugger.cpython-312.pyc | Bin 0 -> 9752 bytes .../__pycache__/dom_snapshot.cpython-312.pyc | Bin 0 -> 38957 bytes .../__pycache__/dom_storage.cpython-312.pyc | Bin 0 -> 7502 bytes .../v85/__pycache__/emulation.cpython-312.pyc | Bin 0 -> 23172 bytes .../v85/__pycache__/fetch.cpython-312.pyc | Bin 0 -> 18377 bytes .../headless_experimental.cpython-312.pyc | Bin 0 -> 5591 bytes .../__pycache__/heap_profiler.cpython-312.pyc | Bin 0 -> 14474 bytes .../__pycache__/indexed_db.cpython-312.pyc | Bin 0 -> 16554 bytes .../v85/__pycache__/input_.cpython-312.pyc | Bin 0 -> 19992 bytes .../v85/__pycache__/inspector.cpython-312.pyc | Bin 0 -> 2634 bytes .../v85/__pycache__/io.cpython-312.pyc | Bin 0 -> 4034 bytes .../__pycache__/layer_tree.cpython-312.pyc | Bin 0 -> 19211 bytes .../v85/__pycache__/log.cpython-312.pyc | Bin 0 -> 6763 bytes .../v85/__pycache__/media.cpython-312.pyc | Bin 0 -> 10106 bytes .../v85/__pycache__/memory.cpython-312.pyc | Bin 0 -> 8937 bytes .../v85/__pycache__/network.cpython-312.pyc | Bin 0 -> 101184 bytes .../v85/__pycache__/overlay.cpython-312.pyc | Bin 0 -> 26268 bytes .../v85/__pycache__/page.cpython-312.pyc | Bin 0 -> 83265 bytes .../__pycache__/performance.cpython-312.pyc | Bin 0 -> 4035 bytes .../v85/__pycache__/profiler.cpython-312.pyc | Bin 0 -> 22695 bytes .../v85/__pycache__/runtime.cpython-312.pyc | Bin 0 -> 58433 bytes .../v85/__pycache__/schema.cpython-312.pyc | Bin 0 -> 1816 bytes .../v85/__pycache__/security.cpython-312.pyc | Bin 0 -> 20574 bytes .../service_worker.cpython-312.pyc | Bin 0 -> 14699 bytes .../v85/__pycache__/storage.cpython-312.pyc | Bin 0 -> 10413 bytes .../__pycache__/system_info.cpython-312.pyc | Bin 0 -> 14397 bytes .../v85/__pycache__/target.cpython-312.pyc | Bin 0 -> 22950 bytes .../v85/__pycache__/tethering.cpython-312.pyc | Bin 0 -> 1982 bytes .../v85/__pycache__/tracing.cpython-312.pyc | Bin 0 -> 12555 bytes .../v85/__pycache__/util.cpython-312.pyc | Bin 0 -> 1113 bytes .../v85/__pycache__/web_audio.cpython-312.pyc | Bin 0 -> 24975 bytes .../v85/__pycache__/web_authn.cpython-312.pyc | Bin 0 -> 11233 bytes .../common/devtools/v85/accessibility.py | 455 + .../common/devtools/v85/animation.py | 415 + .../common/devtools/v85/application_cache.py | 205 + .../webdriver/common/devtools/v85/audits.py | 527 + .../common/devtools/v85/background_service.py | 208 + .../webdriver/common/devtools/v85/browser.py | 579 ++ .../common/devtools/v85/cache_storage.py | 287 + .../webdriver/common/devtools/v85/cast.py | 153 + .../webdriver/common/devtools/v85/console.py | 105 + .../webdriver/common/devtools/v85/css.py | 1365 +++ .../webdriver/common/devtools/v85/database.py | 162 + .../webdriver/common/devtools/v85/debugger.py | 1209 +++ .../common/devtools/v85/device_orientation.py | 43 + .../webdriver/common/devtools/v85/dom.py | 1747 ++++ .../common/devtools/v85/dom_debugger.py | 278 + .../common/devtools/v85/dom_snapshot.py | 837 ++ .../common/devtools/v85/dom_storage.py | 201 + .../common/devtools/v85/emulation.py | 658 ++ .../webdriver/common/devtools/v85/fetch.py | 446 + .../devtools/v85/headless_experimental.py | 116 + .../common/devtools/v85/heap_profiler.py | 371 + .../common/devtools/v85/indexed_db.py | 461 + .../webdriver/common/devtools/v85/input_.py | 477 + .../common/devtools/v85/inspector.py | 76 + .../webdriver/common/devtools/v85/io.py | 99 + .../common/devtools/v85/layer_tree.py | 462 + .../webdriver/common/devtools/v85/log.py | 183 + .../webdriver/common/devtools/v85/media.py | 251 + .../webdriver/common/devtools/v85/memory.py | 261 + .../webdriver/common/devtools/v85/network.py | 2640 +++++ .../webdriver/common/devtools/v85/overlay.py | 698 ++ .../webdriver/common/devtools/v85/page.py | 2373 +++++ .../common/devtools/v85/performance.py | 116 + .../webdriver/common/devtools/v85/profiler.py | 596 ++ .../webdriver/common/devtools/v85/py.typed | 0 .../webdriver/common/devtools/v85/runtime.py | 1437 +++ .../webdriver/common/devtools/v85/schema.py | 48 + .../webdriver/common/devtools/v85/security.py | 509 + .../common/devtools/v85/service_worker.py | 409 + .../webdriver/common/devtools/v85/storage.py | 309 + .../common/devtools/v85/system_info.py | 347 + .../webdriver/common/devtools/v85/target.py | 599 ++ .../common/devtools/v85/tethering.py | 63 + .../webdriver/common/devtools/v85/tracing.py | 290 + .../webdriver/common/devtools/v85/util.py | 20 + .../common/devtools/v85/web_audio.py | 603 ++ .../common/devtools/v85/web_authn.py | 318 + .../webdriver/common/driver_finder.py | 99 + .../fedcm/__pycache__/account.cpython-312.pyc | Bin 0 -> 3356 bytes .../fedcm/__pycache__/dialog.cpython-312.pyc | Bin 0 -> 3088 bytes .../webdriver/common/fedcm/account.py | 71 + .../selenium/webdriver/common/fedcm/dialog.py | 64 + .../selenium/webdriver/common/keys.py | 90 + .../webdriver/common/linux/selenium-manager | Bin 0 -> 5511488 bytes .../selenium/webdriver/common/log.py | 152 + .../webdriver/common/macos/selenium-manager | Bin 0 -> 8235888 bytes .../webdriver/common/mutation-listener.js | 55 + .../selenium/webdriver/common/options.py | 536 + .../webdriver/common/print_page_options.py | 421 + .../selenium/webdriver/common/proxy.py | 307 + .../webdriver/common/selenium_manager.py | 140 + .../selenium/webdriver/common/service.py | 244 + .../selenium/webdriver/common/timeouts.py | 142 + .../selenium/webdriver/common/utils.py | 138 + .../webdriver/common/virtual_authenticator.py | 222 + .../selenium/webdriver/common/window.py | 24 + .../common/windows/selenium-manager.exe | Bin 0 -> 3740160 bytes .../selenium/webdriver/edge/__init__.py | 16 + .../edge/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../edge/__pycache__/options.cpython-312.pyc | Bin 0 -> 2017 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 1364 bytes .../edge/__pycache__/service.cpython-312.pyc | Bin 0 -> 2070 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 1729 bytes .../selenium/webdriver/edge/options.py | 48 + .../webdriver/edge/remote_connection.py | 42 + .../selenium/webdriver/edge/service.py | 55 + .../selenium/webdriver/edge/webdriver.py | 51 + .../selenium/webdriver/firefox/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../firefox_binary.cpython-312.pyc | Bin 0 -> 10675 bytes .../firefox_profile.cpython-312.pyc | Bin 0 -> 18988 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 6180 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 1908 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 2656 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 9856 bytes .../webdriver/firefox/firefox_binary.py | 231 + .../webdriver/firefox/firefox_profile.py | 328 + .../selenium/webdriver/firefox/options.py | 136 + .../webdriver/firefox/remote_connection.py | 47 + .../selenium/webdriver/firefox/service.py | 64 + .../selenium/webdriver/firefox/webdriver.py | 222 + .../webdriver/firefox/webdriver_prefs.json | 69 + .../selenium/webdriver/ie/__init__.py | 16 + .../ie/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 212 bytes .../ie/__pycache__/options.cpython-312.pyc | Bin 0 -> 7819 bytes .../ie/__pycache__/service.cpython-312.pyc | Bin 0 -> 2485 bytes .../ie/__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 3069 bytes .../selenium/webdriver/ie/options.py | 406 + .../selenium/webdriver/ie/service.py | 66 + .../selenium/webdriver/ie/webdriver.py | 75 + .../selenium/webdriver/remote/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../bidi_connection.cpython-312.pyc | Bin 0 -> 647 bytes .../__pycache__/client_config.cpython-312.pyc | Bin 0 -> 14204 bytes .../__pycache__/command.cpython-312.pyc | Bin 0 -> 6643 bytes .../__pycache__/errorhandler.cpython-312.pyc | Bin 0 -> 9081 bytes .../remote/__pycache__/fedcm.cpython-312.pyc | Bin 0 -> 4260 bytes .../__pycache__/file_detector.cpython-312.pyc | Bin 0 -> 2208 bytes .../locator_converter.cpython-312.pyc | Bin 0 -> 767 bytes .../remote/__pycache__/mobile.cpython-312.pyc | Bin 0 -> 3939 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 28013 bytes .../__pycache__/script_key.cpython-312.pyc | Bin 0 -> 1186 bytes .../__pycache__/shadowroot.cpython-312.pyc | Bin 0 -> 3826 bytes .../__pycache__/switch_to.cpython-312.pyc | Bin 0 -> 6436 bytes .../remote/__pycache__/utils.cpython-312.pyc | Bin 0 -> 738 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 61170 bytes .../__pycache__/webelement.cpython-312.pyc | Bin 0 -> 21544 bytes .../websocket_connection.cpython-312.pyc | Bin 0 -> 7419 bytes .../webdriver/remote/bidi_connection.py | 23 + .../webdriver/remote/client_config.py | 291 + .../selenium/webdriver/remote/command.py | 134 + .../selenium/webdriver/remote/errorhandler.py | 232 + .../selenium/webdriver/remote/fedcm.py | 70 + .../webdriver/remote/file_detector.py | 53 + .../selenium/webdriver/remote/findElements.js | 122 + .../selenium/webdriver/remote/getAttribute.js | 6 + .../selenium/webdriver/remote/isDisplayed.js | 28 + .../webdriver/remote/locator_converter.py | 28 + .../selenium/webdriver/remote/mobile.py | 81 + .../webdriver/remote/remote_connection.py | 489 + .../selenium/webdriver/remote/script_key.py | 33 + .../selenium/webdriver/remote/shadowroot.py | 82 + .../selenium/webdriver/remote/switch_to.py | 152 + .../selenium/webdriver/remote/utils.py | 28 + .../selenium/webdriver/remote/webdriver.py | 1308 +++ .../selenium/webdriver/remote/webelement.py | 443 + .../webdriver/remote/websocket_connection.py | 146 + .../selenium/webdriver/safari/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 3494 bytes .../__pycache__/permissions.cpython-312.pyc | Bin 0 -> 520 bytes .../remote_connection.cpython-312.pyc | Bin 0 -> 1702 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 3300 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 4184 bytes .../selenium/webdriver/safari/options.py | 115 + .../selenium/webdriver/safari/permissions.py | 23 + .../webdriver/safari/remote_connection.py | 45 + .../selenium/webdriver/safari/service.py | 76 + .../selenium/webdriver/safari/webdriver.py | 108 + .../selenium/webdriver/support/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../abstract_event_listener.cpython-312.pyc | Bin 0 -> 3464 bytes .../support/__pycache__/color.cpython-312.pyc | Bin 0 -> 18631 bytes .../event_firing_webdriver.cpython-312.pyc | Bin 0 -> 13972 bytes .../__pycache__/events.cpython-312.pyc | Bin 0 -> 357 bytes .../expected_conditions.cpython-312.pyc | Bin 0 -> 22488 bytes .../relative_locator.cpython-312.pyc | Bin 0 -> 8050 bytes .../__pycache__/select.cpython-312.pyc | Bin 0 -> 11588 bytes .../support/__pycache__/ui.cpython-312.pyc | Bin 0 -> 333 bytes .../support/__pycache__/wait.cpython-312.pyc | Bin 0 -> 5916 bytes .../support/abstract_event_listener.py | 77 + .../selenium/webdriver/support/color.py | 334 + .../support/event_firing_webdriver.py | 231 + .../selenium/webdriver/support/events.py | 19 + .../webdriver/support/expected_conditions.py | 555 ++ .../webdriver/support/relative_locator.py | 192 + .../selenium/webdriver/support/select.py | 243 + .../selenium/webdriver/support/ui.py | 21 + .../selenium/webdriver/support/wait.py | 128 + .../selenium/webdriver/webkitgtk/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 3057 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 2683 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 2421 bytes .../selenium/webdriver/webkitgtk/options.py | 77 + .../selenium/webdriver/webkitgtk/service.py | 60 + .../selenium/webdriver/webkitgtk/webdriver.py | 60 + .../selenium/webdriver/wpewebkit/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 219 bytes .../__pycache__/options.cpython-312.pyc | Bin 0 -> 2582 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 2325 bytes .../__pycache__/webdriver.cpython-312.pyc | Bin 0 -> 2425 bytes .../selenium/webdriver/wpewebkit/options.py | 64 + .../selenium/webdriver/wpewebkit/service.py | 55 + .../selenium/webdriver/wpewebkit/webdriver.py | 60 + .../sniffio-1.3.1.dist-info/INSTALLER | 1 + .../sniffio-1.3.1.dist-info/LICENSE | 3 + .../sniffio-1.3.1.dist-info/LICENSE.APACHE2 | 202 + .../sniffio-1.3.1.dist-info/LICENSE.MIT | 20 + .../sniffio-1.3.1.dist-info/METADATA | 104 + .../sniffio-1.3.1.dist-info/RECORD | 19 + .../sniffio-1.3.1.dist-info/WHEEL | 5 + .../sniffio-1.3.1.dist-info/top_level.txt | 1 + .../site-packages/sniffio/__init__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 474 bytes .../sniffio/__pycache__/_impl.cpython-312.pyc | Bin 0 -> 3185 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 226 bytes .../python3.12/site-packages/sniffio/_impl.py | 95 + .../site-packages/sniffio/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../__pycache__/test_sniffio.cpython-312.pyc | Bin 0 -> 3866 bytes .../sniffio/_tests/test_sniffio.py | 84 + .../site-packages/sniffio/_version.py | 3 + .../python3.12/site-packages/sniffio/py.typed | 0 env/lib/python3.12/site-packages/socks.py | 847 ++ .../python3.12/site-packages/sockshandler.py | 111 + .../INSTALLER | 1 + .../sortedcontainers-2.4.0.dist-info/LICENSE | 13 + .../sortedcontainers-2.4.0.dist-info/METADATA | 264 + .../sortedcontainers-2.4.0.dist-info/RECORD | 14 + .../sortedcontainers-2.4.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../sortedcontainers/__init__.py | 74 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2348 bytes .../__pycache__/sorteddict.cpython-312.pyc | Bin 0 -> 27786 bytes .../__pycache__/sortedlist.cpython-312.pyc | Bin 0 -> 86651 bytes .../__pycache__/sortedset.cpython-312.pyc | Bin 0 -> 24470 bytes .../sortedcontainers/sorteddict.py | 812 ++ .../sortedcontainers/sortedlist.py | 2646 +++++ .../sortedcontainers/sortedset.py | 733 ++ .../trio-0.27.0.dist-info/INSTALLER | 1 + .../trio-0.27.0.dist-info/LICENSE | 3 + .../trio-0.27.0.dist-info/LICENSE.APACHE2 | 202 + .../trio-0.27.0.dist-info/LICENSE.MIT | 22 + .../trio-0.27.0.dist-info/METADATA | 188 + .../trio-0.27.0.dist-info/RECORD | 286 + .../site-packages/trio-0.27.0.dist-info/WHEEL | 5 + .../trio-0.27.0.dist-info/entry_points.txt | 2 + .../trio-0.27.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/trio/__init__.py | 138 + .../python3.12/site-packages/trio/__main__.py | 3 + .../trio/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3559 bytes .../trio/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 280 bytes .../trio/__pycache__/_abc.cpython-312.pyc | Bin 0 -> 29885 bytes .../trio/__pycache__/_channel.cpython-312.pyc | Bin 0 -> 23456 bytes .../__pycache__/_deprecate.cpython-312.pyc | Bin 0 -> 7242 bytes .../trio/__pycache__/_dtls.cpython-312.pyc | Bin 0 -> 51187 bytes .../trio/__pycache__/_file_io.cpython-312.pyc | Bin 0 -> 27332 bytes .../_highlevel_generic.cpython-312.pyc | Bin 0 -> 6617 bytes ...ghlevel_open_tcp_listeners.cpython-312.pyc | Bin 0 -> 8892 bytes ..._highlevel_open_tcp_stream.cpython-312.pyc | Bin 0 -> 10198 bytes ...highlevel_open_unix_stream.cpython-312.pyc | Bin 0 -> 2647 bytes ..._highlevel_serve_listeners.cpython-312.pyc | Bin 0 -> 6189 bytes .../_highlevel_socket.cpython-312.pyc | Bin 0 -> 13629 bytes .../_highlevel_ssl_helpers.cpython-312.pyc | Bin 0 -> 6907 bytes .../trio/__pycache__/_path.cpython-312.pyc | Bin 0 -> 14145 bytes .../trio/__pycache__/_repl.cpython-312.pyc | Bin 0 -> 4401 bytes .../trio/__pycache__/_signals.cpython-312.pyc | Bin 0 -> 7073 bytes .../trio/__pycache__/_socket.cpython-312.pyc | Bin 0 -> 44117 bytes .../trio/__pycache__/_ssl.cpython-312.pyc | Bin 0 -> 27625 bytes .../__pycache__/_subprocess.cpython-312.pyc | Bin 0 -> 53995 bytes .../trio/__pycache__/_sync.cpython-312.pyc | Bin 0 -> 41260 bytes .../trio/__pycache__/_threads.cpython-312.pyc | Bin 0 -> 28739 bytes .../__pycache__/_timeouts.cpython-312.pyc | Bin 0 -> 7865 bytes .../__pycache__/_unix_pipes.cpython-312.pyc | Bin 0 -> 9339 bytes .../trio/__pycache__/_util.cpython-312.pyc | Bin 0 -> 13951 bytes .../trio/__pycache__/_version.cpython-312.pyc | Bin 0 -> 224 bytes .../_wait_for_object.cpython-312.pyc | Bin 0 -> 2602 bytes .../_windows_pipes.cpython-312.pyc | Bin 0 -> 6974 bytes .../trio/__pycache__/abc.cpython-312.pyc | Bin 0 -> 516 bytes .../__pycache__/from_thread.cpython-312.pyc | Bin 0 -> 573 bytes .../trio/__pycache__/lowlevel.cpython-312.pyc | Bin 0 -> 2186 bytes .../trio/__pycache__/socket.cpython-312.pyc | Bin 0 -> 16162 bytes .../__pycache__/to_thread.cpython-312.pyc | Bin 0 -> 340 bytes env/lib/python3.12/site-packages/trio/_abc.py | 716 ++ .../python3.12/site-packages/trio/_channel.py | 444 + .../site-packages/trio/_core/__init__.py | 87 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2712 bytes .../__pycache__/_asyncgens.cpython-312.pyc | Bin 0 -> 7457 bytes .../__pycache__/_concat_tb.cpython-312.pyc | Bin 0 -> 3454 bytes .../__pycache__/_entry_queue.cpython-312.pyc | Bin 0 -> 8792 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 0 -> 5505 bytes ..._generated_instrumentation.cpython-312.pyc | Bin 0 -> 2211 bytes .../_generated_io_epoll.cpython-312.pyc | Bin 0 -> 4762 bytes .../_generated_io_kqueue.cpython-312.pyc | Bin 0 -> 6907 bytes .../_generated_io_windows.cpython-312.pyc | Bin 0 -> 8729 bytes .../_generated_run.cpython-312.pyc | Bin 0 -> 12061 bytes .../_instrumentation.cpython-312.pyc | Bin 0 -> 4616 bytes .../__pycache__/_io_common.cpython-312.pyc | Bin 0 -> 1261 bytes .../__pycache__/_io_epoll.cpython-312.pyc | Bin 0 -> 11940 bytes .../__pycache__/_io_kqueue.cpython-312.pyc | Bin 0 -> 13716 bytes .../__pycache__/_io_windows.cpython-312.pyc | Bin 0 -> 31826 bytes .../_core/__pycache__/_ki.cpython-312.pyc | Bin 0 -> 7185 bytes .../_core/__pycache__/_local.cpython-312.pyc | Bin 0 -> 4738 bytes .../__pycache__/_mock_clock.cpython-312.pyc | Bin 0 -> 7609 bytes .../__pycache__/_parking_lot.cpython-312.pyc | Bin 0 -> 10906 bytes .../_core/__pycache__/_run.cpython-312.pyc | Bin 0 -> 112759 bytes .../__pycache__/_thread_cache.cpython-312.pyc | Bin 0 -> 9211 bytes .../_core/__pycache__/_traps.cpython-312.pyc | Bin 0 -> 12661 bytes .../_unbounded_queue.cpython-312.pyc | Bin 0 -> 7526 bytes .../_wakeup_socketpair.cpython-312.pyc | Bin 0 -> 4150 bytes .../__pycache__/_windows_cffi.cpython-312.pyc | Bin 0 -> 16871 bytes .../site-packages/trio/_core/_asyncgens.py | 216 + .../site-packages/trio/_core/_concat_tb.py | 130 + .../site-packages/trio/_core/_entry_queue.py | 220 + .../site-packages/trio/_core/_exceptions.py | 113 + .../trio/_core/_generated_instrumentation.py | 51 + .../trio/_core/_generated_io_epoll.py | 98 + .../trio/_core/_generated_io_kqueue.py | 156 + .../trio/_core/_generated_io_windows.py | 209 + .../trio/_core/_generated_run.py | 273 + .../trio/_core/_instrumentation.py | 108 + .../site-packages/trio/_core/_io_common.py | 31 + .../site-packages/trio/_core/_io_epoll.py | 387 + .../site-packages/trio/_core/_io_kqueue.py | 292 + .../site-packages/trio/_core/_io_windows.py | 1025 ++ .../site-packages/trio/_core/_ki.py | 237 + .../site-packages/trio/_core/_local.py | 104 + .../site-packages/trio/_core/_mock_clock.py | 164 + .../site-packages/trio/_core/_parking_lot.py | 317 + .../site-packages/trio/_core/_run.py | 2953 ++++++ .../trio/_core/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../__pycache__/test_asyncgen.cpython-312.pyc | Bin 0 -> 19836 bytes .../test_exceptiongroup_gc.cpython-312.pyc | Bin 0 -> 4596 bytes .../test_guest_mode.cpython-312.pyc | Bin 0 -> 36472 bytes .../test_instrumentation.cpython-312.pyc | Bin 0 -> 15816 bytes .../__pycache__/test_io.cpython-312.pyc | Bin 0 -> 25788 bytes .../__pycache__/test_ki.cpython-312.pyc | Bin 0 -> 28549 bytes .../__pycache__/test_local.cpython-312.pyc | Bin 0 -> 7314 bytes .../test_mock_clock.cpython-312.pyc | Bin 0 -> 8442 bytes .../test_parking_lot.cpython-312.pyc | Bin 0 -> 19976 bytes .../__pycache__/test_run.cpython-312.pyc | Bin 0 -> 174027 bytes .../test_thread_cache.cpython-312.pyc | Bin 0 -> 11027 bytes .../__pycache__/test_tutil.cpython-312.pyc | Bin 0 -> 1092 bytes .../test_unbounded_queue.cpython-312.pyc | Bin 0 -> 9435 bytes .../__pycache__/test_windows.cpython-312.pyc | Bin 0 -> 19885 bytes .../_tests/__pycache__/tutil.cpython-312.pyc | Bin 0 -> 4407 bytes .../trio/_core/_tests/test_asyncgen.py | 333 + .../_core/_tests/test_exceptiongroup_gc.py | 102 + .../trio/_core/_tests/test_guest_mode.py | 666 ++ .../trio/_core/_tests/test_instrumentation.py | 266 + .../trio/_core/_tests/test_io.py | 480 + .../trio/_core/_tests/test_ki.py | 517 + .../trio/_core/_tests/test_local.py | 118 + .../trio/_core/_tests/test_mock_clock.py | 175 + .../trio/_core/_tests/test_parking_lot.py | 384 + .../trio/_core/_tests/test_run.py | 2776 ++++++ .../trio/_core/_tests/test_thread_cache.py | 195 + .../trio/_core/_tests/test_tutil.py | 13 + .../trio/_core/_tests/test_unbounded_queue.py | 154 + .../trio/_core/_tests/test_windows.py | 299 + .../site-packages/trio/_core/_tests/tutil.py | 117 + .../__pycache__/nursery_start.cpython-312.pyc | Bin 0 -> 3587 bytes .../__pycache__/run.cpython-312.pyc | Bin 0 -> 2091 bytes .../_core/_tests/type_tests/nursery_start.py | 76 + .../trio/_core/_tests/type_tests/run.py | 48 + .../site-packages/trio/_core/_thread_cache.py | 295 + .../site-packages/trio/_core/_traps.py | 287 + .../trio/_core/_unbounded_queue.py | 163 + .../trio/_core/_wakeup_socketpair.py | 75 + .../site-packages/trio/_core/_windows_cffi.py | 520 + .../site-packages/trio/_deprecate.py | 177 + .../python3.12/site-packages/trio/_dtls.py | 1403 +++ .../python3.12/site-packages/trio/_file_io.py | 509 + .../site-packages/trio/_highlevel_generic.py | 129 + .../trio/_highlevel_open_tcp_listeners.py | 251 + .../trio/_highlevel_open_tcp_stream.py | 411 + .../trio/_highlevel_open_unix_stream.py | 65 + .../trio/_highlevel_serve_listeners.py | 147 + .../site-packages/trio/_highlevel_socket.py | 414 + .../trio/_highlevel_ssl_helpers.py | 180 + .../python3.12/site-packages/trio/_path.py | 264 + .../python3.12/site-packages/trio/_repl.py | 92 + .../python3.12/site-packages/trio/_signals.py | 185 + .../python3.12/site-packages/trio/_socket.py | 1321 +++ env/lib/python3.12/site-packages/trio/_ssl.py | 951 ++ .../site-packages/trio/_subprocess.py | 1164 +++ .../trio/_subprocess_platform/__init__.py | 123 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5032 bytes .../__pycache__/kqueue.cpython-312.pyc | Bin 0 -> 2264 bytes .../__pycache__/waitid.cpython-312.pyc | Bin 0 -> 3531 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 704 bytes .../trio/_subprocess_platform/kqueue.py | 48 + .../trio/_subprocess_platform/waitid.py | 113 + .../trio/_subprocess_platform/windows.py | 11 + .../python3.12/site-packages/trio/_sync.py | 876 ++ .../site-packages/trio/_tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../check_type_completeness.cpython-312.pyc | Bin 0 -> 8856 bytes .../module_with_deprecations.cpython-312.pyc | Bin 0 -> 843 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 0 -> 2363 bytes .../__pycache__/test_abc.cpython-312.pyc | Bin 0 -> 3801 bytes .../__pycache__/test_channel.cpython-312.pyc | Bin 0 -> 30833 bytes .../test_contextvars.cpython-312.pyc | Bin 0 -> 3531 bytes .../test_deprecate.cpython-312.pyc | Bin 0 -> 13822 bytes ...ict_exception_groups_false.cpython-312.pyc | Bin 0 -> 4384 bytes .../__pycache__/test_dtls.cpython-312.pyc | Bin 0 -> 53831 bytes .../__pycache__/test_exports.cpython-312.pyc | Bin 0 -> 21916 bytes .../__pycache__/test_fakenet.cpython-312.pyc | Bin 0 -> 19008 bytes .../__pycache__/test_file_io.cpython-312.pyc | Bin 0 -> 13543 bytes .../test_highlevel_generic.cpython-312.pyc | Bin 0 -> 6564 bytes ...ghlevel_open_tcp_listeners.cpython-312.pyc | Bin 0 -> 21407 bytes ..._highlevel_open_tcp_stream.cpython-312.pyc | Bin 0 -> 28866 bytes ...highlevel_open_unix_stream.cpython-312.pyc | Bin 0 -> 5170 bytes ..._highlevel_serve_listeners.cpython-312.pyc | Bin 0 -> 11546 bytes .../test_highlevel_socket.cpython-312.pyc | Bin 0 -> 18448 bytes ...test_highlevel_ssl_helpers.cpython-312.pyc | Bin 0 -> 8119 bytes .../__pycache__/test_path.cpython-312.pyc | Bin 0 -> 15220 bytes .../__pycache__/test_repl.cpython-312.pyc | Bin 0 -> 9245 bytes ...test_scheduler_determinism.cpython-312.pyc | Bin 0 -> 3311 bytes .../__pycache__/test_signals.cpython-312.pyc | Bin 0 -> 12611 bytes .../__pycache__/test_socket.cpython-312.pyc | Bin 0 -> 68640 bytes .../__pycache__/test_ssl.cpython-312.pyc | Bin 0 -> 74983 bytes .../test_subprocess.cpython-312.pyc | Bin 0 -> 41840 bytes .../__pycache__/test_sync.cpython-312.pyc | Bin 0 -> 39385 bytes .../__pycache__/test_testing.cpython-312.pyc | Bin 0 -> 44286 bytes .../test_testing_raisesgroup.cpython-312.pyc | Bin 0 -> 20826 bytes .../__pycache__/test_threads.cpython-312.pyc | Bin 0 -> 63176 bytes .../__pycache__/test_timeouts.cpython-312.pyc | Bin 0 -> 15039 bytes .../__pycache__/test_tracing.cpython-312.pyc | Bin 0 -> 3933 bytes .../__pycache__/test_trio.cpython-312.pyc | Bin 0 -> 615 bytes .../test_unix_pipes.cpython-312.pyc | Bin 0 -> 17330 bytes .../__pycache__/test_util.cpython-312.pyc | Bin 0 -> 16285 bytes .../test_wait_for_object.cpython-312.pyc | Bin 0 -> 12670 bytes .../test_windows_pipes.cpython-312.pyc | Bin 0 -> 11622 bytes .../trio/_tests/check_type_completeness.py | 246 + .../trio/_tests/module_with_deprecations.py | 24 + .../trio/_tests/pytest_plugin.py | 54 + .../site-packages/trio/_tests/test_abc.py | 72 + .../site-packages/trio/_tests/test_channel.py | 413 + .../trio/_tests/test_contextvars.py | 56 + .../trio/_tests/test_deprecate.py | 283 + ...deprecate_strict_exception_groups_false.py | 64 + .../site-packages/trio/_tests/test_dtls.py | 900 ++ .../site-packages/trio/_tests/test_exports.py | 574 ++ .../site-packages/trio/_tests/test_fakenet.py | 313 + .../site-packages/trio/_tests/test_file_io.py | 269 + .../trio/_tests/test_highlevel_generic.py | 98 + .../test_highlevel_open_tcp_listeners.py | 410 + .../_tests/test_highlevel_open_tcp_stream.py | 686 ++ .../_tests/test_highlevel_open_unix_stream.py | 86 + .../_tests/test_highlevel_serve_listeners.py | 183 + .../trio/_tests/test_highlevel_socket.py | 330 + .../trio/_tests/test_highlevel_ssl_helpers.py | 166 + .../site-packages/trio/_tests/test_path.py | 275 + .../site-packages/trio/_tests/test_repl.py | 242 + .../trio/_tests/test_scheduler_determinism.py | 47 + .../site-packages/trio/_tests/test_signals.py | 188 + .../site-packages/trio/_tests/test_socket.py | 1173 +++ .../site-packages/trio/_tests/test_ssl.py | 1366 +++ .../trio/_tests/test_subprocess.py | 696 ++ .../site-packages/trio/_tests/test_sync.py | 655 ++ .../site-packages/trio/_tests/test_testing.py | 684 ++ .../trio/_tests/test_testing_raisesgroup.py | 374 + .../site-packages/trio/_tests/test_threads.py | 1148 +++ .../trio/_tests/test_timeouts.py | 272 + .../site-packages/trio/_tests/test_tracing.py | 66 + .../site-packages/trio/_tests/test_trio.py | 8 + .../trio/_tests/test_unix_pipes.py | 282 + .../site-packages/trio/_tests/test_util.py | 275 + .../trio/_tests/test_wait_for_object.py | 225 + .../trio/_tests/test_windows_pipes.py | 112 + .../trio/_tests/tools/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../test_gen_exports.cpython-312.pyc | Bin 0 -> 7077 bytes .../test_mypy_annotate.cpython-312.pyc | Bin 0 -> 4435 bytes .../trio/_tests/tools/test_gen_exports.py | 176 + .../trio/_tests/tools/test_mypy_annotate.py | 140 + .../__pycache__/check_wraps.cpython-312.pyc | Bin 0 -> 674 bytes .../open_memory_channel.cpython-312.pyc | Bin 0 -> 350 bytes .../__pycache__/path.cpython-312.pyc | Bin 0 -> 13861 bytes .../__pycache__/raisesgroup.cpython-312.pyc | Bin 0 -> 11233 bytes .../__pycache__/task_status.cpython-312.pyc | Bin 0 -> 1341 bytes .../trio/_tests/type_tests/check_wraps.py | 9 + .../_tests/type_tests/open_memory_channel.py | 4 + .../trio/_tests/type_tests/path.py | 144 + .../trio/_tests/type_tests/raisesgroup.py | 254 + .../trio/_tests/type_tests/task_status.py | 29 + .../python3.12/site-packages/trio/_threads.py | 604 ++ .../site-packages/trio/_timeouts.py | 193 + .../site-packages/trio/_tools/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/gen_exports.cpython-312.pyc | Bin 0 -> 14171 bytes .../__pycache__/mypy_annotate.cpython-312.pyc | Bin 0 -> 5834 bytes .../site-packages/trio/_tools/gen_exports.py | 412 + .../trio/_tools/mypy_annotate.py | 126 + .../site-packages/trio/_unix_pipes.py | 202 + .../python3.12/site-packages/trio/_util.py | 409 + .../python3.12/site-packages/trio/_version.py | 3 + .../site-packages/trio/_wait_for_object.py | 67 + .../site-packages/trio/_windows_pipes.py | 144 + env/lib/python3.12/site-packages/trio/abc.py | 23 + .../site-packages/trio/from_thread.py | 13 + .../python3.12/site-packages/trio/lowlevel.py | 85 + .../python3.12/site-packages/trio/py.typed | 0 .../python3.12/site-packages/trio/socket.py | 590 ++ .../site-packages/trio/testing/__init__.py | 39 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1212 bytes .../_check_streams.cpython-312.pyc | Bin 0 -> 40226 bytes .../__pycache__/_checkpoints.cpython-312.pyc | Bin 0 -> 2818 bytes .../__pycache__/_fake_net.cpython-312.pyc | Bin 0 -> 26952 bytes .../_memory_streams.cpython-312.pyc | Bin 0 -> 29857 bytes .../__pycache__/_network.cpython-312.pyc | Bin 0 -> 1728 bytes .../__pycache__/_raises_group.cpython-312.pyc | Bin 0 -> 22173 bytes .../__pycache__/_sequencer.cpython-312.pyc | Bin 0 -> 4040 bytes .../__pycache__/_trio_test.cpython-312.pyc | Bin 0 -> 2164 bytes .../trio/testing/_check_streams.py | 572 ++ .../trio/testing/_checkpoints.py | 69 + .../site-packages/trio/testing/_fake_net.py | 578 ++ .../trio/testing/_memory_streams.py | 626 ++ .../site-packages/trio/testing/_network.py | 36 + .../trio/testing/_raises_group.py | 568 ++ .../site-packages/trio/testing/_sequencer.py | 87 + .../site-packages/trio/testing/_trio_test.py | 50 + .../site-packages/trio/to_thread.py | 4 + .../trio_websocket-0.11.1.dist-info/INSTALLER | 1 + .../trio_websocket-0.11.1.dist-info/LICENSE | 21 + .../trio_websocket-0.11.1.dist-info/METADATA | 117 + .../trio_websocket-0.11.1.dist-info/RECORD | 12 + .../trio_websocket-0.11.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/trio_websocket/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 758 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 71974 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 232 bytes .../site-packages/trio_websocket/_impl.py | 1444 +++ .../site-packages/trio_websocket/_version.py | 1 + .../INSTALLER | 1 + .../LICENSE | 279 + .../METADATA | 67 + .../typing_extensions-4.12.2.dist-info/RECORD | 7 + .../typing_extensions-4.12.2.dist-info/WHEEL | 4 + .../site-packages/typing_extensions.py | 3641 +++++++ .../urllib3-2.2.3.dist-info/INSTALLER | 1 + .../urllib3-2.2.3.dist-info/METADATA | 155 + .../urllib3-2.2.3.dist-info/RECORD | 79 + .../urllib3-2.2.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7323 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6870 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22612 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10639 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 600 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 35753 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39751 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 15845 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12067 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3516 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24044 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 50456 bytes .../site-packages/urllib3/_base_connection.py | 172 + .../site-packages/urllib3/_collections.py | 483 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 16 + .../site-packages/urllib3/connection.py | 1033 ++ .../site-packages/urllib3/connectionpool.py | 1182 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 27287 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8184 bytes .../urllib3/contrib/emscripten/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 914 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10248 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 18384 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1434 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12711 bytes .../urllib3/contrib/emscripten/connection.py | 254 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 418 + .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 285 + .../urllib3/contrib/pyopenssl.py | 552 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 321 + .../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 0 -> 1759 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 16980 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3670 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 637 ++ .../python3.12/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1265 +++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1019 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4748 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1231 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8045 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2890 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20305 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 16719 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5551 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13321 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11703 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16237 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 2008 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3454 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 256 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 533 + .../site-packages/urllib3/util/ssl_.py | 513 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 276 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 471 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../INSTALLER | 1 + .../webdriver_manager-4.0.2.dist-info/LICENSE | 201 + .../METADATA | 399 + .../webdriver_manager-4.0.2.dist-info/RECORD | 56 + .../REQUESTED | 0 .../webdriver_manager-4.0.2.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../webdriver_manager/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 234 bytes .../__pycache__/chrome.cpython-312.pyc | Bin 0 -> 2636 bytes .../__pycache__/firefox.cpython-312.pyc | Bin 0 -> 2687 bytes .../__pycache__/microsoft.cpython-312.pyc | Bin 0 -> 3712 bytes .../__pycache__/opera.cpython-312.pyc | Bin 0 -> 2745 bytes .../site-packages/webdriver_manager/chrome.py | 55 + .../webdriver_manager/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../core/__pycache__/archive.cpython-312.pyc | Bin 0 -> 1494 bytes .../core/__pycache__/config.cpython-312.pyc | Bin 0 -> 1861 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 629 bytes .../download_manager.cpython-312.pyc | Bin 0 -> 2660 bytes .../core/__pycache__/driver.cpython-312.pyc | Bin 0 -> 3931 bytes .../__pycache__/driver_cache.cpython-312.pyc | Bin 0 -> 9204 bytes .../__pycache__/file_manager.cpython-312.pyc | Bin 0 -> 6421 bytes .../core/__pycache__/http.cpython-312.pyc | Bin 0 -> 2524 bytes .../core/__pycache__/logger.cpython-312.pyc | Bin 0 -> 1173 bytes .../core/__pycache__/manager.cpython-312.pyc | Bin 0 -> 2619 bytes .../__pycache__/os_manager.cpython-312.pyc | Bin 0 -> 9513 bytes .../core/__pycache__/utils.cpython-312.pyc | Bin 0 -> 3773 bytes .../webdriver_manager/core/archive.py | 23 + .../webdriver_manager/core/config.py | 41 + .../webdriver_manager/core/constants.py | 7 + .../core/download_manager.py | 42 + .../webdriver_manager/core/driver.py | 77 + .../webdriver_manager/core/driver_cache.py | 164 + .../webdriver_manager/core/file_manager.py | 94 + .../webdriver_manager/core/http.py | 38 + .../webdriver_manager/core/logger.py | 32 + .../webdriver_manager/core/manager.py | 45 + .../webdriver_manager/core/os_manager.py | 163 + .../webdriver_manager/core/utils.py | 63 + .../webdriver_manager/drivers/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 216 bytes .../__pycache__/chrome.cpython-312.pyc | Bin 0 -> 5228 bytes .../drivers/__pycache__/edge.cpython-312.pyc | Bin 0 -> 3072 bytes .../__pycache__/firefox.cpython-312.pyc | Bin 0 -> 3293 bytes .../drivers/__pycache__/ie.cpython-312.pyc | Bin 0 -> 4250 bytes .../drivers/__pycache__/opera.cpython-312.pyc | Bin 0 -> 3058 bytes .../webdriver_manager/drivers/chrome.py | 97 + .../webdriver_manager/drivers/edge.py | 55 + .../webdriver_manager/drivers/firefox.py | 57 + .../webdriver_manager/drivers/ie.py | 82 + .../webdriver_manager/drivers/opera.py | 55 + .../webdriver_manager/firefox.py | 51 + .../webdriver_manager/microsoft.py | 75 + .../site-packages/webdriver_manager/opera.py | 50 + .../site-packages/webdriver_manager/py.typed | 0 .../site-packages/websocket/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1047 bytes .../__pycache__/_abnf.cpython-312.pyc | Bin 0 -> 18148 bytes .../__pycache__/_app.cpython-312.pyc | Bin 0 -> 29528 bytes .../__pycache__/_cookiejar.cpython-312.pyc | Bin 0 -> 3063 bytes .../__pycache__/_core.cpython-312.pyc | Bin 0 -> 25720 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 0 -> 3349 bytes .../__pycache__/_handshake.cpython-312.pyc | Bin 0 -> 8806 bytes .../__pycache__/_http.cpython-312.pyc | Bin 0 -> 14365 bytes .../__pycache__/_logging.cpython-312.pyc | Bin 0 -> 3531 bytes .../__pycache__/_socket.cpython-312.pyc | Bin 0 -> 6763 bytes .../__pycache__/_ssl_compat.cpython-312.pyc | Bin 0 -> 1703 bytes .../__pycache__/_url.cpython-312.pyc | Bin 0 -> 6362 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 4901 bytes .../__pycache__/_wsdump.cpython-312.pyc | Bin 0 -> 11638 bytes .../site-packages/websocket/_abnf.py | 453 + .../site-packages/websocket/_app.py | 677 ++ .../site-packages/websocket/_cookiejar.py | 75 + .../site-packages/websocket/_core.py | 647 ++ .../site-packages/websocket/_exceptions.py | 94 + .../site-packages/websocket/_handshake.py | 202 + .../site-packages/websocket/_http.py | 373 + .../site-packages/websocket/_logging.py | 106 + .../site-packages/websocket/_socket.py | 188 + .../site-packages/websocket/_ssl_compat.py | 48 + .../site-packages/websocket/_url.py | 190 + .../site-packages/websocket/_utils.py | 459 + .../site-packages/websocket/_wsdump.py | 244 + .../site-packages/websocket/py.typed | 0 .../site-packages/websocket/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../__pycache__/echo-server.cpython-312.pyc | Bin 0 -> 1314 bytes .../__pycache__/test_abnf.cpython-312.pyc | Bin 0 -> 6309 bytes .../__pycache__/test_app.cpython-312.pyc | Bin 0 -> 16883 bytes .../test_cookiejar.cpython-312.pyc | Bin 0 -> 5662 bytes .../__pycache__/test_http.cpython-312.pyc | Bin 0 -> 11379 bytes .../__pycache__/test_url.cpython-312.pyc | Bin 0 -> 19421 bytes .../test_websocket.cpython-312.pyc | Bin 0 -> 27199 bytes .../websocket/tests/data/header01.txt | 6 + .../websocket/tests/data/header02.txt | 6 + .../websocket/tests/data/header03.txt | 8 + .../websocket/tests/echo-server.py | 23 + .../websocket/tests/test_abnf.py | 125 + .../site-packages/websocket/tests/test_app.py | 352 + .../websocket/tests/test_cookiejar.py | 123 + .../websocket/tests/test_http.py | 370 + .../site-packages/websocket/tests/test_url.py | 464 + .../websocket/tests/test_websocket.py | 497 + .../INSTALLER | 1 + .../websocket_client-1.8.0.dist-info/LICENSE | 203 + .../websocket_client-1.8.0.dist-info/METADATA | 184 + .../websocket_client-1.8.0.dist-info/RECORD | 56 + .../websocket_client-1.8.0.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../wsproto-1.2.0.dist-info/INSTALLER | 1 + .../wsproto-1.2.0.dist-info/LICENSE | 21 + .../wsproto-1.2.0.dist-info/METADATA | 177 + .../wsproto-1.2.0.dist-info/RECORD | 23 + .../wsproto-1.2.0.dist-info/WHEEL | 5 + .../wsproto-1.2.0.dist-info/top_level.txt | 1 + .../site-packages/wsproto/__init__.py | 94 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4388 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 8690 bytes .../__pycache__/events.cpython-312.pyc | Bin 0 -> 10544 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 0 -> 13734 bytes .../frame_protocol.cpython-312.pyc | Bin 0 -> 26274 bytes .../__pycache__/handshake.cpython-312.pyc | Bin 0 -> 20892 bytes .../__pycache__/typing.cpython-312.pyc | Bin 0 -> 305 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 3732 bytes .../site-packages/wsproto/connection.py | 189 + .../site-packages/wsproto/events.py | 295 + .../site-packages/wsproto/extensions.py | 315 + .../site-packages/wsproto/frame_protocol.py | 673 ++ .../site-packages/wsproto/handshake.py | 491 + .../python3.12/site-packages/wsproto/py.typed | 1 + .../site-packages/wsproto/typing.py | 3 + .../site-packages/wsproto/utilities.py | 88 + env/lib64 | 1 + env/pyvenv.cfg | 5 + 2389 files changed, 415877 insertions(+) create mode 100644 env/bin/Activate.ps1 create mode 100644 env/bin/activate create mode 100644 env/bin/activate.csh create mode 100644 env/bin/activate.fish create mode 100755 env/bin/dotenv create mode 100755 env/bin/normalizer create mode 100755 env/bin/pip create mode 100755 env/bin/pip3 create mode 100755 env/bin/pip3.12 create mode 120000 env/bin/python create mode 120000 env/bin/python3 create mode 120000 env/bin/python3.12 create mode 100755 env/bin/wsdump create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/__pycache__/socks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/__pycache__/sockshandler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__init__.py create mode 100644 env/lib/python3.12/site-packages/attr/__init__.pyi create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_cmp.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_next_gen.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/_version_info.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attr/_cmp.py create mode 100644 env/lib/python3.12/site-packages/attr/_cmp.pyi create mode 100644 env/lib/python3.12/site-packages/attr/_compat.py create mode 100644 env/lib/python3.12/site-packages/attr/_config.py create mode 100644 env/lib/python3.12/site-packages/attr/_funcs.py create mode 100644 env/lib/python3.12/site-packages/attr/_make.py create mode 100644 env/lib/python3.12/site-packages/attr/_next_gen.py create mode 100644 env/lib/python3.12/site-packages/attr/_typing_compat.pyi create mode 100644 env/lib/python3.12/site-packages/attr/_version_info.py create mode 100644 env/lib/python3.12/site-packages/attr/_version_info.pyi create mode 100644 env/lib/python3.12/site-packages/attr/converters.py create mode 100644 env/lib/python3.12/site-packages/attr/converters.pyi create mode 100644 env/lib/python3.12/site-packages/attr/exceptions.py create mode 100644 env/lib/python3.12/site-packages/attr/exceptions.pyi create mode 100644 env/lib/python3.12/site-packages/attr/filters.py create mode 100644 env/lib/python3.12/site-packages/attr/filters.pyi create mode 100644 env/lib/python3.12/site-packages/attr/py.typed create mode 100644 env/lib/python3.12/site-packages/attr/setters.py create mode 100644 env/lib/python3.12/site-packages/attr/setters.pyi create mode 100644 env/lib/python3.12/site-packages/attr/validators.py create mode 100644 env/lib/python3.12/site-packages/attr/validators.pyi create mode 100644 env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.12/site-packages/attrs/__init__.py create mode 100644 env/lib/python3.12/site-packages/attrs/__init__.pyi create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/converters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/setters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/__pycache__/validators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/attrs/converters.py create mode 100644 env/lib/python3.12/site-packages/attrs/exceptions.py create mode 100644 env/lib/python3.12/site-packages/attrs/filters.py create mode 100644 env/lib/python3.12/site-packages/attrs/py.typed create mode 100644 env/lib/python3.12/site-packages/attrs/setters.py create mode 100644 env/lib/python3.12/site-packages/attrs/validators.py create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/certifi/__init__.py create mode 100644 env/lib/python3.12/site-packages/certifi/__main__.py create mode 100644 env/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/certifi/cacert.pem create mode 100644 env/lib/python3.12/site-packages/certifi/core.py create mode 100644 env/lib/python3.12/site-packages/certifi/py.typed create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__init__.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__main__.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/legacy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/md.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/api.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/cd.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/constant.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/legacy.py create mode 100755 env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/md.py create mode 100755 env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/models.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/py.typed create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/utils.py create mode 100644 env/lib/python3.12/site-packages/charset_normalizer/version.py create mode 100644 env/lib/python3.12/site-packages/dotenv/__init__.py create mode 100644 env/lib/python3.12/site-packages/dotenv/__main__.py create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/variables.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/dotenv/cli.py create mode 100644 env/lib/python3.12/site-packages/dotenv/ipython.py create mode 100644 env/lib/python3.12/site-packages/dotenv/main.py create mode 100644 env/lib/python3.12/site-packages/dotenv/parser.py create mode 100644 env/lib/python3.12/site-packages/dotenv/py.typed create mode 100644 env/lib/python3.12/site-packages/dotenv/variables.py create mode 100644 env/lib/python3.12/site-packages/dotenv/version.py create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/LICENSE.txt create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/h11-0.14.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/h11/__init__.py create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_abnf.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_events.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_readers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/__pycache__/_writers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/_abnf.py create mode 100644 env/lib/python3.12/site-packages/h11/_connection.py create mode 100644 env/lib/python3.12/site-packages/h11/_events.py create mode 100644 env/lib/python3.12/site-packages/h11/_headers.py create mode 100644 env/lib/python3.12/site-packages/h11/_readers.py create mode 100644 env/lib/python3.12/site-packages/h11/_receivebuffer.py create mode 100644 env/lib/python3.12/site-packages/h11/_state.py create mode 100644 env/lib/python3.12/site-packages/h11/_util.py create mode 100644 env/lib/python3.12/site-packages/h11/_version.py create mode 100644 env/lib/python3.12/site-packages/h11/_writers.py create mode 100644 env/lib/python3.12/site-packages/h11/py.typed create mode 100644 env/lib/python3.12/site-packages/h11/tests/__init__.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_against_stdlib_http.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_events.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_headers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_receivebuffer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_state.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/__pycache__/test_util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/h11/tests/data/test-file create mode 100644 env/lib/python3.12/site-packages/h11/tests/helpers.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_against_stdlib_http.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_connection.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_events.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_headers.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_helpers.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_io.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_receivebuffer.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_state.py create mode 100644 env/lib/python3.12/site-packages/h11/tests/test_util.py create mode 100644 env/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md create mode 100644 env/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/idna/__init__.py create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/idna/codec.py create mode 100644 env/lib/python3.12/site-packages/idna/compat.py create mode 100644 env/lib/python3.12/site-packages/idna/core.py create mode 100644 env/lib/python3.12/site-packages/idna/idnadata.py create mode 100644 env/lib/python3.12/site-packages/idna/intranges.py create mode 100644 env/lib/python3.12/site-packages/idna/package_data.py create mode 100644 env/lib/python3.12/site-packages/idna/py.typed create mode 100644 env/lib/python3.12/site-packages/idna/uts46data.py create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.APACHE2 create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.MIT create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/outcome/__init__.py create mode 100644 env/lib/python3.12/site-packages/outcome/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/outcome/__pycache__/_impl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/outcome/__pycache__/_util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/outcome/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/outcome/_impl.py create mode 100644 env/lib/python3.12/site-packages/outcome/_util.py create mode 100644 env/lib/python3.12/site-packages/outcome/_version.py create mode 100644 env/lib/python3.12/site-packages/outcome/py.typed create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.APACHE create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.BSD create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/packaging-24.2.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/packaging/__init__.py create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/_elffile.py create mode 100644 env/lib/python3.12/site-packages/packaging/_manylinux.py create mode 100644 env/lib/python3.12/site-packages/packaging/_musllinux.py create mode 100644 env/lib/python3.12/site-packages/packaging/_parser.py create mode 100644 env/lib/python3.12/site-packages/packaging/_structures.py create mode 100644 env/lib/python3.12/site-packages/packaging/_tokenizer.py create mode 100644 env/lib/python3.12/site-packages/packaging/licenses/__init__.py create mode 100644 env/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/packaging/licenses/_spdx.py create mode 100644 env/lib/python3.12/site-packages/packaging/markers.py create mode 100644 env/lib/python3.12/site-packages/packaging/metadata.py create mode 100644 env/lib/python3.12/site-packages/packaging/py.typed create mode 100644 env/lib/python3.12/site-packages/packaging/requirements.py create mode 100644 env/lib/python3.12/site-packages/packaging/specifiers.py create mode 100644 env/lib/python3.12/site-packages/packaging/tags.py create mode 100644 env/lib/python3.12/site-packages/packaging/utils.py create mode 100644 env/lib/python3.12/site-packages/packaging/version.py create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/AUTHORS.txt create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/LICENSE.txt create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/REQUESTED create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/entry_points.txt create mode 100644 env/lib/python3.12/site-packages/pip-24.3.1.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/pip/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 env/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/retry.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/distro/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 env/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 env/lib/python3.12/site-packages/pip/py.typed create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt create mode 100644 env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/requests-2.32.3.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/requests/__init__.py create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/api.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/certs.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/help.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/models.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/requests/__version__.py create mode 100644 env/lib/python3.12/site-packages/requests/_internal_utils.py create mode 100644 env/lib/python3.12/site-packages/requests/adapters.py create mode 100644 env/lib/python3.12/site-packages/requests/api.py create mode 100644 env/lib/python3.12/site-packages/requests/auth.py create mode 100644 env/lib/python3.12/site-packages/requests/certs.py create mode 100644 env/lib/python3.12/site-packages/requests/compat.py create mode 100644 env/lib/python3.12/site-packages/requests/cookies.py create mode 100644 env/lib/python3.12/site-packages/requests/exceptions.py create mode 100644 env/lib/python3.12/site-packages/requests/help.py create mode 100644 env/lib/python3.12/site-packages/requests/hooks.py create mode 100644 env/lib/python3.12/site-packages/requests/models.py create mode 100644 env/lib/python3.12/site-packages/requests/packages.py create mode 100644 env/lib/python3.12/site-packages/requests/sessions.py create mode 100644 env/lib/python3.12/site-packages/requests/status_codes.py create mode 100644 env/lib/python3.12/site-packages/requests/structures.py create mode 100644 env/lib/python3.12/site-packages/requests/utils.py create mode 100644 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/INSTALLER create mode 100755 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/LICENSE create mode 100755 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/REQUESTED create mode 100755 env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/WHEEL create mode 100755 env/lib/python3.12/site-packages/selenium/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/__pycache__/types.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/common/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/common/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/common/__pycache__/exceptions.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/common/exceptions.py create mode 100755 env/lib/python3.12/site-packages/selenium/py.typed create mode 100755 env/lib/python3.12/site-packages/selenium/types.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/__pycache__/__init__.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chrome/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chrome/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chrome/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chromium/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chromium/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chromium/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/action_chains.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/alert.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/by.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/desired_capabilities.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/driver_finder.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/keys.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/print_page_options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/proxy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/selenium_manager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/timeouts.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/virtual_authenticator.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/window.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/action_chains.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/action_builder.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/input_device.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/interaction.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_actions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_input.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/mouse_button.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_actions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_input.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/wheel_actions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/wheel_input.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/action_builder.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/input_device.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/interaction.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_actions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_input.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/mouse_button.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_actions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_input.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_actions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_input.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/alert.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/cdp.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/script.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/session.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/cdp.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/console.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/script.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/session.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/by.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/desired_capabilities.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/accessibility.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/animation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/audits.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/autofill.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/background_service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/bluetooth_emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/browser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cache_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cast.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/css.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/database.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/device_access.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/device_orientation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_snapshot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/event_breakpoints.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/fed_cm.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/fetch.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/file_system.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/headless_experimental.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/heap_profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/indexed_db.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/input_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/inspector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/layer_tree.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/media.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/memory.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/network.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/overlay.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/page.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/performance.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/performance_timeline.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/preload.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/pwa.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/runtime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/schema.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/security.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/service_worker.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/system_info.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/target.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tethering.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tracing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/web_audio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/web_authn.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/accessibility.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/animation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/audits.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/autofill.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/background_service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/bluetooth_emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/browser.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/cache_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/cast.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/console.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/css.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/database.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/device_access.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/device_orientation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/dom.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/dom_debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/dom_snapshot.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/dom_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/event_breakpoints.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/extensions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/fed_cm.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/fetch.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/file_system.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/headless_experimental.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/heap_profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/indexed_db.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/input_.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/inspector.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/io.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/layer_tree.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/log.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/media.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/memory.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/network.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/overlay.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/page.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/performance.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/performance_timeline.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/preload.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/pwa.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/py.typed create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/runtime.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/schema.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/security.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/service_worker.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/system_info.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/target.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tethering.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tracing.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/util.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_audio.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_authn.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/accessibility.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/animation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/audits.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/autofill.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/background_service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/bluetooth_emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/browser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cache_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cast.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/css.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/database.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/device_access.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/device_orientation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom_debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom_snapshot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/event_breakpoints.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fed_cm.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fetch.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/file_system.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/headless_experimental.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/heap_profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/indexed_db.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/input_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/inspector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/layer_tree.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/media.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/memory.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/network.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/overlay.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/page.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/performance.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/performance_timeline.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/preload.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/pwa.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/runtime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/schema.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/security.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/service_worker.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/system_info.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/target.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/tethering.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/tracing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/web_audio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/web_authn.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/accessibility.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/animation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/audits.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/autofill.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/background_service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/bluetooth_emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/browser.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/cache_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/cast.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/console.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/css.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/database.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/device_access.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/device_orientation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/dom.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/dom_debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/dom_snapshot.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/dom_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/event_breakpoints.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/extensions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/fed_cm.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/fetch.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/file_system.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/headless_experimental.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/heap_profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/indexed_db.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/input_.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/inspector.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/io.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/layer_tree.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/log.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/media.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/memory.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/network.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/overlay.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/page.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/performance.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/performance_timeline.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/preload.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/pwa.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/py.typed create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/runtime.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/schema.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/security.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/service_worker.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/system_info.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/target.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tethering.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tracing.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/util.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_audio.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_authn.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/accessibility.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/animation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/audits.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/autofill.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/background_service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/bluetooth_emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/browser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cache_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cast.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/css.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/database.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_access.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_orientation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_snapshot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/event_breakpoints.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fed_cm.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fetch.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/file_system.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/headless_experimental.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/heap_profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/indexed_db.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/input_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/inspector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/layer_tree.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/media.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/memory.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/network.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/overlay.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/page.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/performance.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/performance_timeline.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/preload.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/pwa.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/runtime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/schema.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/security.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/service_worker.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/system_info.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/target.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/tethering.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/tracing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/web_audio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/web_authn.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/accessibility.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/animation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/audits.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/autofill.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/background_service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/bluetooth_emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/browser.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/cache_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/cast.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/console.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/css.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/database.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/device_access.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/device_orientation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/dom.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/dom_debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/dom_snapshot.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/dom_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/event_breakpoints.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/extensions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/fed_cm.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/fetch.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/file_system.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/headless_experimental.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/heap_profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/indexed_db.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/input_.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/inspector.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/io.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/layer_tree.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/log.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/media.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/memory.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/network.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/overlay.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/page.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/performance.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/performance_timeline.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/preload.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/pwa.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/py.typed create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/runtime.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/schema.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/security.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/service_worker.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/system_info.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/target.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tethering.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tracing.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/util.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_audio.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_authn.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/accessibility.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/animation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/application_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/audits.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/background_service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/browser.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/cache_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/cast.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/console.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/css.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/database.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/device_orientation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_debugger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_snapshot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/emulation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/fetch.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/headless_experimental.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/heap_profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/indexed_db.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/input_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/inspector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/layer_tree.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/log.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/media.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/memory.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/network.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/overlay.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/page.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/performance.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/profiler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/runtime.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/schema.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/security.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/service_worker.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/storage.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/system_info.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/target.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tethering.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tracing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/web_audio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/web_authn.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/accessibility.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/animation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/application_cache.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/audits.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/background_service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/browser.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/cache_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/cast.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/console.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/css.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/database.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/device_orientation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/dom.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/dom_debugger.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/dom_snapshot.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/dom_storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/emulation.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/fetch.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/headless_experimental.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/heap_profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/indexed_db.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/input_.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/inspector.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/io.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/layer_tree.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/log.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/media.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/memory.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/network.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/overlay.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/page.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/performance.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/profiler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/py.typed create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/runtime.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/schema.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/security.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/service_worker.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/storage.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/system_info.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/target.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/tethering.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/tracing.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/util.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/web_audio.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/web_authn.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/driver_finder.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/fedcm/__pycache__/account.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/common/fedcm/__pycache__/dialog.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/fedcm/account.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/fedcm/dialog.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/keys.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/linux/selenium-manager create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/log.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/macos/selenium-manager create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/mutation-listener.js create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/print_page_options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/proxy.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/selenium_manager.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/timeouts.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/utils.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/virtual_authenticator.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/window.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/common/windows/selenium-manager.exe create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/edge/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/edge/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/edge/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/edge/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/edge/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/edge/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/edge/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/edge/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/edge/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/edge/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/firefox_binary.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/firefox_profile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/firefox/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/firefox_binary.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/firefox_profile.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/firefox/webdriver_prefs.json create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/ie/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/ie/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/ie/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/ie/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/ie/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/ie/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/ie/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/ie/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/bidi_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/client_config.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/command.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/errorhandler.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/fedcm.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/file_detector.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/locator_converter.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/mobile.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/script_key.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/shadowroot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/switch_to.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/webdriver.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/webelement.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/remote/__pycache__/websocket_connection.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/bidi_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/client_config.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/command.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/errorhandler.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/fedcm.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/file_detector.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/findElements.js create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/getAttribute.js create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/isDisplayed.js create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/locator_converter.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/mobile.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/script_key.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/shadowroot.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/switch_to.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/utils.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/webelement.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/remote/websocket_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/permissions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/remote_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/safari/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/permissions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/remote_connection.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/safari/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/abstract_event_listener.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/color.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/event_firing_webdriver.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/events.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/expected_conditions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/relative_locator.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/select.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/ui.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/support/__pycache__/wait.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/abstract_event_listener.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/color.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/event_firing_webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/events.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/expected_conditions.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/relative_locator.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/select.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/ui.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/support/wait.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/webkitgtk/webdriver.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/__init__.py create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/__pycache__/options.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/__pycache__/service.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/__pycache__/webdriver.cpython-312.pyc create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/options.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/service.py create mode 100755 env/lib/python3.12/site-packages/selenium/webdriver/wpewebkit/webdriver.py create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.APACHE2 create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/LICENSE.MIT create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/sniffio-1.3.1.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/sniffio/__init__.py create mode 100644 env/lib/python3.12/site-packages/sniffio/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sniffio/__pycache__/_impl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sniffio/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sniffio/_impl.py create mode 100644 env/lib/python3.12/site-packages/sniffio/_tests/__init__.py create mode 100644 env/lib/python3.12/site-packages/sniffio/_tests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sniffio/_tests/__pycache__/test_sniffio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sniffio/_tests/test_sniffio.py create mode 100644 env/lib/python3.12/site-packages/sniffio/_version.py create mode 100644 env/lib/python3.12/site-packages/sniffio/py.typed create mode 100644 env/lib/python3.12/site-packages/socks.py create mode 100644 env/lib/python3.12/site-packages/sockshandler.py create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/sortedcontainers-2.4.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/__init__.py create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/__pycache__/sorteddict.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/__pycache__/sortedlist.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/__pycache__/sortedset.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/sorteddict.py create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/sortedlist.py create mode 100644 env/lib/python3.12/site-packages/sortedcontainers/sortedset.py create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/LICENSE.APACHE2 create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/LICENSE.MIT create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.12/site-packages/trio-0.27.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/trio/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/__main__.py create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/__main__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_abc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_channel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_deprecate.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_dtls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_file_io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_generic.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_open_tcp_listeners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_open_tcp_stream.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_open_unix_stream.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_serve_listeners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_highlevel_ssl_helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_path.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_repl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_signals.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_ssl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_subprocess.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_sync.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_threads.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_timeouts.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_unix_pipes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_wait_for_object.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/_windows_pipes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/abc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/from_thread.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/lowlevel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/__pycache__/to_thread.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_abc.py create mode 100644 env/lib/python3.12/site-packages/trio/_channel.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_asyncgens.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_concat_tb.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_entry_queue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_generated_instrumentation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_generated_io_epoll.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_generated_io_kqueue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_generated_io_windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_generated_run.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_instrumentation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_io_common.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_io_epoll.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_io_kqueue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_io_windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_ki.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_local.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_mock_clock.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_parking_lot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_run.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_thread_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_traps.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_unbounded_queue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_wakeup_socketpair.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/__pycache__/_windows_cffi.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_asyncgens.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_concat_tb.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_entry_queue.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_exceptions.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_generated_instrumentation.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_generated_io_epoll.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_generated_io_kqueue.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_generated_io_windows.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_generated_run.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_instrumentation.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_io_common.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_io_epoll.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_io_kqueue.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_io_windows.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_ki.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_local.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_mock_clock.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_parking_lot.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_run.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_asyncgen.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_exceptiongroup_gc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_guest_mode.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_instrumentation.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_ki.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_local.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_mock_clock.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_parking_lot.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_run.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_thread_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_tutil.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_unbounded_queue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/test_windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/__pycache__/tutil.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_asyncgen.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_exceptiongroup_gc.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_guest_mode.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_instrumentation.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_io.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_ki.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_local.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_mock_clock.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_parking_lot.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_run.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_thread_cache.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_tutil.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_unbounded_queue.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/test_windows.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/tutil.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/type_tests/__pycache__/nursery_start.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/type_tests/__pycache__/run.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/type_tests/nursery_start.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_tests/type_tests/run.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_thread_cache.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_traps.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_unbounded_queue.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_wakeup_socketpair.py create mode 100644 env/lib/python3.12/site-packages/trio/_core/_windows_cffi.py create mode 100644 env/lib/python3.12/site-packages/trio/_deprecate.py create mode 100644 env/lib/python3.12/site-packages/trio/_dtls.py create mode 100644 env/lib/python3.12/site-packages/trio/_file_io.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_generic.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_open_tcp_listeners.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_open_tcp_stream.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_open_unix_stream.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_serve_listeners.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_socket.py create mode 100644 env/lib/python3.12/site-packages/trio/_highlevel_ssl_helpers.py create mode 100644 env/lib/python3.12/site-packages/trio/_path.py create mode 100644 env/lib/python3.12/site-packages/trio/_repl.py create mode 100644 env/lib/python3.12/site-packages/trio/_signals.py create mode 100644 env/lib/python3.12/site-packages/trio/_socket.py create mode 100644 env/lib/python3.12/site-packages/trio/_ssl.py create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess.py create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/__pycache__/kqueue.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/__pycache__/waitid.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/__pycache__/windows.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/kqueue.py create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/waitid.py create mode 100644 env/lib/python3.12/site-packages/trio/_subprocess_platform/windows.py create mode 100644 env/lib/python3.12/site-packages/trio/_sync.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/check_type_completeness.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/module_with_deprecations.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/pytest_plugin.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_abc.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_channel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_contextvars.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_deprecate.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_deprecate_strict_exception_groups_false.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_dtls.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_exports.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_fakenet.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_file_io.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_generic.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_open_tcp_listeners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_open_tcp_stream.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_open_unix_stream.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_serve_listeners.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_highlevel_ssl_helpers.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_path.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_repl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_scheduler_determinism.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_signals.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_ssl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_subprocess.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_sync.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_testing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_testing_raisesgroup.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_threads.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_timeouts.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_tracing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_trio.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_unix_pipes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_wait_for_object.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/__pycache__/test_windows_pipes.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/check_type_completeness.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/module_with_deprecations.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/pytest_plugin.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_abc.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_channel.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_contextvars.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_deprecate.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_deprecate_strict_exception_groups_false.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_dtls.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_exports.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_fakenet.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_file_io.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_generic.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_open_tcp_listeners.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_open_tcp_stream.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_open_unix_stream.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_serve_listeners.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_socket.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_highlevel_ssl_helpers.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_path.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_repl.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_scheduler_determinism.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_signals.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_socket.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_ssl.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_subprocess.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_sync.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_testing.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_testing_raisesgroup.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_threads.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_timeouts.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_tracing.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_trio.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_unix_pipes.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_util.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_wait_for_object.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/test_windows_pipes.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/__pycache__/test_gen_exports.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/__pycache__/test_mypy_annotate.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/test_gen_exports.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/tools/test_mypy_annotate.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/__pycache__/check_wraps.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/__pycache__/open_memory_channel.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/__pycache__/path.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/__pycache__/raisesgroup.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/__pycache__/task_status.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/check_wraps.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/open_memory_channel.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/path.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/raisesgroup.py create mode 100644 env/lib/python3.12/site-packages/trio/_tests/type_tests/task_status.py create mode 100644 env/lib/python3.12/site-packages/trio/_threads.py create mode 100644 env/lib/python3.12/site-packages/trio/_timeouts.py create mode 100644 env/lib/python3.12/site-packages/trio/_tools/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/_tools/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tools/__pycache__/gen_exports.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tools/__pycache__/mypy_annotate.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/_tools/gen_exports.py create mode 100644 env/lib/python3.12/site-packages/trio/_tools/mypy_annotate.py create mode 100644 env/lib/python3.12/site-packages/trio/_unix_pipes.py create mode 100644 env/lib/python3.12/site-packages/trio/_util.py create mode 100644 env/lib/python3.12/site-packages/trio/_version.py create mode 100644 env/lib/python3.12/site-packages/trio/_wait_for_object.py create mode 100644 env/lib/python3.12/site-packages/trio/_windows_pipes.py create mode 100644 env/lib/python3.12/site-packages/trio/abc.py create mode 100644 env/lib/python3.12/site-packages/trio/from_thread.py create mode 100644 env/lib/python3.12/site-packages/trio/lowlevel.py create mode 100644 env/lib/python3.12/site-packages/trio/py.typed create mode 100644 env/lib/python3.12/site-packages/trio/socket.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_check_streams.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_checkpoints.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_fake_net.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_memory_streams.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_network.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_raises_group.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_sequencer.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/__pycache__/_trio_test.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio/testing/_check_streams.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_checkpoints.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_fake_net.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_memory_streams.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_network.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_raises_group.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_sequencer.py create mode 100644 env/lib/python3.12/site-packages/trio/testing/_trio_test.py create mode 100644 env/lib/python3.12/site-packages/trio/to_thread.py create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/trio_websocket-0.11.1.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/trio_websocket/__init__.py create mode 100644 env/lib/python3.12/site-packages/trio_websocket/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio_websocket/__pycache__/_impl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio_websocket/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/trio_websocket/_impl.py create mode 100644 env/lib/python3.12/site-packages/trio_websocket/_version.py create mode 100644 env/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/typing_extensions.py create mode 100644 env/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/licenses/LICENSE.txt create mode 100644 env/lib/python3.12/site-packages/urllib3/__init__.py create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/_base_connection.py create mode 100644 env/lib/python3.12/site-packages/urllib3/_collections.py create mode 100644 env/lib/python3.12/site-packages/urllib3/_request_methods.py create mode 100644 env/lib/python3.12/site-packages/urllib3/_version.py create mode 100644 env/lib/python3.12/site-packages/urllib3/connection.py create mode 100644 env/lib/python3.12/site-packages/urllib3/connectionpool.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/__init__.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 env/lib/python3.12/site-packages/urllib3/contrib/socks.py create mode 100644 env/lib/python3.12/site-packages/urllib3/exceptions.py create mode 100644 env/lib/python3.12/site-packages/urllib3/fields.py create mode 100644 env/lib/python3.12/site-packages/urllib3/filepost.py create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/__init__.py create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/connection.py create mode 100644 env/lib/python3.12/site-packages/urllib3/http2/probe.py create mode 100644 env/lib/python3.12/site-packages/urllib3/poolmanager.py create mode 100644 env/lib/python3.12/site-packages/urllib3/py.typed create mode 100644 env/lib/python3.12/site-packages/urllib3/response.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__init__.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/urllib3/util/connection.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/proxy.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/request.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/response.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/retry.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/ssl_.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/ssltransport.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/timeout.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/url.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/util.py create mode 100644 env/lib/python3.12/site-packages/urllib3/util/wait.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/REQUESTED create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/webdriver_manager-4.0.2.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__init__.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__pycache__/chrome.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__pycache__/firefox.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__pycache__/microsoft.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/__pycache__/opera.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/chrome.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__init__.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/archive.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/config.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/constants.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/download_manager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/driver.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/driver_cache.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/file_manager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/http.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/logger.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/manager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/os_manager.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/__pycache__/utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/archive.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/config.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/constants.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/download_manager.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/driver.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/driver_cache.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/file_manager.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/http.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/logger.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/manager.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/os_manager.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/core/utils.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__init__.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/chrome.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/edge.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/firefox.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/ie.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/__pycache__/opera.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/chrome.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/edge.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/firefox.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/ie.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/drivers/opera.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/firefox.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/microsoft.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/opera.py create mode 100644 env/lib/python3.12/site-packages/webdriver_manager/py.typed create mode 100644 env/lib/python3.12/site-packages/websocket/__init__.py create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_abnf.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_app.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_cookiejar.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_core.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_exceptions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_handshake.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_http.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_logging.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_socket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_ssl_compat.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_url.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_utils.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/__pycache__/_wsdump.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/_abnf.py create mode 100644 env/lib/python3.12/site-packages/websocket/_app.py create mode 100644 env/lib/python3.12/site-packages/websocket/_cookiejar.py create mode 100644 env/lib/python3.12/site-packages/websocket/_core.py create mode 100644 env/lib/python3.12/site-packages/websocket/_exceptions.py create mode 100644 env/lib/python3.12/site-packages/websocket/_handshake.py create mode 100644 env/lib/python3.12/site-packages/websocket/_http.py create mode 100644 env/lib/python3.12/site-packages/websocket/_logging.py create mode 100644 env/lib/python3.12/site-packages/websocket/_socket.py create mode 100644 env/lib/python3.12/site-packages/websocket/_ssl_compat.py create mode 100644 env/lib/python3.12/site-packages/websocket/_url.py create mode 100644 env/lib/python3.12/site-packages/websocket/_utils.py create mode 100644 env/lib/python3.12/site-packages/websocket/_wsdump.py create mode 100644 env/lib/python3.12/site-packages/websocket/py.typed create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__init__.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/echo-server.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_abnf.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_app.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_cookiejar.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_http.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_url.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/__pycache__/test_websocket.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/websocket/tests/data/header01.txt create mode 100644 env/lib/python3.12/site-packages/websocket/tests/data/header02.txt create mode 100644 env/lib/python3.12/site-packages/websocket/tests/data/header03.txt create mode 100644 env/lib/python3.12/site-packages/websocket/tests/echo-server.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_abnf.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_app.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_cookiejar.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_http.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_url.py create mode 100644 env/lib/python3.12/site-packages/websocket/tests/test_websocket.py create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.12/site-packages/websocket_client-1.8.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/INSTALLER create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/LICENSE create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/METADATA create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/RECORD create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/WHEEL create mode 100644 env/lib/python3.12/site-packages/wsproto-1.2.0.dist-info/top_level.txt create mode 100644 env/lib/python3.12/site-packages/wsproto/__init__.py create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/__init__.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/connection.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/events.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/extensions.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/frame_protocol.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/handshake.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/typing.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/__pycache__/utilities.cpython-312.pyc create mode 100644 env/lib/python3.12/site-packages/wsproto/connection.py create mode 100644 env/lib/python3.12/site-packages/wsproto/events.py create mode 100644 env/lib/python3.12/site-packages/wsproto/extensions.py create mode 100644 env/lib/python3.12/site-packages/wsproto/frame_protocol.py create mode 100644 env/lib/python3.12/site-packages/wsproto/handshake.py create mode 100644 env/lib/python3.12/site-packages/wsproto/py.typed create mode 100644 env/lib/python3.12/site-packages/wsproto/typing.py create mode 100644 env/lib/python3.12/site-packages/wsproto/utilities.py create mode 120000 env/lib64 create mode 100644 env/pyvenv.cfg diff --git a/env/bin/Activate.ps1 b/env/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/env/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.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/env/bin/activate b/env/bin/activate new file mode 100644 index 0000000..80f3020 --- /dev/null +++ b/env/bin/activate @@ -0,0 +1,70 @@ +# 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/muhammad/Documents/GitHub/100-Days-Of-Code/env") +else + # use the path as-is + export VIRTUAL_ENV="/home/muhammad/Documents/GitHub/100-Days-Of-Code/env" +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="(env) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(env) " + 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/env/bin/activate.csh b/env/bin/activate.csh new file mode 100644 index 0000000..d8782cf --- /dev/null +++ b/env/bin/activate.csh @@ -0,0 +1,27 @@ +# 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/muhammad/Documents/GitHub/100-Days-Of-Code/env" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(env) $prompt" + setenv VIRTUAL_ENV_PROMPT "(env) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/env/bin/activate.fish b/env/bin/activate.fish new file mode 100644 index 0000000..1379d05 --- /dev/null +++ b/env/bin/activate.fish @@ -0,0 +1,69 @@ +# 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/muhammad/Documents/GitHub/100-Days-Of-Code/env" + +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) "(env) " (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 "(env) " +end diff --git a/env/bin/dotenv b/env/bin/dotenv new file mode 100755 index 0000000..49a8389 --- /dev/null +++ b/env/bin/dotenv @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/env/bin/normalizer b/env/bin/normalizer new file mode 100755 index 0000000..9b4f6e6 --- /dev/null +++ b/env/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- 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/env/bin/pip b/env/bin/pip new file mode 100755 index 0000000..c6e1597 --- /dev/null +++ b/env/bin/pip @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- 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/env/bin/pip3 b/env/bin/pip3 new file mode 100755 index 0000000..c6e1597 --- /dev/null +++ b/env/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- 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/env/bin/pip3.12 b/env/bin/pip3.12 new file mode 100755 index 0000000..c6e1597 --- /dev/null +++ b/env/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- 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/env/bin/python b/env/bin/python new file mode 120000 index 0000000..acd4152 --- /dev/null +++ b/env/bin/python @@ -0,0 +1 @@ +/usr/bin/python \ No newline at end of file diff --git a/env/bin/python3 b/env/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/env/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/env/bin/python3.12 b/env/bin/python3.12 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/env/bin/python3.12 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/env/bin/wsdump b/env/bin/wsdump new file mode 100755 index 0000000..769cc34 --- /dev/null +++ b/env/bin/wsdump @@ -0,0 +1,8 @@ +#!/home/muhammad/Documents/GitHub/100-Days-Of-Code/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from websocket._wsdump import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/INSTALLER b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/LICENSE b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/LICENSE new file mode 100644 index 0000000..04b6b1f --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/LICENSE @@ -0,0 +1,22 @@ +Copyright 2006 Dan-Haim. 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 Dan Haim nor the names of his contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY DAN HAIM "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 DAN HAIM OR HIS 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, 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 DAMANGE. diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/METADATA b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/METADATA new file mode 100644 index 0000000..ae2ae34 --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/METADATA @@ -0,0 +1,321 @@ +Metadata-Version: 2.1 +Name: PySocks +Version: 1.7.1 +Summary: A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +Home-page: https://github.com/Anorov/PySocks +Author: Anorov +Author-email: anorov.vorona@gmail.com +License: BSD +Keywords: socks,proxy +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Description-Content-Type: text/markdown + +PySocks +======= + +PySocks lets you send traffic through SOCKS and HTTP proxy servers. It is a modern fork of [SocksiPy](http://socksipy.sourceforge.net/) with bug fixes and extra features. + +Acts as a drop-in replacement to the socket module. Seamlessly configure SOCKS proxies for any socket object by calling `socket_object.set_proxy()`. + +---------------- + +Features +======== + +* SOCKS proxy client for Python 2.7 and 3.4+ +* TCP supported +* UDP mostly supported (issues may occur in some edge cases) +* HTTP proxy client included but not supported or recommended (you should use urllib2's or requests' own HTTP proxy interface) +* urllib2 handler included. `pip install` / `setup.py install` will automatically install the `sockshandler` module. + +Installation +============ + + pip install PySocks + +Or download the tarball / `git clone` and... + + python setup.py install + +These will install both the `socks` and `sockshandler` modules. + +Alternatively, include just `socks.py` in your project. + +-------------------------------------------- + +*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP (not SOCKS) proxies, it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead. + +-------------------------------------------- + +Usage +===== + +## socks.socksocket ## + + import socks + + s = socks.socksocket() # Same API as socket.socket in the standard lib + + s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default + # Or + s.set_proxy(socks.SOCKS4, "localhost", 4444) + # Or + s.set_proxy(socks.HTTP, "5.5.5.5", 8888) + + # Can be treated identical to a regular socket object + s.connect(("www.somesite.com", 80)) + s.sendall("GET / HTTP/1.1 ...") + print s.recv(4096) + +## Monkeypatching ## + +To monkeypatch the entire standard library with a single default proxy: + + import urllib2 + import socket + import socks + + socks.set_default_proxy(socks.SOCKS5, "localhost") + socket.socket = socks.socksocket + + urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy + +Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. Monkeypatching is usually an anti-pattern in Python. + +## urllib2 Handler ## + +Example use case with the `sockshandler` urllib2 handler. Note that you must import both `socks` and `sockshandler`, as the handler is its own module separate from PySocks. The module is included in the PyPI package. + + import urllib2 + import socks + from sockshandler import SocksiPyHandler + + opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050)) + print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy + +-------------------------------------------- + +Original SocksiPy README attached below, amended to reflect API changes. + +-------------------------------------------- + +SocksiPy + +A Python SOCKS module. + +(C) 2006 Dan-Haim. All rights reserved. + +See LICENSE file for details. + + +*WHAT IS A SOCKS PROXY?* + +A SOCKS proxy is a proxy server at the TCP level. In other words, it acts as +a tunnel, relaying all traffic going through it without modifying it. +SOCKS proxies can be used to relay traffic using any network protocol that +uses TCP. + +*WHAT IS SOCKSIPY?* + +This Python module allows you to create TCP connections through a SOCKS +proxy without any special effort. +It also supports relaying UDP packets with a SOCKS5 proxy. + +*PROXY COMPATIBILITY* + +SocksiPy is compatible with three different types of proxies: + +1. SOCKS Version 4 (SOCKS4), including the SOCKS4a extension. +2. SOCKS Version 5 (SOCKS5). +3. HTTP Proxies which support tunneling using the CONNECT method. + +*SYSTEM REQUIREMENTS* + +Being written in Python, SocksiPy can run on any platform that has a Python +interpreter and TCP/IP support. +This module has been tested with Python 2.3 and should work with greater versions +just as well. + + +INSTALLATION +------------- + +Simply copy the file "socks.py" to your Python's `lib/site-packages` directory, +and you're ready to go. [Editor's note: it is better to use `python setup.py install` for PySocks] + + +USAGE +------ + +First load the socks module with the command: + + >>> import socks + >>> + +The socks module provides a class called `socksocket`, which is the base to all of the module's functionality. + +The `socksocket` object has the same initialization parameters as the normal socket +object to ensure maximal compatibility, however it should be noted that `socksocket` will only function with family being `AF_INET` and +type being either `SOCK_STREAM` or `SOCK_DGRAM`. +Generally, it is best to initialize the `socksocket` object with no parameters + + >>> s = socks.socksocket() + >>> + +The `socksocket` object has an interface which is very similiar to socket's (in fact +the `socksocket` class is derived from socket) with a few extra methods. +To select the proxy server you would like to use, use the `set_proxy` method, whose +syntax is: + + set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]]) + +Explanation of the parameters: + +`proxy_type` - The type of the proxy server. This can be one of three possible +choices: `PROXY_TYPE_SOCKS4`, `PROXY_TYPE_SOCKS5` and `PROXY_TYPE_HTTP` for SOCKS4, +SOCKS5 and HTTP servers respectively. `SOCKS4`, `SOCKS5`, and `HTTP` are all aliases, respectively. + +`addr` - The IP address or DNS name of the proxy server. + +`port` - The port of the proxy server. Defaults to 1080 for socks and 8080 for http. + +`rdns` - This is a boolean flag than modifies the behavior regarding DNS resolving. +If it is set to True, DNS resolving will be preformed remotely, on the server. +If it is set to False, DNS resolving will be preformed locally. Please note that +setting this to True with SOCKS4 servers actually use an extension to the protocol, +called SOCKS4a, which may not be supported on all servers (SOCKS5 and http servers +always support DNS). The default is True. + +`username` - For SOCKS5 servers, this allows simple username / password authentication +with the server. For SOCKS4 servers, this parameter will be sent as the userid. +This parameter is ignored if an HTTP server is being used. If it is not provided, +authentication will not be used (servers may accept unauthenticated requests). + +`password` - This parameter is valid only for SOCKS5 servers and specifies the +respective password for the username provided. + +Example of usage: + + >>> s.set_proxy(socks.SOCKS5, "socks.example.com") # uses default port 1080 + >>> s.set_proxy(socks.SOCKS4, "socks.test.com", 1081) + +After the set_proxy method has been called, simply call the connect method with the +traditional parameters to establish a connection through the proxy: + + >>> s.connect(("www.sourceforge.net", 80)) + >>> + +Connection will take a bit longer to allow negotiation with the proxy server. +Please note that calling connect without calling `set_proxy` earlier will connect +without a proxy (just like a regular socket). + +Errors: Any errors in the connection process will trigger exceptions. The exception +may either be generated by the underlying socket layer or may be custom module +exceptions, whose details follow: + +class `ProxyError` - This is a base exception class. It is not raised directly but +rather all other exception classes raised by this module are derived from it. +This allows an easy way to catch all proxy-related errors. It descends from `IOError`. + +All `ProxyError` exceptions have an attribute `socket_err`, which will contain either a +caught `socket.error` exception, or `None` if there wasn't any. + +class `GeneralProxyError` - When thrown, it indicates a problem which does not fall +into another category. + +* `Sent invalid data` - This error means that unexpected data has been received from +the server. The most common reason is that the server specified as the proxy is +not really a SOCKS4/SOCKS5/HTTP proxy, or maybe the proxy type specified is wrong. + +* `Connection closed unexpectedly` - The proxy server unexpectedly closed the connection. +This may indicate that the proxy server is experiencing network or software problems. + +* `Bad proxy type` - This will be raised if the type of the proxy supplied to the +set_proxy function was not one of `SOCKS4`/`SOCKS5`/`HTTP`. + +* `Bad input` - This will be raised if the `connect()` method is called with bad input +parameters. + +class `SOCKS5AuthError` - This indicates that the connection through a SOCKS5 server +failed due to an authentication problem. + +* `Authentication is required` - This will happen if you use a SOCKS5 server which +requires authentication without providing a username / password at all. + +* `All offered authentication methods were rejected` - This will happen if the proxy +requires a special authentication method which is not supported by this module. + +* `Unknown username or invalid password` - Self descriptive. + +class `SOCKS5Error` - This will be raised for SOCKS5 errors which are not related to +authentication. +The parameter is a tuple containing a code, as given by the server, +and a description of the +error. The possible errors, according to the RFC, are: + +* `0x01` - General SOCKS server failure - If for any reason the proxy server is unable to +fulfill your request (internal server error). +* `0x02` - connection not allowed by ruleset - If the address you're trying to connect to +is blacklisted on the server or requires authentication. +* `0x03` - Network unreachable - The target could not be contacted. A router on the network +had replied with a destination net unreachable error. +* `0x04` - Host unreachable - The target could not be contacted. A router on the network +had replied with a destination host unreachable error. +* `0x05` - Connection refused - The target server has actively refused the connection +(the requested port is closed). +* `0x06` - TTL expired - The TTL value of the SYN packet from the proxy to the target server +has expired. This usually means that there are network problems causing the packet +to be caught in a router-to-router "ping-pong". +* `0x07` - Command not supported - For instance if the server does not support UDP. +* `0x08` - Address type not supported - The client has provided an invalid address type. +When using this module, this error should not occur. + +class `SOCKS4Error` - This will be raised for SOCKS4 errors. The parameter is a tuple +containing a code and a description of the error, as given by the server. The +possible error, according to the specification are: + +* `0x5B` - Request rejected or failed - Will be raised in the event of an failure for any +reason other then the two mentioned next. +* `0x5C` - request rejected because SOCKS server cannot connect to identd on the client - +The Socks server had tried an ident lookup on your computer and has failed. In this +case you should run an identd server and/or configure your firewall to allow incoming +connections to local port 113 from the remote server. +* `0x5D` - request rejected because the client program and identd report different user-ids - +The Socks server had performed an ident lookup on your computer and has received a +different userid than the one you have provided. Change your userid (through the +username parameter of the set_proxy method) to match and try again. + +class `HTTPError` - This will be raised for HTTP errors. The message will contain +the HTTP status code and provided error message. + +After establishing the connection, the object behaves like a standard socket. + +Methods like `makefile()` and `settimeout()` should behave just like regular sockets. +Call the `close()` method to close the connection. + +In addition to the `socksocket` class, an additional function worth mentioning is the +`set_default_proxy` function. The parameters are the same as the `set_proxy` method. +This function will set default proxy settings for newly created `socksocket` objects, +in which the proxy settings haven't been changed via the `set_proxy` method. +This is quite useful if you wish to force 3rd party modules to use a SOCKS proxy, +by overriding the socket object. +For example: + + >>> socks.set_default_proxy(socks.SOCKS5, "socks.example.com") + >>> socket.socket = socks.socksocket + >>> urllib.urlopen("http://www.sourceforge.net/") + + +PROBLEMS +--------- + +Please open a GitHub issue at https://github.com/Anorov/PySocks + + diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/RECORD b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/RECORD new file mode 100644 index 0000000..4d0c62a --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/RECORD @@ -0,0 +1,10 @@ +PySocks-1.7.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PySocks-1.7.1.dist-info/LICENSE,sha256=cCfiFOAU63i3rcwc7aWspxOnn8T2oMUsnaWz5wfm_-k,1401 +PySocks-1.7.1.dist-info/METADATA,sha256=zbQMizjPOOP4DhEiEX24XXjNrYuIxF9UGUpN0uFDB6Y,13235 +PySocks-1.7.1.dist-info/RECORD,, +PySocks-1.7.1.dist-info/WHEEL,sha256=t_MpApv386-8PVts2R6wsTifdIn0vbUDTVv61IbqFC8,92 +PySocks-1.7.1.dist-info/top_level.txt,sha256=TKSOIfCFBoK9EY8FBYbYqC3PWd3--G15ph9n8-QHPDk,19 +__pycache__/socks.cpython-312.pyc,, +__pycache__/sockshandler.cpython-312.pyc,, +socks.py,sha256=xOYn27t9IGrbTBzWsUUuPa0YBuplgiUykzkOB5V5iFY,31086 +sockshandler.py,sha256=2SYGj-pwt1kjgLoZAmyeaEXCeZDWRmfVS_QG6kErGtY,3966 diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/WHEEL b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/WHEEL new file mode 100644 index 0000000..129a673 --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.3) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/top_level.txt b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/top_level.txt new file mode 100644 index 0000000..9476163 --- /dev/null +++ b/env/lib/python3.12/site-packages/PySocks-1.7.1.dist-info/top_level.txt @@ -0,0 +1,2 @@ +socks +sockshandler diff --git a/env/lib/python3.12/site-packages/__pycache__/socks.cpython-312.pyc b/env/lib/python3.12/site-packages/__pycache__/socks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4139d75032805c6a615be0ca36147e11b1a9e0e9 GIT binary patch literal 34167 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�mTKhmv0h1cG@pjbX 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 WH{-qu_xx>>w{Gdd?@HYF*!~ZPT2J}_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__init__.py b/env/lib/python3.12/site-packages/attr/__init__.py new file mode 100644 index 0000000..51b1c25 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/__init__.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +""" +Classes Without Boilerplate +""" + +from functools import partial +from typing import Callable + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._compat import Protocol +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Converter, + Factory, + attrib, + attrs, + fields, + fields_dict, + make_class, + validate, +) +from ._next_gen import define, field, frozen, mutable +from ._version_info import VersionInfo + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + + +class AttrsInstance(Protocol): + pass + + +__all__ = [ + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NOTHING", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "get_run_validators", + "has", + "ib", + "make_class", + "mutable", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + + +def _make_getattr(mod_name: str) -> Callable: + """ + Create a metadata proxy for packaging information that uses *mod_name* in + its warnings and errors. + """ + + def __getattr__(name: str) -> str: + if name not in ("__version__", "__version_info__"): + msg = f"module {mod_name} has no attribute {name}" + raise AttributeError(msg) + + try: + from importlib.metadata import metadata + except ImportError: + from importlib_metadata import metadata + + meta = metadata("attrs") + + if name == "__version_info__": + return VersionInfo._from_version_string(meta["version"]) + + return meta["version"] + + return __getattr__ + + +__getattr__ = _make_getattr(__name__) diff --git a/env/lib/python3.12/site-packages/attr/__init__.pyi b/env/lib/python3.12/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..6ae0a83 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/__init__.pyi @@ -0,0 +1,388 @@ +import enum +import sys + +from typing import ( + Any, + Callable, + Generic, + Mapping, + Protocol, + Sequence, + TypeVar, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._typing_compat import AttrsInstance_ +from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) + +if sys.version_info >= (3, 10): + from typing import TypeGuard +else: + from typing_extensions import TypeGuard + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_FilterType = Callable[["Attribute[_T]", _T], bool] + +# We subclass this here to keep the protocol's qualified name clean. +class AttrsInstance(AttrsInstance_, Protocol): + pass + +_A = TypeVar("_A", bound=type[AttrsInstance]) + +class _Nothing(enum.Enum): + NOTHING = enum.auto() + +NOTHING = _Nothing.NOTHING + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +if sys.version_info >= (3, 8): + from typing import Literal + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], + ) -> _T: ... + @overload + def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], + ) -> _T: ... + +else: + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., + ) -> _T: ... + +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + +class Attribute(Generic[_T]): + name: str + default: _T | None + validator: _ValidatorType[_T] | None + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: bool | None + init: bool + converter: _ConverterType | Converter[Any, _T] | None + metadata: dict[Any, Any] + type: type[_T] | None + kw_only: bool + on_setattr: _OnSetAttrType + alias: str | None + + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: object = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: _C, + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> _C: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> Callable[[_C], _C]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _A, + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., + include_extras: bool = ..., +) -> _A: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + collect_by_mro: bool = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36a2bcadd19457caa5fcb75a3dc4e1632d92ba8b GIT binary patch literal 2664 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19b8a8a8237725f6fe0acb99b0bba68d4f9437fb GIT binary patch literal 3815 zcmcInQBND$6~5QwvB$<>8#{Kwl4Q0?mKX&LB%;}Fv}zQ#fYegDG?j3-I~qLKFwS_! zduK>6B3fESY7(_ekX9lOt;A!hy!4^{1>Lv4;PPNP*;c7qsY2>QHmK?=M?m34)c6LS)j8)~M`Oi8K`a5I%5o}KOAqFg6&qD}|bNuH<^<2v2P=!EWo_o)AtF{}Qu1(i=nFYDPt^ki+iO(r}>_*z=44=7x zw+;wx&0}rz&bE0Mn`2j+rj}zBEu)BG!5<9L>}`AB0XUn~I`{Mo%g zR?#a7B~oiEk5(G-^Y!@oEqVC2Bir%OEopQQ(hZ%tlyYE^R3ztpP8s$5hJL!C3o z6`2xek(vNFdCD@0d~X4Oc9&4uSs;|~vvgZFLF5I*6>NRJ*aScSf)*+$H$Q?L|ASDu zU9b7MEBJX+zJipNyoN3yC)89y4#P1Yr2t%*C`*U!+Ow#JT2}{8M$nZuCd0u}D6k)S_VU50vq$-O z&=+3=Wt$NQctD8sewjVj$X>2zFF!lIogH~N_REQ{zfAP}YH}<7&TE7ty*t^r9*%uB z@k)UC8=Kw1pY@zYzs`&bzsIA((Rb}%pmp3`vvCbOt^0P&ePr=DG|J&a3&8s6%8$-{ zyn^ZV6|4o$fVA9-$o@`;7eB_A*{2*DWtK_~jYUl3C!IKhYB(n>-{!Dm3F1QzPKL$9 zNS3Vx_0G%{T4BRM%OBHqlmvcwL=qOc|TJ4X4 zcsV4!w)A*uCzbt2^3)S;V_|)vk;&CFxkhHFo*CNCjBF>bJ`DZ2Bl)EC^atyDBhz2c z^#87}F>>D%k?Hd1}{RNq#t?`1qiPs1w?0FF6_L22(9kmCSH zzjF-8S{E5MH;2;#Ub%I#ec91~0(fNp_wzYe0?Y3m1r{%2ey}}xMX?Rbu@!}000Zb1Mp)DH8^l4uKa2LTRYsWDJ`dyp`YIrZ5}4baeG*=sd>ssm zy{}^(VtTJ9DyF@?Y{${4`Zh?8LzUA)&my8RKtKyQu&Ftk(H@&**B&Yo{8V|~Yl`He zq1v{5`R0#phyEnz*EF6Ve3d!XCcL@Oox!P`z}&!hfg4141@oLm^?BWd_5!;B=q6Z| zYSx1U3v%-$g`Gs-17Q*VY*u7e(aUh;=PN&5`TTx8d~qk9T)Y41{+86c(-G%x$({4i zBvlR7fd;1nMYLwS5oduCRb#zg99k^{$`@;a2GzMDWjB#BH@G1{6{vVtp7J^rMXyv1 z!g?CsH9r0q*Jn z?wZFXJ-ZaL zg^={l>QW4><)$-LaHvLo|OJ1^g^Q{_WV^E{I`Te`ENq}Mey{??8Qd* zS{;7D^lK?7e)B(FmvH(k1mx8MMv3zeYiplA`gA)kug3O5L7e#d)$IU^WuYe#d!RTx dmcVOb&l{WlkNF228WYeLLU^oG_#%dZ{ue8Ca_j&A literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46ed8ae0f566c35a1b9cd1d2f16dcc7c6c3fc70f GIT binary patch literal 1128 zcmd5*&ubJh6i#-w?YiCmphAmnkyky`f$mIysD~mRYDGn`VC$s_v)M_yJ2*30l1$5# z3afY!ym+ez{{iWr;$;sWWbjb%A1JN|@nkaXwxWl6^ufHmdHM3?<;%;*p`kL;*7lw@ z9$E-}H9tKooCMuz9qc2DC~g!s5iJl*tygHXK#SU2X`kJnjY+0Fk;L9M2?I(L7cv`b z{FU4AagSY(Mg8ebQFleVeWXt3_K@mrjt)*DIYjYutok%Gw>^Atf`5tk5V6vNZSDRj zgSK_1V5iAclL_DgVy@tWlYhB<9rQ?ZC|Gdc(LL_wf{gp&Ub$f-82+$d?1C?eEd<$e;eSV{L@ zpzbGicVT|Mx=K=6UE8YO;gq>7-gd*F?zU3Z+UWZzs*Jz&-(UYU2%m?qzP7#$PrS3<#GTUg;rOK&Yh8^(zHvP> z-H>@_j&}q6aZ(oRK4U6FQLQ zr5_7B)hSNqFw-Feo=3va^YZ1#cag6%GM;f|rCSlFNyu)CQ9WVAmNVKNSs3G^epG?Z b%#BX@W_#dpY`i`4t-pdNyO&FNDyR4bP8To$ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/_funcs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac69267f5e73eb56f23fdd9af73ac81221cb55c3 GIT binary patch literal 15349 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 DVlII5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/_make.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99ddd5df70416c1414822e25efe232ddccd11f70 GIT binary patch literal 91855 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 BsOHs*2h_!)XEgRK>=_|LdEt?@UB&JqS(@%H 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/converters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5ce779f66475cde8a023371ff658b7045253977 GIT binary patch literal 4260 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 S;Gj#qSJ`*B`kcT^y6Io5g<=Z; literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f067fe4853e3147ccf0174f4b2c80e64521062 GIT binary patch literal 3016 zcmds2L2nyH6rR~#JGPrNHFY2Y)iRFL=q`~xnjtV(Fbp%NFkg%}X@#GCbcofbp|YB?~{KE0iJ zZ{~e7^L_Kp&`=6NYn9Je)d7UQmp{Fxgihx$IJc06&LIn1ii2y)IRzt2y@t-ImIhX{ zVqjy5gX=;1BWPk!>A(X7)A#aHx6Uo{=hWj-Mfjr_bE&PF_dA5ES%mn1ZGbT#wZ4 zLbjhElRlJ5!Xvh8It`2Jq-eNgPFB#J!yv9vgSkLXVIWeMuz*mU`coF6Ok>WW{T{i< z6afkb{arw2ca6G~ElaNcs8SyZq%6WEXNUs2x(yMzF86c9VAViN!jg2IEWiU`d#*We zxK(PMJV}m&e&~~A$~0+R$ZfIRDkqD!n1_9)jul|+31%dIaHP`TE6?|RFrTR)m-r%h zkGC~-0bRyCgF#L&?#vGZ*R)_KV-h)sk%jH15%Vl4a8@&fc-jIA)`Ef8HdJhKEH)qyn*7@e( z_%>38#=jjNy?J%*>g|!u;ltZ1bUYXyU4MIX_#oW=WQvVI+6E3-l#MaDBaBG1Um95# zI{+rE>dcul-Kqw{rP(+P$|*Y1c?k5|kH%iUU22bJ?`b2g;_ApJv0t@VEVZ>84Q5(1 z!Ez>qMh)2WRCu=jw>+~vctmqK*AqFoR+4YejBfPu|C??n`gH3vEMy)rILJ-CAtLGq zR5y1LNBRNrronl7#2f5UkB!2->_sqtqEdJ?K&9RxMO5kyP0761!TeJy?McBy67q>1 zgb8|VlH`06o5I!E5s00X@rR_5yqeC&{eg1X@=VZ?Sh;3gqTLr*K6?TCf~1XZbSN38 uYM#|_Xo0;7LBI>dC7ZWYjPXx#1#7<~5PoSpp1|?#=SOj-^BS07wLbuZE7u|b literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/setters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ec70d0c1cd413b23e2963a6460ba7589593dbc1 GIT binary patch literal 1939 zcma)7&rjS&6rQoYUhnc_fe;{7LnbK+@~XRr^io9#DTUG;st}b^P+Ql#o@EWY_G-qv zDQKx^6{$q+0ja9s$gvTBN-rQHC0L4-DD9y)0fHvw9A zbH=F`iDnOeD?o(ihfz^^QmI;Sov2f-32rGSyZw>b@+Fl71k9~ize zag?-+fnV|#9^9wUHs5k#Z5ei zOl75%CLo{Hed1IqBn#Jtl<_Qae3vj9)|pSjGHp*APNhysP?BpEhlk)I&8MY}e4aGm zQ!nrx*QM^QTjb_gemp-WH;bzDr==jR=mL!6JgA@XCTc3H>Z8Oo`l1t|RZT%nt%;hr zsqVyIt*SqEYpAJ$$N27JWa^RO`8;&|B8_yB9ck@#ib%t zvi6T-m4hm^s`au{tvaqX9Te+T>WAF=#0&4#3)cA9SZ>-`=DFEYZYpr8Mg4|V@d{RL zIV=bM2l?@v7WYD$t2xCbXMu7{IAO(CZpUl6x zCxGFjp#EM%&$=ukz2!-qQR>03`7!%@TxP^QAV z#k>a;7eIeSSOy-ECT?TGaEI6u`(XUfZavX=*n>KUcC|s)3yY^P5e7uIj|V_)qEN6+ zN}H_TVH2->D#5(RXamv(93idb1NTT6kOC#u!1YQVb@0?e;-OXKU@HmRKuq=v%2L+O-!Q{kvNK z|D=Brj6-2#@jNRct!$*-Iai@uhN4MHfi!D7F;pD7CA=#;F&XDj>sC}sbz&{1e>6RzWG0N+e@LXgTK0|v>O|`EywJ3FRf0VGR&JtzA za4JfByxqRc#9PP}%sFtQ*7ileoR?eC5 zLpBpxhLSzfhe!_!i?kR^<3%Bp+I}YfL~Zs8{GDGr@oWkXxV*RgCd#UBTL4 m2Eqf+(fdbw1`i#L==kbUUj|=18tKIsU*{pHAB=Ak(%`>|>d^oI literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc b/env/lib/python3.12/site-packages/attr/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6893d4e5217e157160bd98fbd1e87b02062773e7 GIT binary patch literal 26224 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attr/_cmp.py b/env/lib/python3.12/site-packages/attr/_cmp.py new file mode 100644 index 0000000..f367bb3 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_cmp.py @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: MIT + + +import functools +import types + +from ._make import _make_ne + + +_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, + and ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if at least + one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = _make_ne() + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + msg = "eq must be define is order to complete ordering from lt, le, gt, ge." + raise ValueError(msg) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = f"__{name}__" + method.__doc__ = ( + f"Return a {_operation_names[name]} b. Computed by attrs." + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + return all(func(self, other) for func in self._requirements) + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/env/lib/python3.12/site-packages/attr/_cmp.pyi b/env/lib/python3.12/site-packages/attr/_cmp.pyi new file mode 100644 index 0000000..cc7893b --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., + require_same_type: bool = ..., + class_name: str = ..., +) -> type: ... diff --git a/env/lib/python3.12/site-packages/attr/_compat.py b/env/lib/python3.12/site-packages/attr/_compat.py new file mode 100644 index 0000000..104eeb0 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_compat.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +import inspect +import platform +import sys +import threading + +from collections.abc import Mapping, Sequence # noqa: F401 +from typing import _GenericAlias + + +PYPY = platform.python_implementation() == "PyPy" +PY_3_8_PLUS = sys.version_info[:2] >= (3, 8) +PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) +PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) + + +if sys.version_info < (3, 8): + try: + from typing_extensions import Protocol + except ImportError: # pragma: no cover + Protocol = object +else: + from typing import Protocol # noqa: F401 + +if PY_3_14_PLUS: # pragma: no cover + import annotationlib + + _get_annotations = annotationlib.get_annotations + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() + + +def get_generic_base(cl): + """If this is a generic class (A[str]), return the generic base for it.""" + if cl.__class__ is _GenericAlias: + return cl.__origin__ + return None diff --git a/env/lib/python3.12/site-packages/attr/_config.py b/env/lib/python3.12/site-packages/attr/_config.py new file mode 100644 index 0000000..9c245b1 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + msg = "'run' must be bool." + raise TypeError(msg) + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/env/lib/python3.12/site-packages/attr/_funcs.py b/env/lib/python3.12/site-packages/attr/_funcs.py new file mode 100644 index 0000000..355cef4 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_funcs.py @@ -0,0 +1,522 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._compat import PY_3_9_PLUS, get_generic_base +from ._make import _OBJ_SETATTR, NOTHING, fields +from .exceptions import AttrsAttributeNotFoundError + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the *attrs* attribute values of *inst* as a dict. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + if has(v.__class__): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain_collection_types is True else list + items = [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + try: + rv[a.name] = cf(items) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv[a.name] = cf(*items) + elif isinstance(v, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + if getattr(val.__class__, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(val, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif isinstance(val, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the *attrs* attribute values of *inst* as a tuple. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + items = [ + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + ) + for j in v + ] + try: + rv.append(cf(items)) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv.append(cf(*items)) + elif isinstance(v, dict): + df = v.__class__ if retain is True else dict + rv.append( + df( + ( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with *attrs* attributes. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + Returns: + bool: + """ + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is not None: + return True + + # No attrs, maybe it's a specialized generic (A[str])? + generic_base = get_generic_base(cls) + if generic_base is not None: + generic_attrs = getattr(generic_base, "__attrs_attrs__", None) + if generic_attrs is not None: + # Stick it on here for speed next time. + cls.__attrs_attrs__ = generic_attrs + return generic_attrs is not None + return False + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + This is different from `evolve` that applies the changes to the arguments + that create the new instance. + + `evolve`'s behavior is preferable, but there are `edge cases`_ where it + doesn't work. Therefore `assoc` is deprecated, but will not be removed. + + .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 + + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. + """ + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + msg = f"{k} is not an attrs attribute on {new.__class__}." + raise AttrsAttributeNotFoundError(msg) + _OBJ_SETATTR(new, k, v) + return new + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +def resolve_types( + cls, globalns=None, localns=None, attribs=None, include_extras=True +): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + .. versionadded:: 23.1.0 *include_extras* + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + kwargs = {"globalns": globalns, "localns": localns} + + if PY_3_9_PLUS: + kwargs["include_extras"] = include_extras + + hints = typing.get_type_hints(cls, **kwargs) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _OBJ_SETATTR(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/env/lib/python3.12/site-packages/attr/_make.py b/env/lib/python3.12/site-packages/attr/_make.py new file mode 100644 index 0000000..bf00c5f --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_make.py @@ -0,0 +1,2960 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +import abc +import contextlib +import copy +import enum +import functools +import inspect +import itertools +import linecache +import sys +import types +import typing + +from operator import itemgetter + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + PY_3_8_PLUS, + PY_3_10_PLUS, + PY_3_11_PLUS, + _AnnotationExtractor, + _get_annotations, + get_generic_base, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_HASH_CACHE_FIELD = "_attrs_cached_hash" + +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_SENTINEL = object() + +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) + + +class _Nothing(enum.Enum): + """ + Sentinel to indicate the lack of a value when `None` is ambiguous. + + If extending attrs, you can use ``typing.Literal[NOTHING]`` to show + that a value may be ``NOTHING``. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. + """ + + NOTHING = enum.auto() + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing.NOTHING +""" +Sentinel to indicate the lack of a value when `None` is ambiguous. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since `None` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new field / attribute on a class. + + Identical to `attrs.field`, except it's not keyword-only. + + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! + + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is `None` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 22.2.0 *alias* + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if factory is not None: + if default is not NOTHING: + msg = ( + "The `default` and `factory` arguments are mutually exclusive." + ) + raise ValueError(msg) + if not callable(factory): + msg = "The `factory` argument must be a callable." + raise ValueError(msg) + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + alias=alias, + ) + + +def _compile_and_eval(script, globs, locs=None, filename=""): + """ + Evaluate the script with the given global (globs) and local (locs) + variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _make_method(name, script, filename, globs, locals=None): + """ + Create the method with the script given and return the method object. + """ + locs = {} if locals is None else locals + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + + filename = f"{base_filename[:-1]}-{count}>" + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs[name] + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = f"{cls_name}Attributes" + attr_class_template = [ + f"class {attr_class_name}(tuple):", + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + f" {attr_name} = _attrs_property(_attrs_itemgetter({i}))" + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + _compile_and_eval("\n".join(attr_class_template), globs) + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_CLASSVAR_PREFIXES) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + """ + return attrib_name in cls.__dict__ + + +def _collect_base_attrs(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer +): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = list(these.items()) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if not isinstance(a, _CountingAttr): + a = attrib() if a is NOTHING else attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" + raise ValueError(msg) + + if had_default is False and a.default is not NOTHING: + had_default = True + + if field_transformer is not None: + attrs = field_transformer(cls, attrs) + + # Resolve default field alias after executing field_transformer. + # This allows field_transformer to differentiate between explicit vs + # default aliases and supply their own defaults. + attrs = [ + a.evolve(alias=_default_init_alias_for(a.name)) if not a.alias else a + for a in attrs + ] + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) + + +def _make_cached_property_getattr(cached_properties, original_getattr, cls): + lines = [ + # Wrapped to get `__class__` into closure cell for super() + # (It will be replaced with the newly constructed class after construction). + "def wrapper(_cls):", + " __class__ = _cls", + " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", + " func = cached_properties.get(item)", + " if func is not None:", + " result = func(self)", + " _setter = _cached_setattr_get(self)", + " _setter(item, result)", + " return result", + ] + if original_getattr is not None: + lines.append( + " return original_getattr(self, item)", + ) + else: + lines.extend( + [ + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", + " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", + " raise AttributeError(original_error)", + ] + ) + + lines.extend( + [ + " return __getattr__", + "__getattr__ = wrapper(_cls)", + ] + ) + + unique_filename = _generate_unique_filename(cls, "getattr") + + glob = { + "cached_properties": cached_properties, + "_cached_setattr_get": _OBJ_SETATTR.__get__, + "original_getattr": original_getattr, + } + + return _make_method( + "__getattr__", + "\n".join(lines), + unique_filename, + glob, + locals={ + "_cls": cls, + }, + ) + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + "__traceback__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_pre_init", + "_pre_init_has_args", + "_has_post_init", + "_is_exc", + "_on_setattr", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + "_has_custom_setattr", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + getstate_setstate, + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_custom_setattr, + field_transformer, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._pre_init_has_args = False + if self._has_pre_init: + # Check if the pre init method has more arguments than just `self` + # We want to pass arguments if pre init expects arguments + pre_init_func = cls.__attrs_pre_init__ + pre_init_signature = inspect.signature(pre_init_func) + self._pre_init_has_args = len(pre_init_signature.parameters) > 1 + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = is_exc + self._on_setattr = on_setattr + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif on_setattr in ( + _DEFAULT_ON_SETATTR, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + on_setattr == _DEFAULT_ON_SETATTR + and not (has_validator or has_converter) + ) + or (on_setattr == setters.validate and not has_validator) + or (on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if getstate_setstate: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + def __repr__(self): + return f"<_ClassBuilder(cls={self._cls.__name__})>" + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + cls = self._create_slots_class() + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) + + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() + + return cls + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _SENTINEL) is not _SENTINEL + ): + # An AttributeError can happen if a base class defines a + # class variable and we want to set an attribute with the + # same name by using only a type annotation. + with contextlib.suppress(AttributeError): + delattr(cls, name) + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _OBJ_SETATTR + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") + } + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _OBJ_SETATTR + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = {} + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + if PY_3_8_PLUS: + cached_properties = { + name: cached_property.func + for name, cached_property in cd.items() + if isinstance(cached_property, functools.cached_property) + } + else: + # `functools.cached_property` was introduced in 3.8. + # So can't be used before this. + cached_properties = {} + + # Collect methods with a `__class__` reference that are shadowed in the new class. + # To know to update them. + additional_closure_functions_to_update = [] + if cached_properties: + class_annotations = _get_annotations(self._cls) + for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) + annotation = inspect.signature(func).return_annotation + if annotation is not inspect.Parameter.empty: + class_annotations[name] = annotation + + original_getattr = cd.get("__getattr__") + if original_getattr is not None: + additional_closure_functions_to_update.append(original_getattr) + + cd["__getattr__"] = _make_cached_property_getattr( + cached_properties, original_getattr, self._cls + ) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_HASH_CACHE_FIELD) + + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . + # If a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in itertools.chain( + cls.__dict__.values(), additional_closure_functions_to_update + ): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # noqa: PERF203 + # ValueError: Cell is empty + pass + else: + if match: + cell.cell_contents = cls + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns, self._cls) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + msg = "__str__ can only be generated if a __repr__ exists." + raise ValueError(msg) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return {name: getattr(self, name) for name in state_attr_names} + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _OBJ_SETATTR.__get__(self) + if isinstance(state, tuple): + # Backward compatibility with attrs instances pickled with + # attrs versions before v22.2.0 which stored tuples. + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + else: + for name in state_attr_names: + if name in state: + __bound_setattr(name, state[name]) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_HASH_CACHE_FIELD, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + ) + + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + self._cls_dict["__attrs_init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + ) + + return self + + def add_eq(self): + cd = self._cls_dict + + cd["__eq__"] = self._add_method_dunders( + _make_eq(self._cls, self._attrs) + ) + cd["__ne__"] = self._add_method_dunders(_make_ne()) + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + if self._frozen: + return self + + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + msg = "Can't combine custom __setattr__ with on_setattr hooks." + raise ValueError(msg) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _OBJ_SETATTR(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + with contextlib.suppress(AttributeError): + method.__module__ = self._cls.__module__ + + with contextlib.suppress(AttributeError): + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + with contextlib.suppress(AttributeError): + method.__doc__ = ( + "Method generated by attrs for class " + f"{self._cls.__qualname__}." + ) + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + unsafe_hash=None, +): + r""" + A class decorator that adds :term:`dunder methods` according to the + specified attributes using `attr.ib` or the *these* argument. + + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports `None` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + + # unsafe_hash takes precedence due to PEP 681. + if unsafe_hash is not None: + hash = unsafe_hash + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + msg = "Can't freeze a class with a custom __setattr__." + raise ValueError(msg) + + builder = _ClassBuilder( + cls, + these, + slots, + is_frozen, + weakref_slot, + _determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_own_setattr, + field_transformer, + ) + if _determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ): + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + + eq = _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + if not is_exc and eq is True: + builder.add_eq() + if not is_exc and _determine_whether_to_implement( + cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") + ): + builder.add_order() + + builder.add_setattr() + + nonlocal hash + if ( + hash is None + and auto_detect is True + and _has_own_attribute(cls, "__hash__") + ): + hash = False + + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if hash is False or (hash is None and eq is False) or is_exc: + # Don't do anything. Should fall back to __object__'s __hash__ + # which is by id. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + elif hash is True or ( + hash is None and eq is True and is_frozen is True + ): + # Build a __hash__ if told so, or if it's safe. + builder.add_hash() + else: + # Raise TypeError on attempts to hash. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + builder.make_unhashable() + + if _determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ): + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, init must be True." + raise TypeError(msg) + + if ( + PY_3_10_PLUS + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls, func_name): + """ + Create a "filename" suitable for a function being generated. + """ + return ( + f"" + ) + + +def _make_hash(cls, attrs, frozen, cache_hash): + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + unique_filename = _generate_unique_filename(cls, "hash") + type_hash = hash(unique_filename) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + f" {type_hash},", + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + globs[cmp_name] = a.eq_key + method_lines.append( + indent + f" {cmp_name}(self.{a.name})," + ) + else: + method_lines.append(indent + f" self.{a.name},") + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") + if frozen: + append_hash_computation_lines( + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 + ) + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return _make_method("__hash__", script, unique_filename, globs) + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) + return cls + + +def _make_ne(): + """ + Create __ne__ method. + """ + + def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + return __ne__ + + +def _make_eq(cls, attrs): + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + unique_filename = _generate_unique_filename(cls, "eq") + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + globs = {} + if attrs: + lines.append(" return (") + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) + else: + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") + else: + lines.append(" return True") + + script = "\n".join(lines) + + return _make_method("__eq__", script, unique_filename, globs) + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__ = _make_eq(cls, attrs) + cls.__ne__ = _make_ne() + + return cls + + +def _make_repr(attrs, ns, cls): + unique_filename = _generate_unique_filename(cls, "repr") + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + f" return f'{cls_name_fragment}({repr_fragment})'", + " finally:", + " already_repring.remove(id(self))", + ] + + return _make_method( + "__repr__", "\n".join(lines), unique_filename, globs=globs + ) + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns, cls) + return cls + + +def fields(cls): + """ + Return the tuple of *attrs* attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + .. versionchanged:: 23.1.0 Add support for generic classes. + """ + generic_base = get_generic_base(cls) + + if generic_base is None and not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + + attrs = getattr(cls, "__attrs_attrs__", None) + + if attrs is None: + if generic_base is not None: + attrs = getattr(generic_base, "__attrs_attrs__", None) + if attrs is not None: + # Even though this is global state, stick it on here to speed + # it up. We rely on `cls` being cached for this to be + # efficient. + cls.__attrs_attrs__ = attrs + return attrs + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + return {a.name: a for a in attrs} + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + Args: + inst: Instance of a class with *attrs* attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ + + +def _make_init( + cls, + attrs, + pre_init, + pre_init_has_args, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +): + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + unique_filename = _generate_unique_filename(cls, "init") + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + pre_init_has_args, + post_init, + cache_hash, + base_attr_map, + is_exc, + needs_cached_setattr, + has_cls_on_setattr, + "__attrs_init__" if attrs_init else "__init__", + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ + + init = _make_method( + "__attrs_init__" if attrs_init else "__init__", + script, + unique_filename, + globs, + ) + init.__annotations__ = annotations + + return init + + +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return f"_setattr('{attr_name}', {value_var})" + + +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" + + +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return f"self.{attr_name} = {value}" + + +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True, converter) + + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" + + +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] +): + """ + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) + + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" + + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] + + if needs_cached_setattr: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. + "_setattr = _cached_setattr_get(self)" + ) + + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not + # explicitly provided + arg_name = a.alias + + has_factory = isinstance(a.default, Factory) + maybe_self = "self" if has_factory and a.default.takes_self else "" + + if a.converter and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + + if a.init is False: + if has_factory: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + elif converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = f"{arg_name}=attr_dict['{attr_name}'].default" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = f"{arg_name}=NOTHING" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append(f"if {arg_name} is not NOTHING:") + + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and converter is None: + annotations[arg_name] = a.type + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if call_post_init: + lines.append("self.__attrs_post_init__()") + + # Because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" + else: + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" + else: + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join(f"self.{a.name}" for a in attrs if a.init) + + lines.append(f"BaseException.__init__(self, {vals})") + + args = ", ".join(args) + pre_init_args = args + if kw_only_args: + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" + pre_init_kw_only_args = ", ".join( + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] + ) + pre_init_args += ", " if pre_init_args else "" + pre_init_args += pre_init_kw_only_args + + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass same arguments as `__init__`. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + + # Python 3.7 doesn't allow backslashes in f strings. + NL = "\n " + return ( + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else 'pass'} +""", + names_for_globals, + annotations, + ) + + +def _default_init_alias_for(name: str) -> str: + """ + The default __init__ parameter name for a field. + + This performs private-name adjustment via leading-unscore stripping, + and is the default value of Attribute.alias if not provided. + """ + + return name.lstrip("_") + + +class Attribute: + """ + *Read-only* representation of an attribute. + + .. warning:: + + You should never instantiate this class yourself. + + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: + + - ``name`` (`str`): The name of the attribute. + - ``alias`` (`str`): The __init__ parameter name of the attribute, after + any explicit overrides and default private-attribute-name handling. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + - The ``alias`` property exposes the __init__ parameter name of the field, + with any overrides and default private-attribute handling applied. + + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + .. versionadded:: 22.2.0 *alias* + + For the full version history of the fields, see `attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + "alias", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + alias=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _OBJ_SETATTR.__get__(self) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _EMPTY_METADATA_SINGLETON + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + bound_setattr("alias", alias) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + msg = "Type annotation and type argument cannot both be present" + raise ValueError(msg) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + "inherited", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + cmp=None, + inherited=False, + **inst_dict, + ) + + # Don't use attrs.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attrs.evolve` but that function does not work + with {class}`Attribute`. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _OBJ_SETATTR.__get__(self) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + "on_setattr", + "alias", + ) + __attrs_attrs__ = ( + *tuple( + Attribute( + name=name, + alias=_default_init_alias_for(name), + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + "alias", + ) + ), + Attribute( + name="metadata", + alias="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + alias, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + self.alias = alias + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + Raises: + DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "converter", + "takes_self", + "takes_field", + "_first_param_type", + "_global_name", + "__call__", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + +def make_class( + name, attrs, bases=(object,), class_body=None, **attributes_arguments +): + r""" + A quick way to create a new class called *name* with *attrs*. + + Args: + name (str): The name for the new class. + + attrs( list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. + + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. + + bases (tuple[type, ...]): Classes that the new class will subclass. + + class_body (dict): + An optional dictionary of class attributes for the new class. + + attributes_arguments: Passed unmodified to `attr.s`. + + Returns: + type: A new class with *attrs*. + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + .. versionchanged:: 23.2.0 *class_body* + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + msg = "attrs argument must be a dict or a list." + raise TypeError(msg) + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if class_body is not None: + body.update(class_body) + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + with contextlib.suppress(AttributeError, ValueError): + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, unsafe_hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if they + have any. + + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + def pipe_converter(val, inst, field): + for c in converters: + val = c(val, inst, field) if isinstance(c, Converter) else c(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = typing.TypeVar("A") + pipe_converter.__annotations__.update({"val": A, "return": A}) + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + + # Get return type from last converter. + rt = _AnnotationExtractor(last).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + return Converter(pipe_converter, takes_self=True, takes_field=True) diff --git a/env/lib/python3.12/site-packages/attr/_next_gen.py b/env/lib/python3.12/site-packages/attr/_next_gen.py new file mode 100644 index 0000000..dbb65cc --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_next_gen.py @@ -0,0 +1,631 @@ +# SPDX-License-Identifier: MIT + +""" +These are keyword-only APIs that call `attr.s` and `attr.ib` with different +default values. +""" + + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + _DEFAULT_ON_SETATTR, + NOTHING, + _frozen_setattrs, + attrib, + attrs, +) +from .exceptions import UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + unsafe_hash=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, +): + r""" + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing True or False` to *init*, *repr*, *eq*, *cmp*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + cmp (bool | None): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make all attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: + + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. + + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. + + .. warning:: + + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. + + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. + + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + unsafe_hash=unsafe_hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _DEFAULT_ON_SETATTR + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." + raise ValueError(msg) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + cmp(bool | ~typing.Callable): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool): + Make this attribute keyword-only in the generated ``__init__`` (if + ``init`` is False, this parameter is ignored). + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* + .. versionadded:: 23.1.0 + The *type* parameter has been re-added; mostly for `attrs.make_class`. + Please note that type checkers ignore this metadata. + + .. seealso:: + + `attr.ib` + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + type=type, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + alias=alias, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) diff --git a/env/lib/python3.12/site-packages/attr/_typing_compat.pyi b/env/lib/python3.12/site-packages/attr/_typing_compat.pyi new file mode 100644 index 0000000..ca7b71e --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_typing_compat.pyi @@ -0,0 +1,15 @@ +from typing import Any, ClassVar, Protocol + +# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. +MYPY = False + +if MYPY: + # A protocol to be able to statically accept an attrs class. + class AttrsInstance_(Protocol): + __attrs_attrs__: ClassVar[Any] + +else: + # For type checkers without plug-in support use an empty protocol that + # will (hopefully) be combined into a union. + class AttrsInstance_(Protocol): + pass diff --git a/env/lib/python3.12/site-packages/attr/_version_info.py b/env/lib/python3.12/site-packages/attr/_version_info.py new file mode 100644 index 0000000..51a1312 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_version_info.py @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them diff --git a/env/lib/python3.12/site-packages/attr/_version_info.pyi b/env/lib/python3.12/site-packages/attr/_version_info.pyi new file mode 100644 index 0000000..45ced08 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/env/lib/python3.12/site-packages/attr/converters.py b/env/lib/python3.12/site-packages/attr/converters.py new file mode 100644 index 0000000..9238311 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/converters.py @@ -0,0 +1,151 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to `None`. + + Type annotations will be inferred from the wrapped converter's, if it has + any. + + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace `None` values by *default* or the result + of *factory*. + + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. + + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + msg = "Must pass either `default` or `factory`." + raise TypeError(msg) + + if default is not NOTHING and factory is not None: + msg = "Must pass either `default` or `factory` but not both." + raise TypeError(msg) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + msg = "`takes_self` is not supported by default_if_none." + raise ValueError(msg) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (for example, from environment variables) to real + booleans. + + Values mapping to `True`: + + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` + + Values mapping to `False`: + + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` + + Raises: + ValueError: For any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" + raise ValueError(msg) diff --git a/env/lib/python3.12/site-packages/attr/converters.pyi b/env/lib/python3.12/site-packages/attr/converters.pyi new file mode 100644 index 0000000..9ef478f --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/converters.pyi @@ -0,0 +1,13 @@ +from typing import Callable, TypeVar, overload + +from attrs import _ConverterType + +_T = TypeVar("_T") + +def pipe(*validators: _ConverterType) -> _ConverterType: ... +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: _T) -> _ConverterType: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... +def to_bool(val: str) -> bool: ... diff --git a/env/lib/python3.12/site-packages/attr/exceptions.py b/env/lib/python3.12/site-packages/attr/exceptions.py new file mode 100644 index 0000000..3b7abb8 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/exceptions.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +from typing import ClassVar + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args: ClassVar[tuple[str]] = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An *attrs* function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-*attrs* class has been passed into an *attrs* function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set when defining the field and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has a field without a type annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an *attrs* feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A field requiring a callable has been set with a value that is not + callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/env/lib/python3.12/site-packages/attr/exceptions.pyi b/env/lib/python3.12/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..f268011 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/env/lib/python3.12/site-packages/attr/filters.py b/env/lib/python3.12/site-packages/attr/filters.py new file mode 100644 index 0000000..689b170 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/filters.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, str)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Create a filter that only allows *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.1.0 Accept strings with field names. + """ + cls, names, attrs = _split_what(what) + + def include_(attribute, value): + return ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return include_ + + +def exclude(*what): + """ + Create a filter that does **not** allow *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.3.0 Accept field name string as input argument + """ + cls, names, attrs = _split_what(what) + + def exclude_(attribute, value): + return not ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return exclude_ diff --git a/env/lib/python3.12/site-packages/attr/filters.pyi b/env/lib/python3.12/site-packages/attr/filters.pyi new file mode 100644 index 0000000..974abdc --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from . import Attribute, _FilterType + +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/env/lib/python3.12/site-packages/attr/py.typed b/env/lib/python3.12/site-packages/attr/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/attr/setters.py b/env/lib/python3.12/site-packages/attr/setters.py new file mode 100644 index 0000000..a9ce016 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/setters.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError() + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. +NO_OP = object() diff --git a/env/lib/python3.12/site-packages/attr/setters.pyi b/env/lib/python3.12/site-packages/attr/setters.pyi new file mode 100644 index 0000000..73abf36 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/setters.pyi @@ -0,0 +1,20 @@ +from typing import Any, NewType, NoReturn, TypeVar + +from . import Attribute +from attrs import _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/env/lib/python3.12/site-packages/attr/validators.py b/env/lib/python3.12/site-packages/attr/validators.py new file mode 100644 index 0000000..8a56717 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/validators.py @@ -0,0 +1,711 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + + +import operator +import re + +from contextlib import contextmanager +from re import Pattern + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .converters import default_if_none +from .exceptions import NotCallableError + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "not_", + "optional", + "or_", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + Args: + disabled (bool): If `True`, disable running all validators. + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + Returns: + bool:`True` if validators are currently disabled. + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type]): The type to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" + raise ValueError( + msg, + attr, + self.pattern, + value, + ) + + def __repr__(self): + return f"" + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against + + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + msg = "'func' must be one of {}.".format( + ", ".join( + sorted(e and e.__name__ or "None" for e in set(valid_funcs)) + ) + ) + raise ValueError(msg) + + if isinstance(regex, Pattern): + if flags: + msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" + raise TypeError(msg) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return f"" + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to `None` in addition to satisfying the requirements of + the sub-validator. + + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. + """ + if isinstance(validator, (list, tuple)): + return _OptionalValidator(_AndValidator(validator)) + + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InValidator: + options = attrib() + _original_options = attrib(hash=False) + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" + raise ValueError( + msg, + attr, + self._original_options, + value, + ) + + def __repr__(self): + return f"" + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. + + The check is performed using ``value in options``, so *options* has to + support that operation. + + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. + """ + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + + return _InValidator(options, repr_options) + + +@attrs(repr=False, slots=False, unsafe_hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attrs.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute that is + not callable. + + .. versionadded:: 19.1.0 + + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else f" {self.iterable_validator!r}" + ) + return ( + f"" + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + Args: + member_validator: Validator to apply to iterable members. + + iterable_validator: + Validator to apply to iterable itself (optional). + + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepMapping: + key_validator = attrib(validator=is_callable()) + value_validator = attrib(validator=is_callable()) + mapping_validator = attrib(default=None, validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + self.key_validator(inst, attr, key) + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return f"" + + +def deep_mapping(key_validator, value_validator, mapping_validator=None): + """ + A validator that performs deep validation of a dictionary. + + Args: + key_validator: Validator to apply to dictionary keys. + + value_validator: Validator to apply to dictionary values. + + mapping_validator: + Validator to apply to top-level mapping attribute (optional). + + .. versionadded:: 19.1.0 + + Raises: + TypeError: if any sub-validators fail + """ + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. + + Args: + val: Exclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. + + Args: + val: Inclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + Args: + length (int): Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + Args: + length (int): Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _SubclassOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not issubclass(value, self.type): + msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def _subclass_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `issubclass` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type, ...]): The type(s) to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _SubclassOfValidator(type) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _NotValidator: + validator = attrib() + msg = attrib( + converter=default_if_none( + "not_ validator child '{validator!r}' " + "did not raise a captured error" + ) + ) + exc_types = attrib( + validator=deep_iterable( + member_validator=_subclass_of(Exception), + iterable_validator=instance_of(tuple), + ), + ) + + def __call__(self, inst, attr, value): + try: + self.validator(inst, attr, value) + except self.exc_types: + pass # suppress error to invert validity + else: + raise ValueError( + self.msg.format( + validator=self.validator, + exc_types=self.exc_types, + ), + attr, + self.validator, + value, + self.exc_types, + ) + + def __repr__(self): + return f"" + + +def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): + """ + A validator that wraps and logically 'inverts' the validator passed to it. + It will raise a `ValueError` if the provided validator *doesn't* raise a + `ValueError` or `TypeError` (by default), and will suppress the exception + if the provided validator *does*. + + Intended to be used with existing validators to compose logic without + needing to create inverted variants, for example, ``not_(in_(...))``. + + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. + + .. versionadded:: 22.2.0 + """ + try: + exc_types = tuple(exc_types) + except TypeError: + exc_types = (exc_types,) + return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/env/lib/python3.12/site-packages/attr/validators.pyi b/env/lib/python3.12/site-packages/attr/validators.pyi new file mode 100644 index 0000000..a314110 --- /dev/null +++ b/env/lib/python3.12/site-packages/attr/validators.pyi @@ -0,0 +1,83 @@ +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + Mapping, + Match, + Pattern, + TypeVar, + overload, +) + +from attrs import _ValidatorType +from attrs import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2]] +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2], type[_T3]] +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +def optional( + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Pattern[AnyStr] | AnyStr, + flags: int = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: _ValidatorType[_I] | None = ..., +) -> _ValidatorType[_I]: ... +def deep_mapping( + key_validator: _ValidatorType[_K], + value_validator: _ValidatorType[_V], + mapping_validator: _ValidatorType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... +def not_( + validator: _ValidatorType[_T], + *, + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., +) -> _ValidatorType[_T]: ... +def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA new file mode 100644 index 0000000..a85b378 --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA @@ -0,0 +1,242 @@ +Metadata-Version: 2.3 +Name: attrs +Version: 24.2.0 +Summary: Classes Without Boilerplate +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: GitHub, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Author-email: Hynek Schlawack +License-Expression: MIT +License-File: LICENSE +Keywords: attribute,boilerplate,class +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Requires-Dist: importlib-metadata; python_version < '3.8' +Provides-Extra: benchmark +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' +Requires-Dist: hypothesis; extra == 'benchmark' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' +Requires-Dist: pympler; extra == 'benchmark' +Requires-Dist: pytest-codspeed; extra == 'benchmark' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' +Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' +Requires-Dist: pytest>=4.3.0; extra == 'benchmark' +Provides-Extra: cov +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' +Requires-Dist: coverage[toml]>=5.3; extra == 'cov' +Requires-Dist: hypothesis; extra == 'cov' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' +Requires-Dist: pympler; extra == 'cov' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' +Requires-Dist: pytest-xdist[psutil]; extra == 'cov' +Requires-Dist: pytest>=4.3.0; extra == 'cov' +Provides-Extra: dev +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' +Requires-Dist: pre-commit; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' +Requires-Dist: pytest-xdist[psutil]; extra == 'dev' +Requires-Dist: pytest>=4.3.0; extra == 'dev' +Provides-Extra: docs +Requires-Dist: cogapp; extra == 'docs' +Requires-Dist: furo; extra == 'docs' +Requires-Dist: myst-parser; extra == 'docs' +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: sphinx-notfound-page; extra == 'docs' +Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' +Requires-Dist: towncrier<24.7; extra == 'docs' +Provides-Extra: tests +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' +Requires-Dist: pytest-xdist[psutil]; extra == 'tests' +Requires-Dist: pytest>=4.3.0; extra == 'tests' +Provides-Extra: tests-mypy +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' +Description-Content-Type: text/markdown + +

+ + attrs + +

+ + +*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). +[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + + +## Sponsors + +*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). +Especially those generously supporting us at the *The Organization* tier and higher: + + + +

+ + + + + + + + +

+ + + +

+ Please consider joining them to help make attrs’s maintenance more sustainable! +

+ + + +## Example + +*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: + + + +```pycon +>>> from attrs import asdict, define, make_class, Factory + +>>> @define +... class SomeClass: +... a_number: int = 42 +... list_of_numbers: list[int] = Factory(list) +... +... def hard_math(self, another_number): +... return self.a_number + sum(self.list_of_numbers) * another_number + + +>>> sc = SomeClass(1, [1, 2, 3]) +>>> sc +SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + +>>> sc.hard_math(3) +19 +>>> sc == SomeClass(1, [1, 2, 3]) +True +>>> sc != SomeClass(2, [3, 2, 1]) +True + +>>> asdict(sc) +{'a_number': 1, 'list_of_numbers': [1, 2, 3]} + +>>> SomeClass() +SomeClass(a_number=42, list_of_numbers=[]) + +>>> C = make_class("C", ["a", "b"]) +>>> C("foo", "bar") +C(a='foo', b='bar') +``` + +After *declaring* your attributes, *attrs* gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable `__repr__`, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +--- + +This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. +The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. + +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` + + +## Data Classes + +On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). +In practice it does a lot more and is more flexible. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. + +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. + + +## Project Information + +- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) +- [**Documentation**](https://www.attrs.org/) +- [**PyPI**](https://pypi.org/project/attrs/) +- [**Source Code**](https://github.com/python-attrs/attrs) +- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) +- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) + + +### *attrs* for Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. +[Learn more](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). + +## Release Information + +### Deprecations + +- Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. + Please don't use it in new code, but we don't intend to remove it anymore. + [#1330](https://github.com/python-attrs/attrs/issues/1330) + + +### Changes + +- `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). + [#1328](https://github.com/python-attrs/attrs/issues/1328) +- Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. + [#1329](https://github.com/python-attrs/attrs/issues/1329) + + + +--- + +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD new file mode 100644 index 0000000..1b01979 --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/RECORD @@ -0,0 +1,55 @@ +attr/__init__.py,sha256=l8Ewh5KZE7CCY0i1iDfSCnFiUTIkBVoqsXjX9EZnIVA,2087 +attr/__init__.pyi,sha256=aTVHBPX6krCGvbQvOl_UKqEzmi2HFsaIVm2WKmAiqVs,11434 +attr/__pycache__/__init__.cpython-312.pyc,, +attr/__pycache__/_cmp.cpython-312.pyc,, +attr/__pycache__/_compat.cpython-312.pyc,, +attr/__pycache__/_config.cpython-312.pyc,, +attr/__pycache__/_funcs.cpython-312.pyc,, +attr/__pycache__/_make.cpython-312.pyc,, +attr/__pycache__/_next_gen.cpython-312.pyc,, +attr/__pycache__/_version_info.cpython-312.pyc,, +attr/__pycache__/converters.cpython-312.pyc,, +attr/__pycache__/exceptions.cpython-312.pyc,, +attr/__pycache__/filters.cpython-312.pyc,, +attr/__pycache__/setters.cpython-312.pyc,, +attr/__pycache__/validators.cpython-312.pyc,, +attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=n2Uk3c-ywv0PkFfGlvqR7SzDXp4NOhWmNV_ZK6YfWoM,2958 +attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 +attr/_funcs.py,sha256=SGDmNlED1TM3tgO9Ap2mfRfVI24XEAcrNQs7o2eBXHQ,17386 +attr/_make.py,sha256=BjENJz5eJoojJVbCoupWjXLLEZJ7VID89lisLbQUlmQ,91479 +attr/_next_gen.py,sha256=dhGb96VFg4kXBkS9Zdz1A2uxVJ99q_RT1hw3kLA9-uI,24630 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=vNa58pZi9V6uxBzl4t1QrHbQfkT4iRFAodyXe7lcgg0,3506 +attr/converters.pyi,sha256=mpDoVFO3Cpx8xYSSV0iZFl7IAHuoNBglxKfxHvLj_sY,410 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=faMQeiBo_nbXYnPaQ1pq8PXeA7Zr-uNsVsPMiKCmxhc,1619 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=985eTP6RHyon61YEauMJgyNy1rEOhJWiSXMJgRxPtrQ,20045 +attr/validators.pyi,sha256=LjKf7AoXZfvGSfT3LRs61Qfln94konYyMUPoJJjOxK4,2502 +attrs-24.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-24.2.0.dist-info/METADATA,sha256=3Jgk4lr9Y1SAqAcwOLPN_mpW0wc6VOGm-yHt1LsPIHw,11524 +attrs-24.2.0.dist-info/RECORD,, +attrs-24.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +attrs-24.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=5FHo-EMFOX-g4ialSK4fwOjuoHzLISJDZCwoOl02Ty8,1071 +attrs/__init__.pyi,sha256=o3l92VsD9kHz8sldEtb_tllBTs3TeL-vIBMTxo2Zc_4,7703 +attrs/__pycache__/__init__.cpython-312.pyc,, +attrs/__pycache__/converters.cpython-312.pyc,, +attrs/__pycache__/exceptions.cpython-312.pyc,, +attrs/__pycache__/filters.cpython-312.pyc,, +attrs/__pycache__/setters.cpython-312.pyc,, +attrs/__pycache__/validators.cpython-312.pyc,, +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL new file mode 100644 index 0000000..cdd68a4 --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.25.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE new file mode 100644 index 0000000..2bd6453 --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs-24.2.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs contributors + +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/env/lib/python3.12/site-packages/attrs/__init__.py b/env/lib/python3.12/site-packages/attrs/__init__.py new file mode 100644 index 0000000..963b197 --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs/__init__.py @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + AttrsInstance, + Converter, + Factory, + _make_getattr, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._next_gen import asdict, astuple + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "Attribute", + "AttrsInstance", + "cmp_using", + "Converter", + "converters", + "define", + "evolve", + "exceptions", + "Factory", + "field", + "fields_dict", + "fields", + "filters", + "frozen", + "has", + "make_class", + "mutable", + "NOTHING", + "resolve_types", + "setters", + "validate", + "validators", +] + +__getattr__ = _make_getattr(__name__) diff --git a/env/lib/python3.12/site-packages/attrs/__init__.pyi b/env/lib/python3.12/site-packages/attrs/__init__.pyi new file mode 100644 index 0000000..b2670de --- /dev/null +++ b/env/lib/python3.12/site-packages/attrs/__init__.pyi @@ -0,0 +1,252 @@ +import sys + +from typing import ( + Any, + Callable, + Mapping, + Sequence, + overload, + TypeVar, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import AttrsInstance as AttrsInstance +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import Converter as Converter +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import has as has +from attr import make_class as make_class +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_ConverterType = Callable[[Any], Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define + +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... diff --git a/env/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/attrs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52fded30bd190bf853d430d66743cc1a11829d3a GIT binary patch literal 1125 zcmZvaJC77c5XXD=F|&``-Fw45ur1jH3%VQ5PAy9u$Q%+n5=Sjdt-hJs-4;_btL~l^ zON2j#9XN7k`J*_roODWn$iM_hj@;F|CjvadZ>mbAs()42pMyb<`R}FpahkRmdqvLm z*IXO#fAz-CEN6LCFpPMF4c@>eZ(@tLu+7^T^B5DJV25|G%e&a)J?!&7Ztx8p@Bt3_ z5J!B3n|u?u_!e&SZQS8I5!GxIyST^qaG&pcznQm+8+eo7!~=eShx`za_z@oShF@xqSM=#pBCIu6y5Ft*&YdZa}7aTpBCO3|#j? zRW3kV&@TC2X13BxHxMYFftZ4oKG(ISF;(We8O}v*R5^8V4ii;^i(yd}3vlg;f+BZu z_!-w<{Y9=a>w~&_0i|osq;b7aI4gWbmtbw>RpAwBFjPj^CzTL--^&P#U$_=M=qlr5@6a~1=umEu7xa8o5qgKVLBRjD4IQbO8&Z=~QNnZUZ>U@i zP4l|-bYZ5TKPV(|v_Vq%nsIStqd-qNr%B4AZIyrez<&Z+TNDFn9&X@k(%WqE4zD|v@a59(KGdTs5l3J4r zp-ScN;B>xpoo}(q>jJ*hXTB$$oH_S++l->`SC;qD6 Xc$vI=60yq={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+kMIX|x~wWuVusCXsAXOR4_RQ-(n+*JMC(u~C1+{6@pm;B_?+|<01Vtx0_ z5|7d(eM18SU6;hlVqO0jTQl8pR3V?9G7{o>4$RNaEaq={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+kMwIVsSpd>RtuXrWHXOR4_RQ-(n+*JMC(u~C1+{6@pm;B_?+|<01Vtx0_ z5|7d(eM18SU6;hlVqO0jTQl8pR3V?9G7{o>4$RNaEa literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc b/env/lib/python3.12/site-packages/attrs/__pycache__/filters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce6096dcfe5dc9258f9fb25efd88aaa38a39a316 GIT binary patch literal 231 zcmX@j%ge<81P$>q>7GFPF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$0i1q@+kMEiuO$79{M=Oi+|rE1+}y+zeV6>?(%jU%l45=L%o2~% zBz;2z16`NI%3@vrG+pQXlvMrHyfXcq%q0DS%94!yJYzjWBmLscl2qM-#N_P6^weT~ vkTu2nPq>7GFPF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$0i1q@+l%IJKlCwWxR{!)K7>uO$79{M=Oi+|rE1+}y+zeV6>?(%jU%l45=L%o2~% zBz;2z16`NI%3@vrG+pQXlvMrHyfXcq%q0DS%94!yJYzjWBmLscl2qM-#N_P6^weT~ vkTu2nPq={`XEF^B^LOi;#WJ|JT{LkdF*V-CYwCPs!zCQas-AW2QeTZ~$M zK$1VPq@+l%EHNiDC9x#GsCXsAXOR4_RQ-(n+*JMC(u~C1+{6@pm;B_?+|<01Vtx0_ z5|7d(eM18SU6;hlVqO0jTQl8pR3V?9G7{o>4$RNaEa=3.6 +License-File: LICENSE + +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/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/RECORD b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/RECORD new file mode 100644 index 0000000..12374b0 --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/RECORD @@ -0,0 +1,14 @@ +certifi-2024.8.30.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2024.8.30.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2024.8.30.dist-info/METADATA,sha256=GhBHRVUN6a4ZdUgE_N5wmukJfyuoE-QyIl8Y3ifNQBM,2222 +certifi-2024.8.30.dist-info/RECORD,, +certifi-2024.8.30.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91 +certifi-2024.8.30.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,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=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427 +certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/WHEEL b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/WHEEL new file mode 100644 index 0000000..57e56b7 --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (74.0.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/top_level.txt b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/env/lib/python3.12/site-packages/certifi/__init__.py b/env/lib/python3.12/site-packages/certifi/__init__.py new file mode 100644 index 0000000..f61d77f --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2024.08.30" diff --git a/env/lib/python3.12/site-packages/certifi/__main__.py b/env/lib/python3.12/site-packages/certifi/__main__.py new file mode 100644 index 0000000..8945b5d --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +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/env/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06450f0b2bafb6b54ca5bea6e3f16b0eda290d6e GIT binary patch literal 325 zcmYjMJx{|h5Vi9`OQW(OBo<)okT`7_kf>Ow1QYBL;*`d2ViCuc<0gJZZ#uTA}En?G2;V!dy~Bch1n90?p@VMP{3 z)S`B3MK*OJr*;P$pV+JotfrgDLbF1bjl0U2V#+pi|SpYntwK+xKjAT+UBC0GFBBo?2lS;HP^V3- zP~aUPfWQ&x>1d1~GkOLydnN=1pkV0LNsBm{!=6p;VPnD9h?vA8_9tgzo-hz7-*T-k z;%Oa^dP8f$*N88v4tzC@+BtzI8U$lF*UbNE9rw33Zgvdm#aSw7Dhg>o8&FPnj4<8_ z!tj(13XyRd30~3;ln#zXlBJzMdYJcf%nK^rm~xS9CtTl$>qh0$9o{dQD*I47xO6Hf zmuD~`kxHyI8C0y^7t*R$JLgF%J_7wE;4ejkj8VkO0cH#n)Xm~5u|W3{alhO`Ypbha z7mthZ!FG5zBNWl}DH*t6 zaztV=6 w55W4N+nBknsoUCjFYH=Jru%B+#l|W5u9wHm9kA*n@81RyrMD`{zx ztIm!h%T)>;aAj_Q2MGB${t2YdciO+AgghVyDH4MkLWLHoXN96* zqz&mKsVJJXtOV2ctRdfej}UeQMu#eLHB<~$!^JQqhM+0XB8F&27X>2>EA;uk0)A{= z_<{8z-SwidUc8v7szvpC>-F`l7wfF&?YF76Et^*JE zb_D(uhhRk1NcjKK5fUNBu%VhmM!%Uh2H@EsG(1bxNPZ+2RsSrho_!2;_L0lnF{8T4 zxV31FudGM^)Rky-VcBxBRohstm|14>RaSGdeA&!eHHT}JipDLwmaW)&$FUc)x`r!_ zub9=W&9WAEvbtU4W{o@J(HD4%SvS;KNDt10R)!`*YfpfBKse}*l(F}K7!Y=YJocYZ zvQBbzHYd1!rK!tP@60WfrWSthDy5Qn+v26tBhtqCue8FlT{R2U)n%<()r`UwTVJi> z#tK(0KE3*W;rzLC`77GGlfS;0pRx_JVAeh;RIK+4E9-pOuDvmSexl%5+{~|N`YmnA zbP7Ib1>I&QAm^&y8#@q`bbgy5kFhx^P@CkLq&B5YUCL~yw)xJ&SJD}V49y8I@GLKo z+i;Aq=9Ct#is{Oz9UXeR(#7eY(AA66=1ty3isL9x4Eh+-1f?AA*j{Z2!PCHM5)TrL z@NV*y3s2dBydgJoK zG{e2H1SnT2+g5EwxvF%ZUmwZbYrEG8`3z2!&R8MWI531MS~#@9_lQDv*fj9 zlbH;2Y6zNh4b&!i*-v7b-M-P6X)-eQx04Sejj@U5*kpZd@{5_q*smK$-@SY7*~sxv z|JWS8P#?X}7=5!b^48s%XR*Qi*Y92b^!k^vv)`yAyUK|7rhO5_C}C^=4irStj}L(| z79evd=ew~gccTjn_+p5kNx^KuQl4c{Hwi<`U0HK<%X&mz#jNSJVbzv$q6Z*DQo0dl zYDNj5;s>Eog3M)E7&s2i`7tPgl?A`r)yL`eswTR97$k{nV~{siDs8 zDsw)u8Pe$mVh+TXykL#OpM8i((BUESS8(=m`j>m0#v=JxfB_(yz`JbbINOsl#`Az2 z!cyFjC*@e+?OBe*@+3fWKT8=hJEyQD7*|;`d8x}khV)@+RKut;s4({r!0J)WQ*XmV z=VzdL_?96fukBoXSZN%c{J$C2tr5pz?fnch1dl0*Hpo0-BVZm;hA}y~&n)(#nuFFx zK4IiD+edb0zIf|Pb!u0c>I9j(@^5Q!58Uaqo$(uxk2BUS(+&Go67$coR~h6s?#B&5 zBHGN+yK#fg5Hybgx54S%@m~CcNNxz9(SQd(Asz zI^Bq!yi31P2kx)kTf4t;Z)5xN_C`ZJyQ`f2entIX`OdJ4{UF=_fDbWjK?Or%!q>$e zd6h5b-*!WA%~(3m4ZGn|$*^@eqv)(VoutQncVi!z%z=C;S+zymOd7%1cHH1Ex;03SWS^#we-{bMqfZAiEfMVV!J{o1ENmf}ZiUfP$Uv%vV_H!Xjko*I SON(+Iw+^Ni?cIY1)qepa{CV>L literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/certifi/cacert.pem b/env/lib/python3.12/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..3c165a1 --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi/cacert.pem @@ -0,0 +1,4929 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=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=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root 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=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: 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=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=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=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=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=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# 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 RootCA3 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication RootCA3" +# Serial: 16247922307909811815 +# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26 +# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a +# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94 +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV +BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw +JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2 +MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg +Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r +CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA +lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG +TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7 +9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7 +8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4 +g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we +GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst ++3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M +0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ +T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw +HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA +FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd +9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI +UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+ +OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke +gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf +iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV +nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD +2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI// +1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad +TdJ0MN1kURXbg4NR16/9M51NZg== +-----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=CommScope Public Trust ECC Root-01 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Label: "CommScope Public Trust ECC Root-01" +# Serial: 385011430473757362783587124273108818652468453534 +# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 +# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d +# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Label: "CommScope Public Trust ECC Root-02" +# Serial: 234015080301808452132356021271193974922492992893 +# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 +# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 +# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Label: "CommScope Public Trust RSA Root-01" +# Serial: 354030733275608256394402989253558293562031411421 +# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 +# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 +# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Label: "CommScope Public Trust RSA Root-02" +# Serial: 480062499834624527752716769107743131258796508494 +# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa +# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae +# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# 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----- diff --git a/env/lib/python3.12/site-packages/certifi/core.py b/env/lib/python3.12/site-packages/certifi/core.py new file mode 100644 index 0000000..91f538b --- /dev/null +++ b/env/lib/python3.12/site-packages/certifi/core.py @@ -0,0 +1,114 @@ +""" +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") + +elif sys.version_info >= (3, 7): + + 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") + +else: + import os + import types + from typing import Union + + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where() -> str: + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/env/lib/python3.12/site-packages/certifi/py.typed b/env/lib/python3.12/site-packages/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/INSTALLER b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/LICENSE b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/LICENSE new file mode 100644 index 0000000..ad82355 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 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. \ No newline at end of file diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/METADATA b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/METADATA new file mode 100644 index 0000000..b19096b --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/METADATA @@ -0,0 +1,695 @@ +Metadata-Version: 2.1 +Name: charset-normalizer +Version: 3.4.0 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Home-page: https://github.com/Ousret/charset_normalizer +Author: Ahmed TAHRI +Author-email: tahri.ahmed@proton.me +License: MIT +Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest +Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Topic :: Software Development :: Libraries :: Python Modules +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 :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.7.0 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode_backport + +

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*
+Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) + +## ⚡ 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 % | 200 ms | 5 file/sec | +| charset-normalizer | **98 %** | **10 ms** | 100 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +|-----------------------------------------------|:---------------:|:---------------:|:---------------:| +| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms | +| charset-normalizer | 100 ms | 50 ms | 5 ms | + +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 +> (eg. 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. + 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 + +# 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.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) 2019 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/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/RECORD b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/RECORD new file mode 100644 index 0000000..4f56385 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/RECORD @@ -0,0 +1,35 @@ +../../../bin/normalizer,sha256=4DxLlyc4HLrO0TtZcZN5fk5-OFcjAmbv0lGcSFU6s-o,280 +charset_normalizer-3.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.0.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-3.4.0.dist-info/METADATA,sha256=WGbEW9ehh2spNJxo1M6sEGGZWmsQ-oj2DsMjV29zoms,34159 +charset_normalizer-3.4.0.dist-info/RECORD,, +charset_normalizer-3.4.0.dist-info/WHEEL,sha256=7B4nnId14TToQHuAKpxbDLCJbNciqBsV-mvXE2hVLJc,151 +charset_normalizer-3.4.0.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 +charset_normalizer-3.4.0.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577 +charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73 +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=kMyNUqrfBZU22PP0pYKrSldtYUGA24wsGlXGLAKra7c,22559 +charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560 +charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100 +charset_normalizer/cli/__main__.py,sha256=zX9sV_ApU1d96Wb0cS04vulstdB4F0Eh7kLn-gevfw4,10411 +charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc,, +charset_normalizer/cli/__pycache__/__main__.cpython-312.pyc,, +charset_normalizer/constant.py,sha256=uwoW87NicWZDTLviX7le0wdoYBbhBQDA4n1JtJo77ts,40499 +charset_normalizer/legacy.py,sha256=XJjkT0hejMH8qfAKz1ts8OUiBT18t2FJP3tJgLwUWwc,2327 +charset_normalizer/md.cpython-312-x86_64-linux-gnu.so,sha256=W654QTU3QZI6eWJ0fanScAr0_O6sL0I61fyRSdC-39Y,16064 +charset_normalizer/md.py,sha256=SIIZcENrslI7h3v4GigbFN61fRyE_wiCN1z9Ii3fBRo,20138 +charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so,sha256=aHbqbG6rcHNRf7bwpi57D1X8ZKAmyoVnTldPUDzCKMo,276848 +charset_normalizer/models.py,sha256=oAMAcBSEY7CngbUXJp34Wc4Rl9NKJJjGmUwW3EPtk6g,12425 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894 +charset_normalizer/version.py,sha256=AX66S4ytQFdd6F5jbVU2OPMqYwFS5M3BkMvyX-3BKF8,79 diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/WHEEL b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/WHEEL new file mode 100644 index 0000000..3e81182 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.1.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/entry_points.txt b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/entry_points.txt new file mode 100644 index 0000000..65619e7 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer.cli:cli_detect diff --git a/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/top_level.txt b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__init__.py b/env/lib/python3.12/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..55991fc --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +""" +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. +""" +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/env/lib/python3.12/site-packages/charset_normalizer/__main__.py b/env/lib/python3.12/site-packages/charset_normalizer/__main__.py new file mode 100644 index 0000000..beae2ef --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/__main__.py @@ -0,0 +1,4 @@ +from .cli import cli_detect + +if __name__ == "__main__": + cli_detect() diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67bdad6ff2614e565715b2b20b05e8356c8e63dc GIT binary patch literal 1744 zcmcIk&1)M+6rZ(Z$y(WQ?9fX~VG1RdAkzBd(4wXW#~-yImW$)`uoRZj?nt}w><2Tm za@9j|bLpSZzoF#f7D7#F-Aix1tT4r}5OV0DkmNU7?X8k#HF5_p|4S(L8_ivgvK`xmKQ;2Gh-X8~_{2l#? zHk2MMO|)Y!v#N}x$^XfS9ouTCKUFQqk8=p=n=avk%33SrK4IRMl@GU~t zqYzRZh?punNsiPp!2vzSB#L-QY!?7BhMOC$jm$5xCFK~B#{u!Fz@3oeW7o6Y%+;rT z>4tzWndZ< zS7zC<)$U6w#s-j2%%s2{zj9Vtx;OYbd7Au`oZ-PY$$9dF5^!>s{G6QPmUNlX~ztIe%}dp4FdLmSWklK3u9+$7tGANUIxDp#Y7b z)s?bxeMLxKnOw`%|2JG+--mW{fqe>Ha-b7|GpzftDWpd{M%s+x8Z>w~8=V-M?}T>j z(?AmGg@Fz;de@aQ5)H%XdeV*CbvyKp{aA1+jn|vDUe_CT81=c=b!7ur>?&SeUR_ZG zx8eFQv4JOP;XWUH~gr)zShufz7Kc8T53!lVTs_KS&0xO6&}P_1FC z;t1+6yaJ*E5yl`;sY~U3$dmF^Cyui_Of@aHp!p-=J9Gsm=%2`NL!TOc>=NH6j-1pun!;sD6YoTh1i=Wl8Gs|wQQ|3Zxm)Od#8evX!(q1(?<^<}{08w;ym@m$ z5IlJ+^ybMdv~!qw^WI~4%zMAzgHR{@ets3^Pq%C<+JN<8052dxk^(fjBLpy#(c%EW zB@rNb+ZYKnw4uZJmjq%++Fn*DF41G=+k|s1l;QklNLv~NM}w)OjnK&XE3CUKe(NyW}Lwar{GBl5@P%~CGKDXw0G&y3G@|cz) zTZlPUEX#$f&~sy*7KK`(W7{yJvT2i3ZDn2Hnd@HBMXv^-ttcVn3--V1&hzqv?tR9) NPuD97@xUcP{s(piROJ8w literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58a4743b2edc719053f42e8d50acf162906e1c2d GIT binary patch literal 17997 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/cd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dfbe5233c3292db7898179a3dc3799bd76210fb GIT binary patch literal 13453 zcmd6NS#TW3nPyd=)#wJgaS}HQHyR`^f|p2wH+YJGWI~pRu?B8*6@VuDfU3Gl0&c7^ zvLY7paKq5d>&Ra=r=A}9;+CyplMIEGFCNSMbkymeX;8C>R8Qq zO{{jjHdZ%Y7poty$2YIoAo#>0v7rW?opK1pZ#l*rg_1qFe&jaU7}52__B8Ce~2JB50bts=jMwyH1-4an_6Zk6%gi1#4rtI(A1 zD|*sK+vCM{p;^RCS}kxw%Ue!sKDy`FVEgA}fFnUxE4va8OJYonCqvN-VmKj)5^~+= z6RCKTCOuIpH4zSlXT+dWa-f#xxDW{^HOGq)IjM1@v&l#z9*SztvD9o-{G7~O(5ZPZ zerx#USB6Kc+tLP=53IJ`$g$w*wQLMoPuCL2Jfi-jAWRp%a_m;~{<)4D>mM8yart+#w4oGi|%&*K-Q*$x`zz?VPqoV72W^yJYr$ zbF$nj<+8rH)9yv~eqXZE`sOyj30#Uny`i)_ZNI}xPQjVBr`;z}kUa0%?$O;Sc;?aL zusv*}UmW`Tg5&;82b0`qwQ9e>{Ky@)O*3KJ>lncT+DyC2?npc4z1U?%x4*+Mk}d6i z$9BKefl>=rKW^ZSr8#$*pm+Xa5s&LzbgB7}EGNPdB2~O07Ce86(CbeQcIT1?; zsVJm)Dj~%}Nr}j$=A@(1Tmpp!%}M$sOI7$JkrmTiGVOGblgLzSZoQnOv9p?27R9)} zdt}WYo(V~zFyLe&OkhQ0BbqZjlZxLi{G?AEhnC0`lk1;u_01$=VqYvZ6N<$`Lf?f% zI7N_3?zZ;y$GEU!9j%jGi z9NVZrw0Jhx(zbXlS69C{`lPsQ`Or$muZtU(*j#1RyRW_T+E2vQmsijK_*S+uxa9l? zZ{Tsy@%6*mp0i7%TmDAH-;oPcKk)}MeOdqUb@7q^e6GADvtKPgoEto}d~MaQR`llr zbt|LUz=1VZ4GiF!3pA|`sDZY3{M&U*Nz)gNjIZpei)riIaXLIjziaJX_UHVyE2mZe z{!Bvk4}Dbe$Upqd$rRV;T6>?8GCOvc&$Z3CoUSjQ+3+qCT>5*q;(R@)70*hM81PYF z@m&~5aEwUP&Y$4+E;9}M$>ZQH17YyVx=cL<)ahZE@1VqjZNZ+#9)7(QX-6Iz(-wlI zncH1hBKCe+n!QC(ch8l!nYh9-EOWod!QAh200nO_L3aLB;hv7fr?9246Qj^6DIzj_ zO2+HmNOFb`?cV45UJg1WUf zyVjAcAzjCDB%ZI!7FdB@u%%h76z~Tc#YV6jtHP!23qa90i#fL~+6DVGW^)JkR$#N@!MFvWCGwTB_rWf zG$dKAbjd+|3CCt4GCyS^vXH={Cuc~LkOX-asvjLNkb6XPzDTTxfAZ1?e=Y>+2-+x2 z&^3WLP&6#rwQ#a72!4513`eFSqF`Vnv8Tvt>x*4x4zysMPocyp{^iTK0e^f<^U<}r zEPr-!B-h%xc>S}w;F3S*EnDe(~eE66aeyn!NjeoYB$qsdiYQ^Ia;McJ8V1P9r; z5{wTb5?@opG8kko%_J?zxI^l>zo8yy{Sv81rkY-~o`=+%W*~4y^FO8ncb%Am|KG_Q zly z(p=YIE`;JiyH+G8u@PhfXA&{yBp+@;mddP5mfR4<%Gji35f@0~Rg?(hUtYiss8hmt z$~L)rK+Vc)8(c@uTe0bFQoT*9z720r{>{DN?ZVrN`;oV4D^RTgx!Is3Eex<2m2U@iev`VvbaRDY-Vk+5Ci%r{rW0eKE z$NDa?)KYCF*mu8!XqB{W$_Bx*®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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/constant.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24fbdf2b1435c407bfe146c945bcd52d9fe4fb7d GIT binary patch literal 38777 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..911f4b808bd461e782ac941f1ae9136fa7d01cf0 GIT binary patch literal 17461 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 HmD&FX%c7-( literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e93f09a8024cf40ded8360ca5ca84d38a51e1c30 GIT binary patch literal 341 zcmX@j%ge<81lI8}>Ha|aF^B^L%uvQ>Js@K`LkdF_LkeRQV=7}7D@+N3PGMTj2;oIB zS2Am|R0(joRutqHrz(`C78Pga=W$iB8ta+p8Qfyj^V4Lx#U3A@lAjzOe~UXl9;yP! zVJ$Am$t=0W9_AVp?CI~flHoJR%wPHX8Tq-X`njbUiMhFnDf%w?$)&lec_qdA?wKVX zrAhjR1_rt=iIv5={%N|-`6;RTsd;7kIhjfN1(hWk`FX~AhDQ3unI);Z1&PVoiRr1u z`pFrIMa8Kl@p<`0xrsTMRjEb#P-o~BRNmsS$<0qG%}KQ@0tFAqW5tR<;sY}yBjZOV jCPtPI91Q$o4cs@lM6Yv6U*wXW;e44(p^?3a1E>lB82nqP literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/api.py b/env/lib/python3.12/site-packages/charset_normalizer/api.py new file mode 100644 index 0000000..e3f2283 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/api.py @@ -0,0 +1,668 @@ +import logging +from os import PathLike +from typing import BinaryIO, List, Optional, Set, Union + +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, +) + +# Will most likely be controversial +# logging.addLevelName(TRACE, "TRACE") +logger = logging.getLogger("charset_normalizer") +explain_handler = logging.StreamHandler() +explain_handler.setFormatter( + logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") +) + + +def from_bytes( + sequences: Union[bytes, bytearray], + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.2, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = 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: {0}".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: + 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: Optional[str] = ( + 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: Optional[CharsetMatch] = None + fallback_u8: Optional[CharsetMatch] = None + fallback_specified: Optional[CharsetMatch] = 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: Optional[str] = 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] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, + encoding_iana, + threshold, + False, + [], + 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: + 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: + 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: + 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: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = 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: Union[str, bytes, PathLike], # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = 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: Union[PathLike, str, BinaryIO, bytes], # type: ignore[type-arg] + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = 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/env/lib/python3.12/site-packages/charset_normalizer/cd.py b/env/lib/python3.12/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..4ea6760 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/cd.py @@ -0,0 +1,395 @@ +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter, Dict, List, Optional, Tuple + +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 IOError("Function not supported on multi-byte code page") + + decoder = importlib.import_module( + "encodings.{}".format(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: Optional[str] = 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: Optional[str] = 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("{} not available".format(language)) + + 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: Optional[str] = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: Optional[str] = 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: Optional[str] = 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/env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py b/env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..d95fedf --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/cli/__init__.py @@ -0,0 +1,6 @@ +from .__main__ import cli_detect, query_yes_no + +__all__ = ( + "cli_detect", + "query_yes_no", +) diff --git a/env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py b/env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py new file mode 100644 index 0000000..e7edd0f --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/cli/__main__.py @@ -0,0 +1,320 @@ +import argparse +import sys +from json import dumps +from os.path import abspath, basename, dirname, join, realpath +from platform import python_version +from typing import List, Optional +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") + + +def cli_detect(argv: Optional[List[str]] = 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=argparse.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 chaos allowed in decoded content. 0. <= chaos <= 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 IOError 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/env/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5620feb930b9dae18ac08128485b650aedf42d63 GIT binary patch literal 302 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", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", + "(", + ")", +} + + +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/env/lib/python3.12/site-packages/charset_normalizer/legacy.py b/env/lib/python3.12/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..3f6d490 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional +from warnings import warn + +from .api import from_bytes +from .constant import CHARDET_CORRESPONDENCE + +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: Optional[str] + language: str + confidence: Optional[float] + + +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 + "Expected object of type bytes or bytearray, got: " + "{0}".format(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 + + # 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/env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so b/env/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..3d0b46ae77baa966a03418d61fbd1da9d141366e GIT binary patch literal 16064 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/md.py b/env/lib/python3.12/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..d834db0 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/md.py @@ -0,0 +1,628 @@ +from functools import lru_cache +from logging import getLogger +from typing import List, Optional + +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, +) + + +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: Optional[str] = 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: # pragma: no cover + 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: # pragma: no cover + 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: # pragma: no cover + 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: Optional[str] = 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: # pragma: no cover + 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: Optional[str] = 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: Optional[str] = unicode_range(self._last_printable_seen) + unicode_range_b: Optional[str] = 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: # pragma: no cover + 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: # pragma: no cover + 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 CjkInvalidStopPlugin(MessDetectorPlugin): + """ + GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and + can be easily detected. Searching for the overuse of '丅' and '丄'. + """ + + def __init__(self) -> None: + self._wrong_stop_count: int = 0 + self._cjk_character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character in {"丅", "丄"}: + self._wrong_stop_count += 1 + return + if is_cjk(character): + self._cjk_character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._wrong_stop_count = 0 + self._cjk_character_count = 0 + + @property + def ratio(self) -> float: + if self._cjk_character_count < 16: + return 0.0 + return self._wrong_stop_count / self._cjk_character_count + + +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: Optional[str] = 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: # pragma: no cover + 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: # pragma: no cover + 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: Optional[str], unicode_range_b: Optional[str] +) -> 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: # pragma: nocover + logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") + + return round(mean_mess_ratio, 3) diff --git a/env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so b/env/lib/python3.12/site-packages/charset_normalizer/md__mypyc.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..27ce76b9d2234b32a2c4e3baa9d52c9080f12c57 GIT binary patch literal 276848 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�J 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 z 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_against_stdlib_http.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_against_stdlib_http.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b60f4d5b775c38e9b3a6810e75bc21147e836942 GIT binary patch literal 6924 zcmbVQTWlNGnLfk0@J?Mw-7HI%+P_@M_&QQ1-{LKcWX1S&zog_sJP zv~N00YcUgMw3rRE5StQQ(i}D?Eny3V_H@FUw1sV&&Lr$fN7#{chMn3sn{Xwo!d041 zC91>KqDA0DhhP?&c)Q*eBOWm|!G~ZGosfUfNY^!i5~vXxZAKWudYAdMm=Si1ruY%v z%828~3|-g$jHOS{H)65jQ$3IP%F6ZGT~M&w+eErE6-A?#6Bod10~ufsRN{w$kZJZ zMLr}H{N3;RKK&uNLwVibV)cVwlWLA8(sC>{s=A`-lp=m#N%ARvRFu4w+Bg(Tjwi%R z!^7{sCw^~2l$A?-N=QJSNwoy|M1sGW5LN4dm=YykNn;W7gp^2+iz(GSRxtIeoFpm} zQYu=UG;LTc$OG`(f6#H|sJOn3jYQa> z0v)41V@kD{1U6%elxnh)j4AHiQJ|>m%SDk4^%K(qg>f8?O?fcvCSho=v$;bG3-NOr z7K4Lzn6h?uo%VOYU#EoQSDoYOL?RM{C6R9PiP4WdzZm%a)ZMpW>N$m%Mny&CZruSz z9`;&Phn$Yy5)~P2MM<>|2j3kks>+xo@&c|eH>|0uQ?rVUq$LrJIe{0G>6FUKP_3d` zs}jPc1NF9bsA=tNRXDRN*S zrd*o18R+cj@P+tE+4s(fFPIj@fS9@+NW^Xi#wV4rbgJ9m*%gpuis&2Xqqktg$$_!X z&VT}&Ox9$CALU~yS&7Js0L3EM4gdHgbYB~4q%c-#5A??cKlv7j{~~{yA=?(>Y}#w8 zG#q1QlJT z*^Xe>B3J`#Ek+g-BN7fx#+usNBt%s(l=zgK;FW^ml=shf#=qMX(OSmSI76OSwPYaiDNHQ%}avREDJt? zg8&*w5gKt`An2{=u?Bg6O>2#X`gTekCiS}Ym?BEEZl~K!(;6t_5|)LM1*7cKvoefP zSBBX!k8Qez5l;|lKg`tuBSqI>UJvQI5euwdw;ltRzN5UMTNrKcXt#pr0qxdgnD|k> zoDmD$EwGnOSI7^k*VKF5D5YyqZ&ikdn*Dl;5l_K>o2Fk=XN8r5I;j+O|B2G6*Oj65 z(JNhgn$c@3dVTPx6RhUl?fOPyEb~Wd3p7}sK3SwkuX#|V2l|Jnn7~LnjR18iEi0-u zk&g0-F;E}TDwh<2Py`8&6}TP1cA_MIi-+;suRwVBXdF>M4cy==S6~peCJNLDkOqEF zN{lKoAVF7wRU*6~NTMvOG;oq?3mOJo@H?0L2ZvR&ET#nTfDkcLf@&@zvg+th3Ga+t zgR($rs`ciiBJz^NPpY;QxKkt)o;;EP3<<#IbEAB;&fqwIeuYee&pk!jTT?7#kbZHSgY?? zcXa-zd+)>E*-*Z=KHu21>{xRA)HTOGudbUDf9%M+8$S*%Ut7ACb9<4@>lX&+2Uj|O zcIuN;tL^{Tv+nWdJ$s+K8y4Azz5jIJXU9J|o^$*2&21aa$8*icAJb2pyR)9|Y;(6^ zbL5jFIrq`Lr*W}=`O4CjoagXdsFb_W-j#!YcURuiwAoDD4cmK(r)kjxwfmpCJFz8ku zLH{+w4mizGFe?R}q_#Yew8Lirj{$rIdXn-oYR#q2&fPA;;4beQPYRxdEf07gJ1G!I zOs~Jxpg{*3d6oR-N}jg@^%X)Tiqyel8m^H=Xh$+G3kI|Uh#U2lXwfh)f_MdA96-Fr zu+ufTY8CGodJG^QQcA?O1H_GXahl5lv}?*R0I7euWCf}%Lh5veo+$u5dRJPAqaRxq zGISgr!?F-B5uTADnDh}rnKmO`*Iru&eXOz&A`jRHT$GN1Q~7s?3Aq6~W15}jGVE(= zfu>6|Yjn|Y%PL*)1!k0d#_B|*&y5~y?o0)e ze{D+@Xggz$`;1=cnz0_AaeAxe@n7AG3j0bwGq1K$PRWz7npAQ2@4Q0CJ7`zxfWfFN zFGpiB35O`58{jobA=Cq?QyQyy8zhZY%~IisKst#Ar$DIOQ2%?^``?q^#FV#Cyp5s{ z#RU{SD0)GtOkBo0s4$TnmnC#!;9e>s(`mG>wI`iH>$50=DEc)kF@;uMi?kopE~B`D z;%`t~1)(x{nNV4{L{9*3#!@3`?Lwk4V2K2|!gIw`<15hVFXUj&@{bB^==97DFWi{F zvF>bN;a_FFeEpu;f!!qa|753QpB&4%efib{a|4wLrw#~bvz~aGv+l!L$6=6Qx6m`+ z^G)la<y|H;oI{~Xz7>9+dc`_3(0TO3|Fxk;0zmSy{r zePv*+@%XCvdE!yxm#5eK!CYf7?>qNLH2!b1xu$lDwt8H%p-oR2TQA>Oy74&ruU+dc z7uV_s)*YAf1^U<7eEEZ=4^~fn-utNc@tw6}Z>_hyy;k41?zm89Rz~{Bp$D?g_W#*B z3>|p!M&awFj4=3*Uvt%Gy@j_h)#FoBPayEobk9fA0U4gT;Ef6%SP%fEcTpff zNyr8oI!)OOBb9>(PVKi&PKp;46UDnC_4E^)~(*v_w#joHtM{&I`2K(EHf+QU57VZzMRXqDm)IYxz5hg zcnkRM;?Tna1m@kIg|qW#ANH;scnS&$+PzuE zo3(rMcK4jJczON@E16uwiJbjJmO=TVst62PLs_f0=w6=+HquYH!$Al8HCU_CF9C(1)pd)8wF<^3J-s=;FDJ=AK-0 zPqw}%=j`32A^jWHHJjO}I+UwAw4$sIXRA7MY}X%I$l0RxvYV}>*0azs->|TEe(&PV z<K+Cw#7uX zX7``nCJ=AgTBy$Lx2YDYYtgaMcskd3dYixpB-yExFNRD|Aj|H1DdR2T-}co6_tRhO JXM;!0{|9o9cLe|d literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_connection.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84261581ba676a95d5f7529aaa5633d882fe0090 GIT binary patch literal 57993 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_events.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_events.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ae48316e3a1573901a5a569c42f2b8f0aae9c61 GIT binary patch literal 5455 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
    =T%e+56~N0*_%~LE9qcv5srx@X&;Y`ynbU zBWYR5aN_kyaxNiuz-I^m(nI>Uhm0MipD3Y6A0IrVMx$s-3mUCNB$ye}0EmZ~cM@I& zS_ns-HbVwFIz1NY6kw#&s6eEeeO6KC!VsA<1S~M3ZvYZ9^B$Im5-ZHSefrEppFqmL zeMqkZ!Q1ece*p!`P+K0cRjaiPtF`-A_xaS05w&h~je&W%MsA)e4$OH3NZ*^k6H>d+ zsa<0^_B`yGPL#?R`3!8Gtb^lsbRl|C;A&KOUWq64sMQm8JrZ@tNM{ix(o^su zdpwyI<`d$p(ip(dVMF#o@r1;2{4W^)H|+2_LF2@?7%ChXek4zi<9JtonsDRv+Uxis IykPZz0lW-M>i_@% literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_helpers.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0672c91a3631c623022c9033cb0326b79cc2e93 GIT binary patch literal 1208 zcmah|&1(}u6rbJfXR;}wAJ9gTB3KNPZqv_8@zNGQz!d6j5yB=j`Jg+yab{A8ry}0! zp`uWaJyzO3MDUu^lAB(7OHHNV$(ik@2~uss3T3bHcuD(E&x-}H4TYJc7;nXv~8W8LXwd?I5 z+6;V(LVX9lZXwD-V?dotBD)k$`9khB-k=iXSxZQyp~Xu4j_8x-$R7&&RUUK%m^F4*{U^bMRJbgWOoLFWOk(BT~d*B5(2hE9Y`@ zn4-*OEn2DskPo+xT!;vbBuf!4N4OHlB@>k3^+hJDFrCT?X z+~w7Xg`^)i?1OG<_J@`E)Hqf?1|4gzYh@1M`|YkZc|37a?pTEzBIc(LihonlO>ZJ; zCi@A?(k`>WOdmez7}H%N^ZDh;{f?3E8dl6q9*hZRu4ByfQd&~`IWul)Jut3n7l2zN z%d6r8(g=spM6^6=bkta)30JHVF$9Q?i%~{RxE_jlDwz==vXVPOVXWf- nwmkHh%yL((2))OlmyjgsN;V|<3UIg(@M|1Mk1n+d>AI>vWN!;& literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_io.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d77fc44d33963ab066b94b6f4a031867e7ade579 GIT binary patch literal 19849 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 X!wP8nGC}8hv6r?!sew9Vv-y7jJLc!% literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_receivebuffer.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_receivebuffer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b43c85e30b3fcd90fee9d2028f89c1a9e58c42da GIT binary patch literal 3983 zcmbtWO>7&-6`ozruE`y)MA@P&Td__3HKGEErX;(uBqVU-Hbx!DZDSySkbqcnRuX0Y zD6=akbm@Q!0)&nW)VE%PqK6djp}qCkdoM%kV0Y^R2HYNWV@#iN>YF8(KN9r=WPzQT zeeccp{$}3Wf9kr1;3*|OUjITz=%x7Zo%< zUt4P3=b_S5rfh2GKm}E(w1#Q_SNKWOgjG_Iq62&4Yb7c<%AM`4jJYSwfiL|xX39+8 zGk>+*%_ zC$X;KQ%^L#(=OWgBhmW1&_X9cqXV6Lj*QIdlS&@pZ+G<0v@9eYNo_8@+&++s(mJAp ze?0EqhP&)L0?|8Tbm%1dJ?Wn3_H64840md8R3A9K=T4$w9kuuNJS82T6;Sm23KPY$ zF5*-dK@gabmz5;d?X=PLIEEnyq%+@nHVWutr}@x_xnWtKghINM>ijUpJ6-I0Ys2 z+#i0_U%LLU{!r0q!Rmj-4@m(_cUARhSIiBTY_83gNN=7&y z;bg?aY*X5pbGzgx-%YeI4>-_LE(AeoQ+31rS`aBJ4_vC?OQq{B=0t@|2*g;GT;uo} zC)Yg0`&BZ^@hB&wU4qk9vcT~ICkvinXY9`Id{DanOxVx_Zdu?-e^wUgTu4OZW6rl|Y`CI9ckVdr|Rh@;qpU zXRdOrc z$I~zh7tigiG|fH0ZRKiym%Pc}TCS31j+Z%EZk|@x<1%DxxEtZyWR*;DJjKb>K11Nt zF;S=-Oby$JDwg;wzIo@)uVV4pcx3MK<;d+@x>i3A)c5i^8*b-}UDz@gBQ{+3*jC0! z=b)CIX|Qu<%1-BVi;+|&Z<#;+Oa^?OI*@tpm4Px#pH}jS0h@Ay*^l%jYtM4y6ja0Bk1UnW(qy zk{CL+WYeFUv|*}|qlwH~s`cLtlA^4NxBevzJ^!htBD#S-fx7%aE=on&?Q7ES0vHvg zO|f&|)9T*7q7S;abV&D>TK%)*&j5OyZzbxp`T=ua0Igx59Tq<~;RnL!1_2t3=mkt< zmx;tgF%wX15C#W}TF%0-bURQ49yTNxQwM8oVlB@S>D)adlcw$Xvk4IYNC2$DP(rV7 zN+>WSito$NU>QI22g-LI1|CW^9~ubPRHXNH+^-iT^a|my3PVt>A*_fYsJ_-vaKNq5 z#VQ%+c)UW!-2)z#nF?A~qCrPyrlZ0sh91g97917&3A78Rue)J1ycg}k!C8adb;y>% zjI3$1^nKG&+z&S{t|Na&uAW8={L9%q-OiZruo>7c4vqCE7-~LAlKzbX|3Skqk^Vn4 zT~}{O(s=D-8Oi>yM|MV@O2ZXt_!-t-_y^1C?}HD6HCfgBYJDg)`FbD_&}xGy5Z=d` tI*#+!B}J_(W3pWPg``Upf4%be@ZXke2$ui2@k&hf_a)$d?{Zx){tuN$USR+L literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_state.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9391f9b0e2f1dbaa616c15b325edfc97f7921ca GIT binary patch literal 12545 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 Dz2pKr literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_util.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/test_util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fde37cd770bb5264ffe0dda3b9193c6895d57faa GIT binary patch literal 6119 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 Hy0iTkHSNda literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/data/test-file b/env/lib/python3.12/site-packages/h11/tests/data/test-file new file mode 100644 index 0000000..d0be0a6 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/data/test-file @@ -0,0 +1 @@ +92b12bc045050b55b848d37167a1a63947c364579889ce1d39788e45e9fac9e5 diff --git a/env/lib/python3.12/site-packages/h11/tests/helpers.py b/env/lib/python3.12/site-packages/h11/tests/helpers.py new file mode 100644 index 0000000..571be44 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/helpers.py @@ -0,0 +1,101 @@ +from typing import cast, List, Type, Union, ValuesView + +from .._connection import Connection, NEED_DATA, PAUSED +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .._state import CLIENT, CLOSED, DONE, MUST_CLOSE, SERVER +from .._util import Sentinel + +try: + from typing import Literal +except ImportError: + from typing_extensions import Literal # type: ignore + + +def get_all_events(conn: Connection) -> List[Event]: + got_events = [] + while True: + event = conn.next_event() + if event in (NEED_DATA, PAUSED): + break + event = cast(Event, event) + got_events.append(event) + if type(event) is ConnectionClosed: + break + return got_events + + +def receive_and_get(conn: Connection, data: bytes) -> List[Event]: + conn.receive_data(data) + return get_all_events(conn) + + +# Merges adjacent Data events, converts payloads to bytestrings, and removes +# chunk boundaries. +def normalize_data_events(in_events: List[Event]) -> List[Event]: + out_events: List[Event] = [] + for event in in_events: + if type(event) is Data: + event = Data(data=bytes(event.data), chunk_start=False, chunk_end=False) + if out_events and type(out_events[-1]) is type(event) is Data: + out_events[-1] = Data( + data=out_events[-1].data + event.data, + chunk_start=out_events[-1].chunk_start, + chunk_end=out_events[-1].chunk_end, + ) + else: + out_events.append(event) + return out_events + + +# Given that we want to write tests that push some events through a Connection +# and check that its state updates appropriately... we might as make a habit +# of pushing them through two Connections with a fake network link in +# between. +class ConnectionPair: + def __init__(self) -> None: + self.conn = {CLIENT: Connection(CLIENT), SERVER: Connection(SERVER)} + self.other = {CLIENT: SERVER, SERVER: CLIENT} + + @property + def conns(self) -> ValuesView[Connection]: + return self.conn.values() + + # expect="match" if expect=send_events; expect=[...] to say what expected + def send( + self, + role: Type[Sentinel], + send_events: Union[List[Event], Event], + expect: Union[List[Event], Event, Literal["match"]] = "match", + ) -> bytes: + if not isinstance(send_events, list): + send_events = [send_events] + data = b"" + closed = False + for send_event in send_events: + new_data = self.conn[role].send(send_event) + if new_data is None: + closed = True + else: + data += new_data + # send uses b"" to mean b"", and None to mean closed + # receive uses b"" to mean closed, and None to mean "try again" + # so we have to translate between the two conventions + if data: + self.conn[self.other[role]].receive_data(data) + if closed: + self.conn[self.other[role]].receive_data(b"") + got_events = get_all_events(self.conn[self.other[role]]) + if expect == "match": + expect = send_events + if not isinstance(expect, list): + expect = [expect] + assert got_events == expect + return data diff --git a/env/lib/python3.12/site-packages/h11/tests/test_against_stdlib_http.py b/env/lib/python3.12/site-packages/h11/tests/test_against_stdlib_http.py new file mode 100644 index 0000000..d2ee131 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_against_stdlib_http.py @@ -0,0 +1,115 @@ +import json +import os.path +import socket +import socketserver +import threading +from contextlib import closing, contextmanager +from http.server import SimpleHTTPRequestHandler +from typing import Callable, Generator +from urllib.request import urlopen + +import h11 + + +@contextmanager +def socket_server( + handler: Callable[..., socketserver.BaseRequestHandler] +) -> Generator[socketserver.TCPServer, None, None]: + httpd = socketserver.TCPServer(("127.0.0.1", 0), handler) + thread = threading.Thread( + target=httpd.serve_forever, kwargs={"poll_interval": 0.01} + ) + thread.daemon = True + try: + thread.start() + yield httpd + finally: + httpd.shutdown() + + +test_file_path = os.path.join(os.path.dirname(__file__), "data/test-file") +with open(test_file_path, "rb") as f: + test_file_data = f.read() + + +class SingleMindedRequestHandler(SimpleHTTPRequestHandler): + def translate_path(self, path: str) -> str: + return test_file_path + + +def test_h11_as_client() -> None: + with socket_server(SingleMindedRequestHandler) as httpd: + with closing(socket.create_connection(httpd.server_address)) as s: + c = h11.Connection(h11.CLIENT) + + s.sendall( + c.send( # type: ignore[arg-type] + h11.Request( + method="GET", target="/foo", headers=[("Host", "localhost")] + ) + ) + ) + s.sendall(c.send(h11.EndOfMessage())) # type: ignore[arg-type] + + data = bytearray() + while True: + event = c.next_event() + print(event) + if event is h11.NEED_DATA: + # Use a small read buffer to make things more challenging + # and exercise more paths :-) + c.receive_data(s.recv(10)) + continue + if type(event) is h11.Response: + assert event.status_code == 200 + if type(event) is h11.Data: + data += event.data + if type(event) is h11.EndOfMessage: + break + assert bytes(data) == test_file_data + + +class H11RequestHandler(socketserver.BaseRequestHandler): + def handle(self) -> None: + with closing(self.request) as s: + c = h11.Connection(h11.SERVER) + request = None + while True: + event = c.next_event() + if event is h11.NEED_DATA: + # Use a small read buffer to make things more challenging + # and exercise more paths :-) + c.receive_data(s.recv(10)) + continue + if type(event) is h11.Request: + request = event + if type(event) is h11.EndOfMessage: + break + assert request is not None + info = json.dumps( + { + "method": request.method.decode("ascii"), + "target": request.target.decode("ascii"), + "headers": { + name.decode("ascii"): value.decode("ascii") + for (name, value) in request.headers + }, + } + ) + s.sendall(c.send(h11.Response(status_code=200, headers=[]))) # type: ignore[arg-type] + s.sendall(c.send(h11.Data(data=info.encode("ascii")))) + s.sendall(c.send(h11.EndOfMessage())) + + +def test_h11_as_server() -> None: + with socket_server(H11RequestHandler) as httpd: + host, port = httpd.server_address + url = "http://{}:{}/some-path".format(host, port) + with closing(urlopen(url)) as f: + assert f.getcode() == 200 + data = f.read() + info = json.loads(data.decode("ascii")) + print(info) + assert info["method"] == "GET" + assert info["target"] == "/some-path" + assert "urllib" in info["headers"]["user-agent"] diff --git a/env/lib/python3.12/site-packages/h11/tests/test_connection.py b/env/lib/python3.12/site-packages/h11/tests/test_connection.py new file mode 100644 index 0000000..73a27b9 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_connection.py @@ -0,0 +1,1122 @@ +from typing import Any, cast, Dict, List, Optional, Tuple, Type + +import pytest + +from .._connection import _body_framing, _keep_alive, Connection, NEED_DATA, PAUSED +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .._state import ( + CLIENT, + CLOSED, + DONE, + ERROR, + IDLE, + MIGHT_SWITCH_PROTOCOL, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, + SWITCHED_PROTOCOL, +) +from .._util import LocalProtocolError, RemoteProtocolError, Sentinel +from .helpers import ConnectionPair, get_all_events, receive_and_get + + +def test__keep_alive() -> None: + assert _keep_alive( + Request(method="GET", target="/", headers=[("Host", "Example.com")]) + ) + assert not _keep_alive( + Request( + method="GET", + target="/", + headers=[("Host", "Example.com"), ("Connection", "close")], + ) + ) + assert not _keep_alive( + Request( + method="GET", + target="/", + headers=[("Host", "Example.com"), ("Connection", "a, b, cLOse, foo")], + ) + ) + assert not _keep_alive( + Request(method="GET", target="/", headers=[], http_version="1.0") # type: ignore[arg-type] + ) + + assert _keep_alive(Response(status_code=200, headers=[])) # type: ignore[arg-type] + assert not _keep_alive(Response(status_code=200, headers=[("Connection", "close")])) + assert not _keep_alive( + Response(status_code=200, headers=[("Connection", "a, b, cLOse, foo")]) + ) + assert not _keep_alive(Response(status_code=200, headers=[], http_version="1.0")) # type: ignore[arg-type] + + +def test__body_framing() -> None: + def headers(cl: Optional[int], te: bool) -> List[Tuple[str, str]]: + headers = [] + if cl is not None: + headers.append(("Content-Length", str(cl))) + if te: + headers.append(("Transfer-Encoding", "chunked")) + return headers + + def resp( + status_code: int = 200, cl: Optional[int] = None, te: bool = False + ) -> Response: + return Response(status_code=status_code, headers=headers(cl, te)) + + def req(cl: Optional[int] = None, te: bool = False) -> Request: + h = headers(cl, te) + h += [("Host", "example.com")] + return Request(method="GET", target="/", headers=h) + + # Special cases where the headers are ignored: + for kwargs in [{}, {"cl": 100}, {"te": True}, {"cl": 100, "te": True}]: + kwargs = cast(Dict[str, Any], kwargs) + for meth, r in [ + (b"HEAD", resp(**kwargs)), + (b"GET", resp(status_code=204, **kwargs)), + (b"GET", resp(status_code=304, **kwargs)), + ]: + assert _body_framing(meth, r) == ("content-length", (0,)) + + # Transfer-encoding + for kwargs in [{"te": True}, {"cl": 100, "te": True}]: + kwargs = cast(Dict[str, Any], kwargs) + for meth, r in [(None, req(**kwargs)), (b"GET", resp(**kwargs))]: # type: ignore + assert _body_framing(meth, r) == ("chunked", ()) + + # Content-Length + for meth, r in [(None, req(cl=100)), (b"GET", resp(cl=100))]: # type: ignore + assert _body_framing(meth, r) == ("content-length", (100,)) + + # No headers + assert _body_framing(None, req()) == ("content-length", (0,)) # type: ignore + assert _body_framing(b"GET", resp()) == ("http/1.0", ()) + + +def test_Connection_basics_and_content_length() -> None: + with pytest.raises(ValueError): + Connection("CLIENT") # type: ignore + + p = ConnectionPair() + assert p.conn[CLIENT].our_role is CLIENT + assert p.conn[CLIENT].their_role is SERVER + assert p.conn[SERVER].our_role is SERVER + assert p.conn[SERVER].their_role is CLIENT + + data = p.send( + CLIENT, + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Content-Length", "10")], + ), + ) + assert data == ( + b"GET / HTTP/1.1\r\n" b"Host: example.com\r\n" b"Content-Length: 10\r\n\r\n" + ) + + for conn in p.conns: + assert conn.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + assert p.conn[CLIENT].our_state is SEND_BODY + assert p.conn[CLIENT].their_state is SEND_RESPONSE + assert p.conn[SERVER].our_state is SEND_RESPONSE + assert p.conn[SERVER].their_state is SEND_BODY + + assert p.conn[CLIENT].their_http_version is None + assert p.conn[SERVER].their_http_version == b"1.1" + + data = p.send(SERVER, InformationalResponse(status_code=100, headers=[])) # type: ignore[arg-type] + assert data == b"HTTP/1.1 100 \r\n\r\n" + + data = p.send(SERVER, Response(status_code=200, headers=[("Content-Length", "11")])) + assert data == b"HTTP/1.1 200 \r\nContent-Length: 11\r\n\r\n" + + for conn in p.conns: + assert conn.states == {CLIENT: SEND_BODY, SERVER: SEND_BODY} + + assert p.conn[CLIENT].their_http_version == b"1.1" + assert p.conn[SERVER].their_http_version == b"1.1" + + data = p.send(CLIENT, Data(data=b"12345")) + assert data == b"12345" + data = p.send( + CLIENT, Data(data=b"67890"), expect=[Data(data=b"67890"), EndOfMessage()] + ) + assert data == b"67890" + data = p.send(CLIENT, EndOfMessage(), expect=[]) + assert data == b"" + + for conn in p.conns: + assert conn.states == {CLIENT: DONE, SERVER: SEND_BODY} + + data = p.send(SERVER, Data(data=b"1234567890")) + assert data == b"1234567890" + data = p.send(SERVER, Data(data=b"1"), expect=[Data(data=b"1"), EndOfMessage()]) + assert data == b"1" + data = p.send(SERVER, EndOfMessage(), expect=[]) + assert data == b"" + + for conn in p.conns: + assert conn.states == {CLIENT: DONE, SERVER: DONE} + + +def test_chunked() -> None: + p = ConnectionPair() + + p.send( + CLIENT, + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Transfer-Encoding", "chunked")], + ), + ) + data = p.send(CLIENT, Data(data=b"1234567890", chunk_start=True, chunk_end=True)) + assert data == b"a\r\n1234567890\r\n" + data = p.send(CLIENT, Data(data=b"abcde", chunk_start=True, chunk_end=True)) + assert data == b"5\r\nabcde\r\n" + data = p.send(CLIENT, Data(data=b""), expect=[]) + assert data == b"" + data = p.send(CLIENT, EndOfMessage(headers=[("hello", "there")])) + assert data == b"0\r\nhello: there\r\n\r\n" + + p.send( + SERVER, Response(status_code=200, headers=[("Transfer-Encoding", "chunked")]) + ) + p.send(SERVER, Data(data=b"54321", chunk_start=True, chunk_end=True)) + p.send(SERVER, Data(data=b"12345", chunk_start=True, chunk_end=True)) + p.send(SERVER, EndOfMessage()) + + for conn in p.conns: + assert conn.states == {CLIENT: DONE, SERVER: DONE} + + +def test_chunk_boundaries() -> None: + conn = Connection(our_role=SERVER) + + request = ( + b"POST / HTTP/1.1\r\n" + b"Host: example.com\r\n" + b"Transfer-Encoding: chunked\r\n" + b"\r\n" + ) + conn.receive_data(request) + assert conn.next_event() == Request( + method="POST", + target="/", + headers=[("Host", "example.com"), ("Transfer-Encoding", "chunked")], + ) + assert conn.next_event() is NEED_DATA + + conn.receive_data(b"5\r\nhello\r\n") + assert conn.next_event() == Data(data=b"hello", chunk_start=True, chunk_end=True) + + conn.receive_data(b"5\r\nhel") + assert conn.next_event() == Data(data=b"hel", chunk_start=True, chunk_end=False) + + conn.receive_data(b"l") + assert conn.next_event() == Data(data=b"l", chunk_start=False, chunk_end=False) + + conn.receive_data(b"o\r\n") + assert conn.next_event() == Data(data=b"o", chunk_start=False, chunk_end=True) + + conn.receive_data(b"5\r\nhello") + assert conn.next_event() == Data(data=b"hello", chunk_start=True, chunk_end=True) + + conn.receive_data(b"\r\n") + assert conn.next_event() == NEED_DATA + + conn.receive_data(b"0\r\n\r\n") + assert conn.next_event() == EndOfMessage() + + +def test_client_talking_to_http10_server() -> None: + c = Connection(CLIENT) + c.send(Request(method="GET", target="/", headers=[("Host", "example.com")])) + c.send(EndOfMessage()) + assert c.our_state is DONE + # No content-length, so Http10 framing for body + assert receive_and_get(c, b"HTTP/1.0 200 OK\r\n\r\n") == [ + Response(status_code=200, headers=[], http_version="1.0", reason=b"OK") # type: ignore[arg-type] + ] + assert c.our_state is MUST_CLOSE + assert receive_and_get(c, b"12345") == [Data(data=b"12345")] + assert receive_and_get(c, b"67890") == [Data(data=b"67890")] + assert receive_and_get(c, b"") == [EndOfMessage(), ConnectionClosed()] + assert c.their_state is CLOSED + + +def test_server_talking_to_http10_client() -> None: + c = Connection(SERVER) + # No content-length, so no body + # NB: no host header + assert receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") == [ + Request(method="GET", target="/", headers=[], http_version="1.0"), # type: ignore[arg-type] + EndOfMessage(), + ] + assert c.their_state is MUST_CLOSE + + # We automatically Connection: close back at them + assert ( + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + == b"HTTP/1.1 200 \r\nConnection: close\r\n\r\n" + ) + + assert c.send(Data(data=b"12345")) == b"12345" + assert c.send(EndOfMessage()) == b"" + assert c.our_state is MUST_CLOSE + + # Check that it works if they do send Content-Length + c = Connection(SERVER) + # NB: no host header + assert receive_and_get(c, b"POST / HTTP/1.0\r\nContent-Length: 10\r\n\r\n1") == [ + Request( + method="POST", + target="/", + headers=[("Content-Length", "10")], + http_version="1.0", + ), + Data(data=b"1"), + ] + assert receive_and_get(c, b"234567890") == [Data(data=b"234567890"), EndOfMessage()] + assert c.their_state is MUST_CLOSE + assert receive_and_get(c, b"") == [ConnectionClosed()] + + +def test_automatic_transfer_encoding_in_response() -> None: + # Check that in responses, the user can specify either Transfer-Encoding: + # chunked or no framing at all, and in both cases we automatically select + # the right option depending on whether the peer speaks HTTP/1.0 or + # HTTP/1.1 + for user_headers in [ + [("Transfer-Encoding", "chunked")], + [], + # In fact, this even works if Content-Length is set, + # because if both are set then Transfer-Encoding wins + [("Transfer-Encoding", "chunked"), ("Content-Length", "100")], + ]: + user_headers = cast(List[Tuple[str, str]], user_headers) + p = ConnectionPair() + p.send( + CLIENT, + [ + Request(method="GET", target="/", headers=[("Host", "example.com")]), + EndOfMessage(), + ], + ) + # When speaking to HTTP/1.1 client, all of the above cases get + # normalized to Transfer-Encoding: chunked + p.send( + SERVER, + Response(status_code=200, headers=user_headers), + expect=Response( + status_code=200, headers=[("Transfer-Encoding", "chunked")] + ), + ) + + # When speaking to HTTP/1.0 client, all of the above cases get + # normalized to no-framing-headers + c = Connection(SERVER) + receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") + assert ( + c.send(Response(status_code=200, headers=user_headers)) + == b"HTTP/1.1 200 \r\nConnection: close\r\n\r\n" + ) + assert c.send(Data(data=b"12345")) == b"12345" + + +def test_automagic_connection_close_handling() -> None: + p = ConnectionPair() + # If the user explicitly sets Connection: close, then we notice and + # respect it + p.send( + CLIENT, + [ + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Connection", "close")], + ), + EndOfMessage(), + ], + ) + for conn in p.conns: + assert conn.states[CLIENT] is MUST_CLOSE + # And if the client sets it, the server automatically echoes it back + p.send( + SERVER, + # no header here... + [Response(status_code=204, headers=[]), EndOfMessage()], # type: ignore[arg-type] + # ...but oh look, it arrived anyway + expect=[ + Response(status_code=204, headers=[("connection", "close")]), + EndOfMessage(), + ], + ) + for conn in p.conns: + assert conn.states == {CLIENT: MUST_CLOSE, SERVER: MUST_CLOSE} + + +def test_100_continue() -> None: + def setup() -> ConnectionPair: + p = ConnectionPair() + p.send( + CLIENT, + Request( + method="GET", + target="/", + headers=[ + ("Host", "example.com"), + ("Content-Length", "100"), + ("Expect", "100-continue"), + ], + ), + ) + for conn in p.conns: + assert conn.client_is_waiting_for_100_continue + assert not p.conn[CLIENT].they_are_waiting_for_100_continue + assert p.conn[SERVER].they_are_waiting_for_100_continue + return p + + # Disabled by 100 Continue + p = setup() + p.send(SERVER, InformationalResponse(status_code=100, headers=[])) # type: ignore[arg-type] + for conn in p.conns: + assert not conn.client_is_waiting_for_100_continue + assert not conn.they_are_waiting_for_100_continue + + # Disabled by a real response + p = setup() + p.send( + SERVER, Response(status_code=200, headers=[("Transfer-Encoding", "chunked")]) + ) + for conn in p.conns: + assert not conn.client_is_waiting_for_100_continue + assert not conn.they_are_waiting_for_100_continue + + # Disabled by the client going ahead and sending stuff anyway + p = setup() + p.send(CLIENT, Data(data=b"12345")) + for conn in p.conns: + assert not conn.client_is_waiting_for_100_continue + assert not conn.they_are_waiting_for_100_continue + + +def test_max_incomplete_event_size_countermeasure() -> None: + # Infinitely long headers are definitely not okay + c = Connection(SERVER) + c.receive_data(b"GET / HTTP/1.0\r\nEndless: ") + assert c.next_event() is NEED_DATA + with pytest.raises(RemoteProtocolError): + while True: + c.receive_data(b"a" * 1024) + c.next_event() + + # Checking that the same header is accepted / rejected depending on the + # max_incomplete_event_size setting: + c = Connection(SERVER, max_incomplete_event_size=5000) + c.receive_data(b"GET / HTTP/1.0\r\nBig: ") + c.receive_data(b"a" * 4000) + c.receive_data(b"\r\n\r\n") + assert get_all_events(c) == [ + Request( + method="GET", target="/", http_version="1.0", headers=[("big", "a" * 4000)] + ), + EndOfMessage(), + ] + + c = Connection(SERVER, max_incomplete_event_size=4000) + c.receive_data(b"GET / HTTP/1.0\r\nBig: ") + c.receive_data(b"a" * 4000) + with pytest.raises(RemoteProtocolError): + c.next_event() + + # Temporarily exceeding the size limit is fine, as long as its done with + # complete events: + c = Connection(SERVER, max_incomplete_event_size=5000) + c.receive_data(b"GET / HTTP/1.0\r\nContent-Length: 10000") + c.receive_data(b"\r\n\r\n" + b"a" * 10000) + assert get_all_events(c) == [ + Request( + method="GET", + target="/", + http_version="1.0", + headers=[("Content-Length", "10000")], + ), + Data(data=b"a" * 10000), + EndOfMessage(), + ] + + c = Connection(SERVER, max_incomplete_event_size=100) + # Two pipelined requests to create a way-too-big receive buffer... but + # it's fine because we're not checking + c.receive_data( + b"GET /1 HTTP/1.1\r\nHost: a\r\n\r\n" + b"GET /2 HTTP/1.1\r\nHost: b\r\n\r\n" + b"X" * 1000 + ) + assert get_all_events(c) == [ + Request(method="GET", target="/1", headers=[("host", "a")]), + EndOfMessage(), + ] + # Even more data comes in, still no problem + c.receive_data(b"X" * 1000) + # We can respond and reuse to get the second pipelined request + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + c.start_next_cycle() + assert get_all_events(c) == [ + Request(method="GET", target="/2", headers=[("host", "b")]), + EndOfMessage(), + ] + # But once we unpause and try to read the next message, and find that it's + # incomplete and the buffer is *still* way too large, then *that's* a + # problem: + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + c.start_next_cycle() + with pytest.raises(RemoteProtocolError): + c.next_event() + + +def test_reuse_simple() -> None: + p = ConnectionPair() + p.send( + CLIENT, + [Request(method="GET", target="/", headers=[("Host", "a")]), EndOfMessage()], + ) + p.send( + SERVER, + [ + Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), + EndOfMessage(), + ], + ) + for conn in p.conns: + assert conn.states == {CLIENT: DONE, SERVER: DONE} + conn.start_next_cycle() + + p.send( + CLIENT, + [ + Request(method="DELETE", target="/foo", headers=[("Host", "a")]), + EndOfMessage(), + ], + ) + p.send( + SERVER, + [ + Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), + EndOfMessage(), + ], + ) + + +def test_pipelining() -> None: + # Client doesn't support pipelining, so we have to do this by hand + c = Connection(SERVER) + assert c.next_event() is NEED_DATA + # 3 requests all bunched up + c.receive_data( + b"GET /1 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" + b"12345" + b"GET /2 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" + b"67890" + b"GET /3 HTTP/1.1\r\nHost: a.com\r\n\r\n" + ) + assert get_all_events(c) == [ + Request( + method="GET", + target="/1", + headers=[("Host", "a.com"), ("Content-Length", "5")], + ), + Data(data=b"12345"), + EndOfMessage(), + ] + assert c.their_state is DONE + assert c.our_state is SEND_RESPONSE + + assert c.next_event() is PAUSED + + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + assert c.their_state is DONE + assert c.our_state is DONE + + c.start_next_cycle() + + assert get_all_events(c) == [ + Request( + method="GET", + target="/2", + headers=[("Host", "a.com"), ("Content-Length", "5")], + ), + Data(data=b"67890"), + EndOfMessage(), + ] + assert c.next_event() is PAUSED + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + c.start_next_cycle() + + assert get_all_events(c) == [ + Request(method="GET", target="/3", headers=[("Host", "a.com")]), + EndOfMessage(), + ] + # Doesn't pause this time, no trailing data + assert c.next_event() is NEED_DATA + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + + # Arrival of more data triggers pause + assert c.next_event() is NEED_DATA + c.receive_data(b"SADF") + assert c.next_event() is PAUSED + assert c.trailing_data == (b"SADF", False) + # If EOF arrives while paused, we don't see that either: + c.receive_data(b"") + assert c.trailing_data == (b"SADF", True) + assert c.next_event() is PAUSED + c.receive_data(b"") + assert c.next_event() is PAUSED + # Can't call receive_data with non-empty buf after closing it + with pytest.raises(RuntimeError): + c.receive_data(b"FDSA") + + +def test_protocol_switch() -> None: + for (req, deny, accept) in [ + ( + Request( + method="CONNECT", + target="example.com:443", + headers=[("Host", "foo"), ("Content-Length", "1")], + ), + Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), + Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), + ), + ( + Request( + method="GET", + target="/", + headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], + ), + Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), + InformationalResponse(status_code=101, headers=[("Upgrade", "a")]), + ), + ( + Request( + method="CONNECT", + target="example.com:443", + headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], + ), + Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), + # Accept CONNECT, not upgrade + Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), + ), + ( + Request( + method="CONNECT", + target="example.com:443", + headers=[("Host", "foo"), ("Content-Length", "1"), ("Upgrade", "a, b")], + ), + Response(status_code=404, headers=[(b"transfer-encoding", b"chunked")]), + # Accept Upgrade, not CONNECT + InformationalResponse(status_code=101, headers=[("Upgrade", "b")]), + ), + ]: + + def setup() -> ConnectionPair: + p = ConnectionPair() + p.send(CLIENT, req) + # No switch-related state change stuff yet; the client has to + # finish the request before that kicks in + for conn in p.conns: + assert conn.states[CLIENT] is SEND_BODY + p.send(CLIENT, [Data(data=b"1"), EndOfMessage()]) + for conn in p.conns: + assert conn.states[CLIENT] is MIGHT_SWITCH_PROTOCOL + assert p.conn[SERVER].next_event() is PAUSED + return p + + # Test deny case + p = setup() + p.send(SERVER, deny) + for conn in p.conns: + assert conn.states == {CLIENT: DONE, SERVER: SEND_BODY} + p.send(SERVER, EndOfMessage()) + # Check that re-use is still allowed after a denial + for conn in p.conns: + conn.start_next_cycle() + + # Test accept case + p = setup() + p.send(SERVER, accept) + for conn in p.conns: + assert conn.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} + conn.receive_data(b"123") + assert conn.next_event() is PAUSED + conn.receive_data(b"456") + assert conn.next_event() is PAUSED + assert conn.trailing_data == (b"123456", False) + + # Pausing in might-switch, then recovery + # (weird artificial case where the trailing data actually is valid + # HTTP for some reason, because this makes it easier to test the state + # logic) + p = setup() + sc = p.conn[SERVER] + sc.receive_data(b"GET / HTTP/1.0\r\n\r\n") + assert sc.next_event() is PAUSED + assert sc.trailing_data == (b"GET / HTTP/1.0\r\n\r\n", False) + sc.send(deny) + assert sc.next_event() is PAUSED + sc.send(EndOfMessage()) + sc.start_next_cycle() + assert get_all_events(sc) == [ + Request(method="GET", target="/", headers=[], http_version="1.0"), # type: ignore[arg-type] + EndOfMessage(), + ] + + # When we're DONE, have no trailing data, and the connection gets + # closed, we report ConnectionClosed(). When we're in might-switch or + # switched, we don't. + p = setup() + sc = p.conn[SERVER] + sc.receive_data(b"") + assert sc.next_event() is PAUSED + assert sc.trailing_data == (b"", True) + p.send(SERVER, accept) + assert sc.next_event() is PAUSED + + p = setup() + sc = p.conn[SERVER] + sc.receive_data(b"") + assert sc.next_event() is PAUSED + sc.send(deny) + assert sc.next_event() == ConnectionClosed() + + # You can't send after switching protocols, or while waiting for a + # protocol switch + p = setup() + with pytest.raises(LocalProtocolError): + p.conn[CLIENT].send( + Request(method="GET", target="/", headers=[("Host", "a")]) + ) + p = setup() + p.send(SERVER, accept) + with pytest.raises(LocalProtocolError): + p.conn[SERVER].send(Data(data=b"123")) + + +def test_close_simple() -> None: + # Just immediately closing a new connection without anything having + # happened yet. + for (who_shot_first, who_shot_second) in [(CLIENT, SERVER), (SERVER, CLIENT)]: + + def setup() -> ConnectionPair: + p = ConnectionPair() + p.send(who_shot_first, ConnectionClosed()) + for conn in p.conns: + assert conn.states == { + who_shot_first: CLOSED, + who_shot_second: MUST_CLOSE, + } + return p + + # You can keep putting b"" into a closed connection, and you keep + # getting ConnectionClosed() out: + p = setup() + assert p.conn[who_shot_second].next_event() == ConnectionClosed() + assert p.conn[who_shot_second].next_event() == ConnectionClosed() + p.conn[who_shot_second].receive_data(b"") + assert p.conn[who_shot_second].next_event() == ConnectionClosed() + # Second party can close... + p = setup() + p.send(who_shot_second, ConnectionClosed()) + for conn in p.conns: + assert conn.our_state is CLOSED + assert conn.their_state is CLOSED + # But trying to receive new data on a closed connection is a + # RuntimeError (not ProtocolError, because the problem here isn't + # violation of HTTP, it's violation of physics) + p = setup() + with pytest.raises(RuntimeError): + p.conn[who_shot_second].receive_data(b"123") + # And receiving new data on a MUST_CLOSE connection is a ProtocolError + p = setup() + p.conn[who_shot_first].receive_data(b"GET") + with pytest.raises(RemoteProtocolError): + p.conn[who_shot_first].next_event() + + +def test_close_different_states() -> None: + req = [ + Request(method="GET", target="/foo", headers=[("Host", "a")]), + EndOfMessage(), + ] + resp = [ + Response(status_code=200, headers=[(b"transfer-encoding", b"chunked")]), + EndOfMessage(), + ] + + # Client before request + p = ConnectionPair() + p.send(CLIENT, ConnectionClosed()) + for conn in p.conns: + assert conn.states == {CLIENT: CLOSED, SERVER: MUST_CLOSE} + + # Client after request + p = ConnectionPair() + p.send(CLIENT, req) + p.send(CLIENT, ConnectionClosed()) + for conn in p.conns: + assert conn.states == {CLIENT: CLOSED, SERVER: SEND_RESPONSE} + + # Server after request -> not allowed + p = ConnectionPair() + p.send(CLIENT, req) + with pytest.raises(LocalProtocolError): + p.conn[SERVER].send(ConnectionClosed()) + p.conn[CLIENT].receive_data(b"") + with pytest.raises(RemoteProtocolError): + p.conn[CLIENT].next_event() + + # Server after response + p = ConnectionPair() + p.send(CLIENT, req) + p.send(SERVER, resp) + p.send(SERVER, ConnectionClosed()) + for conn in p.conns: + assert conn.states == {CLIENT: MUST_CLOSE, SERVER: CLOSED} + + # Both after closing (ConnectionClosed() is idempotent) + p = ConnectionPair() + p.send(CLIENT, req) + p.send(SERVER, resp) + p.send(CLIENT, ConnectionClosed()) + p.send(SERVER, ConnectionClosed()) + p.send(CLIENT, ConnectionClosed()) + p.send(SERVER, ConnectionClosed()) + + # In the middle of sending -> not allowed + p = ConnectionPair() + p.send( + CLIENT, + Request( + method="GET", target="/", headers=[("Host", "a"), ("Content-Length", "10")] + ), + ) + with pytest.raises(LocalProtocolError): + p.conn[CLIENT].send(ConnectionClosed()) + p.conn[SERVER].receive_data(b"") + with pytest.raises(RemoteProtocolError): + p.conn[SERVER].next_event() + + +# Receive several requests and then client shuts down their side of the +# connection; we can respond to each +def test_pipelined_close() -> None: + c = Connection(SERVER) + # 2 requests then a close + c.receive_data( + b"GET /1 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" + b"12345" + b"GET /2 HTTP/1.1\r\nHost: a.com\r\nContent-Length: 5\r\n\r\n" + b"67890" + ) + c.receive_data(b"") + assert get_all_events(c) == [ + Request( + method="GET", + target="/1", + headers=[("host", "a.com"), ("content-length", "5")], + ), + Data(data=b"12345"), + EndOfMessage(), + ] + assert c.states[CLIENT] is DONE + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + assert c.states[SERVER] is DONE + c.start_next_cycle() + assert get_all_events(c) == [ + Request( + method="GET", + target="/2", + headers=[("host", "a.com"), ("content-length", "5")], + ), + Data(data=b"67890"), + EndOfMessage(), + ConnectionClosed(), + ] + assert c.states == {CLIENT: CLOSED, SERVER: SEND_RESPONSE} + c.send(Response(status_code=200, headers=[])) # type: ignore[arg-type] + c.send(EndOfMessage()) + assert c.states == {CLIENT: CLOSED, SERVER: MUST_CLOSE} + c.send(ConnectionClosed()) + assert c.states == {CLIENT: CLOSED, SERVER: CLOSED} + + +def test_sendfile() -> None: + class SendfilePlaceholder: + def __len__(self) -> int: + return 10 + + placeholder = SendfilePlaceholder() + + def setup( + header: Tuple[str, str], http_version: str + ) -> Tuple[Connection, Optional[List[bytes]]]: + c = Connection(SERVER) + receive_and_get( + c, "GET / HTTP/{}\r\nHost: a\r\n\r\n".format(http_version).encode("ascii") + ) + headers = [] + if header: + headers.append(header) + c.send(Response(status_code=200, headers=headers)) + return c, c.send_with_data_passthrough(Data(data=placeholder)) # type: ignore + + c, data = setup(("Content-Length", "10"), "1.1") + assert data == [placeholder] # type: ignore + # Raises an error if the connection object doesn't think we've sent + # exactly 10 bytes + c.send(EndOfMessage()) + + _, data = setup(("Transfer-Encoding", "chunked"), "1.1") + assert placeholder in data # type: ignore + data[data.index(placeholder)] = b"x" * 10 # type: ignore + assert b"".join(data) == b"a\r\nxxxxxxxxxx\r\n" # type: ignore + + c, data = setup(None, "1.0") # type: ignore + assert data == [placeholder] # type: ignore + assert c.our_state is SEND_BODY + + +def test_errors() -> None: + # After a receive error, you can't receive + for role in [CLIENT, SERVER]: + c = Connection(our_role=role) + c.receive_data(b"gibberish\r\n\r\n") + with pytest.raises(RemoteProtocolError): + c.next_event() + # Now any attempt to receive continues to raise + assert c.their_state is ERROR + assert c.our_state is not ERROR + print(c._cstate.states) + with pytest.raises(RemoteProtocolError): + c.next_event() + # But we can still yell at the client for sending us gibberish + if role is SERVER: + assert ( + c.send(Response(status_code=400, headers=[])) # type: ignore[arg-type] + == b"HTTP/1.1 400 \r\nConnection: close\r\n\r\n" + ) + + # After an error sending, you can no longer send + # (This is especially important for things like content-length errors, + # where there's complex internal state being modified) + def conn(role: Type[Sentinel]) -> Connection: + c = Connection(our_role=role) + if role is SERVER: + # Put it into the state where it *could* send a response... + receive_and_get(c, b"GET / HTTP/1.0\r\n\r\n") + assert c.our_state is SEND_RESPONSE + return c + + for role in [CLIENT, SERVER]: + if role is CLIENT: + # This HTTP/1.0 request won't be detected as bad until after we go + # through the state machine and hit the writing code + good = Request(method="GET", target="/", headers=[("Host", "example.com")]) + bad = Request( + method="GET", + target="/", + headers=[("Host", "example.com")], + http_version="1.0", + ) + elif role is SERVER: + good = Response(status_code=200, headers=[]) # type: ignore[arg-type,assignment] + bad = Response(status_code=200, headers=[], http_version="1.0") # type: ignore[arg-type,assignment] + # Make sure 'good' actually is good + c = conn(role) + c.send(good) + assert c.our_state is not ERROR + # Do that again, but this time sending 'bad' first + c = conn(role) + with pytest.raises(LocalProtocolError): + c.send(bad) + assert c.our_state is ERROR + assert c.their_state is not ERROR + # Now 'good' is not so good + with pytest.raises(LocalProtocolError): + c.send(good) + + # And check send_failed() too + c = conn(role) + c.send_failed() + assert c.our_state is ERROR + assert c.their_state is not ERROR + # This is idempotent + c.send_failed() + assert c.our_state is ERROR + assert c.their_state is not ERROR + + +def test_idle_receive_nothing() -> None: + # At one point this incorrectly raised an error + for role in [CLIENT, SERVER]: + c = Connection(role) + assert c.next_event() is NEED_DATA + + +def test_connection_drop() -> None: + c = Connection(SERVER) + c.receive_data(b"GET /") + assert c.next_event() is NEED_DATA + c.receive_data(b"") + with pytest.raises(RemoteProtocolError): + c.next_event() + + +def test_408_request_timeout() -> None: + # Should be able to send this spontaneously as a server without seeing + # anything from client + p = ConnectionPair() + p.send(SERVER, Response(status_code=408, headers=[(b"connection", b"close")])) + + +# This used to raise IndexError +def test_empty_request() -> None: + c = Connection(SERVER) + c.receive_data(b"\r\n") + with pytest.raises(RemoteProtocolError): + c.next_event() + + +# This used to raise IndexError +def test_empty_response() -> None: + c = Connection(CLIENT) + c.send(Request(method="GET", target="/", headers=[("Host", "a")])) + c.receive_data(b"\r\n") + with pytest.raises(RemoteProtocolError): + c.next_event() + + +@pytest.mark.parametrize( + "data", + [ + b"\x00", + b"\x20", + b"\x16\x03\x01\x00\xa5", # Typical start of a TLS Client Hello + ], +) +def test_early_detection_of_invalid_request(data: bytes) -> None: + c = Connection(SERVER) + # Early detection should occur before even receiving a `\r\n` + c.receive_data(data) + with pytest.raises(RemoteProtocolError): + c.next_event() + + +@pytest.mark.parametrize( + "data", + [ + b"\x00", + b"\x20", + b"\x16\x03\x03\x00\x31", # Typical start of a TLS Server Hello + ], +) +def test_early_detection_of_invalid_response(data: bytes) -> None: + c = Connection(CLIENT) + # Early detection should occur before even receiving a `\r\n` + c.receive_data(data) + with pytest.raises(RemoteProtocolError): + c.next_event() + + +# This used to give different headers for HEAD and GET. +# The correct way to handle HEAD is to put whatever headers we *would* have +# put if it were a GET -- even though we know that for HEAD, those headers +# will be ignored. +def test_HEAD_framing_headers() -> None: + def setup(method: bytes, http_version: bytes) -> Connection: + c = Connection(SERVER) + c.receive_data( + method + b" / HTTP/" + http_version + b"\r\n" + b"Host: example.com\r\n\r\n" + ) + assert type(c.next_event()) is Request + assert type(c.next_event()) is EndOfMessage + return c + + for method in [b"GET", b"HEAD"]: + # No Content-Length, HTTP/1.1 peer, should use chunked + c = setup(method, b"1.1") + assert ( + c.send(Response(status_code=200, headers=[])) == b"HTTP/1.1 200 \r\n" # type: ignore[arg-type] + b"Transfer-Encoding: chunked\r\n\r\n" + ) + + # No Content-Length, HTTP/1.0 peer, frame with connection: close + c = setup(method, b"1.0") + assert ( + c.send(Response(status_code=200, headers=[])) == b"HTTP/1.1 200 \r\n" # type: ignore[arg-type] + b"Connection: close\r\n\r\n" + ) + + # Content-Length + Transfer-Encoding, TE wins + c = setup(method, b"1.1") + assert ( + c.send( + Response( + status_code=200, + headers=[ + ("Content-Length", "100"), + ("Transfer-Encoding", "chunked"), + ], + ) + ) + == b"HTTP/1.1 200 \r\n" + b"Transfer-Encoding: chunked\r\n\r\n" + ) + + +def test_special_exceptions_for_lost_connection_in_message_body() -> None: + c = Connection(SERVER) + c.receive_data( + b"POST / HTTP/1.1\r\n" b"Host: example.com\r\n" b"Content-Length: 100\r\n\r\n" + ) + assert type(c.next_event()) is Request + assert c.next_event() is NEED_DATA + c.receive_data(b"12345") + assert c.next_event() == Data(data=b"12345") + c.receive_data(b"") + with pytest.raises(RemoteProtocolError) as excinfo: + c.next_event() + assert "received 5 bytes" in str(excinfo.value) + assert "expected 100" in str(excinfo.value) + + c = Connection(SERVER) + c.receive_data( + b"POST / HTTP/1.1\r\n" + b"Host: example.com\r\n" + b"Transfer-Encoding: chunked\r\n\r\n" + ) + assert type(c.next_event()) is Request + assert c.next_event() is NEED_DATA + c.receive_data(b"8\r\n012345") + assert c.next_event().data == b"012345" # type: ignore + c.receive_data(b"") + with pytest.raises(RemoteProtocolError) as excinfo: + c.next_event() + assert "incomplete chunked read" in str(excinfo.value) diff --git a/env/lib/python3.12/site-packages/h11/tests/test_events.py b/env/lib/python3.12/site-packages/h11/tests/test_events.py new file mode 100644 index 0000000..bc6c313 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_events.py @@ -0,0 +1,150 @@ +from http import HTTPStatus + +import pytest + +from .. import _events +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .._util import LocalProtocolError + + +def test_events() -> None: + with pytest.raises(LocalProtocolError): + # Missing Host: + req = Request( + method="GET", target="/", headers=[("a", "b")], http_version="1.1" + ) + # But this is okay (HTTP/1.0) + req = Request(method="GET", target="/", headers=[("a", "b")], http_version="1.0") + # fields are normalized + assert req.method == b"GET" + assert req.target == b"/" + assert req.headers == [(b"a", b"b")] + assert req.http_version == b"1.0" + + # This is also okay -- has a Host (with weird capitalization, which is ok) + req = Request( + method="GET", + target="/", + headers=[("a", "b"), ("hOSt", "example.com")], + http_version="1.1", + ) + # we normalize header capitalization + assert req.headers == [(b"a", b"b"), (b"host", b"example.com")] + + # Multiple host is bad too + with pytest.raises(LocalProtocolError): + req = Request( + method="GET", + target="/", + headers=[("Host", "a"), ("Host", "a")], + http_version="1.1", + ) + # Even for HTTP/1.0 + with pytest.raises(LocalProtocolError): + req = Request( + method="GET", + target="/", + headers=[("Host", "a"), ("Host", "a")], + http_version="1.0", + ) + + # Header values are validated + for bad_char in "\x00\r\n\f\v": + with pytest.raises(LocalProtocolError): + req = Request( + method="GET", + target="/", + headers=[("Host", "a"), ("Foo", "asd" + bad_char)], + http_version="1.0", + ) + + # But for compatibility we allow non-whitespace control characters, even + # though they're forbidden by the spec. + Request( + method="GET", + target="/", + headers=[("Host", "a"), ("Foo", "asd\x01\x02\x7f")], + http_version="1.0", + ) + + # Request target is validated + for bad_byte in b"\x00\x20\x7f\xee": + target = bytearray(b"/") + target.append(bad_byte) + with pytest.raises(LocalProtocolError): + Request( + method="GET", target=target, headers=[("Host", "a")], http_version="1.1" + ) + + # Request method is validated + with pytest.raises(LocalProtocolError): + Request( + method="GET / HTTP/1.1", + target=target, + headers=[("Host", "a")], + http_version="1.1", + ) + + ir = InformationalResponse(status_code=100, headers=[("Host", "a")]) + assert ir.status_code == 100 + assert ir.headers == [(b"host", b"a")] + assert ir.http_version == b"1.1" + + with pytest.raises(LocalProtocolError): + InformationalResponse(status_code=200, headers=[("Host", "a")]) + + resp = Response(status_code=204, headers=[], http_version="1.0") # type: ignore[arg-type] + assert resp.status_code == 204 + assert resp.headers == [] + assert resp.http_version == b"1.0" + + with pytest.raises(LocalProtocolError): + resp = Response(status_code=100, headers=[], http_version="1.0") # type: ignore[arg-type] + + with pytest.raises(LocalProtocolError): + Response(status_code="100", headers=[], http_version="1.0") # type: ignore[arg-type] + + with pytest.raises(LocalProtocolError): + InformationalResponse(status_code=b"100", headers=[], http_version="1.0") # type: ignore[arg-type] + + d = Data(data=b"asdf") + assert d.data == b"asdf" + + eom = EndOfMessage() + assert eom.headers == [] + + cc = ConnectionClosed() + assert repr(cc) == "ConnectionClosed()" + + +def test_intenum_status_code() -> None: + # https://github.com/python-hyper/h11/issues/72 + + r = Response(status_code=HTTPStatus.OK, headers=[], http_version="1.0") # type: ignore[arg-type] + assert r.status_code == HTTPStatus.OK + assert type(r.status_code) is not type(HTTPStatus.OK) + assert type(r.status_code) is int + + +def test_header_casing() -> None: + r = Request( + method="GET", + target="/", + headers=[("Host", "example.org"), ("Connection", "keep-alive")], + http_version="1.1", + ) + assert len(r.headers) == 2 + assert r.headers[0] == (b"host", b"example.org") + assert r.headers == [(b"host", b"example.org"), (b"connection", b"keep-alive")] + assert r.headers.raw_items() == [ + (b"Host", b"example.org"), + (b"Connection", b"keep-alive"), + ] diff --git a/env/lib/python3.12/site-packages/h11/tests/test_headers.py b/env/lib/python3.12/site-packages/h11/tests/test_headers.py new file mode 100644 index 0000000..ba53d08 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_headers.py @@ -0,0 +1,157 @@ +import pytest + +from .._events import Request +from .._headers import ( + get_comma_header, + has_expect_100_continue, + Headers, + normalize_and_validate, + set_comma_header, +) +from .._util import LocalProtocolError + + +def test_normalize_and_validate() -> None: + assert normalize_and_validate([("foo", "bar")]) == [(b"foo", b"bar")] + assert normalize_and_validate([(b"foo", b"bar")]) == [(b"foo", b"bar")] + + # no leading/trailing whitespace in names + with pytest.raises(LocalProtocolError): + normalize_and_validate([(b"foo ", "bar")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([(b" foo", "bar")]) + + # no weird characters in names + with pytest.raises(LocalProtocolError) as excinfo: + normalize_and_validate([(b"foo bar", b"baz")]) + assert "foo bar" in str(excinfo.value) + with pytest.raises(LocalProtocolError): + normalize_and_validate([(b"foo\x00bar", b"baz")]) + # Not even 8-bit characters: + with pytest.raises(LocalProtocolError): + normalize_and_validate([(b"foo\xffbar", b"baz")]) + # And not even the control characters we allow in values: + with pytest.raises(LocalProtocolError): + normalize_and_validate([(b"foo\x01bar", b"baz")]) + + # no return or NUL characters in values + with pytest.raises(LocalProtocolError) as excinfo: + normalize_and_validate([("foo", "bar\rbaz")]) + assert "bar\\rbaz" in str(excinfo.value) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", "bar\nbaz")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", "bar\x00baz")]) + # no leading/trailing whitespace + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", "barbaz ")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", " barbaz")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", "barbaz\t")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("foo", "\tbarbaz")]) + + # content-length + assert normalize_and_validate([("Content-Length", "1")]) == [ + (b"content-length", b"1") + ] + with pytest.raises(LocalProtocolError): + normalize_and_validate([("Content-Length", "asdf")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("Content-Length", "1x")]) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("Content-Length", "1"), ("Content-Length", "2")]) + assert normalize_and_validate( + [("Content-Length", "0"), ("Content-Length", "0")] + ) == [(b"content-length", b"0")] + assert normalize_and_validate([("Content-Length", "0 , 0")]) == [ + (b"content-length", b"0") + ] + with pytest.raises(LocalProtocolError): + normalize_and_validate( + [("Content-Length", "1"), ("Content-Length", "1"), ("Content-Length", "2")] + ) + with pytest.raises(LocalProtocolError): + normalize_and_validate([("Content-Length", "1 , 1,2")]) + + # transfer-encoding + assert normalize_and_validate([("Transfer-Encoding", "chunked")]) == [ + (b"transfer-encoding", b"chunked") + ] + assert normalize_and_validate([("Transfer-Encoding", "cHuNkEd")]) == [ + (b"transfer-encoding", b"chunked") + ] + with pytest.raises(LocalProtocolError) as excinfo: + normalize_and_validate([("Transfer-Encoding", "gzip")]) + assert excinfo.value.error_status_hint == 501 # Not Implemented + with pytest.raises(LocalProtocolError) as excinfo: + normalize_and_validate( + [("Transfer-Encoding", "chunked"), ("Transfer-Encoding", "gzip")] + ) + assert excinfo.value.error_status_hint == 501 # Not Implemented + + +def test_get_set_comma_header() -> None: + headers = normalize_and_validate( + [ + ("Connection", "close"), + ("whatever", "something"), + ("connectiON", "fOo,, , BAR"), + ] + ) + + assert get_comma_header(headers, b"connection") == [b"close", b"foo", b"bar"] + + headers = set_comma_header(headers, b"newthing", ["a", "b"]) # type: ignore + + with pytest.raises(LocalProtocolError): + set_comma_header(headers, b"newthing", [" a", "b"]) # type: ignore + + assert headers == [ + (b"connection", b"close"), + (b"whatever", b"something"), + (b"connection", b"fOo,, , BAR"), + (b"newthing", b"a"), + (b"newthing", b"b"), + ] + + headers = set_comma_header(headers, b"whatever", ["different thing"]) # type: ignore + + assert headers == [ + (b"connection", b"close"), + (b"connection", b"fOo,, , BAR"), + (b"newthing", b"a"), + (b"newthing", b"b"), + (b"whatever", b"different thing"), + ] + + +def test_has_100_continue() -> None: + assert has_expect_100_continue( + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Expect", "100-continue")], + ) + ) + assert not has_expect_100_continue( + Request(method="GET", target="/", headers=[("Host", "example.com")]) + ) + # Case insensitive + assert has_expect_100_continue( + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Expect", "100-Continue")], + ) + ) + # Doesn't work in HTTP/1.0 + assert not has_expect_100_continue( + Request( + method="GET", + target="/", + headers=[("Host", "example.com"), ("Expect", "100-continue")], + http_version="1.0", + ) + ) diff --git a/env/lib/python3.12/site-packages/h11/tests/test_helpers.py b/env/lib/python3.12/site-packages/h11/tests/test_helpers.py new file mode 100644 index 0000000..c329c76 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_helpers.py @@ -0,0 +1,32 @@ +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .helpers import normalize_data_events + + +def test_normalize_data_events() -> None: + assert normalize_data_events( + [ + Data(data=bytearray(b"1")), + Data(data=b"2"), + Response(status_code=200, headers=[]), # type: ignore[arg-type] + Data(data=b"3"), + Data(data=b"4"), + EndOfMessage(), + Data(data=b"5"), + Data(data=b"6"), + Data(data=b"7"), + ] + ) == [ + Data(data=b"12"), + Response(status_code=200, headers=[]), # type: ignore[arg-type] + Data(data=b"34"), + EndOfMessage(), + Data(data=b"567"), + ] diff --git a/env/lib/python3.12/site-packages/h11/tests/test_io.py b/env/lib/python3.12/site-packages/h11/tests/test_io.py new file mode 100644 index 0000000..2b47c0e --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_io.py @@ -0,0 +1,572 @@ +from typing import Any, Callable, Generator, List + +import pytest + +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .._headers import Headers, normalize_and_validate +from .._readers import ( + _obsolete_line_fold, + ChunkedReader, + ContentLengthReader, + Http10Reader, + READERS, +) +from .._receivebuffer import ReceiveBuffer +from .._state import ( + CLIENT, + CLOSED, + DONE, + IDLE, + MIGHT_SWITCH_PROTOCOL, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, + SWITCHED_PROTOCOL, +) +from .._util import LocalProtocolError +from .._writers import ( + ChunkedWriter, + ContentLengthWriter, + Http10Writer, + write_any_response, + write_headers, + write_request, + WRITERS, +) +from .helpers import normalize_data_events + +SIMPLE_CASES = [ + ( + (CLIENT, IDLE), + Request( + method="GET", + target="/a", + headers=[("Host", "foo"), ("Connection", "close")], + ), + b"GET /a HTTP/1.1\r\nHost: foo\r\nConnection: close\r\n\r\n", + ), + ( + (SERVER, SEND_RESPONSE), + Response(status_code=200, headers=[("Connection", "close")], reason=b"OK"), + b"HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", + ), + ( + (SERVER, SEND_RESPONSE), + Response(status_code=200, headers=[], reason=b"OK"), # type: ignore[arg-type] + b"HTTP/1.1 200 OK\r\n\r\n", + ), + ( + (SERVER, SEND_RESPONSE), + InformationalResponse( + status_code=101, headers=[("Upgrade", "websocket")], reason=b"Upgrade" + ), + b"HTTP/1.1 101 Upgrade\r\nUpgrade: websocket\r\n\r\n", + ), + ( + (SERVER, SEND_RESPONSE), + InformationalResponse(status_code=101, headers=[], reason=b"Upgrade"), # type: ignore[arg-type] + b"HTTP/1.1 101 Upgrade\r\n\r\n", + ), +] + + +def dowrite(writer: Callable[..., None], obj: Any) -> bytes: + got_list: List[bytes] = [] + writer(obj, got_list.append) + return b"".join(got_list) + + +def tw(writer: Any, obj: Any, expected: Any) -> None: + got = dowrite(writer, obj) + assert got == expected + + +def makebuf(data: bytes) -> ReceiveBuffer: + buf = ReceiveBuffer() + buf += data + return buf + + +def tr(reader: Any, data: bytes, expected: Any) -> None: + def check(got: Any) -> None: + assert got == expected + # Headers should always be returned as bytes, not e.g. bytearray + # https://github.com/python-hyper/wsproto/pull/54#issuecomment-377709478 + for name, value in getattr(got, "headers", []): + assert type(name) is bytes + assert type(value) is bytes + + # Simple: consume whole thing + buf = makebuf(data) + check(reader(buf)) + assert not buf + + # Incrementally growing buffer + buf = ReceiveBuffer() + for i in range(len(data)): + assert reader(buf) is None + buf += data[i : i + 1] + check(reader(buf)) + + # Trailing data + buf = makebuf(data) + buf += b"trailing" + check(reader(buf)) + assert bytes(buf) == b"trailing" + + +def test_writers_simple() -> None: + for ((role, state), event, binary) in SIMPLE_CASES: + tw(WRITERS[role, state], event, binary) + + +def test_readers_simple() -> None: + for ((role, state), event, binary) in SIMPLE_CASES: + tr(READERS[role, state], binary, event) + + +def test_writers_unusual() -> None: + # Simple test of the write_headers utility routine + tw( + write_headers, + normalize_and_validate([("foo", "bar"), ("baz", "quux")]), + b"foo: bar\r\nbaz: quux\r\n\r\n", + ) + tw(write_headers, Headers([]), b"\r\n") + + # We understand HTTP/1.0, but we don't speak it + with pytest.raises(LocalProtocolError): + tw( + write_request, + Request( + method="GET", + target="/", + headers=[("Host", "foo"), ("Connection", "close")], + http_version="1.0", + ), + None, + ) + with pytest.raises(LocalProtocolError): + tw( + write_any_response, + Response( + status_code=200, headers=[("Connection", "close")], http_version="1.0" + ), + None, + ) + + +def test_readers_unusual() -> None: + # Reading HTTP/1.0 + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.0\r\nSome: header\r\n\r\n", + Request( + method="HEAD", + target="/foo", + headers=[("Some", "header")], + http_version="1.0", + ), + ) + + # check no-headers, since it's only legal with HTTP/1.0 + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.0\r\n\r\n", + Request(method="HEAD", target="/foo", headers=[], http_version="1.0"), # type: ignore[arg-type] + ) + + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.0 200 OK\r\nSome: header\r\n\r\n", + Response( + status_code=200, + headers=[("Some", "header")], + http_version="1.0", + reason=b"OK", + ), + ) + + # single-character header values (actually disallowed by the ABNF in RFC + # 7230 -- this is a bug in the standard that we originally copied...) + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.0 200 OK\r\n" b"Foo: a a a a a \r\n\r\n", + Response( + status_code=200, + headers=[("Foo", "a a a a a")], + http_version="1.0", + reason=b"OK", + ), + ) + + # Empty headers -- also legal + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.0 200 OK\r\n" b"Foo:\r\n\r\n", + Response( + status_code=200, headers=[("Foo", "")], http_version="1.0", reason=b"OK" + ), + ) + + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.0 200 OK\r\n" b"Foo: \t \t \r\n\r\n", + Response( + status_code=200, headers=[("Foo", "")], http_version="1.0", reason=b"OK" + ), + ) + + # Tolerate broken servers that leave off the response code + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.0 200\r\n" b"Foo: bar\r\n\r\n", + Response( + status_code=200, headers=[("Foo", "bar")], http_version="1.0", reason=b"" + ), + ) + + # Tolerate headers line endings (\r\n and \n) + # \n\r\b between headers and body + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.1 200 OK\r\nSomeHeader: val\n\r\n", + Response( + status_code=200, + headers=[("SomeHeader", "val")], + http_version="1.1", + reason="OK", + ), + ) + + # delimited only with \n + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.1 200 OK\nSomeHeader1: val1\nSomeHeader2: val2\n\n", + Response( + status_code=200, + headers=[("SomeHeader1", "val1"), ("SomeHeader2", "val2")], + http_version="1.1", + reason="OK", + ), + ) + + # mixed \r\n and \n + tr( + READERS[SERVER, SEND_RESPONSE], + b"HTTP/1.1 200 OK\r\nSomeHeader1: val1\nSomeHeader2: val2\n\r\n", + Response( + status_code=200, + headers=[("SomeHeader1", "val1"), ("SomeHeader2", "val2")], + http_version="1.1", + reason="OK", + ), + ) + + # obsolete line folding + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" + b"Host: example.com\r\n" + b"Some: multi-line\r\n" + b" header\r\n" + b"\tnonsense\r\n" + b" \t \t\tI guess\r\n" + b"Connection: close\r\n" + b"More-nonsense: in the\r\n" + b" last header \r\n\r\n", + Request( + method="HEAD", + target="/foo", + headers=[ + ("Host", "example.com"), + ("Some", "multi-line header nonsense I guess"), + ("Connection", "close"), + ("More-nonsense", "in the last header"), + ], + ), + ) + + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" b" folded: line\r\n\r\n", + None, + ) + + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" b"foo : line\r\n\r\n", + None, + ) + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" b"foo\t: line\r\n\r\n", + None, + ) + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" b"foo\t: line\r\n\r\n", + None, + ) + with pytest.raises(LocalProtocolError): + tr(READERS[CLIENT, IDLE], b"HEAD /foo HTTP/1.1\r\n" b": line\r\n\r\n", None) + + +def test__obsolete_line_fold_bytes() -> None: + # _obsolete_line_fold has a defensive cast to bytearray, which is + # necessary to protect against O(n^2) behavior in case anyone ever passes + # in regular bytestrings... but right now we never pass in regular + # bytestrings. so this test just exists to get some coverage on that + # defensive cast. + assert list(_obsolete_line_fold([b"aaa", b"bbb", b" ccc", b"ddd"])) == [ + b"aaa", + bytearray(b"bbb ccc"), + b"ddd", + ] + + +def _run_reader_iter( + reader: Any, buf: bytes, do_eof: bool +) -> Generator[Any, None, None]: + while True: + event = reader(buf) + if event is None: + break + yield event + # body readers have undefined behavior after returning EndOfMessage, + # because this changes the state so they don't get called again + if type(event) is EndOfMessage: + break + if do_eof: + assert not buf + yield reader.read_eof() + + +def _run_reader(*args: Any) -> List[Event]: + events = list(_run_reader_iter(*args)) + return normalize_data_events(events) + + +def t_body_reader(thunk: Any, data: bytes, expected: Any, do_eof: bool = False) -> None: + # Simple: consume whole thing + print("Test 1") + buf = makebuf(data) + assert _run_reader(thunk(), buf, do_eof) == expected + + # Incrementally growing buffer + print("Test 2") + reader = thunk() + buf = ReceiveBuffer() + events = [] + for i in range(len(data)): + events += _run_reader(reader, buf, False) + buf += data[i : i + 1] + events += _run_reader(reader, buf, do_eof) + assert normalize_data_events(events) == expected + + is_complete = any(type(event) is EndOfMessage for event in expected) + if is_complete and not do_eof: + buf = makebuf(data + b"trailing") + assert _run_reader(thunk(), buf, False) == expected + + +def test_ContentLengthReader() -> None: + t_body_reader(lambda: ContentLengthReader(0), b"", [EndOfMessage()]) + + t_body_reader( + lambda: ContentLengthReader(10), + b"0123456789", + [Data(data=b"0123456789"), EndOfMessage()], + ) + + +def test_Http10Reader() -> None: + t_body_reader(Http10Reader, b"", [EndOfMessage()], do_eof=True) + t_body_reader(Http10Reader, b"asdf", [Data(data=b"asdf")], do_eof=False) + t_body_reader( + Http10Reader, b"asdf", [Data(data=b"asdf"), EndOfMessage()], do_eof=True + ) + + +def test_ChunkedReader() -> None: + t_body_reader(ChunkedReader, b"0\r\n\r\n", [EndOfMessage()]) + + t_body_reader( + ChunkedReader, + b"0\r\nSome: header\r\n\r\n", + [EndOfMessage(headers=[("Some", "header")])], + ) + + t_body_reader( + ChunkedReader, + b"5\r\n01234\r\n" + + b"10\r\n0123456789abcdef\r\n" + + b"0\r\n" + + b"Some: header\r\n\r\n", + [ + Data(data=b"012340123456789abcdef"), + EndOfMessage(headers=[("Some", "header")]), + ], + ) + + t_body_reader( + ChunkedReader, + b"5\r\n01234\r\n" + b"10\r\n0123456789abcdef\r\n" + b"0\r\n\r\n", + [Data(data=b"012340123456789abcdef"), EndOfMessage()], + ) + + # handles upper and lowercase hex + t_body_reader( + ChunkedReader, + b"aA\r\n" + b"x" * 0xAA + b"\r\n" + b"0\r\n\r\n", + [Data(data=b"x" * 0xAA), EndOfMessage()], + ) + + # refuses arbitrarily long chunk integers + with pytest.raises(LocalProtocolError): + # Technically this is legal HTTP/1.1, but we refuse to process chunk + # sizes that don't fit into 20 characters of hex + t_body_reader(ChunkedReader, b"9" * 100 + b"\r\nxxx", [Data(data=b"xxx")]) + + # refuses garbage in the chunk count + with pytest.raises(LocalProtocolError): + t_body_reader(ChunkedReader, b"10\x00\r\nxxx", None) + + # handles (and discards) "chunk extensions" omg wtf + t_body_reader( + ChunkedReader, + b"5; hello=there\r\n" + + b"xxxxx" + + b"\r\n" + + b'0; random="junk"; some=more; canbe=lonnnnngg\r\n\r\n', + [Data(data=b"xxxxx"), EndOfMessage()], + ) + + t_body_reader( + ChunkedReader, + b"5 \r\n01234\r\n" + b"0\r\n\r\n", + [Data(data=b"01234"), EndOfMessage()], + ) + + +def test_ContentLengthWriter() -> None: + w = ContentLengthWriter(5) + assert dowrite(w, Data(data=b"123")) == b"123" + assert dowrite(w, Data(data=b"45")) == b"45" + assert dowrite(w, EndOfMessage()) == b"" + + w = ContentLengthWriter(5) + with pytest.raises(LocalProtocolError): + dowrite(w, Data(data=b"123456")) + + w = ContentLengthWriter(5) + dowrite(w, Data(data=b"123")) + with pytest.raises(LocalProtocolError): + dowrite(w, Data(data=b"456")) + + w = ContentLengthWriter(5) + dowrite(w, Data(data=b"123")) + with pytest.raises(LocalProtocolError): + dowrite(w, EndOfMessage()) + + w = ContentLengthWriter(5) + dowrite(w, Data(data=b"123")) == b"123" + dowrite(w, Data(data=b"45")) == b"45" + with pytest.raises(LocalProtocolError): + dowrite(w, EndOfMessage(headers=[("Etag", "asdf")])) + + +def test_ChunkedWriter() -> None: + w = ChunkedWriter() + assert dowrite(w, Data(data=b"aaa")) == b"3\r\naaa\r\n" + assert dowrite(w, Data(data=b"a" * 20)) == b"14\r\n" + b"a" * 20 + b"\r\n" + + assert dowrite(w, Data(data=b"")) == b"" + + assert dowrite(w, EndOfMessage()) == b"0\r\n\r\n" + + assert ( + dowrite(w, EndOfMessage(headers=[("Etag", "asdf"), ("a", "b")])) + == b"0\r\nEtag: asdf\r\na: b\r\n\r\n" + ) + + +def test_Http10Writer() -> None: + w = Http10Writer() + assert dowrite(w, Data(data=b"1234")) == b"1234" + assert dowrite(w, EndOfMessage()) == b"" + + with pytest.raises(LocalProtocolError): + dowrite(w, EndOfMessage(headers=[("Etag", "asdf")])) + + +def test_reject_garbage_after_request_line() -> None: + with pytest.raises(LocalProtocolError): + tr(READERS[SERVER, SEND_RESPONSE], b"HTTP/1.0 200 OK\x00xxxx\r\n\r\n", None) + + +def test_reject_garbage_after_response_line() -> None: + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1 xxxxxx\r\n" b"Host: a\r\n\r\n", + None, + ) + + +def test_reject_garbage_in_header_line() -> None: + with pytest.raises(LocalProtocolError): + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" b"Host: foo\x00bar\r\n\r\n", + None, + ) + + +def test_reject_non_vchar_in_path() -> None: + for bad_char in b"\x00\x20\x7f\xee": + message = bytearray(b"HEAD /") + message.append(bad_char) + message.extend(b" HTTP/1.1\r\nHost: foobar\r\n\r\n") + with pytest.raises(LocalProtocolError): + tr(READERS[CLIENT, IDLE], message, None) + + +# https://github.com/python-hyper/h11/issues/57 +def test_allow_some_garbage_in_cookies() -> None: + tr( + READERS[CLIENT, IDLE], + b"HEAD /foo HTTP/1.1\r\n" + b"Host: foo\r\n" + b"Set-Cookie: ___utmvafIumyLc=kUd\x01UpAt; path=/; Max-Age=900\r\n" + b"\r\n", + Request( + method="HEAD", + target="/foo", + headers=[ + ("Host", "foo"), + ("Set-Cookie", "___utmvafIumyLc=kUd\x01UpAt; path=/; Max-Age=900"), + ], + ), + ) + + +def test_host_comes_first() -> None: + tw( + write_headers, + normalize_and_validate([("foo", "bar"), ("Host", "example.com")]), + b"Host: example.com\r\nfoo: bar\r\n\r\n", + ) diff --git a/env/lib/python3.12/site-packages/h11/tests/test_receivebuffer.py b/env/lib/python3.12/site-packages/h11/tests/test_receivebuffer.py new file mode 100644 index 0000000..21a3870 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_receivebuffer.py @@ -0,0 +1,135 @@ +import re +from typing import Tuple + +import pytest + +from .._receivebuffer import ReceiveBuffer + + +def test_receivebuffer() -> None: + b = ReceiveBuffer() + assert not b + assert len(b) == 0 + assert bytes(b) == b"" + + b += b"123" + assert b + assert len(b) == 3 + assert bytes(b) == b"123" + + assert bytes(b) == b"123" + + assert b.maybe_extract_at_most(2) == b"12" + assert b + assert len(b) == 1 + assert bytes(b) == b"3" + + assert bytes(b) == b"3" + + assert b.maybe_extract_at_most(10) == b"3" + assert bytes(b) == b"" + + assert b.maybe_extract_at_most(10) is None + assert not b + + ################################################################ + # maybe_extract_until_next + ################################################################ + + b += b"123\n456\r\n789\r\n" + + assert b.maybe_extract_next_line() == b"123\n456\r\n" + assert bytes(b) == b"789\r\n" + + assert b.maybe_extract_next_line() == b"789\r\n" + assert bytes(b) == b"" + + b += b"12\r" + assert b.maybe_extract_next_line() is None + assert bytes(b) == b"12\r" + + b += b"345\n\r" + assert b.maybe_extract_next_line() is None + assert bytes(b) == b"12\r345\n\r" + + # here we stopped at the middle of b"\r\n" delimiter + + b += b"\n6789aaa123\r\n" + assert b.maybe_extract_next_line() == b"12\r345\n\r\n" + assert b.maybe_extract_next_line() == b"6789aaa123\r\n" + assert b.maybe_extract_next_line() is None + assert bytes(b) == b"" + + ################################################################ + # maybe_extract_lines + ################################################################ + + b += b"123\r\na: b\r\nfoo:bar\r\n\r\ntrailing" + lines = b.maybe_extract_lines() + assert lines == [b"123", b"a: b", b"foo:bar"] + assert bytes(b) == b"trailing" + + assert b.maybe_extract_lines() is None + + b += b"\r\n\r" + assert b.maybe_extract_lines() is None + + assert b.maybe_extract_at_most(100) == b"trailing\r\n\r" + assert not b + + # Empty body case (as happens at the end of chunked encoding if there are + # no trailing headers, e.g.) + b += b"\r\ntrailing" + assert b.maybe_extract_lines() == [] + assert bytes(b) == b"trailing" + + +@pytest.mark.parametrize( + "data", + [ + pytest.param( + ( + b"HTTP/1.1 200 OK\r\n", + b"Content-type: text/plain\r\n", + b"Connection: close\r\n", + b"\r\n", + b"Some body", + ), + id="with_crlf_delimiter", + ), + pytest.param( + ( + b"HTTP/1.1 200 OK\n", + b"Content-type: text/plain\n", + b"Connection: close\n", + b"\n", + b"Some body", + ), + id="with_lf_only_delimiter", + ), + pytest.param( + ( + b"HTTP/1.1 200 OK\n", + b"Content-type: text/plain\r\n", + b"Connection: close\n", + b"\n", + b"Some body", + ), + id="with_mixed_crlf_and_lf", + ), + ], +) +def test_receivebuffer_for_invalid_delimiter(data: Tuple[bytes]) -> None: + b = ReceiveBuffer() + + for line in data: + b += line + + lines = b.maybe_extract_lines() + + assert lines == [ + b"HTTP/1.1 200 OK", + b"Content-type: text/plain", + b"Connection: close", + ] + assert bytes(b) == b"Some body" diff --git a/env/lib/python3.12/site-packages/h11/tests/test_state.py b/env/lib/python3.12/site-packages/h11/tests/test_state.py new file mode 100644 index 0000000..bc974e6 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_state.py @@ -0,0 +1,271 @@ +import pytest + +from .._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from .._state import ( + _SWITCH_CONNECT, + _SWITCH_UPGRADE, + CLIENT, + CLOSED, + ConnectionState, + DONE, + IDLE, + MIGHT_SWITCH_PROTOCOL, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, + SWITCHED_PROTOCOL, +) +from .._util import LocalProtocolError + + +def test_ConnectionState() -> None: + cs = ConnectionState() + + # Basic event-triggered transitions + + assert cs.states == {CLIENT: IDLE, SERVER: IDLE} + + cs.process_event(CLIENT, Request) + # The SERVER-Request special case: + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + # Illegal transitions raise an error and nothing happens + with pytest.raises(LocalProtocolError): + cs.process_event(CLIENT, Request) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + cs.process_event(SERVER, InformationalResponse) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + cs.process_event(SERVER, Response) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_BODY} + + cs.process_event(CLIENT, EndOfMessage) + cs.process_event(SERVER, EndOfMessage) + assert cs.states == {CLIENT: DONE, SERVER: DONE} + + # State-triggered transition + + cs.process_event(SERVER, ConnectionClosed) + assert cs.states == {CLIENT: MUST_CLOSE, SERVER: CLOSED} + + +def test_ConnectionState_keep_alive() -> None: + # keep_alive = False + cs = ConnectionState() + cs.process_event(CLIENT, Request) + cs.process_keep_alive_disabled() + cs.process_event(CLIENT, EndOfMessage) + assert cs.states == {CLIENT: MUST_CLOSE, SERVER: SEND_RESPONSE} + + cs.process_event(SERVER, Response) + cs.process_event(SERVER, EndOfMessage) + assert cs.states == {CLIENT: MUST_CLOSE, SERVER: MUST_CLOSE} + + +def test_ConnectionState_keep_alive_in_DONE() -> None: + # Check that if keep_alive is disabled when the CLIENT is already in DONE, + # then this is sufficient to immediately trigger the DONE -> MUST_CLOSE + # transition + cs = ConnectionState() + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + assert cs.states[CLIENT] is DONE + cs.process_keep_alive_disabled() + assert cs.states[CLIENT] is MUST_CLOSE + + +def test_ConnectionState_switch_denied() -> None: + for switch_type in (_SWITCH_CONNECT, _SWITCH_UPGRADE): + for deny_early in (True, False): + cs = ConnectionState() + cs.process_client_switch_proposal(switch_type) + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, Data) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + assert switch_type in cs.pending_switch_proposals + + if deny_early: + # before client reaches DONE + cs.process_event(SERVER, Response) + assert not cs.pending_switch_proposals + + cs.process_event(CLIENT, EndOfMessage) + + if deny_early: + assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} + else: + assert cs.states == { + CLIENT: MIGHT_SWITCH_PROTOCOL, + SERVER: SEND_RESPONSE, + } + + cs.process_event(SERVER, InformationalResponse) + assert cs.states == { + CLIENT: MIGHT_SWITCH_PROTOCOL, + SERVER: SEND_RESPONSE, + } + + cs.process_event(SERVER, Response) + assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} + assert not cs.pending_switch_proposals + + +_response_type_for_switch = { + _SWITCH_UPGRADE: InformationalResponse, + _SWITCH_CONNECT: Response, + None: Response, +} + + +def test_ConnectionState_protocol_switch_accepted() -> None: + for switch_event in [_SWITCH_UPGRADE, _SWITCH_CONNECT]: + cs = ConnectionState() + cs.process_client_switch_proposal(switch_event) + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, Data) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + cs.process_event(CLIENT, EndOfMessage) + assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} + + cs.process_event(SERVER, InformationalResponse) + assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} + + cs.process_event(SERVER, _response_type_for_switch[switch_event], switch_event) + assert cs.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} + + +def test_ConnectionState_double_protocol_switch() -> None: + # CONNECT + Upgrade is legal! Very silly, but legal. So we support + # it. Because sometimes doing the silly thing is easier than not. + for server_switch in [None, _SWITCH_UPGRADE, _SWITCH_CONNECT]: + cs = ConnectionState() + cs.process_client_switch_proposal(_SWITCH_UPGRADE) + cs.process_client_switch_proposal(_SWITCH_CONNECT) + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} + cs.process_event( + SERVER, _response_type_for_switch[server_switch], server_switch + ) + if server_switch is None: + assert cs.states == {CLIENT: DONE, SERVER: SEND_BODY} + else: + assert cs.states == {CLIENT: SWITCHED_PROTOCOL, SERVER: SWITCHED_PROTOCOL} + + +def test_ConnectionState_inconsistent_protocol_switch() -> None: + for client_switches, server_switch in [ + ([], _SWITCH_CONNECT), + ([], _SWITCH_UPGRADE), + ([_SWITCH_UPGRADE], _SWITCH_CONNECT), + ([_SWITCH_CONNECT], _SWITCH_UPGRADE), + ]: + cs = ConnectionState() + for client_switch in client_switches: # type: ignore[attr-defined] + cs.process_client_switch_proposal(client_switch) + cs.process_event(CLIENT, Request) + with pytest.raises(LocalProtocolError): + cs.process_event(SERVER, Response, server_switch) + + +def test_ConnectionState_keepalive_protocol_switch_interaction() -> None: + # keep_alive=False + pending_switch_proposals + cs = ConnectionState() + cs.process_client_switch_proposal(_SWITCH_UPGRADE) + cs.process_event(CLIENT, Request) + cs.process_keep_alive_disabled() + cs.process_event(CLIENT, Data) + assert cs.states == {CLIENT: SEND_BODY, SERVER: SEND_RESPONSE} + + # the protocol switch "wins" + cs.process_event(CLIENT, EndOfMessage) + assert cs.states == {CLIENT: MIGHT_SWITCH_PROTOCOL, SERVER: SEND_RESPONSE} + + # but when the server denies the request, keep_alive comes back into play + cs.process_event(SERVER, Response) + assert cs.states == {CLIENT: MUST_CLOSE, SERVER: SEND_BODY} + + +def test_ConnectionState_reuse() -> None: + cs = ConnectionState() + + with pytest.raises(LocalProtocolError): + cs.start_next_cycle() + + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + + with pytest.raises(LocalProtocolError): + cs.start_next_cycle() + + cs.process_event(SERVER, Response) + cs.process_event(SERVER, EndOfMessage) + + cs.start_next_cycle() + assert cs.states == {CLIENT: IDLE, SERVER: IDLE} + + # No keepalive + + cs.process_event(CLIENT, Request) + cs.process_keep_alive_disabled() + cs.process_event(CLIENT, EndOfMessage) + cs.process_event(SERVER, Response) + cs.process_event(SERVER, EndOfMessage) + + with pytest.raises(LocalProtocolError): + cs.start_next_cycle() + + # One side closed + + cs = ConnectionState() + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + cs.process_event(CLIENT, ConnectionClosed) + cs.process_event(SERVER, Response) + cs.process_event(SERVER, EndOfMessage) + + with pytest.raises(LocalProtocolError): + cs.start_next_cycle() + + # Succesful protocol switch + + cs = ConnectionState() + cs.process_client_switch_proposal(_SWITCH_UPGRADE) + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + cs.process_event(SERVER, InformationalResponse, _SWITCH_UPGRADE) + + with pytest.raises(LocalProtocolError): + cs.start_next_cycle() + + # Failed protocol switch + + cs = ConnectionState() + cs.process_client_switch_proposal(_SWITCH_UPGRADE) + cs.process_event(CLIENT, Request) + cs.process_event(CLIENT, EndOfMessage) + cs.process_event(SERVER, Response) + cs.process_event(SERVER, EndOfMessage) + + cs.start_next_cycle() + assert cs.states == {CLIENT: IDLE, SERVER: IDLE} + + +def test_server_request_is_illegal() -> None: + # There used to be a bug in how we handled the Request special case that + # made this allowed... + cs = ConnectionState() + with pytest.raises(LocalProtocolError): + cs.process_event(SERVER, Request) diff --git a/env/lib/python3.12/site-packages/h11/tests/test_util.py b/env/lib/python3.12/site-packages/h11/tests/test_util.py new file mode 100644 index 0000000..79bc095 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/tests/test_util.py @@ -0,0 +1,112 @@ +import re +import sys +import traceback +from typing import NoReturn + +import pytest + +from .._util import ( + bytesify, + LocalProtocolError, + ProtocolError, + RemoteProtocolError, + Sentinel, + validate, +) + + +def test_ProtocolError() -> None: + with pytest.raises(TypeError): + ProtocolError("abstract base class") + + +def test_LocalProtocolError() -> None: + try: + raise LocalProtocolError("foo") + except LocalProtocolError as e: + assert str(e) == "foo" + assert e.error_status_hint == 400 + + try: + raise LocalProtocolError("foo", error_status_hint=418) + except LocalProtocolError as e: + assert str(e) == "foo" + assert e.error_status_hint == 418 + + def thunk() -> NoReturn: + raise LocalProtocolError("a", error_status_hint=420) + + try: + try: + thunk() + except LocalProtocolError as exc1: + orig_traceback = "".join(traceback.format_tb(sys.exc_info()[2])) + exc1._reraise_as_remote_protocol_error() + except RemoteProtocolError as exc2: + assert type(exc2) is RemoteProtocolError + assert exc2.args == ("a",) + assert exc2.error_status_hint == 420 + new_traceback = "".join(traceback.format_tb(sys.exc_info()[2])) + assert new_traceback.endswith(orig_traceback) + + +def test_validate() -> None: + my_re = re.compile(rb"(?P[0-9]+)\.(?P[0-9]+)") + with pytest.raises(LocalProtocolError): + validate(my_re, b"0.") + + groups = validate(my_re, b"0.1") + assert groups == {"group1": b"0", "group2": b"1"} + + # successful partial matches are an error - must match whole string + with pytest.raises(LocalProtocolError): + validate(my_re, b"0.1xx") + with pytest.raises(LocalProtocolError): + validate(my_re, b"0.1\n") + + +def test_validate_formatting() -> None: + my_re = re.compile(rb"foo") + + with pytest.raises(LocalProtocolError) as excinfo: + validate(my_re, b"", "oops") + assert "oops" in str(excinfo.value) + + with pytest.raises(LocalProtocolError) as excinfo: + validate(my_re, b"", "oops {}") + assert "oops {}" in str(excinfo.value) + + with pytest.raises(LocalProtocolError) as excinfo: + validate(my_re, b"", "oops {} xx", 10) + assert "oops 10 xx" in str(excinfo.value) + + +def test_make_sentinel() -> None: + class S(Sentinel, metaclass=Sentinel): + pass + + assert repr(S) == "S" + assert S == S + assert type(S).__name__ == "S" + assert S in {S} + assert type(S) is S + + class S2(Sentinel, metaclass=Sentinel): + pass + + assert repr(S2) == "S2" + assert S != S2 + assert S not in {S2} + assert type(S) is not type(S2) + + +def test_bytesify() -> None: + assert bytesify(b"123") == b"123" + assert bytesify(bytearray(b"123")) == b"123" + assert bytesify("123") == b"123" + + with pytest.raises(UnicodeEncodeError): + bytesify("\u1234") + + with pytest.raises(TypeError): + bytesify(10) diff --git a/env/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER b/env/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/idna-3.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md b/env/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md new file mode 100644 index 0000000..19b6b45 --- /dev/null +++ b/env/lib/python3.12/site-packages/idna-3.10.dist-info/LICENSE.md @@ -0,0 +1,31 @@ +BSD 3-Clause License + +Copyright (c) 2013-2024, 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/env/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA b/env/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA new file mode 100644 index 0000000..c42623e --- /dev/null +++ b/env/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA @@ -0,0 +1,250 @@ +Metadata-Version: 2.1 +Name: idna +Version: 3.10 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +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 +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 the Internationalized Domain Names in +Applications (IDNA) protocol as specified in `RFC 5891 +`_. This is the latest version of +the protocol and is sometimes referred to as “IDNA 2008”. + +This library also provides support for Unicode Technical +Standard 46, `Unicode IDNA Compatibility Processing +`_. + +This acts as a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports the older superseded IDNA specification (`RFC 3490 +`_). + +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: + +.. 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 A-labels or U-labels +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + >>> import idna.codec + >>> print('домен.испытание'.encode('idna2008')) + b'xn--d1acufc.xn--80akhbyknj4f' + >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) + домен.испытание + +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) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the +IDNA specification does not normalize input from different potential +ways a user may input a domain name. This functionality, known as +a “mapping”, is considered by the specification to be a local +user-interface issue distinct from IDNA conversion functionality. + +This library provides one such mapping that was developed by the +Unicode Consortium. Known as `Unicode IDNA Compatibility Processing +`_, it provides for both a regular +mapping for typical applications, as well as a transitional mapping to +help migrate from older IDNA 2003 applications. Strings are +preprocessed according to Section 4.4 “Preprocessing for IDNA2008” +prior to the IDNA operations. + +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 + +Transitional processing provides conversions to help transition from +the older 2003 standard to the current standard. For example, in the +original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was +converted into two *LATIN SMALL LETTER S* (ss), whereas in the current +IDNA specification this conversion is not performed. + +.. code-block:: pycon + + >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementers should use transitional processing with caution, only in +rare cases where conversion from legacy labels to current labels must be +performed (i.e. IDNA implementations that pre-date 2008). For typical +applications that just need to convert labels, transitional processing +is unlikely to be beneficial and could produce unexpected incompatible +results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the new +module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards. These tables are +computed using the command-line script ``tools/idna-data``. + +This tool will fetch relevant 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.6 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. + Removing support for older versions should be well justified in that the + maintenance burden has become too high. + +* **Python 2**. Python 2 is supported by version 2.x of this library. + Use "idna<3" in your requirements file if you need this library for + a Python 2 application. Be advised that these versions are no longer + actively developed. + +* **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. + diff --git a/env/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD b/env/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD new file mode 100644 index 0000000..9cfce7f --- /dev/null +++ b/env/lib/python3.12/site-packages/idna-3.10.dist-info/RECORD @@ -0,0 +1,22 @@ +idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 +idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 +idna-3.10.dist-info/RECORD,, +idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +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=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 +idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/env/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL b/env/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/env/lib/python3.12/site-packages/idna-3.10.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/env/lib/python3.12/site-packages/idna/__init__.py b/env/lib/python3.12/site-packages/idna/__init__.py new file mode 100644 index 0000000..cfdc030 --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/__init__.py @@ -0,0 +1,45 @@ +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/env/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ef2027124d8db7cbbc8beb17ee53f72fadc76c0 GIT binary patch literal 893 zcmbu7zi-qq6vyq{UG7Kj_g$|Hhz*Gwu4w_WfRLa?(537alI2U>i`zW=u5DE5RfTqy$kW7zDNmfW4Y{nIo9dHjV~U55sOG@dwqLgBij|F=-N=<4SMST6 zH0N?a|X923%s5v3Pg7eYx&=Tkj%KTW&aM7r+L@CZGc z9xacyhrfCqd2~H`9(|7;kAcU~W8^XRn0QPbPUg34JyDwfm(M>fZ2Qkq%Z6-s&60Dr z;xuK3m4~!VN?D#$`Vn2arqIu2oGIWjY%&JG()dUv8{pCu@k?P|ZI#c1)0hMlY{#4&_mVQ8s jg~PWR#`r3j;NS}VjUV?Ao_|Jnzt?x7;9XPSb~}Cnn+x&` literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc b/env/lib/python3.12/site-packages/idna/__pycache__/codec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..720bc0d4ae744c9ad6882e513b476e45651773f7 GIT binary patch literal 4983 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 L{RK=vZo&TmFSr(8 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/idna/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fcc31a40b4d26d1b6eb4d166490e1b724c1a6d1 GIT binary patch literal 897 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 MnAfb3B3t?Y0tUJckN^Mx literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/env/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0320f890ebb2817be2ebf2e4d2c4dd8b5562e876 GIT binary patch literal 99483 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc b/env/lib/python3.12/site-packages/idna/__pycache__/package_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..042bbf24a1c6326b5b813d26a9e7fa9b34372dd7 GIT binary patch literal 224 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 vd~>=jX3gVMJKHgR1!g 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, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +codecs.register(search_function) diff --git a/env/lib/python3.12/site-packages/idna/compat.py b/env/lib/python3.12/site-packages/idna/compat.py new file mode 100644 index 0000000..1df9f2a --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/compat.py @@ -0,0 +1,15 @@ +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/env/lib/python3.12/site-packages/idna/core.py b/env/lib/python3.12/site-packages/idna/core.py new file mode 100644 index 0000000..9115f12 --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/core.py @@ -0,0 +1,437 @@ +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 = 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/env/lib/python3.12/site-packages/idna/idnadata.py b/env/lib/python3.12/site-packages/idna/idnadata.py new file mode 100644 index 0000000..4be6004 --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/idnadata.py @@ -0,0 +1,4243 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "15.1.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, + 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, + 0x10EAB: 84, + 0x10EAC: 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, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171E: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 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, + 0x898000008E2, + 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, + 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, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 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, + 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, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EFD00010F1D, + 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, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, + 0x1160000011641, + 0x1164400011645, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, + 0x1174000011747, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5A, + 0x11FB000011FB1, + 0x120000001239A, + 0x1248000012544, + 0x12F9000012FF1, + 0x1300000013430, + 0x1344000013456, + 0x1440000014647, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18D0000018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 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/env/lib/python3.12/site-packages/idna/intranges.py b/env/lib/python3.12/site-packages/idna/intranges.py new file mode 100644 index 0000000..7bfaa8d --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/intranges.py @@ -0,0 +1,57 @@ +""" +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/env/lib/python3.12/site-packages/idna/package_data.py b/env/lib/python3.12/site-packages/idna/package_data.py new file mode 100644 index 0000000..514ff7e --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/package_data.py @@ -0,0 +1 @@ +__version__ = "3.10" diff --git a/env/lib/python3.12/site-packages/idna/py.typed b/env/lib/python3.12/site-packages/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/idna/uts46data.py b/env/lib/python3.12/site-packages/idna/uts46data.py new file mode 100644 index 0000000..eb89432 --- /dev/null +++ b/env/lib/python3.12/site-packages/idna/uts46data.py @@ -0,0 +1,8681 @@ +# 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__ = "15.1.0" + + +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, "3"), + (0x1, "3"), + (0x2, "3"), + (0x3, "3"), + (0x4, "3"), + (0x5, "3"), + (0x6, "3"), + (0x7, "3"), + (0x8, "3"), + (0x9, "3"), + (0xA, "3"), + (0xB, "3"), + (0xC, "3"), + (0xD, "3"), + (0xE, "3"), + (0xF, "3"), + (0x10, "3"), + (0x11, "3"), + (0x12, "3"), + (0x13, "3"), + (0x14, "3"), + (0x15, "3"), + (0x16, "3"), + (0x17, "3"), + (0x18, "3"), + (0x19, "3"), + (0x1A, "3"), + (0x1B, "3"), + (0x1C, "3"), + (0x1D, "3"), + (0x1E, "3"), + (0x1F, "3"), + (0x20, "3"), + (0x21, "3"), + (0x22, "3"), + (0x23, "3"), + (0x24, "3"), + (0x25, "3"), + (0x26, "3"), + (0x27, "3"), + (0x28, "3"), + (0x29, "3"), + (0x2A, "3"), + (0x2B, "3"), + (0x2C, "3"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "3"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "3"), + (0x3B, "3"), + (0x3C, "3"), + (0x3D, "3"), + (0x3E, "3"), + (0x3F, "3"), + (0x40, "3"), + (0x41, "M", "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, "3"), + (0x5C, "3"), + (0x5D, "3"), + (0x5E, "3"), + (0x5F, "3"), + (0x60, "3"), + (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, "3"), + (0x7C, "3"), + (0x7D, "3"), + (0x7E, "3"), + (0x7F, "3"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "3", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "3", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "3", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "3", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "3", " ̧"), + (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, "3", " ̆"), + (0x2D9, "3", " ̇"), + (0x2DA, "3", " ̊"), + (0x2DB, "3", " ̨"), + (0x2DC, "3", " ̃"), + (0x2DD, "3", " ̋"), + (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, "3", " ι"), + (0x37B, "V"), + (0x37E, "3", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "3", " ́"), + (0x385, "3", " ̈́"), + (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, "X"), + (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"), + (0x898, "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, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "X"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (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"), + ] + + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "X"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x1806, "X"), + (0x1807, "V"), + (0x180B, "I"), + (0x180E, "X"), + (0x180F, "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"), + (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"), + (0x1B50, "V"), + (0x1B7F, "X"), + (0x1B80, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), + ] + + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "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"), + (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", "ɔ"), + ] + + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ỏ"), + (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", "ự"), + ] + + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ὕ"), + (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", "ἇι"), + ] + + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "3", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "3", " ̓"), + (0x1FC0, "3", " ͂"), + (0x1FC1, "3", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "3", " ̓̀"), + (0x1FCE, "3", " ̓́"), + (0x1FCF, "3", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "3", " ̔̀"), + (0x1FDE, "3", " ̔́"), + (0x1FDF, "3", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "3", " ̈̀"), + (0x1FEE, "3", " ̈́"), + (0x1FEF, "3", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), + ] + + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "3", " ́"), + (0x1FFE, "3", " ̔"), + (0x1FFF, "X"), + (0x2000, "3", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "3", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "3", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "3", "!!"), + (0x203D, "V"), + (0x203E, "3", " ̅"), + (0x203F, "V"), + (0x2047, "3", "??"), + (0x2048, "3", "?!"), + (0x2049, "3", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "3", " "), + (0x2060, "I"), + (0x2061, "X"), + (0x2064, "I"), + (0x2065, "X"), + (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, "3", "+"), + (0x207B, "M", "−"), + (0x207C, "3", "="), + (0x207D, "3", "("), + (0x207E, "3", ")"), + (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"), + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "3", "+"), + (0x208B, "M", "−"), + (0x208C, "3", "="), + (0x208D, "3", "("), + (0x208E, "3", ")"), + (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, "3", "a/c"), + (0x2101, "3", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), + ] + + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, "3", "c/o"), + (0x2106, "3", "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, "X"), + (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"), + (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"), + ] + + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "X"), + (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"), + (0x2427, "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, "3", "(1)"), + (0x2475, "3", "(2)"), + (0x2476, "3", "(3)"), + (0x2477, "3", "(4)"), + (0x2478, "3", "(5)"), + (0x2479, "3", "(6)"), + (0x247A, "3", "(7)"), + (0x247B, "3", "(8)"), + (0x247C, "3", "(9)"), + (0x247D, "3", "(10)"), + (0x247E, "3", "(11)"), + (0x247F, "3", "(12)"), + (0x2480, "3", "(13)"), + (0x2481, "3", "(14)"), + (0x2482, "3", "(15)"), + (0x2483, "3", "(16)"), + (0x2484, "3", "(17)"), + (0x2485, "3", "(18)"), + (0x2486, "3", "(19)"), + (0x2487, "3", "(20)"), + (0x2488, "X"), + (0x249C, "3", "(a)"), + (0x249D, "3", "(b)"), + (0x249E, "3", "(c)"), + (0x249F, "3", "(d)"), + (0x24A0, "3", "(e)"), + (0x24A1, "3", "(f)"), + (0x24A2, "3", "(g)"), + (0x24A3, "3", "(h)"), + (0x24A4, "3", "(i)"), + (0x24A5, "3", "(j)"), + (0x24A6, "3", "(k)"), + (0x24A7, "3", "(l)"), + (0x24A8, "3", "(m)"), + (0x24A9, "3", "(n)"), + (0x24AA, "3", "(o)"), + (0x24AB, "3", "(p)"), + (0x24AC, "3", "(q)"), + (0x24AD, "3", "(r)"), + (0x24AE, "3", "(s)"), + (0x24AF, "3", "(t)"), + (0x24B0, "3", "(u)"), + (0x24B1, "3", "(v)"), + (0x24B2, "3", "(w)"), + (0x24B3, "3", "(x)"), + (0x24B4, "3", "(y)"), + (0x24B5, "3", "(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"), + ] + + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "3", "::="), + (0x2A75, "3", "=="), + (0x2A76, "3", "==="), + (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", "ⰻ"), + (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", "ⱜ"), + ] + + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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", "ⳇ"), + ] + + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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", "卩"), + ] + + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "牛"), + (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", "而"), + ] + + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "鬲"), + (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, "3", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), + ] + + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "3", " ゙"), + (0x309C, "3", " ゚"), + (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, "X"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + (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", "ᆅ"), + ] + + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (0x31E4, "X"), + (0x31F0, "V"), + (0x3200, "3", "(ᄀ)"), + (0x3201, "3", "(ᄂ)"), + (0x3202, "3", "(ᄃ)"), + (0x3203, "3", "(ᄅ)"), + (0x3204, "3", "(ᄆ)"), + (0x3205, "3", "(ᄇ)"), + (0x3206, "3", "(ᄉ)"), + (0x3207, "3", "(ᄋ)"), + (0x3208, "3", "(ᄌ)"), + (0x3209, "3", "(ᄎ)"), + (0x320A, "3", "(ᄏ)"), + (0x320B, "3", "(ᄐ)"), + (0x320C, "3", "(ᄑ)"), + (0x320D, "3", "(ᄒ)"), + (0x320E, "3", "(가)"), + (0x320F, "3", "(나)"), + (0x3210, "3", "(다)"), + (0x3211, "3", "(라)"), + (0x3212, "3", "(마)"), + (0x3213, "3", "(바)"), + (0x3214, "3", "(사)"), + (0x3215, "3", "(아)"), + (0x3216, "3", "(자)"), + (0x3217, "3", "(차)"), + (0x3218, "3", "(카)"), + (0x3219, "3", "(타)"), + (0x321A, "3", "(파)"), + (0x321B, "3", "(하)"), + (0x321C, "3", "(주)"), + (0x321D, "3", "(오전)"), + (0x321E, "3", "(오후)"), + (0x321F, "X"), + (0x3220, "3", "(一)"), + (0x3221, "3", "(二)"), + (0x3222, "3", "(三)"), + (0x3223, "3", "(四)"), + (0x3224, "3", "(五)"), + (0x3225, "3", "(六)"), + (0x3226, "3", "(七)"), + (0x3227, "3", "(八)"), + (0x3228, "3", "(九)"), + (0x3229, "3", "(十)"), + (0x322A, "3", "(月)"), + (0x322B, "3", "(火)"), + (0x322C, "3", "(水)"), + (0x322D, "3", "(木)"), + (0x322E, "3", "(金)"), + (0x322F, "3", "(土)"), + (0x3230, "3", "(日)"), + (0x3231, "3", "(株)"), + (0x3232, "3", "(有)"), + (0x3233, "3", "(社)"), + (0x3234, "3", "(名)"), + (0x3235, "3", "(特)"), + (0x3236, "3", "(財)"), + (0x3237, "3", "(祝)"), + (0x3238, "3", "(労)"), + (0x3239, "3", "(代)"), + (0x323A, "3", "(呼)"), + (0x323B, "3", "(学)"), + (0x323C, "3", "(監)"), + (0x323D, "3", "(企)"), + (0x323E, "3", "(資)"), + (0x323F, "3", "(協)"), + (0x3240, "3", "(祭)"), + (0x3241, "3", "(休)"), + (0x3242, "3", "(自)"), + (0x3243, "3", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), + ] + + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (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", "名"), + (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"), + ] + + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ル"), + (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", "グラムトン"), + ] + + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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点"), + (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", "大正"), + ] + + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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ω"), + (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日"), + ] + + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ꙟ"), + (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"), + ] + + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "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"), + ] + + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "Ꮇ"), + (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", "Ꮮ"), + ] + + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "濫"), + (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", "雷"), + ] + + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "閭"), + (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", "玲"), + ] + + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "離"), + (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", "晴"), + ] + + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "禎"), + (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", "塚"), + ] + + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "調"), + (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"), + ] + + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "3", "+"), + (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", "پ"), + (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", "ى"), + ] + + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "قح"), + (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", "يي"), + ] + + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "3", " ٌّ"), + (0xFC5F, "3", " ٍّ"), + (0xFC60, "3", " َّ"), + (0xFC61, "3", " ُّ"), + (0xFC62, "3", " ِّ"), + (0xFC63, "3", " ّٰ"), + (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", "ئج"), + (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", "فج"), + ] + + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "سى"), + (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", "صي"), + ] + + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "فخم"), + (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", "شحي"), + ] + + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "3", "صلى الله عليه وسلم"), + (0xFDFB, "3", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "3", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "3", ":"), + (0xFE14, "3", ";"), + (0xFE15, "3", "!"), + (0xFE16, "3", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + (0xFE33, "3", "_"), + (0xFE35, "3", "("), + (0xFE36, "3", ")"), + (0xFE37, "3", "{"), + (0xFE38, "3", "}"), + (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, "3", "["), + (0xFE48, "3", "]"), + (0xFE49, "3", " ̅"), + (0xFE4D, "3", "_"), + (0xFE50, "3", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "3", ";"), + (0xFE55, "3", ":"), + (0xFE56, "3", "?"), + (0xFE57, "3", "!"), + (0xFE58, "M", "—"), + (0xFE59, "3", "("), + (0xFE5A, "3", ")"), + (0xFE5B, "3", "{"), + (0xFE5C, "3", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "3", "#"), + (0xFE60, "3", "&"), + (0xFE61, "3", "*"), + ] + + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE62, "3", "+"), + (0xFE63, "M", "-"), + (0xFE64, "3", "<"), + (0xFE65, "3", ">"), + (0xFE66, "3", "="), + (0xFE67, "X"), + (0xFE68, "3", "\\"), + (0xFE69, "3", "$"), + (0xFE6A, "3", "%"), + (0xFE6B, "3", "@"), + (0xFE6C, "X"), + (0xFE70, "3", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "3", " ٌ"), + (0xFE73, "V"), + (0xFE74, "3", " ٍ"), + (0xFE75, "X"), + (0xFE76, "3", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "3", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "3", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "3", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "3", " ْ"), + (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", "و"), + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "3", "!"), + (0xFF02, "3", '"'), + (0xFF03, "3", "#"), + (0xFF04, "3", "$"), + (0xFF05, "3", "%"), + (0xFF06, "3", "&"), + (0xFF07, "3", "'"), + (0xFF08, "3", "("), + (0xFF09, "3", ")"), + (0xFF0A, "3", "*"), + (0xFF0B, "3", "+"), + (0xFF0C, "3", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "3", "/"), + (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, "3", ":"), + (0xFF1B, "3", ";"), + (0xFF1C, "3", "<"), + (0xFF1D, "3", "="), + (0xFF1E, "3", ">"), + ] + + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1F, "3", "?"), + (0xFF20, "3", "@"), + (0xFF21, "M", "a"), + (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, "3", "["), + (0xFF3C, "3", "\\"), + (0xFF3D, "3", "]"), + (0xFF3E, "3", "^"), + (0xFF3F, "3", "_"), + (0xFF40, "3", "`"), + (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, "3", "{"), + (0xFF5C, "3", "|"), + (0xFF5D, "3", "}"), + (0xFF5E, "3", "~"), + (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", "ツ"), + ] + + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "X"), + (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"), + (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, "3", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), + ] + + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (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", "𐐶"), + (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", "𐓡"), + ] + + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "𐖱"), + (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"), + (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", "ɗ"), + ] + + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "𐳭"), + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EFD, "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"), + ] + + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11400, "V"), + (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"), + (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", "𑣊"), + ] + + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + (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"), + (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"), + ] + + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11F5A, "X"), + (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"), + (0x14400, "V"), + (0x14647, "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"), + (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"), + (0x18D00, "V"), + (0x18D09, "X"), + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), + ] + + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (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"), + (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, "X"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + (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"), + ] + + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + ] + + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "σ"), + (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", "η"), + ] + + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ε"), + (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", "ω"), + ] + + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "χ"), + (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", "κ"), + ] + + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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", "ж"), + ] + + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ұ"), + (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"), + (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", "𞤯"), + ] + + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "ش"), + (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", "س"), + ] + + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "د"), + (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", "ذ"), + ] + + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "3", "0,"), + (0x1F102, "3", "1,"), + (0x1F103, "3", "2,"), + (0x1F104, "3", "3,"), + (0x1F105, "3", "4,"), + (0x1F106, "3", "5,"), + (0x1F107, "3", "6,"), + (0x1F108, "3", "7,"), + (0x1F109, "3", "8,"), + (0x1F10A, "3", "9,"), + (0x1F10B, "V"), + (0x1F110, "3", "(a)"), + (0x1F111, "3", "(b)"), + (0x1F112, "3", "(c)"), + (0x1F113, "3", "(d)"), + (0x1F114, "3", "(e)"), + (0x1F115, "3", "(f)"), + (0x1F116, "3", "(g)"), + (0x1F117, "3", "(h)"), + (0x1F118, "3", "(i)"), + (0x1F119, "3", "(j)"), + (0x1F11A, "3", "(k)"), + (0x1F11B, "3", "(l)"), + (0x1F11C, "3", "(m)"), + (0x1F11D, "3", "(n)"), + (0x1F11E, "3", "(o)"), + (0x1F11F, "3", "(p)"), + (0x1F120, "3", "(q)"), + (0x1F121, "3", "(r)"), + (0x1F122, "3", "(s)"), + (0x1F123, "3", "(t)"), + (0x1F124, "3", "(u)"), + (0x1F125, "3", "(v)"), + (0x1F126, "3", "(w)"), + (0x1F127, "3", "(x)"), + (0x1F128, "3", "(y)"), + (0x1F129, "3", "(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"), + ] + + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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"), + (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"), + (0x1F8B2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA89, "X"), + ] + + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FA90, "V"), + (0x1FABE, "X"), + (0x1FABF, "V"), + (0x1FAC6, "X"), + (0x1FACE, "V"), + (0x1FADC, "X"), + (0x1FAE0, "V"), + (0x1FAE9, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBCB, "X"), + (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", "免"), + (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", "咢"), + ] + + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "X"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "X"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + (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", "慎"), + ] + + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "杓"), + (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", "滇"), + ] + + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, "X"), + (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", "𥃳"), + (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, "X"), + (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", "𦉇"), + ] + + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "䔫"), + (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, "X"), + (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", "起"), + ] + + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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", "鳽"), + (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() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/INSTALLER b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE new file mode 100644 index 0000000..51f3442 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE @@ -0,0 +1,3 @@ +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are +made under the terms of *both* these licenses. diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.APACHE2 b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.APACHE2 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.APACHE2 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.MIT b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.MIT new file mode 100644 index 0000000..b8bb971 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/LICENSE.MIT @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/METADATA b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/METADATA new file mode 100644 index 0000000..9f8a3eb --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/METADATA @@ -0,0 +1,63 @@ +Metadata-Version: 2.1 +Name: outcome +Version: 1.3.0.post0 +Summary: Capture the outcome of Python function calls. +Home-page: https://github.com/python-trio/outcome +Author: Frazer McLean +Author-email: frazer@frazermclean.co.uk +License: MIT OR Apache-2.0 +Project-URL: Documentation, https://outcome.readthedocs.io/en/latest/ +Project-URL: Chat, https://gitter.im/python-trio/general +Project-URL: Changelog, https://outcome.readthedocs.io/en/latest/history.html +Keywords: result +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: Trio +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: LICENSE.APACHE2 +License-File: LICENSE.MIT +Requires-Dist: attrs >=19.2.0 + +.. image:: https://img.shields.io/badge/chat-join%20now-blue.svg + :target: https://gitter.im/python-trio/general + :alt: Join chatroom + +.. image:: https://img.shields.io/badge/docs-read%20now-blue.svg + :target: https://outcome.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +.. image:: https://travis-ci.org/python-trio/trio.svg?branch=master + :target: https://travis-ci.org/python-trio/outcome + :alt: Automated test status (Linux and MacOS) + +.. image:: https://ci.appveyor.com/api/projects/status/c54uu4rxlgs2usmj/branch/master?svg=true + :target: https://ci.appveyor.com/project/RazerM/outcome/history + :alt: Automated test status (Windows) + +.. image:: https://codecov.io/gh/python-trio/trio/branch/master/graph/badge.svg + :target: https://codecov.io/gh/python-trio/outcome + :alt: Test coverage + +outcome +======= + +Welcome to `outcome `__! + +Capture the outcome of Python function calls. Extracted from the +`Trio `__ project. + +License: Your choice of MIT or Apache License 2.0 diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/RECORD b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/RECORD new file mode 100644 index 0000000..20372fa --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/RECORD @@ -0,0 +1,17 @@ +outcome-1.3.0.post0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +outcome-1.3.0.post0.dist-info/LICENSE,sha256=ZSyHhIjRRWNh4Iw_hgf9e6WYkqFBA9Fczk_5PIW1zIs,185 +outcome-1.3.0.post0.dist-info/LICENSE.APACHE2,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +outcome-1.3.0.post0.dist-info/LICENSE.MIT,sha256=Pm2uVV65J4f8gtHUg1Vnf0VMf2Wus40_nnK_mj2vA0s,1046 +outcome-1.3.0.post0.dist-info/METADATA,sha256=brWxWZ_d8YhJzF24GvyfYRmeAY31qvbAOHPRgrQz0F4,2559 +outcome-1.3.0.post0.dist-info/RECORD,, +outcome-1.3.0.post0.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110 +outcome-1.3.0.post0.dist-info/top_level.txt,sha256=gyOUMosVXcIYHnlvxHt2jeNDnEIt62nwCk1PKatrcNg,8 +outcome/__init__.py,sha256=PmCGcc4Cf26kd_9-EdmF1C58-CijfgBnBgXyhsJCrMc,496 +outcome/__pycache__/__init__.cpython-312.pyc,, +outcome/__pycache__/_impl.cpython-312.pyc,, +outcome/__pycache__/_util.cpython-312.pyc,, +outcome/__pycache__/_version.cpython-312.pyc,, +outcome/_impl.py,sha256=h9irxMwYZE_5-pUOVELttxSNILXwaHeWxUOcsSSRf9Q,6657 +outcome/_util.py,sha256=fBrW6uy-ax3lp3V6A5cbtoGh-MRK1rfReRHZfC9ZDDg,941 +outcome/_version.py,sha256=qLgPwPOr0OXcxQrNK_I74vuSAUN9F289WqZduQA_m44,201 +outcome/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/WHEEL b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/WHEEL new file mode 100644 index 0000000..c34f116 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/top_level.txt b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/top_level.txt new file mode 100644 index 0000000..e6d2d58 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome-1.3.0.post0.dist-info/top_level.txt @@ -0,0 +1 @@ +outcome diff --git a/env/lib/python3.12/site-packages/outcome/__init__.py b/env/lib/python3.12/site-packages/outcome/__init__.py new file mode 100644 index 0000000..9e6b453 --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome/__init__.py @@ -0,0 +1,20 @@ +"""Top-level package for outcome.""" + +from ._impl import ( + Error as Error, + Maybe as Maybe, + Outcome as Outcome, + Value as Value, + acapture as acapture, + capture as capture, +) +from ._util import AlreadyUsedError as AlreadyUsedError, fixup_module_metadata +from ._version import __version__ as __version__ + +__all__ = ( + 'Error', 'Outcome', 'Value', 'Maybe', 'acapture', 'capture', + 'AlreadyUsedError' +) + +fixup_module_metadata(__name__, globals()) +del fixup_module_metadata diff --git a/env/lib/python3.12/site-packages/outcome/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/outcome/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e71d16cd89fdde3212db859d4f0dc20434009e32 GIT binary patch literal 628 zcmYL`zmL-}6vyrSa++SD1DwQyIQHnm?eW|KU@HH2sip}4#B_A!69;vpOE6K;d>{o&`GT{@gl{VpX*3Gy< z(_PzyubF7MiP@Z0O{;BZFH+A89|_G_-o2`MzH{GR6z|)LN|m>QQ^^~avxcS6^eJ6) zT^FjPG)3CCH?@mHM-G7la)=#z7BAAFL6qidPN@lLAuF+SZD;>m|GDf?+Z1AJ*6tse z`1+*oyV7oBLfCCFr6rTxDzp@8#zg%UT-pinhvSuv1j}~Cq+~fhRr6NzvZ?XYqIuTN z@X=(FowBaZri<*c$~orc8jE6vtFBq8@??B;jO(J|**@tS?_;I<7hsKiCEI zP#@Z>F8}((V&g*yFTlO40735xI1B-t!XIF=3H-iyhJGgi9)4VXMqhg0!TpQij=p7m Fe*v@_sp9|u literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/outcome/__pycache__/_impl.cpython-312.pyc b/env/lib/python3.12/site-packages/outcome/__pycache__/_impl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4445c26084da4782886c2315a4a6babe931fe05 GIT binary patch literal 8908 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 Ig$3IG03>F}UjP6A literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/outcome/__pycache__/_util.cpython-312.pyc b/env/lib/python3.12/site-packages/outcome/__pycache__/_util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b606e56aad180c672a7798edc70565c53998126c GIT binary patch literal 1983 zcmZuy|7#po5P$pizJFR}- zb7d1w3G^aW^MjHT1S=G*M4_O6gy1g;t@ip1DEO1VT}cu3C+BT$6Dm%~ym>S8W@qMo z=G~8}R2%^{v@6r!N(lYVHzBEAVe<+IE67BqV55pq5-MUz6p)C{AyZsLri7(cILoOd zn=)2R1&dh0>Xg_II#V?xQ>qzVluHpahNEU2$4nJRL6-nsydKFX|KNx7B9q3PI+MpO zgBn~DlF$`4vmmS>j7oxuN}?&0q`H`wSa!@NSU2l$dDuKlh)Zq^k2$#uHEOsOoHKMM z=Q?&hSH`)TbDikbDmFo5;KF2HW>HOZ^a|EA7T2_jYu0QoCpGQenr?S35lu5)L({%S zn>>|&%EcLoT&&b)^h!lHi{q|Qt6+zE#d8)tUn>`nA3HWOuGhVh3sWO!ToV_ubFFAw znR#F;cia1BWTfnU_-9bh-nO$9DhprI8m(?nBpQ)!|p(UcaG zA1JZI-%Zmi_QdIEN*$014;lg zlWDz*Ih0M99e}TTO}A^<%PV9z1Y{DxgvEInEikailr^Wh4kl?Zd%T;uT&~d|yaI9n z*o|TEs8z#(s6Y~?PW8e`+ck9C8!dDL@B`jeV1G5xM!Ij=Xq~*(6|@$=xz%M*`!_qQf~ z>V5vPgbuyZkx=$TOMUH!Bvu1 zgTe@)46!Ib6xbqgiqA;Ul%PzHBlvBoJ$E{&o%Q{1*<=XZIHRI@}-kS+5T4ldgf5${6?a0dFD>vH}dV&gG6CX9{pavclo>YeR*^(QTU~2e>2if z?`=ia)48VfD4JQ8K1@DVQ15}QIwd@3Fu{3hb~${5+4VtKK>$El|4UEJsSr*RKo39w z(1bc6)+%BFu}odSxDW8~Qu89l*Yc@&bP}Q<_EzJTzr^z5s3t(Vc0`BDAbI zc#g6(N9m47UM7bj8W{%0L|SHo=J6DG-?!SHCAi{V!x{vbBK#F21+a4)Tv&?^G#A>b%*Umr(vk>xN$=^XD4BVf7+6mXw95Ar z2iN3-L1Xg?rox<9&NShzBs>L{yjXLnRl&jUM)2M;$)kik%RPp;N9uLm!)NCVT&0%l zFv)UgkR3^Im*6etQ^2Apw;tnB@)B(Md*odL){z83_!S*^qKZOn*?)py>BO@_U%T&_ wjs)v(J$qYH>ryMR-ZRuuKmqxy@y!UAh81D3HPS(_+&vR4_uhEIcfoi61#~9Wb^rhX literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/outcome/__pycache__/_version.cpython-312.pyc b/env/lib/python3.12/site-packages/outcome/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcac8c365a91c5e57189834073b0dd2681c01538 GIT binary patch literal 386 zcmXv~Jxjwt7``(}mDZwe4i0XTA-UA9#igyS2-QIcYvs81&Ni6bg}X~JojUpt{0;sT zadip^iXgZN-JHCrec}Chp7)dYsah=qBXc|$KN|mDfTdXf!6GohJvavxP#A$2_8|le z%96n=(MoLfEeNR9x2eq>>NHGsR&rNAi*^_0)w7G!Hg0y?&Eun9#}Lk8$VoJ-)cm?1 z_=!+Dn3aFIOQq#iUcq?EqzVPcxaXGglFpKlk7aRBzV!z%yVZ;rHA>osmrjw~z?g6@ zG|@!@;|H)XH27v{B4UQ(bVA~oP}CBmG-g~Y)CqMr9imzgcrB7C@8sHR3d#`UQxt_m zlw^7$c-^nQOOsd8(ge`C20uG>zDSTsK>xQMGN%mjxmG0K0G2 T=8L`ey5r6(cY|l(%Hs7updD>G literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/outcome/_impl.py b/env/lib/python3.12/site-packages/outcome/_impl.py new file mode 100644 index 0000000..004b72d --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome/_impl.py @@ -0,0 +1,239 @@ +from __future__ import annotations + +import abc +from typing import ( + TYPE_CHECKING, + AsyncGenerator, + Awaitable, + Callable, + Generator, + Generic, + NoReturn, + TypeVar, + Union, + overload, +) + +import attr + +from ._util import AlreadyUsedError, remove_tb_frames + +if TYPE_CHECKING: + from typing_extensions import ParamSpec, final + ArgsT = ParamSpec("ArgsT") +else: + + def final(func): + return func + + +__all__ = ['Error', 'Outcome', 'Maybe', 'Value', 'acapture', 'capture'] + +ValueT = TypeVar("ValueT", covariant=True) +ResultT = TypeVar("ResultT") + + +@overload +def capture( + # NoReturn = raises exception, so we should get an error. + sync_fn: Callable[ArgsT, NoReturn], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Error: + ... + + +@overload +def capture( + sync_fn: Callable[ArgsT, ResultT], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Value[ResultT] | Error: + ... + + +def capture( + sync_fn: Callable[ArgsT, ResultT], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Value[ResultT] | Error: + """Run ``sync_fn(*args, **kwargs)`` and capture the result. + + Returns: + Either a :class:`Value` or :class:`Error` as appropriate. + + """ + try: + return Value(sync_fn(*args, **kwargs)) + except BaseException as exc: + exc = remove_tb_frames(exc, 1) + return Error(exc) + + +@overload +async def acapture( + async_fn: Callable[ArgsT, Awaitable[NoReturn]], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Error: + ... + + +@overload +async def acapture( + async_fn: Callable[ArgsT, Awaitable[ResultT]], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Value[ResultT] | Error: + ... + + +async def acapture( + async_fn: Callable[ArgsT, Awaitable[ResultT]], + *args: ArgsT.args, + **kwargs: ArgsT.kwargs, +) -> Value[ResultT] | Error: + """Run ``await async_fn(*args, **kwargs)`` and capture the result. + + Returns: + Either a :class:`Value` or :class:`Error` as appropriate. + + """ + try: + return Value(await async_fn(*args, **kwargs)) + except BaseException as exc: + exc = remove_tb_frames(exc, 1) + return Error(exc) + + +@attr.s(repr=False, init=False, slots=True) +class Outcome(abc.ABC, Generic[ValueT]): + """An abstract class representing the result of a Python computation. + + This class has two concrete subclasses: :class:`Value` representing a + value, and :class:`Error` representing an exception. + + In addition to the methods described below, comparison operators on + :class:`Value` and :class:`Error` objects (``==``, ``<``, etc.) check that + the other object is also a :class:`Value` or :class:`Error` object + respectively, and then compare the contained objects. + + :class:`Outcome` objects are hashable if the contained objects are + hashable. + + """ + _unwrapped: bool = attr.ib(default=False, eq=False, init=False) + + def _set_unwrapped(self) -> None: + if self._unwrapped: + raise AlreadyUsedError + object.__setattr__(self, '_unwrapped', True) + + @abc.abstractmethod + def unwrap(self) -> ValueT: + """Return or raise the contained value or exception. + + These two lines of code are equivalent:: + + x = fn(*args) + x = outcome.capture(fn, *args).unwrap() + + """ + + @abc.abstractmethod + def send(self, gen: Generator[ResultT, ValueT, object]) -> ResultT: + """Send or throw the contained value or exception into the given + generator object. + + Args: + gen: A generator object supporting ``.send()`` and ``.throw()`` + methods. + + """ + + @abc.abstractmethod + async def asend(self, agen: AsyncGenerator[ResultT, ValueT]) -> ResultT: + """Send or throw the contained value or exception into the given async + generator object. + + Args: + agen: An async generator object supporting ``.asend()`` and + ``.athrow()`` methods. + + """ + + +@final +@attr.s(frozen=True, repr=False, slots=True) +class Value(Outcome[ValueT], Generic[ValueT]): + """Concrete :class:`Outcome` subclass representing a regular value. + + """ + + value: ValueT = attr.ib() + """The contained value.""" + + def __repr__(self) -> str: + return f'Value({self.value!r})' + + def unwrap(self) -> ValueT: + self._set_unwrapped() + return self.value + + def send(self, gen: Generator[ResultT, ValueT, object]) -> ResultT: + self._set_unwrapped() + return gen.send(self.value) + + async def asend(self, agen: AsyncGenerator[ResultT, ValueT]) -> ResultT: + self._set_unwrapped() + return await agen.asend(self.value) + + +@final +@attr.s(frozen=True, repr=False, slots=True) +class Error(Outcome[NoReturn]): + """Concrete :class:`Outcome` subclass representing a raised exception. + + """ + + error: BaseException = attr.ib( + validator=attr.validators.instance_of(BaseException) + ) + """The contained exception object.""" + + def __repr__(self) -> str: + return f'Error({self.error!r})' + + def unwrap(self) -> NoReturn: + self._set_unwrapped() + # Tracebacks show the 'raise' line below out of context, so let's give + # this variable a name that makes sense out of context. + captured_error = self.error + try: + raise captured_error + finally: + # We want to avoid creating a reference cycle here. Python does + # collect cycles just fine, so it wouldn't be the end of the world + # if we did create a cycle, but the cyclic garbage collector adds + # latency to Python programs, and the more cycles you create, the + # more often it runs, so it's nicer to avoid creating them in the + # first place. For more details see: + # + # https://github.com/python-trio/trio/issues/1770 + # + # In particuar, by deleting this local variables from the 'unwrap' + # methods frame, we avoid the 'captured_error' object's + # __traceback__ from indirectly referencing 'captured_error'. + del captured_error, self + + def send(self, gen: Generator[ResultT, NoReturn, object]) -> ResultT: + self._set_unwrapped() + return gen.throw(self.error) + + async def asend(self, agen: AsyncGenerator[ResultT, NoReturn]) -> ResultT: + self._set_unwrapped() + return await agen.athrow(self.error) + + +# A convenience alias to a union of both results, allowing exhaustiveness checking. +Maybe = Union[Value[ValueT], Error] diff --git a/env/lib/python3.12/site-packages/outcome/_util.py b/env/lib/python3.12/site-packages/outcome/_util.py new file mode 100644 index 0000000..98ad50f --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome/_util.py @@ -0,0 +1,33 @@ +from typing import Any, Dict + + +class AlreadyUsedError(RuntimeError): + """An Outcome can only be unwrapped once.""" + pass + + +def fixup_module_metadata( + module_name: str, + namespace: Dict[str, object], +) -> None: + def fix_one(obj: object) -> None: + mod = getattr(obj, "__module__", None) + if mod is not None and mod.startswith("outcome."): + obj.__module__ = module_name + if isinstance(obj, type): + for attr_value in obj.__dict__.values(): + fix_one(attr_value) + + all_list = namespace["__all__"] + assert isinstance(all_list, (tuple, list)), repr(all_list) + for objname in all_list: + obj = namespace[objname] + fix_one(obj) + + +def remove_tb_frames(exc: BaseException, n: int) -> BaseException: + tb = exc.__traceback__ + for _ in range(n): + assert tb is not None + tb = tb.tb_next + return exc.with_traceback(tb) diff --git a/env/lib/python3.12/site-packages/outcome/_version.py b/env/lib/python3.12/site-packages/outcome/_version.py new file mode 100644 index 0000000..5bd0d9c --- /dev/null +++ b/env/lib/python3.12/site-packages/outcome/_version.py @@ -0,0 +1,7 @@ +# This file is imported from __init__.py and exec'd from setup.py +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from typing_extensions import Final + +__version__: 'Final[str]' = "1.3.0.post0" diff --git a/env/lib/python3.12/site-packages/outcome/py.typed b/env/lib/python3.12/site-packages/outcome/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/INSTALLER b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE new file mode 100644 index 0000000..6f62d44 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE @@ -0,0 +1,3 @@ +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made +under the terms of *both* these licenses. diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.APACHE b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.APACHE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.APACHE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.BSD b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.BSD new file mode 100644 index 0000000..42ce7b7 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.BSD @@ -0,0 +1,23 @@ +Copyright (c) Donald Stufft and individual 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. + +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/env/lib/python3.12/site-packages/packaging-24.2.dist-info/METADATA b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/METADATA new file mode 100644 index 0000000..1479c86 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/METADATA @@ -0,0 +1,102 @@ +Metadata-Version: 2.3 +Name: packaging +Version: 24.2 +Summary: Core utilities for Python packages +Author-email: Donald Stufft +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: License :: OSI Approved :: BSD License +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 :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Project-URL: Documentation, https://packaging.pypa.io/ +Project-URL: Source, https://github.com/pypa/packaging + +packaging +========= + +.. start-intro + +Reusable core utilities for various Python Packaging +`interoperability specifications `_. + +This library provides utilities that implement the interoperability +specifications which have clearly one correct behaviour (eg: :pep:`440`) +or benefit greatly from having a single shared implementation (eg: :pep:`425`). + +.. end-intro + +The ``packaging`` project includes the following: version handling, specifiers, +markers, requirements, tags, utilities. + +Documentation +------------- + +The `documentation`_ provides information and the API for the following: + +- Version Handling +- Specifiers +- Markers +- Requirements +- Tags +- Utilities + +Installation +------------ + +Use ``pip`` to install these utilities:: + + pip install packaging + +The ``packaging`` library uses calendar-based versioning (``YY.N``). + +Discussion +---------- + +If you run into bugs, you can file them in our `issue tracker`_. + +You can also join ``#pypa`` on Freenode to ask questions or get involved. + + +.. _`documentation`: https://packaging.pypa.io/ +.. _`issue tracker`: https://github.com/pypa/packaging/issues + + +Code of Conduct +--------------- + +Everyone interacting in the packaging project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md + +Contributing +------------ + +The ``CONTRIBUTING.rst`` file outlines how to contribute to this project as +well as how to report a potential security issue. The documentation for this +project also covers information about `project development`_ and `security`_. + +.. _`project development`: https://packaging.pypa.io/en/latest/development/ +.. _`security`: https://packaging.pypa.io/en/latest/security/ + +Project History +--------------- + +Please review the ``CHANGELOG.rst`` file or the `Changelog documentation`_ for +recent changes and project history. + +.. _`Changelog documentation`: https://packaging.pypa.io/en/latest/changelog/ + diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/RECORD b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/RECORD new file mode 100644 index 0000000..556139f --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/RECORD @@ -0,0 +1,40 @@ +packaging-24.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +packaging-24.2.dist-info/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197 +packaging-24.2.dist-info/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174 +packaging-24.2.dist-info/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344 +packaging-24.2.dist-info/METADATA,sha256=ohH86s6k5mIfQxY2TS0LcSfADeOFa4BiCC-bxZV-pNs,3204 +packaging-24.2.dist-info/RECORD,, +packaging-24.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +packaging/__init__.py,sha256=dk4Ta_vmdVJxYHDcfyhvQNw8V3PgSBomKNXqg-D2JDY,494 +packaging/__pycache__/__init__.cpython-312.pyc,, +packaging/__pycache__/_elffile.cpython-312.pyc,, +packaging/__pycache__/_manylinux.cpython-312.pyc,, +packaging/__pycache__/_musllinux.cpython-312.pyc,, +packaging/__pycache__/_parser.cpython-312.pyc,, +packaging/__pycache__/_structures.cpython-312.pyc,, +packaging/__pycache__/_tokenizer.cpython-312.pyc,, +packaging/__pycache__/markers.cpython-312.pyc,, +packaging/__pycache__/metadata.cpython-312.pyc,, +packaging/__pycache__/requirements.cpython-312.pyc,, +packaging/__pycache__/specifiers.cpython-312.pyc,, +packaging/__pycache__/tags.cpython-312.pyc,, +packaging/__pycache__/utils.cpython-312.pyc,, +packaging/__pycache__/version.cpython-312.pyc,, +packaging/_elffile.py,sha256=cflAQAkE25tzhYmq_aCi72QfbT_tn891tPzfpbeHOwE,3306 +packaging/_manylinux.py,sha256=vl5OCoz4kx80H5rwXKeXWjl9WNISGmr4ZgTpTP9lU9c,9612 +packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694 +packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236 +packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273 +packaging/licenses/__init__.py,sha256=1x5M1nEYjcgwEbLt0dXwz2ukjr18DiCzC0sraQqJ-Ww,5715 +packaging/licenses/__pycache__/__init__.cpython-312.pyc,, +packaging/licenses/__pycache__/_spdx.cpython-312.pyc,, +packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398 +packaging/markers.py,sha256=c89TNzB7ZdGYhkovm6PYmqGyHxXlYVaLW591PHUNKD8,10561 +packaging/metadata.py,sha256=YJibM7GYe4re8-0a3OlXmGS-XDgTEoO4tlBt2q25Bng,34762 +packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947 +packaging/specifiers.py,sha256=GG1wPNMcL0fMJO68vF53wKMdwnfehDcaI-r9NpTfilA,40074 +packaging/tags.py,sha256=CFqrJzAzc2XNGexerH__T-Y5Iwq7WbsYXsiLERLWxY0,21014 +packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050 +packaging/version.py,sha256=olfyuk_DPbflNkJ4wBWetXQ17c74x3DB501degUv7DY,16676 diff --git a/env/lib/python3.12/site-packages/packaging-24.2.dist-info/WHEEL b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/WHEEL new file mode 100644 index 0000000..e3c6fee --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging-24.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/env/lib/python3.12/site-packages/packaging/__init__.py b/env/lib/python3.12/site-packages/packaging/__init__.py new file mode 100644 index 0000000..d79f73c --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/__init__.py @@ -0,0 +1,15 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "24.2" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = f"2014 {__author__}" diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0aae4de8a1e9e68c5ec43ea8f1bac9e0dbe6d637 GIT binary patch literal 565 zcmYLGO^XvT7|!%#+fH}NB7)*UM)A^xnY7~~q9SSwdQxF;gAme5Iumv#8S+t>!Nd3u zyeWu3z~AD~U>N}QbGl<~B_KNFJrMzfr0 zMwP!5(tls+OmKfsqN=`^XPZw3fyrgMtWW{8k7MS*2yK@TA#*?xCLrDB3x;39;LeT=ldoumb3`JR)rgmSf$ z@eoQxSxJ^=8lfNHVi)V*6lS8JurL|676i^kVhYN&g0Go=V-|2anFMoOso>o*mVE$C>*&EJPafLQe+O^24*&oF literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0eaf4efeb90db7eeef973f206bf77f44af1cd5fe GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eca87194bc84b83464a292587f173ae9c2beab96 GIT binary patch literal 9718 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 AqyPW_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fc723ba839faf5e089249c761625fb1cd791bd5 GIT binary patch literal 4561 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 GqyGnzl|oMd literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfe88b760a509091b97c9f0785ff1c99a8a80f98 GIT binary patch literal 3248 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 a(rwR*w{x8wXV@<%m`R4I{(>N+zW9HirxaNL literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92d4e093217ba385c58614159129649f2bde8ca6 GIT binary patch literal 11381 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc631ae29cfeb3bcb6ece71b3e28a144cecbf0e8 GIT binary patch literal 27219 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95acd49c287f64833445d981659868eecb428996 GIT binary patch literal 4417 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a50069b8fc59de792d4747ecdfa7cddad769dc1 GIT binary patch literal 39025 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8590001cf9dca43ab1f28b1f099f46cb9e0fa63 GIT binary patch literal 20481 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/_elffile.py b/env/lib/python3.12/site-packages/packaging/_elffile.py new file mode 100644 index 0000000..25f4282 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_elffile.py @@ -0,0 +1,110 @@ +""" +ELF file parser. + +This provides a class ``ELFFile`` that parses an ELF executable in a similar +interface to ``ZipFile``. Only the read interface is implemented. + +Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca +ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html +""" + +from __future__ import annotations + +import enum +import os +import struct +from typing import IO + + +class ELFInvalid(ValueError): + pass + + +class EIClass(enum.IntEnum): + C32 = 1 + C64 = 2 + + +class EIData(enum.IntEnum): + Lsb = 1 + Msb = 2 + + +class EMachine(enum.IntEnum): + I386 = 3 + S390 = 22 + Arm = 40 + X8664 = 62 + AArc64 = 183 + + +class ELFFile: + """ + Representation of an ELF executable. + """ + + def __init__(self, f: IO[bytes]) -> None: + self._f = f + + try: + ident = self._read("16B") + except struct.error as e: + raise ELFInvalid("unable to parse identification") from e + magic = bytes(ident[:4]) + if magic != b"\x7fELF": + raise ELFInvalid(f"invalid magic: {magic!r}") + + self.capacity = ident[4] # Format for program header (bitness). + self.encoding = ident[5] # Data structure encoding (endianness). + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, self._p_fmt, self._p_idx = { + (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. + (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. + }[(self.capacity, self.encoding)] + except KeyError as e: + raise ELFInvalid( + f"unrecognized capacity ({self.capacity}) or " + f"encoding ({self.encoding})" + ) from e + + try: + ( + _, + self.machine, # Architecture type. + _, + _, + self._e_phoff, # Offset of program header. + _, + self.flags, # Processor-specific flags. + _, + self._e_phentsize, # Size of section. + self._e_phnum, # Number of sections. + ) = self._read(e_fmt) + except struct.error as e: + raise ELFInvalid("unable to parse machine and section information") from e + + def _read(self, fmt: str) -> tuple[int, ...]: + return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) + + @property + def interpreter(self) -> str | None: + """ + The path recorded in the ``PT_INTERP`` section header. + """ + for index in range(self._e_phnum): + self._f.seek(self._e_phoff + self._e_phentsize * index) + try: + data = self._read(self._p_fmt) + except struct.error: + continue + if data[self._p_idx[0]] != 3: # Not PT_INTERP. + continue + self._f.seek(data[self._p_idx[1]]) + return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") + return None diff --git a/env/lib/python3.12/site-packages/packaging/_manylinux.py b/env/lib/python3.12/site-packages/packaging/_manylinux.py new file mode 100644 index 0000000..61339a6 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_manylinux.py @@ -0,0 +1,263 @@ +from __future__ import annotations + +import collections +import contextlib +import functools +import os +import re +import sys +import warnings +from typing import Generator, Iterator, NamedTuple, Sequence + +from ._elffile import EIClass, EIData, ELFFile, EMachine + +EF_ARM_ABIMASK = 0xFF000000 +EF_ARM_ABI_VER5 = 0x05000000 +EF_ARM_ABI_FLOAT_HARD = 0x00000400 + + +# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` +# as the type for `path` until then. +@contextlib.contextmanager +def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]: + try: + with open(path, "rb") as f: + yield ELFFile(f) + except (OSError, TypeError, ValueError): + yield None + + +def _is_linux_armhf(executable: str) -> bool: + # hard-float ABI can be detected from the ELF header of the running + # process + # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.Arm + and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 + and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD + ) + + +def _is_linux_i686(executable: str) -> bool: + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.I386 + ) + + +def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: + if "armv7l" in archs: + return _is_linux_armhf(executable) + if "i686" in archs: + return _is_linux_i686(executable) + allowed_archs = { + "x86_64", + "aarch64", + "ppc64", + "ppc64le", + "s390x", + "loongarch64", + "riscv64", + } + return any(arch in allowed_archs for arch in archs) + + +# If glibc ever changes its major version, we need to know what the last +# minor version was, so we can build the complete list of all versions. +# For now, guess what the highest minor version might be, assume it will +# be 50 for testing. Once this actually happens, update the dictionary +# with the actual value. +_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50) + + +class _GLibCVersion(NamedTuple): + major: int + minor: int + + +def _glibc_version_string_confstr() -> str | None: + """ + Primary implementation of glibc_version_string using os.confstr. + """ + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module. + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 + try: + # Should be a string like "glibc 2.17". + version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION") + assert version_string is not None + _, version = version_string.rsplit() + except (AssertionError, AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def _glibc_version_string_ctypes() -> str | None: + """ + Fallback implementation of glibc_version_string using ctypes. + """ + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +def _glibc_version_string() -> str | None: + """Returns glibc version string, or None if not using glibc.""" + return _glibc_version_string_confstr() or _glibc_version_string_ctypes() + + +def _parse_glibc_version(version_str: str) -> tuple[int, int]: + """Parse glibc version. + + We use a regexp instead of str.split because we want to discard any + random junk that might come after the minor version -- this might happen + in patched/forked versions of glibc (e.g. Linaro's version of glibc + uses version strings like "2.20-2014.11"). See gh-3588. + """ + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn( + f"Expected glibc version with 2 components major.minor," + f" got: {version_str}", + RuntimeWarning, + stacklevel=2, + ) + return -1, -1 + return int(m.group("major")), int(m.group("minor")) + + +@functools.lru_cache +def _get_glibc_version() -> tuple[int, int]: + version_str = _glibc_version_string() + if version_str is None: + return (-1, -1) + return _parse_glibc_version(version_str) + + +# From PEP 513, PEP 600 +def _is_compatible(arch: str, version: _GLibCVersion) -> bool: + sys_glibc = _get_glibc_version() + if sys_glibc < version: + return False + # Check for presence of _manylinux module. + try: + import _manylinux + except ImportError: + return True + if hasattr(_manylinux, "manylinux_compatible"): + result = _manylinux.manylinux_compatible(version[0], version[1], arch) + if result is not None: + return bool(result) + return True + if version == _GLibCVersion(2, 5): + if hasattr(_manylinux, "manylinux1_compatible"): + return bool(_manylinux.manylinux1_compatible) + if version == _GLibCVersion(2, 12): + if hasattr(_manylinux, "manylinux2010_compatible"): + return bool(_manylinux.manylinux2010_compatible) + if version == _GLibCVersion(2, 17): + if hasattr(_manylinux, "manylinux2014_compatible"): + return bool(_manylinux.manylinux2014_compatible) + return True + + +_LEGACY_MANYLINUX_MAP = { + # CentOS 7 w/ glibc 2.17 (PEP 599) + (2, 17): "manylinux2014", + # CentOS 6 w/ glibc 2.12 (PEP 571) + (2, 12): "manylinux2010", + # CentOS 5 w/ glibc 2.5 (PEP 513) + (2, 5): "manylinux1", +} + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate manylinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be manylinux-compatible. + + :returns: An iterator of compatible manylinux tags. + """ + if not _have_compatible_abi(sys.executable, archs): + return + # Oldest glibc to be supported regardless of architecture is (2, 17). + too_old_glibc2 = _GLibCVersion(2, 16) + if set(archs) & {"x86_64", "i686"}: + # On x86/i686 also oldest glibc to be supported is (2, 5). + too_old_glibc2 = _GLibCVersion(2, 4) + current_glibc = _GLibCVersion(*_get_glibc_version()) + glibc_max_list = [current_glibc] + # We can assume compatibility across glibc major versions. + # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 + # + # Build a list of maximum glibc versions so that we can + # output the canonical list of all glibc from current_glibc + # down to too_old_glibc2, including all intermediary versions. + for glibc_major in range(current_glibc.major - 1, 1, -1): + glibc_minor = _LAST_GLIBC_MINOR[glibc_major] + glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) + for arch in archs: + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(arch, glibc_version): + yield f"{tag}_{arch}" + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(arch, glibc_version): + yield f"{legacy_tag}_{arch}" diff --git a/env/lib/python3.12/site-packages/packaging/_musllinux.py b/env/lib/python3.12/site-packages/packaging/_musllinux.py new file mode 100644 index 0000000..d2bf30b --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_musllinux.py @@ -0,0 +1,85 @@ +"""PEP 656 support. + +This module implements logic to detect if the currently running Python is +linked against musl, and what musl version is used. +""" + +from __future__ import annotations + +import functools +import re +import subprocess +import sys +from typing import Iterator, NamedTuple, Sequence + +from ._elffile import ELFFile + + +class _MuslVersion(NamedTuple): + major: int + minor: int + + +def _parse_musl_version(output: str) -> _MuslVersion | None: + lines = [n for n in (n.strip() for n in output.splitlines()) if n] + if len(lines) < 2 or lines[0][:4] != "musl": + return None + m = re.match(r"Version (\d+)\.(\d+)", lines[1]) + if not m: + return None + return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) + + +@functools.lru_cache +def _get_musl_version(executable: str) -> _MuslVersion | None: + """Detect currently-running musl runtime version. + + This is done by checking the specified executable's dynamic linking + information, and invoking the loader to parse its output for a version + string. If the loader is musl, the output would be something like:: + + musl libc (x86_64) + Version 1.2.2 + Dynamic Program Loader + """ + try: + with open(executable, "rb") as f: + ld = ELFFile(f).interpreter + except (OSError, TypeError, ValueError): + return None + if ld is None or "musl" not in ld: + return None + proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) + return _parse_musl_version(proc.stderr) + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate musllinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be musllinux-compatible. + + :returns: An iterator of compatible musllinux tags. + """ + sys_musl = _get_musl_version(sys.executable) + if sys_musl is None: # Python not dynamically linked against musl. + return + for arch in archs: + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + + +if __name__ == "__main__": # pragma: no cover + import sysconfig + + plat = sysconfig.get_platform() + assert plat.startswith("linux-"), "not linux" + + print("plat:", plat) + print("musl:", _get_musl_version(sys.executable)) + print("tags:", end=" ") + for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): + print(t, end="\n ") diff --git a/env/lib/python3.12/site-packages/packaging/_parser.py b/env/lib/python3.12/site-packages/packaging/_parser.py new file mode 100644 index 0000000..c1238c0 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_parser.py @@ -0,0 +1,354 @@ +"""Handwritten parser of dependency specifiers. + +The docstring for each __parse_* function contains EBNF-inspired grammar representing +the implementation. +""" + +from __future__ import annotations + +import ast +from typing import NamedTuple, Sequence, Tuple, Union + +from ._tokenizer import DEFAULT_RULES, Tokenizer + + +class Node: + def __init__(self, value: str) -> None: + self.value = value + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +MarkerVar = Union[Variable, Value] +MarkerItem = Tuple[MarkerVar, Op, MarkerVar] +MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]] +MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]] + + +class ParsedRequirement(NamedTuple): + name: str + url: str + extras: list[str] + specifier: str + marker: MarkerList | None + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for dependency specifier +# -------------------------------------------------------------------------------------- +def parse_requirement(source: str) -> ParsedRequirement: + return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: + """ + requirement = WS? IDENTIFIER WS? extras WS? requirement_details + """ + tokenizer.consume("WS") + + name_token = tokenizer.expect( + "IDENTIFIER", expected="package name at the start of dependency specifier" + ) + name = name_token.text + tokenizer.consume("WS") + + extras = _parse_extras(tokenizer) + tokenizer.consume("WS") + + url, specifier, marker = _parse_requirement_details(tokenizer) + tokenizer.expect("END", expected="end of dependency specifier") + + return ParsedRequirement(name, url, extras, specifier, marker) + + +def _parse_requirement_details( + tokenizer: Tokenizer, +) -> tuple[str, str, MarkerList | None]: + """ + requirement_details = AT URL (WS requirement_marker?)? + | specifier WS? (requirement_marker)? + """ + + specifier = "" + url = "" + marker = None + + if tokenizer.check("AT"): + tokenizer.read() + tokenizer.consume("WS") + + url_start = tokenizer.position + url = tokenizer.expect("URL", expected="URL after @").text + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + tokenizer.expect("WS", expected="whitespace after URL") + + # The input might end after whitespace. + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, span_start=url_start, after="URL and whitespace" + ) + else: + specifier_start = tokenizer.position + specifier = _parse_specifier(tokenizer) + tokenizer.consume("WS") + + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, + span_start=specifier_start, + after=( + "version specifier" + if specifier + else "name and no valid version specifier" + ), + ) + + return (url, specifier, marker) + + +def _parse_requirement_marker( + tokenizer: Tokenizer, *, span_start: int, after: str +) -> MarkerList: + """ + requirement_marker = SEMICOLON marker WS? + """ + + if not tokenizer.check("SEMICOLON"): + tokenizer.raise_syntax_error( + f"Expected end or semicolon (after {after})", + span_start=span_start, + ) + tokenizer.read() + + marker = _parse_marker(tokenizer) + tokenizer.consume("WS") + + return marker + + +def _parse_extras(tokenizer: Tokenizer) -> list[str]: + """ + extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? + """ + if not tokenizer.check("LEFT_BRACKET", peek=True): + return [] + + with tokenizer.enclosing_tokens( + "LEFT_BRACKET", + "RIGHT_BRACKET", + around="extras", + ): + tokenizer.consume("WS") + extras = _parse_extras_list(tokenizer) + tokenizer.consume("WS") + + return extras + + +def _parse_extras_list(tokenizer: Tokenizer) -> list[str]: + """ + extras_list = identifier (wsp* ',' wsp* identifier)* + """ + extras: list[str] = [] + + if not tokenizer.check("IDENTIFIER"): + return extras + + extras.append(tokenizer.read().text) + + while True: + tokenizer.consume("WS") + if tokenizer.check("IDENTIFIER", peek=True): + tokenizer.raise_syntax_error("Expected comma between extra names") + elif not tokenizer.check("COMMA"): + break + + tokenizer.read() + tokenizer.consume("WS") + + extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") + extras.append(extra_token.text) + + return extras + + +def _parse_specifier(tokenizer: Tokenizer) -> str: + """ + specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS + | WS? version_many WS? + """ + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="version specifier", + ): + tokenizer.consume("WS") + parsed_specifiers = _parse_version_many(tokenizer) + tokenizer.consume("WS") + + return parsed_specifiers + + +def _parse_version_many(tokenizer: Tokenizer) -> str: + """ + version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? + """ + parsed_specifiers = "" + while tokenizer.check("SPECIFIER"): + span_start = tokenizer.position + parsed_specifiers += tokenizer.read().text + if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): + tokenizer.raise_syntax_error( + ".* suffix can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position + 1, + ) + if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): + tokenizer.raise_syntax_error( + "Local version label can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position, + ) + tokenizer.consume("WS") + if not tokenizer.check("COMMA"): + break + parsed_specifiers += tokenizer.read().text + tokenizer.consume("WS") + + return parsed_specifiers + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for marker expression +# -------------------------------------------------------------------------------------- +def parse_marker(source: str) -> MarkerList: + return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: + retval = _parse_marker(tokenizer) + tokenizer.expect("END", expected="end of marker expression") + return retval + + +def _parse_marker(tokenizer: Tokenizer) -> MarkerList: + """ + marker = marker_atom (BOOLOP marker_atom)+ + """ + expression = [_parse_marker_atom(tokenizer)] + while tokenizer.check("BOOLOP"): + token = tokenizer.read() + expr_right = _parse_marker_atom(tokenizer) + expression.extend((token.text, expr_right)) + return expression + + +def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: + """ + marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? + | WS? marker_item WS? + """ + + tokenizer.consume("WS") + if tokenizer.check("LEFT_PARENTHESIS", peek=True): + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="marker expression", + ): + tokenizer.consume("WS") + marker: MarkerAtom = _parse_marker(tokenizer) + tokenizer.consume("WS") + else: + marker = _parse_marker_item(tokenizer) + tokenizer.consume("WS") + return marker + + +def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: + """ + marker_item = WS? marker_var WS? marker_op WS? marker_var WS? + """ + tokenizer.consume("WS") + marker_var_left = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + marker_op = _parse_marker_op(tokenizer) + tokenizer.consume("WS") + marker_var_right = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + return (marker_var_left, marker_op, marker_var_right) + + +def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: + """ + marker_var = VARIABLE | QUOTED_STRING + """ + if tokenizer.check("VARIABLE"): + return process_env_var(tokenizer.read().text.replace(".", "_")) + elif tokenizer.check("QUOTED_STRING"): + return process_python_str(tokenizer.read().text) + else: + tokenizer.raise_syntax_error( + message="Expected a marker variable or quoted string" + ) + + +def process_env_var(env_var: str) -> Variable: + if env_var in ("platform_python_implementation", "python_implementation"): + return Variable("platform_python_implementation") + else: + return Variable(env_var) + + +def process_python_str(python_str: str) -> Value: + value = ast.literal_eval(python_str) + return Value(str(value)) + + +def _parse_marker_op(tokenizer: Tokenizer) -> Op: + """ + marker_op = IN | NOT IN | OP + """ + if tokenizer.check("IN"): + tokenizer.read() + return Op("in") + elif tokenizer.check("NOT"): + tokenizer.read() + tokenizer.expect("WS", expected="whitespace after 'not'") + tokenizer.expect("IN", expected="'in' after 'not'") + return Op("not in") + elif tokenizer.check("OP"): + return Op(tokenizer.read().text) + else: + return tokenizer.raise_syntax_error( + "Expected marker operator, one of " + "<=, <, !=, ==, >=, >, ~=, ===, in, not in" + ) diff --git a/env/lib/python3.12/site-packages/packaging/_structures.py b/env/lib/python3.12/site-packages/packaging/_structures.py new file mode 100644 index 0000000..90a6465 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_structures.py @@ -0,0 +1,61 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return False + + def __le__(self, other: object) -> bool: + return False + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return True + + def __ge__(self, other: object) -> bool: + return True + + def __neg__(self: object) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return True + + def __le__(self, other: object) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return False + + def __ge__(self, other: object) -> bool: + return False + + def __neg__(self: object) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() diff --git a/env/lib/python3.12/site-packages/packaging/_tokenizer.py b/env/lib/python3.12/site-packages/packaging/_tokenizer.py new file mode 100644 index 0000000..89d0416 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/_tokenizer.py @@ -0,0 +1,194 @@ +from __future__ import annotations + +import contextlib +import re +from dataclasses import dataclass +from typing import Iterator, NoReturn + +from .specifiers import Specifier + + +@dataclass +class Token: + name: str + text: str + position: int + + +class ParserSyntaxError(Exception): + """The provided source text could not be parsed correctly.""" + + def __init__( + self, + message: str, + *, + source: str, + span: tuple[int, int], + ) -> None: + self.span = span + self.message = message + self.source = source + + super().__init__() + + def __str__(self) -> str: + marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" + return "\n ".join([self.message, self.source, marker]) + + +DEFAULT_RULES: dict[str, str | re.Pattern[str]] = { + "LEFT_PARENTHESIS": r"\(", + "RIGHT_PARENTHESIS": r"\)", + "LEFT_BRACKET": r"\[", + "RIGHT_BRACKET": r"\]", + "SEMICOLON": r";", + "COMMA": r",", + "QUOTED_STRING": re.compile( + r""" + ( + ('[^']*') + | + ("[^"]*") + ) + """, + re.VERBOSE, + ), + "OP": r"(===|==|~=|!=|<=|>=|<|>)", + "BOOLOP": r"\b(or|and)\b", + "IN": r"\bin\b", + "NOT": r"\bnot\b", + "VARIABLE": re.compile( + r""" + \b( + python_version + |python_full_version + |os[._]name + |sys[._]platform + |platform_(release|system) + |platform[._](version|machine|python_implementation) + |python_implementation + |implementation_(name|version) + |extra + )\b + """, + re.VERBOSE, + ), + "SPECIFIER": re.compile( + Specifier._operator_regex_str + Specifier._version_regex_str, + re.VERBOSE | re.IGNORECASE, + ), + "AT": r"\@", + "URL": r"[^ \t]+", + "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", + "VERSION_PREFIX_TRAIL": r"\.\*", + "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", + "WS": r"[ \t]+", + "END": r"$", +} + + +class Tokenizer: + """Context-sensitive token parsing. + + Provides methods to examine the input stream to check whether the next token + matches. + """ + + def __init__( + self, + source: str, + *, + rules: dict[str, str | re.Pattern[str]], + ) -> None: + self.source = source + self.rules: dict[str, re.Pattern[str]] = { + name: re.compile(pattern) for name, pattern in rules.items() + } + self.next_token: Token | None = None + self.position = 0 + + def consume(self, name: str) -> None: + """Move beyond provided token name, if at current position.""" + if self.check(name): + self.read() + + def check(self, name: str, *, peek: bool = False) -> bool: + """Check whether the next token has the provided name. + + By default, if the check succeeds, the token *must* be read before + another check. If `peek` is set to `True`, the token is not loaded and + would need to be checked again. + """ + assert ( + self.next_token is None + ), f"Cannot check for {name!r}, already have {self.next_token!r}" + assert name in self.rules, f"Unknown token name: {name!r}" + + expression = self.rules[name] + + match = expression.match(self.source, self.position) + if match is None: + return False + if not peek: + self.next_token = Token(name, match[0], self.position) + return True + + def expect(self, name: str, *, expected: str) -> Token: + """Expect a certain token name next, failing with a syntax error otherwise. + + The token is *not* read. + """ + if not self.check(name): + raise self.raise_syntax_error(f"Expected {expected}") + return self.read() + + def read(self) -> Token: + """Consume the next token and return it.""" + token = self.next_token + assert token is not None + + self.position += len(token.text) + self.next_token = None + + return token + + def raise_syntax_error( + self, + message: str, + *, + span_start: int | None = None, + span_end: int | None = None, + ) -> NoReturn: + """Raise ParserSyntaxError at the given position.""" + span = ( + self.position if span_start is None else span_start, + self.position if span_end is None else span_end, + ) + raise ParserSyntaxError( + message, + source=self.source, + span=span, + ) + + @contextlib.contextmanager + def enclosing_tokens( + self, open_token: str, close_token: str, *, around: str + ) -> Iterator[None]: + if self.check(open_token): + open_position = self.position + self.read() + else: + open_position = None + + yield + + if open_position is None: + return + + if not self.check(close_token): + self.raise_syntax_error( + f"Expected matching {close_token} for {open_token}, after {around}", + span_start=open_position, + ) + + self.read() diff --git a/env/lib/python3.12/site-packages/packaging/licenses/__init__.py b/env/lib/python3.12/site-packages/packaging/licenses/__init__.py new file mode 100644 index 0000000..569156d --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/licenses/__init__.py @@ -0,0 +1,145 @@ +####################################################################################### +# +# Adapted from: +# https://github.com/pypa/hatch/blob/5352e44/backend/src/hatchling/licenses/parse.py +# +# MIT License +# +# Copyright (c) 2017-present Ofek Lev +# +# 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. +# +# +# With additional allowance of arbitrary `LicenseRef-` identifiers, not just +# `LicenseRef-Public-Domain` and `LicenseRef-Proprietary`. +# +####################################################################################### +from __future__ import annotations + +import re +from typing import NewType, cast + +from packaging.licenses._spdx import EXCEPTIONS, LICENSES + +__all__ = [ + "NormalizedLicenseExpression", + "InvalidLicenseExpression", + "canonicalize_license_expression", +] + +license_ref_allowed = re.compile("^[A-Za-z0-9.-]*$") + +NormalizedLicenseExpression = NewType("NormalizedLicenseExpression", str) + + +class InvalidLicenseExpression(ValueError): + """Raised when a license-expression string is invalid + + >>> canonicalize_license_expression("invalid") + Traceback (most recent call last): + ... + packaging.licenses.InvalidLicenseExpression: Invalid license expression: 'invalid' + """ + + +def canonicalize_license_expression( + raw_license_expression: str, +) -> NormalizedLicenseExpression: + if not raw_license_expression: + message = f"Invalid license expression: {raw_license_expression!r}" + raise InvalidLicenseExpression(message) + + # Pad any parentheses so tokenization can be achieved by merely splitting on + # whitespace. + license_expression = raw_license_expression.replace("(", " ( ").replace(")", " ) ") + licenseref_prefix = "LicenseRef-" + license_refs = { + ref.lower(): "LicenseRef-" + ref[len(licenseref_prefix) :] + for ref in license_expression.split() + if ref.lower().startswith(licenseref_prefix.lower()) + } + + # Normalize to lower case so we can look up licenses/exceptions + # and so boolean operators are Python-compatible. + license_expression = license_expression.lower() + + tokens = license_expression.split() + + # Rather than implementing boolean logic, we create an expression that Python can + # parse. Everything that is not involved with the grammar itself is treated as + # `False` and the expression should evaluate as such. + python_tokens = [] + for token in tokens: + if token not in {"or", "and", "with", "(", ")"}: + python_tokens.append("False") + elif token == "with": + python_tokens.append("or") + elif token == "(" and python_tokens and python_tokens[-1] not in {"or", "and"}: + message = f"Invalid license expression: {raw_license_expression!r}" + raise InvalidLicenseExpression(message) + else: + python_tokens.append(token) + + python_expression = " ".join(python_tokens) + try: + invalid = eval(python_expression, globals(), locals()) + except Exception: + invalid = True + + if invalid is not False: + message = f"Invalid license expression: {raw_license_expression!r}" + raise InvalidLicenseExpression(message) from None + + # Take a final pass to check for unknown licenses/exceptions. + normalized_tokens = [] + for token in tokens: + if token in {"or", "and", "with", "(", ")"}: + normalized_tokens.append(token.upper()) + continue + + if normalized_tokens and normalized_tokens[-1] == "WITH": + if token not in EXCEPTIONS: + message = f"Unknown license exception: {token!r}" + raise InvalidLicenseExpression(message) + + normalized_tokens.append(EXCEPTIONS[token]["id"]) + else: + if token.endswith("+"): + final_token = token[:-1] + suffix = "+" + else: + final_token = token + suffix = "" + + if final_token.startswith("licenseref-"): + if not license_ref_allowed.match(final_token): + message = f"Invalid licenseref: {final_token!r}" + raise InvalidLicenseExpression(message) + normalized_tokens.append(license_refs[final_token] + suffix) + else: + if final_token not in LICENSES: + message = f"Unknown license: {final_token!r}" + raise InvalidLicenseExpression(message) + normalized_tokens.append(LICENSES[final_token]["id"] + suffix) + + normalized_expression = " ".join(normalized_tokens) + + return cast( + NormalizedLicenseExpression, + normalized_expression.replace("( ", "(").replace(" )", ")"), + ) diff --git a/env/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9c161b401f222098a6fea52f5073d34725b1835 GIT binary patch literal 4115 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 UwbZt!Y|()YoPLGtfMLRa0R|!N$p8QV literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc b/env/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aab23b50ae9628197b4d896c15c3b12c18ed3189 GIT binary patch literal 47371 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%0ACAktwI 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 Any: + """ + Normalize extra values. + """ + if isinstance(results[0], tuple): + lhs, op, rhs = results[0] + if isinstance(lhs, Variable) and lhs.value == "extra": + normalized_extra = canonicalize_name(rhs.value) + rhs = Value(normalized_extra) + elif isinstance(rhs, Variable) and rhs.value == "extra": + normalized_extra = canonicalize_name(lhs.value) + lhs = Value(normalized_extra) + results[0] = lhs, op, rhs + return results + + +def _format_marker( + marker: list[str] | MarkerAtom | str, first: bool | None = True +) -> str: + assert isinstance(marker, (list, tuple, str)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators: dict[str, Operator] = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs: str, op: Op, rhs: str) -> bool: + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs, prereleases=True) + + oper: Operator | None = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") + + return oper(lhs, rhs) + + +def _normalize(*values: str, key: str) -> tuple[str, ...]: + # PEP 685 – Comparison of extra names for optional distribution dependencies + # https://peps.python.org/pep-0685/ + # > When comparing extra names, tools MUST normalize the names being + # > compared using the semantics outlined in PEP 503 for names + if key == "extra": + return tuple(canonicalize_name(v) for v in values) + + # other environment markers don't have such standards + return values + + +def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool: + groups: list[list[bool]] = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, str)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + environment_key = lhs.value + lhs_value = environment[environment_key] + rhs_value = rhs.value + else: + lhs_value = lhs.value + environment_key = rhs.value + rhs_value = environment[environment_key] + + lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info: sys._version_info) -> str: + version = f"{info.major}.{info.minor}.{info.micro}" + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment() -> Environment: + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": ".".join(platform.python_version_tuple()[:2]), + "sys_platform": sys.platform, + } + + +class Marker: + def __init__(self, marker: str) -> None: + # Note: We create a Marker object without calling this constructor in + # packaging.requirements.Requirement. If any additional logic is + # added here, make sure to mirror/adapt Requirement. + try: + self._markers = _normalize_extra_values(_parse_marker(marker)) + # The attribute `_markers` can be described in terms of a recursive type: + # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] + # + # For example, the following expression: + # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") + # + # is parsed into: + # [ + # (, ')>, ), + # 'and', + # [ + # (, , ), + # 'or', + # (, , ) + # ] + # ] + except ParserSyntaxError as e: + raise InvalidMarker(str(e)) from e + + def __str__(self) -> str: + return _format_marker(self._markers) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash((self.__class__.__name__, str(self))) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Marker): + return NotImplemented + + return str(self) == str(other) + + def evaluate(self, environment: dict[str, str] | None = None) -> bool: + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = cast("dict[str, str]", default_environment()) + current_environment["extra"] = "" + if environment is not None: + current_environment.update(environment) + # The API used to allow setting extra to None. We need to handle this + # case for backwards compatibility. + if current_environment["extra"] is None: + current_environment["extra"] = "" + + return _evaluate_markers( + self._markers, _repair_python_full_version(current_environment) + ) + + +def _repair_python_full_version(env: dict[str, str]) -> dict[str, str]: + """ + Work around platform.python_version() returning something that is not PEP 440 + compliant for non-tagged Python builds. + """ + if env["python_full_version"].endswith("+"): + env["python_full_version"] += "local" + return env diff --git a/env/lib/python3.12/site-packages/packaging/metadata.py b/env/lib/python3.12/site-packages/packaging/metadata.py new file mode 100644 index 0000000..721f411 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/metadata.py @@ -0,0 +1,863 @@ +from __future__ import annotations + +import email.feedparser +import email.header +import email.message +import email.parser +import email.policy +import pathlib +import sys +import typing +from typing import ( + Any, + Callable, + Generic, + Literal, + TypedDict, + cast, +) + +from . import licenses, requirements, specifiers, utils +from . import version as version_module +from .licenses import NormalizedLicenseExpression + +T = typing.TypeVar("T") + + +if sys.version_info >= (3, 11): # pragma: no cover + ExceptionGroup = ExceptionGroup +else: # pragma: no cover + + class ExceptionGroup(Exception): + """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. + + If :external:exc:`ExceptionGroup` is already defined by Python itself, + that version is used instead. + """ + + message: str + exceptions: list[Exception] + + def __init__(self, message: str, exceptions: list[Exception]) -> None: + self.message = message + self.exceptions = exceptions + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" + + +class InvalidMetadata(ValueError): + """A metadata field contains invalid data.""" + + field: str + """The name of the field that contains invalid data.""" + + def __init__(self, field: str, message: str) -> None: + self.field = field + super().__init__(message) + + +# The RawMetadata class attempts to make as few assumptions about the underlying +# serialization formats as possible. The idea is that as long as a serialization +# formats offer some very basic primitives in *some* way then we can support +# serializing to and from that format. +class RawMetadata(TypedDict, total=False): + """A dictionary of raw core metadata. + + Each field in core metadata maps to a key of this dictionary (when data is + provided). The key is lower-case and underscores are used instead of dashes + compared to the equivalent core metadata field. Any core metadata field that + can be specified multiple times or can hold multiple values in a single + field have a key with a plural name. See :class:`Metadata` whose attributes + match the keys of this dictionary. + + Core metadata fields that can be specified multiple times are stored as a + list or dict depending on which is appropriate for the field. Any fields + which hold multiple values in a single field are stored as a list. + + """ + + # Metadata 1.0 - PEP 241 + metadata_version: str + name: str + version: str + platforms: list[str] + summary: str + description: str + keywords: list[str] + home_page: str + author: str + author_email: str + license: str + + # Metadata 1.1 - PEP 314 + supported_platforms: list[str] + download_url: str + classifiers: list[str] + requires: list[str] + provides: list[str] + obsoletes: list[str] + + # Metadata 1.2 - PEP 345 + maintainer: str + maintainer_email: str + requires_dist: list[str] + provides_dist: list[str] + obsoletes_dist: list[str] + requires_python: str + requires_external: list[str] + project_urls: dict[str, str] + + # Metadata 2.0 + # PEP 426 attempted to completely revamp the metadata format + # but got stuck without ever being able to build consensus on + # it and ultimately ended up withdrawn. + # + # However, a number of tools had started emitting METADATA with + # `2.0` Metadata-Version, so for historical reasons, this version + # was skipped. + + # Metadata 2.1 - PEP 566 + description_content_type: str + provides_extra: list[str] + + # Metadata 2.2 - PEP 643 + dynamic: list[str] + + # Metadata 2.3 - PEP 685 + # No new fields were added in PEP 685, just some edge case were + # tightened up to provide better interoptability. + + # Metadata 2.4 - PEP 639 + license_expression: str + license_files: list[str] + + +_STRING_FIELDS = { + "author", + "author_email", + "description", + "description_content_type", + "download_url", + "home_page", + "license", + "license_expression", + "maintainer", + "maintainer_email", + "metadata_version", + "name", + "requires_python", + "summary", + "version", +} + +_LIST_FIELDS = { + "classifiers", + "dynamic", + "license_files", + "obsoletes", + "obsoletes_dist", + "platforms", + "provides", + "provides_dist", + "provides_extra", + "requires", + "requires_dist", + "requires_external", + "supported_platforms", +} + +_DICT_FIELDS = { + "project_urls", +} + + +def _parse_keywords(data: str) -> list[str]: + """Split a string of comma-separated keywords into a list of keywords.""" + return [k.strip() for k in data.split(",")] + + +def _parse_project_urls(data: list[str]) -> dict[str, str]: + """Parse a list of label/URL string pairings separated by a comma.""" + urls = {} + for pair in data: + # Our logic is slightly tricky here as we want to try and do + # *something* reasonable with malformed data. + # + # The main thing that we have to worry about, is data that does + # not have a ',' at all to split the label from the Value. There + # isn't a singular right answer here, and we will fail validation + # later on (if the caller is validating) so it doesn't *really* + # matter, but since the missing value has to be an empty str + # and our return value is dict[str, str], if we let the key + # be the missing value, then they'd have multiple '' values that + # overwrite each other in a accumulating dict. + # + # The other potentional issue is that it's possible to have the + # same label multiple times in the metadata, with no solid "right" + # answer with what to do in that case. As such, we'll do the only + # thing we can, which is treat the field as unparseable and add it + # to our list of unparsed fields. + parts = [p.strip() for p in pair.split(",", 1)] + parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items + + # TODO: The spec doesn't say anything about if the keys should be + # considered case sensitive or not... logically they should + # be case-preserving and case-insensitive, but doing that + # would open up more cases where we might have duplicate + # entries. + label, url = parts + if label in urls: + # The label already exists in our set of urls, so this field + # is unparseable, and we can just add the whole thing to our + # unparseable data and stop processing it. + raise KeyError("duplicate labels in project urls") + urls[label] = url + + return urls + + +def _get_payload(msg: email.message.Message, source: bytes | str) -> str: + """Get the body of the message.""" + # If our source is a str, then our caller has managed encodings for us, + # and we don't need to deal with it. + if isinstance(source, str): + payload = msg.get_payload() + assert isinstance(payload, str) + return payload + # If our source is a bytes, then we're managing the encoding and we need + # to deal with it. + else: + bpayload = msg.get_payload(decode=True) + assert isinstance(bpayload, bytes) + try: + return bpayload.decode("utf8", "strict") + except UnicodeDecodeError as exc: + raise ValueError("payload in an invalid encoding") from exc + + +# The various parse_FORMAT functions here are intended to be as lenient as +# possible in their parsing, while still returning a correctly typed +# RawMetadata. +# +# To aid in this, we also generally want to do as little touching of the +# data as possible, except where there are possibly some historic holdovers +# that make valid data awkward to work with. +# +# While this is a lower level, intermediate format than our ``Metadata`` +# class, some light touch ups can make a massive difference in usability. + +# Map METADATA fields to RawMetadata. +_EMAIL_TO_RAW_MAPPING = { + "author": "author", + "author-email": "author_email", + "classifier": "classifiers", + "description": "description", + "description-content-type": "description_content_type", + "download-url": "download_url", + "dynamic": "dynamic", + "home-page": "home_page", + "keywords": "keywords", + "license": "license", + "license-expression": "license_expression", + "license-file": "license_files", + "maintainer": "maintainer", + "maintainer-email": "maintainer_email", + "metadata-version": "metadata_version", + "name": "name", + "obsoletes": "obsoletes", + "obsoletes-dist": "obsoletes_dist", + "platform": "platforms", + "project-url": "project_urls", + "provides": "provides", + "provides-dist": "provides_dist", + "provides-extra": "provides_extra", + "requires": "requires", + "requires-dist": "requires_dist", + "requires-external": "requires_external", + "requires-python": "requires_python", + "summary": "summary", + "supported-platform": "supported_platforms", + "version": "version", +} +_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} + + +def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]: + """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). + + This function returns a two-item tuple of dicts. The first dict is of + recognized fields from the core metadata specification. Fields that can be + parsed and translated into Python's built-in types are converted + appropriately. All other fields are left as-is. Fields that are allowed to + appear multiple times are stored as lists. + + The second dict contains all other fields from the metadata. This includes + any unrecognized fields. It also includes any fields which are expected to + be parsed into a built-in type but were not formatted appropriately. Finally, + any fields that are expected to appear only once but are repeated are + included in this dict. + + """ + raw: dict[str, str | list[str] | dict[str, str]] = {} + unparsed: dict[str, list[str]] = {} + + if isinstance(data, str): + parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) + else: + parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) + + # We have to wrap parsed.keys() in a set, because in the case of multiple + # values for a key (a list), the key will appear multiple times in the + # list of keys, but we're avoiding that by using get_all(). + for name in frozenset(parsed.keys()): + # Header names in RFC are case insensitive, so we'll normalize to all + # lower case to make comparisons easier. + name = name.lower() + + # We use get_all() here, even for fields that aren't multiple use, + # because otherwise someone could have e.g. two Name fields, and we + # would just silently ignore it rather than doing something about it. + headers = parsed.get_all(name) or [] + + # The way the email module works when parsing bytes is that it + # unconditionally decodes the bytes as ascii using the surrogateescape + # handler. When you pull that data back out (such as with get_all() ), + # it looks to see if the str has any surrogate escapes, and if it does + # it wraps it in a Header object instead of returning the string. + # + # As such, we'll look for those Header objects, and fix up the encoding. + value = [] + # Flag if we have run into any issues processing the headers, thus + # signalling that the data belongs in 'unparsed'. + valid_encoding = True + for h in headers: + # It's unclear if this can return more types than just a Header or + # a str, so we'll just assert here to make sure. + assert isinstance(h, (email.header.Header, str)) + + # If it's a header object, we need to do our little dance to get + # the real data out of it. In cases where there is invalid data + # we're going to end up with mojibake, but there's no obvious, good + # way around that without reimplementing parts of the Header object + # ourselves. + # + # That should be fine since, if mojibacked happens, this key is + # going into the unparsed dict anyways. + if isinstance(h, email.header.Header): + # The Header object stores it's data as chunks, and each chunk + # can be independently encoded, so we'll need to check each + # of them. + chunks: list[tuple[bytes, str | None]] = [] + for bin, encoding in email.header.decode_header(h): + try: + bin.decode("utf8", "strict") + except UnicodeDecodeError: + # Enable mojibake. + encoding = "latin1" + valid_encoding = False + else: + encoding = "utf8" + chunks.append((bin, encoding)) + + # Turn our chunks back into a Header object, then let that + # Header object do the right thing to turn them into a + # string for us. + value.append(str(email.header.make_header(chunks))) + # This is already a string, so just add it. + else: + value.append(h) + + # We've processed all of our values to get them into a list of str, + # but we may have mojibake data, in which case this is an unparsed + # field. + if not valid_encoding: + unparsed[name] = value + continue + + raw_name = _EMAIL_TO_RAW_MAPPING.get(name) + if raw_name is None: + # This is a bit of a weird situation, we've encountered a key that + # we don't know what it means, so we don't know whether it's meant + # to be a list or not. + # + # Since we can't really tell one way or another, we'll just leave it + # as a list, even though it may be a single item list, because that's + # what makes the most sense for email headers. + unparsed[name] = value + continue + + # If this is one of our string fields, then we'll check to see if our + # value is a list of a single item. If it is then we'll assume that + # it was emitted as a single string, and unwrap the str from inside + # the list. + # + # If it's any other kind of data, then we haven't the faintest clue + # what we should parse it as, and we have to just add it to our list + # of unparsed stuff. + if raw_name in _STRING_FIELDS and len(value) == 1: + raw[raw_name] = value[0] + # If this is one of our list of string fields, then we can just assign + # the value, since email *only* has strings, and our get_all() call + # above ensures that this is a list. + elif raw_name in _LIST_FIELDS: + raw[raw_name] = value + # Special Case: Keywords + # The keywords field is implemented in the metadata spec as a str, + # but it conceptually is a list of strings, and is serialized using + # ", ".join(keywords), so we'll do some light data massaging to turn + # this into what it logically is. + elif raw_name == "keywords" and len(value) == 1: + raw[raw_name] = _parse_keywords(value[0]) + # Special Case: Project-URL + # The project urls is implemented in the metadata spec as a list of + # specially-formatted strings that represent a key and a value, which + # is fundamentally a mapping, however the email format doesn't support + # mappings in a sane way, so it was crammed into a list of strings + # instead. + # + # We will do a little light data massaging to turn this into a map as + # it logically should be. + elif raw_name == "project_urls": + try: + raw[raw_name] = _parse_project_urls(value) + except KeyError: + unparsed[name] = value + # Nothing that we've done has managed to parse this, so it'll just + # throw it in our unparseable data and move on. + else: + unparsed[name] = value + + # We need to support getting the Description from the message payload in + # addition to getting it from the the headers. This does mean, though, there + # is the possibility of it being set both ways, in which case we put both + # in 'unparsed' since we don't know which is right. + try: + payload = _get_payload(parsed, data) + except ValueError: + unparsed.setdefault("description", []).append( + parsed.get_payload(decode=isinstance(data, bytes)) # type: ignore[call-overload] + ) + else: + if payload: + # Check to see if we've already got a description, if so then both + # it, and this body move to unparseable. + if "description" in raw: + description_header = cast(str, raw.pop("description")) + unparsed.setdefault("description", []).extend( + [description_header, payload] + ) + elif "description" in unparsed: + unparsed["description"].append(payload) + else: + raw["description"] = payload + + # We need to cast our `raw` to a metadata, because a TypedDict only support + # literal key names, but we're computing our key names on purpose, but the + # way this function is implemented, our `TypedDict` can only have valid key + # names. + return cast(RawMetadata, raw), unparsed + + +_NOT_FOUND = object() + + +# Keep the two values in sync. +_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"] +_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"] + +_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) + + +class _Validator(Generic[T]): + """Validate a metadata field. + + All _process_*() methods correspond to a core metadata field. The method is + called with the field's raw value. If the raw value is valid it is returned + in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). + If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause + as appropriate). + """ + + name: str + raw_name: str + added: _MetadataVersion + + def __init__( + self, + *, + added: _MetadataVersion = "1.0", + ) -> None: + self.added = added + + def __set_name__(self, _owner: Metadata, name: str) -> None: + self.name = name + self.raw_name = _RAW_TO_EMAIL_MAPPING[name] + + def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T: + # With Python 3.8, the caching can be replaced with functools.cached_property(). + # No need to check the cache as attribute lookup will resolve into the + # instance's __dict__ before __get__ is called. + cache = instance.__dict__ + value = instance._raw.get(self.name) + + # To make the _process_* methods easier, we'll check if the value is None + # and if this field is NOT a required attribute, and if both of those + # things are true, we'll skip the the converter. This will mean that the + # converters never have to deal with the None union. + if self.name in _REQUIRED_ATTRS or value is not None: + try: + converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") + except AttributeError: + pass + else: + value = converter(value) + + cache[self.name] = value + try: + del instance._raw[self.name] # type: ignore[misc] + except KeyError: + pass + + return cast(T, value) + + def _invalid_metadata( + self, msg: str, cause: Exception | None = None + ) -> InvalidMetadata: + exc = InvalidMetadata( + self.raw_name, msg.format_map({"field": repr(self.raw_name)}) + ) + exc.__cause__ = cause + return exc + + def _process_metadata_version(self, value: str) -> _MetadataVersion: + # Implicitly makes Metadata-Version required. + if value not in _VALID_METADATA_VERSIONS: + raise self._invalid_metadata(f"{value!r} is not a valid metadata version") + return cast(_MetadataVersion, value) + + def _process_name(self, value: str) -> str: + if not value: + raise self._invalid_metadata("{field} is a required field") + # Validate the name as a side-effect. + try: + utils.canonicalize_name(value, validate=True) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) from exc + else: + return value + + def _process_version(self, value: str) -> version_module.Version: + if not value: + raise self._invalid_metadata("{field} is a required field") + try: + return version_module.parse(value) + except version_module.InvalidVersion as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) from exc + + def _process_summary(self, value: str) -> str: + """Check the field contains no newlines.""" + if "\n" in value: + raise self._invalid_metadata("{field} must be a single line") + return value + + def _process_description_content_type(self, value: str) -> str: + content_types = {"text/plain", "text/x-rst", "text/markdown"} + message = email.message.EmailMessage() + message["content-type"] = value + + content_type, parameters = ( + # Defaults to `text/plain` if parsing failed. + message.get_content_type().lower(), + message["content-type"].params, + ) + # Check if content-type is valid or defaulted to `text/plain` and thus was + # not parseable. + if content_type not in content_types or content_type not in value.lower(): + raise self._invalid_metadata( + f"{{field}} must be one of {list(content_types)}, not {value!r}" + ) + + charset = parameters.get("charset", "UTF-8") + if charset != "UTF-8": + raise self._invalid_metadata( + f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" + ) + + markdown_variants = {"GFM", "CommonMark"} + variant = parameters.get("variant", "GFM") # Use an acceptable default. + if content_type == "text/markdown" and variant not in markdown_variants: + raise self._invalid_metadata( + f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " + f"not {variant!r}", + ) + return value + + def _process_dynamic(self, value: list[str]) -> list[str]: + for dynamic_field in map(str.lower, value): + if dynamic_field in {"name", "version", "metadata-version"}: + raise self._invalid_metadata( + f"{dynamic_field!r} is not allowed as a dynamic field" + ) + elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: + raise self._invalid_metadata( + f"{dynamic_field!r} is not a valid dynamic field" + ) + return list(map(str.lower, value)) + + def _process_provides_extra( + self, + value: list[str], + ) -> list[utils.NormalizedName]: + normalized_names = [] + try: + for name in value: + normalized_names.append(utils.canonicalize_name(name, validate=True)) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{name!r} is invalid for {{field}}", cause=exc + ) from exc + else: + return normalized_names + + def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: + try: + return specifiers.SpecifierSet(value) + except specifiers.InvalidSpecifier as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) from exc + + def _process_requires_dist( + self, + value: list[str], + ) -> list[requirements.Requirement]: + reqs = [] + try: + for req in value: + reqs.append(requirements.Requirement(req)) + except requirements.InvalidRequirement as exc: + raise self._invalid_metadata( + f"{req!r} is invalid for {{field}}", cause=exc + ) from exc + else: + return reqs + + def _process_license_expression( + self, value: str + ) -> NormalizedLicenseExpression | None: + try: + return licenses.canonicalize_license_expression(value) + except ValueError as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) from exc + + def _process_license_files(self, value: list[str]) -> list[str]: + paths = [] + for path in value: + if ".." in path: + raise self._invalid_metadata( + f"{path!r} is invalid for {{field}}, " + "parent directory indicators are not allowed" + ) + if "*" in path: + raise self._invalid_metadata( + f"{path!r} is invalid for {{field}}, paths must be resolved" + ) + if ( + pathlib.PurePosixPath(path).is_absolute() + or pathlib.PureWindowsPath(path).is_absolute() + ): + raise self._invalid_metadata( + f"{path!r} is invalid for {{field}}, paths must be relative" + ) + if pathlib.PureWindowsPath(path).as_posix() != path: + raise self._invalid_metadata( + f"{path!r} is invalid for {{field}}, " + "paths must use '/' delimiter" + ) + paths.append(path) + return paths + + +class Metadata: + """Representation of distribution metadata. + + Compared to :class:`RawMetadata`, this class provides objects representing + metadata fields instead of only using built-in types. Any invalid metadata + will cause :exc:`InvalidMetadata` to be raised (with a + :py:attr:`~BaseException.__cause__` attribute as appropriate). + """ + + _raw: RawMetadata + + @classmethod + def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata: + """Create an instance from :class:`RawMetadata`. + + If *validate* is true, all metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + ins = cls() + ins._raw = data.copy() # Mutations occur due to caching enriched values. + + if validate: + exceptions: list[Exception] = [] + try: + metadata_version = ins.metadata_version + metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) + except InvalidMetadata as metadata_version_exc: + exceptions.append(metadata_version_exc) + metadata_version = None + + # Make sure to check for the fields that are present, the required + # fields (so their absence can be reported). + fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS + # Remove fields that have already been checked. + fields_to_check -= {"metadata_version"} + + for key in fields_to_check: + try: + if metadata_version: + # Can't use getattr() as that triggers descriptor protocol which + # will fail due to no value for the instance argument. + try: + field_metadata_version = cls.__dict__[key].added + except KeyError: + exc = InvalidMetadata(key, f"unrecognized field: {key!r}") + exceptions.append(exc) + continue + field_age = _VALID_METADATA_VERSIONS.index( + field_metadata_version + ) + if field_age > metadata_age: + field = _RAW_TO_EMAIL_MAPPING[key] + exc = InvalidMetadata( + field, + f"{field} introduced in metadata version " + f"{field_metadata_version}, not {metadata_version}", + ) + exceptions.append(exc) + continue + getattr(ins, key) + except InvalidMetadata as exc: + exceptions.append(exc) + + if exceptions: + raise ExceptionGroup("invalid metadata", exceptions) + + return ins + + @classmethod + def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata: + """Parse metadata from email headers. + + If *validate* is true, the metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + raw, unparsed = parse_email(data) + + if validate: + exceptions: list[Exception] = [] + for unparsed_key in unparsed: + if unparsed_key in _EMAIL_TO_RAW_MAPPING: + message = f"{unparsed_key!r} has invalid data" + else: + message = f"unrecognized field: {unparsed_key!r}" + exceptions.append(InvalidMetadata(unparsed_key, message)) + + if exceptions: + raise ExceptionGroup("unparsed", exceptions) + + try: + return cls.from_raw(raw, validate=validate) + except ExceptionGroup as exc_group: + raise ExceptionGroup( + "invalid or unparsed metadata", exc_group.exceptions + ) from None + + metadata_version: _Validator[_MetadataVersion] = _Validator() + """:external:ref:`core-metadata-metadata-version` + (required; validated to be a valid metadata version)""" + # `name` is not normalized/typed to NormalizedName so as to provide access to + # the original/raw name. + name: _Validator[str] = _Validator() + """:external:ref:`core-metadata-name` + (required; validated using :func:`~packaging.utils.canonicalize_name` and its + *validate* parameter)""" + version: _Validator[version_module.Version] = _Validator() + """:external:ref:`core-metadata-version` (required)""" + dynamic: _Validator[list[str] | None] = _Validator( + added="2.2", + ) + """:external:ref:`core-metadata-dynamic` + (validated against core metadata field names and lowercased)""" + platforms: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-platform`""" + supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-supported-platform`""" + summary: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" + description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body + """:external:ref:`core-metadata-description`""" + description_content_type: _Validator[str | None] = _Validator(added="2.1") + """:external:ref:`core-metadata-description-content-type` (validated)""" + keywords: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-keywords`""" + home_page: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-home-page`""" + download_url: _Validator[str | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-download-url`""" + author: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author`""" + author_email: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author-email`""" + maintainer: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer`""" + maintainer_email: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer-email`""" + license: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-license`""" + license_expression: _Validator[NormalizedLicenseExpression | None] = _Validator( + added="2.4" + ) + """:external:ref:`core-metadata-license-expression`""" + license_files: _Validator[list[str] | None] = _Validator(added="2.4") + """:external:ref:`core-metadata-license-file`""" + classifiers: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-classifier`""" + requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-dist`""" + requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-python`""" + # Because `Requires-External` allows for non-PEP 440 version specifiers, we + # don't do any processing on the values. + requires_external: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-requires-external`""" + project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-project-url`""" + # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation + # regardless of metadata version. + provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator( + added="2.1", + ) + """:external:ref:`core-metadata-provides-extra`""" + provides_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-provides-dist`""" + obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-obsoletes-dist`""" + requires: _Validator[list[str] | None] = _Validator(added="1.1") + """``Requires`` (deprecated)""" + provides: _Validator[list[str] | None] = _Validator(added="1.1") + """``Provides`` (deprecated)""" + obsoletes: _Validator[list[str] | None] = _Validator(added="1.1") + """``Obsoletes`` (deprecated)""" diff --git a/env/lib/python3.12/site-packages/packaging/py.typed b/env/lib/python3.12/site-packages/packaging/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/packaging/requirements.py b/env/lib/python3.12/site-packages/packaging/requirements.py new file mode 100644 index 0000000..4e068c9 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/requirements.py @@ -0,0 +1,91 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import annotations + +from typing import Any, Iterator + +from ._parser import parse_requirement as _parse_requirement +from ._tokenizer import ParserSyntaxError +from .markers import Marker, _normalize_extra_values +from .specifiers import SpecifierSet +from .utils import canonicalize_name + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +class Requirement: + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string: str) -> None: + try: + parsed = _parse_requirement(requirement_string) + except ParserSyntaxError as e: + raise InvalidRequirement(str(e)) from e + + self.name: str = parsed.name + self.url: str | None = parsed.url or None + self.extras: set[str] = set(parsed.extras or []) + self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) + self.marker: Marker | None = None + if parsed.marker is not None: + self.marker = Marker.__new__(Marker) + self.marker._markers = _normalize_extra_values(parsed.marker) + + def _iter_parts(self, name: str) -> Iterator[str]: + yield name + + if self.extras: + formatted_extras = ",".join(sorted(self.extras)) + yield f"[{formatted_extras}]" + + if self.specifier: + yield str(self.specifier) + + if self.url: + yield f"@ {self.url}" + if self.marker: + yield " " + + if self.marker: + yield f"; {self.marker}" + + def __str__(self) -> str: + return "".join(self._iter_parts(self.name)) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash( + ( + self.__class__.__name__, + *self._iter_parts(canonicalize_name(self.name)), + ) + ) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Requirement): + return NotImplemented + + return ( + canonicalize_name(self.name) == canonicalize_name(other.name) + and self.extras == other.extras + and self.specifier == other.specifier + and self.url == other.url + and self.marker == other.marker + ) diff --git a/env/lib/python3.12/site-packages/packaging/specifiers.py b/env/lib/python3.12/site-packages/packaging/specifiers.py new file mode 100644 index 0000000..b30926a --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/specifiers.py @@ -0,0 +1,1020 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier + from packaging.version import Version +""" + +from __future__ import annotations + +import abc +import itertools +import re +from typing import Callable, Iterable, Iterator, TypeVar, Union + +from .utils import canonicalize_version +from .version import Version + +UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) +CallableOperator = Callable[[Version, str], bool] + + +def _coerce_version(version: UnparsedVersion) -> Version: + if not isinstance(version, Version): + version = Version(version) + return version + + +class InvalidSpecifier(ValueError): + """ + Raised when attempting to create a :class:`Specifier` with a specifier + string that is invalid. + + >>> Specifier("lolwat") + Traceback (most recent call last): + ... + packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' + """ + + +class BaseSpecifier(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __str__(self) -> str: + """ + Returns the str representation of this Specifier-like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self) -> int: + """ + Returns a hash value for this Specifier-like object. + """ + + @abc.abstractmethod + def __eq__(self, other: object) -> bool: + """ + Returns a boolean representing whether or not the two Specifier-like + objects are equal. + + :param other: The other object to check against. + """ + + @property + @abc.abstractmethod + def prereleases(self) -> bool | None: + """Whether or not pre-releases as a whole are allowed. + + This can be set to either ``True`` or ``False`` to explicitly enable or disable + prereleases or it can be set to ``None`` (the default) to use default semantics. + """ + + @prereleases.setter + def prereleases(self, value: bool) -> None: + """Setter for :attr:`prereleases`. + + :param value: The value to set. + """ + + @abc.abstractmethod + def contains(self, item: str, prereleases: bool | None = None) -> bool: + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class Specifier(BaseSpecifier): + """This class abstracts handling of version specifiers. + + .. tip:: + + It is generally not required to instantiate this manually. You should instead + prefer to work with :class:`SpecifierSet` instead, which can parse + comma-separated version specifiers (which is what package metadata contains). + """ + + _operator_regex_str = r""" + (?P(~=|==|!=|<=|>=|<|>|===)) + """ + _version_regex_str = r""" + (?P + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s;)]* # The arbitrary version can be just about anything, + # we match everything except for whitespace, a + # semi-colon for marker support, and a closing paren + # since versions can be enclosed in them. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + + # You cannot use a wild card and a pre-release, post-release, a dev or + # local version together so group them with a | and make them optional. + (?: + \.\* # Wild card syntax of .* + | + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + def __init__(self, spec: str = "", prereleases: bool | None = None) -> None: + """Initialize a Specifier instance. + + :param spec: + The string representation of a specifier which will be parsed and + normalized before use. + :param prereleases: + This tells the specifier if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + :raises InvalidSpecifier: + If the given specifier is invalid (i.e. bad syntax). + """ + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: {spec!r}") + + self._spec: tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 + @property # type: ignore[override] + def prereleases(self) -> bool: + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "===", ">", "<"]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if Version(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + @property + def operator(self) -> str: + """The operator of this specifier. + + >>> Specifier("==1.2.3").operator + '==' + """ + return self._spec[0] + + @property + def version(self) -> str: + """The version of this specifier. + + >>> Specifier("==1.2.3").version + '1.2.3' + """ + return self._spec[1] + + def __repr__(self) -> str: + """A representation of the Specifier that shows all internal state. + + >>> Specifier('>=1.0.0') + =1.0.0')> + >>> Specifier('>=1.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> Specifier('>=1.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + """A string representation of the Specifier that can be round-tripped. + + >>> str(Specifier('>=1.0.0')) + '>=1.0.0' + >>> str(Specifier('>=1.0.0', prereleases=False)) + '>=1.0.0' + """ + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> tuple[str, str]: + canonical_version = canonicalize_version( + self._spec[1], + strip_trailing_zero=(self._spec[0] != "~="), + ) + return self._spec[0], canonical_version + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + """Whether or not the two Specifier-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") + True + >>> (Specifier("==1.2.3", prereleases=False) == + ... Specifier("==1.2.3", prereleases=True)) + True + >>> Specifier("==1.2.3") == "==1.2.3" + True + >>> Specifier("==1.2.3") == Specifier("==1.2.4") + False + >>> Specifier("==1.2.3") == Specifier("~=1.2.3") + False + """ + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _compare_compatible(self, prospective: Version, spec: str) -> bool: + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore suffix segments. + prefix = _version_join( + list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + def _compare_equal(self, prospective: Version, spec: str) -> bool: + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + normalized_prospective = canonicalize_version( + prospective.public, strip_trailing_zero=False + ) + # Get the normalized version string ignoring the trailing .* + normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) + # Split the spec out by bangs and dots, and pretend that there is + # an implicit dot in between a release segment and a pre-release segment. + split_spec = _version_split(normalized_spec) + + # Split the prospective version out by bangs and dots, and pretend + # that there is an implicit dot in between a release segment and + # a pre-release segment. + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + shortened_prospective = padded_prospective[: len(split_spec)] + + return shortened_prospective == split_spec + else: + # Convert our spec string into a Version + spec_version = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec_version.local: + prospective = Version(prospective.public) + + return prospective == spec_version + + def _compare_not_equal(self, prospective: Version, spec: str) -> bool: + return not self._compare_equal(prospective, spec) + + def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) + + def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) + + def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: + return str(prospective).lower() == str(spec).lower() + + def __contains__(self, item: str | Version) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in Specifier(">=1.2.3") + True + >>> Version("1.2.3") in Specifier(">=1.2.3") + True + >>> "1.0.0" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) + True + """ + return self.contains(item) + + def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this Specifier. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> Specifier(">=1.2.3").contains("1.2.3") + True + >>> Specifier(">=1.2.3").contains(Version("1.2.3")) + True + >>> Specifier(">=1.2.3").contains("1.0.0") + False + >>> Specifier(">=1.2.3").contains("1.3.0a1") + False + >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") + True + >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) + True + """ + + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version, this allows us to have a shortcut for + # "2.0" in Specifier(">=2") + normalized_item = _coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifier. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(Specifier().contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) + ['1.2.3', '1.3', ] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) + ['1.5a1'] + >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + """ + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = _coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version: str) -> list[str]: + """Split version into components. + + The split components are intended for version comparison. The logic does + not attempt to retain the original version string, so joining the + components back with :func:`_version_join` may not produce the original + version string. + """ + result: list[str] = [] + + epoch, _, rest = version.rpartition("!") + result.append(epoch or "0") + + for item in rest.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _version_join(components: list[str]) -> str: + """Join split version components into a version string. + + This function assumes the input came from :func:`_version_split`, where the + first component must be the epoch (either empty or numeric), and all other + components numeric. + """ + epoch, *rest = components + return f"{epoch}!{'.'.join(rest)}" + + +def _is_not_suffix(segment: str) -> bool: + return not any( + segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") + ) + + +def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]: + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return ( + list(itertools.chain.from_iterable(left_split)), + list(itertools.chain.from_iterable(right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + """This class abstracts handling of a set of version specifiers. + + It can be passed a single specifier (``>=3.0``), a comma-separated list of + specifiers (``>=3.0,!=3.1``), or no specifier at all. + """ + + def __init__( + self, + specifiers: str | Iterable[Specifier] = "", + prereleases: bool | None = None, + ) -> None: + """Initialize a SpecifierSet instance. + + :param specifiers: + The string representation of a specifier or a comma-separated list of + specifiers which will be parsed and normalized before use. + May also be an iterable of ``Specifier`` instances, which will be used + as is. + :param prereleases: + This tells the SpecifierSet if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + + :raises InvalidSpecifier: + If the given ``specifiers`` are not parseable than this exception will be + raised. + """ + + if isinstance(specifiers, str): + # Split on `,` to break each individual specifier into its own item, and + # strip each item to remove leading/trailing whitespace. + split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Make each individual specifier a Specifier and save in a frozen set + # for later. + self._specs = frozenset(map(Specifier, split_specifiers)) + else: + # Save the supplied specifiers in a frozen set. + self._specs = frozenset(specifiers) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + @property + def prereleases(self) -> bool | None: + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __repr__(self) -> str: + """A representation of the specifier set that shows all internal state. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> SpecifierSet('>=1.0.0,!=2.0.0') + =1.0.0')> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"" + + def __str__(self) -> str: + """A string representation of the specifier set that can be round-tripped. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) + '!=1.0.1,>=1.0.0' + >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) + '!=1.0.1,>=1.0.0' + """ + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self) -> int: + return hash(self._specs) + + def __and__(self, other: SpecifierSet | str) -> SpecifierSet: + """Return a SpecifierSet which is a combination of the two sets. + + :param other: The other object to combine with. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' + =1.0.0')> + >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') + =1.0.0')> + """ + if isinstance(other, str): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other: object) -> bool: + """Whether or not the two SpecifierSet-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == + ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") + False + """ + if isinstance(other, (str, Specifier)): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __len__(self) -> int: + """Returns the number of specifiers in this specifier set.""" + return len(self._specs) + + def __iter__(self) -> Iterator[Specifier]: + """ + Returns an iterator over all the underlying :class:`Specifier` instances + in this specifier set. + + >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) + [, =1.0.0')>] + """ + return iter(self._specs) + + def __contains__(self, item: UnparsedVersion) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, + item: UnparsedVersion, + prereleases: bool | None = None, + installed: bool | None = None, + ) -> bool: + """Return whether or not the item is contained in this SpecifierSet. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this SpecifierSet. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) + True + """ + # Ensure that our item is a Version instance. + if not isinstance(item, Version): + item = Version(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + if installed and item.is_prerelease: + item = Version(item.base_version) + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifiers in this set. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) + ['1.3', ] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) + [] + >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + + An "empty" SpecifierSet will filter items based on the presence of prerelease + versions in the set. + + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet("").filter(["1.5a1"])) + ['1.5a1'] + >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + """ + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iter(iterable) + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases. + else: + filtered: list[UnparsedVersionVar] = [] + found_prereleases: list[UnparsedVersionVar] = [] + + for item in iterable: + parsed_version = _coerce_version(item) + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return iter(found_prereleases) + + return iter(filtered) diff --git a/env/lib/python3.12/site-packages/packaging/tags.py b/env/lib/python3.12/site-packages/packaging/tags.py new file mode 100644 index 0000000..f590340 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/tags.py @@ -0,0 +1,617 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import logging +import platform +import re +import struct +import subprocess +import sys +import sysconfig +from importlib.machinery import EXTENSION_SUFFIXES +from typing import ( + Iterable, + Iterator, + Sequence, + Tuple, + cast, +) + +from . import _manylinux, _musllinux + +logger = logging.getLogger(__name__) + +PythonVersion = Sequence[int] +AppleVersion = Tuple[int, int] + +INTERPRETER_SHORT_NAMES: dict[str, str] = { + "python": "py", # Generic. + "cpython": "cp", + "pypy": "pp", + "ironpython": "ip", + "jython": "jy", +} + + +_32_BIT_INTERPRETER = struct.calcsize("P") == 4 + + +class Tag: + """ + A representation of the tag triple for a wheel. + + Instances are considered immutable and thus are hashable. Equality checking + is also supported. + """ + + __slots__ = ["_abi", "_hash", "_interpreter", "_platform"] + + def __init__(self, interpreter: str, abi: str, platform: str) -> None: + self._interpreter = interpreter.lower() + self._abi = abi.lower() + self._platform = platform.lower() + # The __hash__ of every single element in a Set[Tag] will be evaluated each time + # that a set calls its `.disjoint()` method, which may be called hundreds of + # times when scanning a page of links for packages with tags matching that + # Set[Tag]. Pre-computing the value here produces significant speedups for + # downstream consumers. + self._hash = hash((self._interpreter, self._abi, self._platform)) + + @property + def interpreter(self) -> str: + return self._interpreter + + @property + def abi(self) -> str: + return self._abi + + @property + def platform(self) -> str: + return self._platform + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Tag): + return NotImplemented + + return ( + (self._hash == other._hash) # Short-circuit ASAP for perf reasons. + and (self._platform == other._platform) + and (self._abi == other._abi) + and (self._interpreter == other._interpreter) + ) + + def __hash__(self) -> int: + return self._hash + + def __str__(self) -> str: + return f"{self._interpreter}-{self._abi}-{self._platform}" + + def __repr__(self) -> str: + return f"<{self} @ {id(self)}>" + + +def parse_tag(tag: str) -> frozenset[Tag]: + """ + Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. + + Returning a set is required due to the possibility that the tag is a + compressed tag set. + """ + tags = set() + interpreters, abis, platforms = tag.split("-") + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) + + +def _get_config_var(name: str, warn: bool = False) -> int | str | None: + value: int | str | None = sysconfig.get_config_var(name) + if value is None and warn: + logger.debug( + "Config variable '%s' is unset, Python ABI tag may be incorrect", name + ) + return value + + +def _normalize_string(string: str) -> str: + return string.replace(".", "_").replace("-", "_").replace(" ", "_") + + +def _is_threaded_cpython(abis: list[str]) -> bool: + """ + Determine if the ABI corresponds to a threaded (`--disable-gil`) build. + + The threaded builds are indicated by a "t" in the abiflags. + """ + if len(abis) == 0: + return False + # expect e.g., cp313 + m = re.match(r"cp\d+(.*)", abis[0]) + if not m: + return False + abiflags = m.group(1) + return "t" in abiflags + + +def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool: + """ + Determine if the Python version supports abi3. + + PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`) + builds do not support abi3. + """ + return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading + + +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]: + py_version = tuple(py_version) # To allow for version comparison. + abis = [] + version = _version_nodot(py_version[:2]) + threading = debug = pymalloc = ucs4 = "" + with_debug = _get_config_var("Py_DEBUG", warn) + has_refcount = hasattr(sys, "gettotalrefcount") + # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled + # extension modules is the best option. + # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 + has_ext = "_d.pyd" in EXTENSION_SUFFIXES + if with_debug or (with_debug is None and (has_refcount or has_ext)): + debug = "d" + if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn): + threading = "t" + if py_version < (3, 8): + with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) + if with_pymalloc or with_pymalloc is None: + pymalloc = "m" + if py_version < (3, 3): + unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) + if unicode_size == 4 or ( + unicode_size is None and sys.maxunicode == 0x10FFFF + ): + ucs4 = "u" + elif debug: + # Debug builds can also load "normal" extension modules. + # We can also assume no UCS-4 or pymalloc requirement. + abis.append(f"cp{version}{threading}") + abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}") + return abis + + +def cpython_tags( + python_version: PythonVersion | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a CPython interpreter. + + The tags consist of: + - cp-- + - cp-abi3- + - cp-none- + - cp-abi3- # Older Python versions down to 3.2. + + If python_version only specifies a major version then user-provided ABIs and + the 'none' ABItag will be used. + + If 'abi3' or 'none' are specified in 'abis' then they will be yielded at + their normal position and not at the beginning. + """ + if not python_version: + python_version = sys.version_info[:2] + + interpreter = f"cp{_version_nodot(python_version[:2])}" + + if abis is None: + if len(python_version) > 1: + abis = _cpython_abis(python_version, warn) + else: + abis = [] + abis = list(abis) + # 'abi3' and 'none' are explicitly handled later. + for explicit_abi in ("abi3", "none"): + try: + abis.remove(explicit_abi) + except ValueError: + pass + + platforms = list(platforms or platform_tags()) + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + threading = _is_threaded_cpython(abis) + use_abi3 = _abi3_applies(python_version, threading) + if use_abi3: + yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) + yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) + + if use_abi3: + for minor_version in range(python_version[1] - 1, 1, -1): + for platform_ in platforms: + version = _version_nodot((python_version[0], minor_version)) + interpreter = f"cp{version}" + yield Tag(interpreter, "abi3", platform_) + + +def _generic_abi() -> list[str]: + """ + Return the ABI tag based on EXT_SUFFIX. + """ + # The following are examples of `EXT_SUFFIX`. + # We want to keep the parts which are related to the ABI and remove the + # parts which are related to the platform: + # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 + # - mac: '.cpython-310-darwin.so' => cp310 + # - win: '.cp310-win_amd64.pyd' => cp310 + # - win: '.pyd' => cp37 (uses _cpython_abis()) + # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 + # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' + # => graalpy_38_native + + ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) + if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": + raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") + parts = ext_suffix.split(".") + if len(parts) < 3: + # CPython3.7 and earlier uses ".pyd" on Windows. + return _cpython_abis(sys.version_info[:2]) + soabi = parts[1] + if soabi.startswith("cpython"): + # non-windows + abi = "cp" + soabi.split("-")[1] + elif soabi.startswith("cp"): + # windows + abi = soabi.split("-")[0] + elif soabi.startswith("pypy"): + abi = "-".join(soabi.split("-")[:2]) + elif soabi.startswith("graalpy"): + abi = "-".join(soabi.split("-")[:3]) + elif soabi: + # pyston, ironpython, others? + abi = soabi + else: + return [] + return [_normalize_string(abi)] + + +def generic_tags( + interpreter: str | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a generic interpreter. + + The tags consist of: + - -- + + The "none" ABI will be added if it was not explicitly provided. + """ + if not interpreter: + interp_name = interpreter_name() + interp_version = interpreter_version(warn=warn) + interpreter = "".join([interp_name, interp_version]) + if abis is None: + abis = _generic_abi() + else: + abis = list(abis) + platforms = list(platforms or platform_tags()) + if "none" not in abis: + abis.append("none") + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + +def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: + """ + Yields Python versions in descending order. + + After the latest version, the major-only version will be yielded, and then + all previous versions of that major version. + """ + if len(py_version) > 1: + yield f"py{_version_nodot(py_version[:2])}" + yield f"py{py_version[0]}" + if len(py_version) > 1: + for minor in range(py_version[1] - 1, -1, -1): + yield f"py{_version_nodot((py_version[0], minor))}" + + +def compatible_tags( + python_version: PythonVersion | None = None, + interpreter: str | None = None, + platforms: Iterable[str] | None = None, +) -> Iterator[Tag]: + """ + Yields the sequence of tags that are compatible with a specific version of Python. + + The tags consist of: + - py*-none- + - -none-any # ... if `interpreter` is provided. + - py*-none-any + """ + if not python_version: + python_version = sys.version_info[:2] + platforms = list(platforms or platform_tags()) + for version in _py_interpreter_range(python_version): + for platform_ in platforms: + yield Tag(version, "none", platform_) + if interpreter: + yield Tag(interpreter, "none", "any") + for version in _py_interpreter_range(python_version): + yield Tag(version, "none", "any") + + +def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: + if not is_32bit: + return arch + + if arch.startswith("ppc"): + return "ppc" + + return "i386" + + +def _mac_binary_formats(version: AppleVersion, cpu_arch: str) -> list[str]: + formats = [cpu_arch] + if cpu_arch == "x86_64": + if version < (10, 4): + return [] + formats.extend(["intel", "fat64", "fat32"]) + + elif cpu_arch == "i386": + if version < (10, 4): + return [] + formats.extend(["intel", "fat32", "fat"]) + + elif cpu_arch == "ppc64": + # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? + if version > (10, 5) or version < (10, 4): + return [] + formats.append("fat64") + + elif cpu_arch == "ppc": + if version > (10, 6): + return [] + formats.extend(["fat32", "fat"]) + + if cpu_arch in {"arm64", "x86_64"}: + formats.append("universal2") + + if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: + formats.append("universal") + + return formats + + +def mac_platforms( + version: AppleVersion | None = None, arch: str | None = None +) -> Iterator[str]: + """ + Yields the platform tags for a macOS system. + + The `version` parameter is a two-item tuple specifying the macOS version to + generate platform tags for. The `arch` parameter is the CPU architecture to + generate platform tags for. Both parameters default to the appropriate value + for the current system. + """ + version_str, _, cpu_arch = platform.mac_ver() + if version is None: + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) + if version == (10, 16): + # When built against an older macOS SDK, Python will report macOS 10.16 + # instead of the real version. + version_str = subprocess.run( + [ + sys.executable, + "-sS", + "-c", + "import platform; print(platform.mac_ver()[0])", + ], + check=True, + env={"SYSTEM_VERSION_COMPAT": "0"}, + stdout=subprocess.PIPE, + text=True, + ).stdout + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) + else: + version = version + if arch is None: + arch = _mac_arch(cpu_arch) + else: + arch = arch + + if (10, 0) <= version and version < (11, 0): + # Prior to Mac OS 11, each yearly release of Mac OS bumped the + # "minor" version number. The major version was always 10. + major_version = 10 + for minor_version in range(version[1], -1, -1): + compat_version = major_version, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield f"macosx_{major_version}_{minor_version}_{binary_format}" + + if version >= (11, 0): + # Starting with Mac OS 11, each yearly release bumps the major version + # number. The minor versions are now the midyear updates. + minor_version = 0 + for major_version in range(version[0], 10, -1): + compat_version = major_version, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield f"macosx_{major_version}_{minor_version}_{binary_format}" + + if version >= (11, 0): + # Mac OS 11 on x86_64 is compatible with binaries from previous releases. + # Arm64 support was introduced in 11.0, so no Arm binaries from previous + # releases exist. + # + # However, the "universal2" binary format can have a + # macOS version earlier than 11.0 when the x86_64 part of the binary supports + # that version of macOS. + major_version = 10 + if arch == "x86_64": + for minor_version in range(16, 3, -1): + compat_version = major_version, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield f"macosx_{major_version}_{minor_version}_{binary_format}" + else: + for minor_version in range(16, 3, -1): + compat_version = major_version, minor_version + binary_format = "universal2" + yield f"macosx_{major_version}_{minor_version}_{binary_format}" + + +def ios_platforms( + version: AppleVersion | None = None, multiarch: str | None = None +) -> Iterator[str]: + """ + Yields the platform tags for an iOS system. + + :param version: A two-item tuple specifying the iOS version to generate + platform tags for. Defaults to the current iOS version. + :param multiarch: The CPU architecture+ABI to generate platform tags for - + (the value used by `sys.implementation._multiarch` e.g., + `arm64_iphoneos` or `x84_64_iphonesimulator`). Defaults to the current + multiarch value. + """ + if version is None: + # if iOS is the current platform, ios_ver *must* be defined. However, + # it won't exist for CPython versions before 3.13, which causes a mypy + # error. + _, release, _, _ = platform.ios_ver() # type: ignore[attr-defined, unused-ignore] + version = cast("AppleVersion", tuple(map(int, release.split(".")[:2]))) + + if multiarch is None: + multiarch = sys.implementation._multiarch + multiarch = multiarch.replace("-", "_") + + ios_platform_template = "ios_{major}_{minor}_{multiarch}" + + # Consider any iOS major.minor version from the version requested, down to + # 12.0. 12.0 is the first iOS version that is known to have enough features + # to support CPython. Consider every possible minor release up to X.9. There + # highest the minor has ever gone is 8 (14.8 and 15.8) but having some extra + # candidates that won't ever match doesn't really hurt, and it saves us from + # having to keep an explicit list of known iOS versions in the code. Return + # the results descending order of version number. + + # If the requested major version is less than 12, there won't be any matches. + if version[0] < 12: + return + + # Consider the actual X.Y version that was requested. + yield ios_platform_template.format( + major=version[0], minor=version[1], multiarch=multiarch + ) + + # Consider every minor version from X.0 to the minor version prior to the + # version requested by the platform. + for minor in range(version[1] - 1, -1, -1): + yield ios_platform_template.format( + major=version[0], minor=minor, multiarch=multiarch + ) + + for major in range(version[0] - 1, 11, -1): + for minor in range(9, -1, -1): + yield ios_platform_template.format( + major=major, minor=minor, multiarch=multiarch + ) + + +def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: + linux = _normalize_string(sysconfig.get_platform()) + if not linux.startswith("linux_"): + # we should never be here, just yield the sysconfig one and return + yield linux + return + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv8l" + _, arch = linux.split("_", 1) + archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) + yield from _manylinux.platform_tags(archs) + yield from _musllinux.platform_tags(archs) + for arch in archs: + yield f"linux_{arch}" + + +def _generic_platforms() -> Iterator[str]: + yield _normalize_string(sysconfig.get_platform()) + + +def platform_tags() -> Iterator[str]: + """ + Provides the platform tags for this installation. + """ + if platform.system() == "Darwin": + return mac_platforms() + elif platform.system() == "iOS": + return ios_platforms() + elif platform.system() == "Linux": + return _linux_platforms() + else: + return _generic_platforms() + + +def interpreter_name() -> str: + """ + Returns the name of the running interpreter. + + Some implementations have a reserved, two-letter abbreviation which will + be returned when appropriate. + """ + name = sys.implementation.name + return INTERPRETER_SHORT_NAMES.get(name) or name + + +def interpreter_version(*, warn: bool = False) -> str: + """ + Returns the version of the running interpreter. + """ + version = _get_config_var("py_version_nodot", warn=warn) + if version: + version = str(version) + else: + version = _version_nodot(sys.version_info[:2]) + return version + + +def _version_nodot(version: PythonVersion) -> str: + return "".join(map(str, version)) + + +def sys_tags(*, warn: bool = False) -> Iterator[Tag]: + """ + Returns the sequence of tag triples for the running interpreter. + + The order of the sequence corresponds to priority order for the + interpreter, from most to least important. + """ + + interp_name = interpreter_name() + if interp_name == "cp": + yield from cpython_tags(warn=warn) + else: + yield from generic_tags() + + if interp_name == "pp": + interp = "pp3" + elif interp_name == "cp": + interp = "cp" + interpreter_version(warn=warn) + else: + interp = None + yield from compatible_tags(interpreter=interp) diff --git a/env/lib/python3.12/site-packages/packaging/utils.py b/env/lib/python3.12/site-packages/packaging/utils.py new file mode 100644 index 0000000..2345095 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/utils.py @@ -0,0 +1,163 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import functools +import re +from typing import NewType, Tuple, Union, cast + +from .tags import Tag, parse_tag +from .version import InvalidVersion, Version, _TrimmedRelease + +BuildTag = Union[Tuple[()], Tuple[int, str]] +NormalizedName = NewType("NormalizedName", str) + + +class InvalidName(ValueError): + """ + An invalid distribution name; users should refer to the packaging user guide. + """ + + +class InvalidWheelFilename(ValueError): + """ + An invalid wheel filename was found, users should refer to PEP 427. + """ + + +class InvalidSdistFilename(ValueError): + """ + An invalid sdist filename was found, users should refer to the packaging user guide. + """ + + +# Core metadata spec for `Name` +_validate_regex = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE +) +_canonicalize_regex = re.compile(r"[-_.]+") +_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") +# PEP 427: The build number must start with a digit. +_build_tag_regex = re.compile(r"(\d+)(.*)") + + +def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: + if validate and not _validate_regex.match(name): + raise InvalidName(f"name is invalid: {name!r}") + # This is taken from PEP 503. + value = _canonicalize_regex.sub("-", name).lower() + return cast(NormalizedName, value) + + +def is_normalized_name(name: str) -> bool: + return _normalized_regex.match(name) is not None + + +@functools.singledispatch +def canonicalize_version( + version: Version | str, *, strip_trailing_zero: bool = True +) -> str: + """ + Return a canonical form of a version as a string. + + >>> canonicalize_version('1.0.1') + '1.0.1' + + Per PEP 625, versions may have multiple canonical forms, differing + only by trailing zeros. + + >>> canonicalize_version('1.0.0') + '1' + >>> canonicalize_version('1.0.0', strip_trailing_zero=False) + '1.0.0' + + Invalid versions are returned unaltered. + + >>> canonicalize_version('foo bar baz') + 'foo bar baz' + """ + return str(_TrimmedRelease(str(version)) if strip_trailing_zero else version) + + +@canonicalize_version.register +def _(version: str, *, strip_trailing_zero: bool = True) -> str: + try: + parsed = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + return canonicalize_version(parsed, strip_trailing_zero=strip_trailing_zero) + + +def parse_wheel_filename( + filename: str, +) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]: + if not filename.endswith(".whl"): + raise InvalidWheelFilename( + f"Invalid wheel filename (extension must be '.whl'): {filename!r}" + ) + + filename = filename[:-4] + dashes = filename.count("-") + if dashes not in (4, 5): + raise InvalidWheelFilename( + f"Invalid wheel filename (wrong number of parts): {filename!r}" + ) + + parts = filename.split("-", dashes - 2) + name_part = parts[0] + # See PEP 427 for the rules on escaping the project name. + if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: + raise InvalidWheelFilename(f"Invalid project name: {filename!r}") + name = canonicalize_name(name_part) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename!r}" + ) from e + + if dashes == 5: + build_part = parts[2] + build_match = _build_tag_regex.match(build_part) + if build_match is None: + raise InvalidWheelFilename( + f"Invalid build number: {build_part} in {filename!r}" + ) + build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) + else: + build = () + tags = parse_tag(parts[-1]) + return (name, version, build, tags) + + +def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]: + if filename.endswith(".tar.gz"): + file_stem = filename[: -len(".tar.gz")] + elif filename.endswith(".zip"): + file_stem = filename[: -len(".zip")] + else: + raise InvalidSdistFilename( + f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" + f" {filename!r}" + ) + + # We are requiring a PEP 440 version, which cannot contain dashes, + # so we split on the last dash. + name_part, sep, version_part = file_stem.rpartition("-") + if not sep: + raise InvalidSdistFilename(f"Invalid sdist filename: {filename!r}") + + name = canonicalize_name(name_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename!r}" + ) from e + + return (name, version) diff --git a/env/lib/python3.12/site-packages/packaging/version.py b/env/lib/python3.12/site-packages/packaging/version.py new file mode 100644 index 0000000..c9bbda2 --- /dev/null +++ b/env/lib/python3.12/site-packages/packaging/version.py @@ -0,0 +1,582 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.version import parse, Version +""" + +from __future__ import annotations + +import itertools +import re +from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union + +from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType + +__all__ = ["VERSION_PATTERN", "InvalidVersion", "Version", "parse"] + +LocalType = Tuple[Union[int, str], ...] + +CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] +CmpLocalType = Union[ + NegativeInfinityType, + Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], +] +CmpKey = Tuple[ + int, + Tuple[int, ...], + CmpPrePostDevType, + CmpPrePostDevType, + CmpPrePostDevType, + CmpLocalType, +] +VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] + + +class _Version(NamedTuple): + epoch: int + release: tuple[int, ...] + dev: tuple[str, int] | None + pre: tuple[str, int] | None + post: tuple[str, int] | None + local: LocalType | None + + +def parse(version: str) -> Version: + """Parse the given version string. + + >>> parse('1.0.dev1') + + + :param version: The version string to parse. + :raises InvalidVersion: When the version string is not a valid version. + """ + return Version(version) + + +class InvalidVersion(ValueError): + """Raised when a version string is not a valid version. + + >>> Version("invalid") + Traceback (most recent call last): + ... + packaging.version.InvalidVersion: Invalid version: 'invalid' + """ + + +class _BaseVersion: + _key: tuple[Any, ...] + + def __hash__(self) -> int: + return hash(self._key) + + # Please keep the duplicated `isinstance` check + # in the six comparisons hereunder + # unless you find a way to avoid adding overhead function calls. + def __lt__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key < other._key + + def __le__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key <= other._key + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key == other._key + + def __ge__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key >= other._key + + def __gt__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key > other._key + + def __ne__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key != other._key + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +_VERSION_PATTERN = r""" + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P

                                              # pre-release
    +            [-_\.]?
    +            (?Palpha|a|beta|b|preview|pre|c|rc)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +        (?P                                         # post release
    +            (?:-(?P[0-9]+))
    +            |
    +            (?:
    +                [-_\.]?
    +                (?Ppost|rev|r)
    +                [-_\.]?
    +                (?P[0-9]+)?
    +            )
    +        )?
    +        (?P                                          # dev release
    +            [-_\.]?
    +            (?Pdev)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +    )
    +    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    +"""
    +
    +VERSION_PATTERN = _VERSION_PATTERN
    +"""
    +A string containing the regular expression used to match a valid version.
    +
    +The pattern is not anchored at either end, and is intended for embedding in larger
    +expressions (for example, matching a version number as part of a file name). The
    +regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
    +flags set.
    +
    +:meta hide-value:
    +"""
    +
    +
    +class Version(_BaseVersion):
    +    """This class abstracts handling of a project's versions.
    +
    +    A :class:`Version` instance is comparison aware and can be compared and
    +    sorted using the standard Python interfaces.
    +
    +    >>> v1 = Version("1.0a5")
    +    >>> v2 = Version("1.0")
    +    >>> v1
    +    
    +    >>> v2
    +    
    +    >>> v1 < v2
    +    True
    +    >>> v1 == v2
    +    False
    +    >>> v1 > v2
    +    False
    +    >>> v1 >= v2
    +    False
    +    >>> v1 <= v2
    +    True
    +    """
    +
    +    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
    +    _key: CmpKey
    +
    +    def __init__(self, version: str) -> None:
    +        """Initialize a Version object.
    +
    +        :param version:
    +            The string representation of a version which will be parsed and normalized
    +            before use.
    +        :raises InvalidVersion:
    +            If the ``version`` does not conform to PEP 440 in any way then this
    +            exception will be raised.
    +        """
    +
    +        # Validate the version and parse it into pieces
    +        match = self._regex.search(version)
    +        if not match:
    +            raise InvalidVersion(f"Invalid version: {version!r}")
    +
    +        # Store the parsed out pieces of the version
    +        self._version = _Version(
    +            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
    +            release=tuple(int(i) for i in match.group("release").split(".")),
    +            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
    +            post=_parse_letter_version(
    +                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
    +            ),
    +            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
    +            local=_parse_local_version(match.group("local")),
    +        )
    +
    +        # Generate a key which will be used for sorting
    +        self._key = _cmpkey(
    +            self._version.epoch,
    +            self._version.release,
    +            self._version.pre,
    +            self._version.post,
    +            self._version.dev,
    +            self._version.local,
    +        )
    +
    +    def __repr__(self) -> str:
    +        """A representation of the Version that shows all internal state.
    +
    +        >>> Version('1.0.0')
    +        
    +        """
    +        return f""
    +
    +    def __str__(self) -> str:
    +        """A string representation of the version that can be round-tripped.
    +
    +        >>> str(Version("1.0a5"))
    +        '1.0a5'
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        # Pre-release
    +        if self.pre is not None:
    +            parts.append("".join(str(x) for x in self.pre))
    +
    +        # Post-release
    +        if self.post is not None:
    +            parts.append(f".post{self.post}")
    +
    +        # Development release
    +        if self.dev is not None:
    +            parts.append(f".dev{self.dev}")
    +
    +        # Local version segment
    +        if self.local is not None:
    +            parts.append(f"+{self.local}")
    +
    +        return "".join(parts)
    +
    +    @property
    +    def epoch(self) -> int:
    +        """The epoch of the version.
    +
    +        >>> Version("2.0.0").epoch
    +        0
    +        >>> Version("1!2.0.0").epoch
    +        1
    +        """
    +        return self._version.epoch
    +
    +    @property
    +    def release(self) -> tuple[int, ...]:
    +        """The components of the "release" segment of the version.
    +
    +        >>> Version("1.2.3").release
    +        (1, 2, 3)
    +        >>> Version("2.0.0").release
    +        (2, 0, 0)
    +        >>> Version("1!2.0.0.post0").release
    +        (2, 0, 0)
    +
    +        Includes trailing zeroes but not the epoch or any pre-release / development /
    +        post-release suffixes.
    +        """
    +        return self._version.release
    +
    +    @property
    +    def pre(self) -> tuple[str, int] | None:
    +        """The pre-release segment of the version.
    +
    +        >>> print(Version("1.2.3").pre)
    +        None
    +        >>> Version("1.2.3a1").pre
    +        ('a', 1)
    +        >>> Version("1.2.3b1").pre
    +        ('b', 1)
    +        >>> Version("1.2.3rc1").pre
    +        ('rc', 1)
    +        """
    +        return self._version.pre
    +
    +    @property
    +    def post(self) -> int | None:
    +        """The post-release number of the version.
    +
    +        >>> print(Version("1.2.3").post)
    +        None
    +        >>> Version("1.2.3.post1").post
    +        1
    +        """
    +        return self._version.post[1] if self._version.post else None
    +
    +    @property
    +    def dev(self) -> int | None:
    +        """The development number of the version.
    +
    +        >>> print(Version("1.2.3").dev)
    +        None
    +        >>> Version("1.2.3.dev1").dev
    +        1
    +        """
    +        return self._version.dev[1] if self._version.dev else None
    +
    +    @property
    +    def local(self) -> str | None:
    +        """The local version segment of the version.
    +
    +        >>> print(Version("1.2.3").local)
    +        None
    +        >>> Version("1.2.3+abc").local
    +        'abc'
    +        """
    +        if self._version.local:
    +            return ".".join(str(x) for x in self._version.local)
    +        else:
    +            return None
    +
    +    @property
    +    def public(self) -> str:
    +        """The public portion of the version.
    +
    +        >>> Version("1.2.3").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").public
    +        '1.2.3'
    +        >>> Version("1!1.2.3dev1+abc").public
    +        '1!1.2.3.dev1'
    +        """
    +        return str(self).split("+", 1)[0]
    +
    +    @property
    +    def base_version(self) -> str:
    +        """The "base version" of the version.
    +
    +        >>> Version("1.2.3").base_version
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").base_version
    +        '1.2.3'
    +        >>> Version("1!1.2.3dev1+abc").base_version
    +        '1!1.2.3'
    +
    +        The "base version" is the public version of the project without any pre or post
    +        release markers.
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        return "".join(parts)
    +
    +    @property
    +    def is_prerelease(self) -> bool:
    +        """Whether this version is a pre-release.
    +
    +        >>> Version("1.2.3").is_prerelease
    +        False
    +        >>> Version("1.2.3a1").is_prerelease
    +        True
    +        >>> Version("1.2.3b1").is_prerelease
    +        True
    +        >>> Version("1.2.3rc1").is_prerelease
    +        True
    +        >>> Version("1.2.3dev1").is_prerelease
    +        True
    +        """
    +        return self.dev is not None or self.pre is not None
    +
    +    @property
    +    def is_postrelease(self) -> bool:
    +        """Whether this version is a post-release.
    +
    +        >>> Version("1.2.3").is_postrelease
    +        False
    +        >>> Version("1.2.3.post1").is_postrelease
    +        True
    +        """
    +        return self.post is not None
    +
    +    @property
    +    def is_devrelease(self) -> bool:
    +        """Whether this version is a development release.
    +
    +        >>> Version("1.2.3").is_devrelease
    +        False
    +        >>> Version("1.2.3.dev1").is_devrelease
    +        True
    +        """
    +        return self.dev is not None
    +
    +    @property
    +    def major(self) -> int:
    +        """The first item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").major
    +        1
    +        """
    +        return self.release[0] if len(self.release) >= 1 else 0
    +
    +    @property
    +    def minor(self) -> int:
    +        """The second item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").minor
    +        2
    +        >>> Version("1").minor
    +        0
    +        """
    +        return self.release[1] if len(self.release) >= 2 else 0
    +
    +    @property
    +    def micro(self) -> int:
    +        """The third item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").micro
    +        3
    +        >>> Version("1").micro
    +        0
    +        """
    +        return self.release[2] if len(self.release) >= 3 else 0
    +
    +
    +class _TrimmedRelease(Version):
    +    @property
    +    def release(self) -> tuple[int, ...]:
    +        """
    +        Release segment without any trailing zeros.
    +
    +        >>> _TrimmedRelease('1.0.0').release
    +        (1,)
    +        >>> _TrimmedRelease('0.0').release
    +        (0,)
    +        """
    +        rel = super().release
    +        nonzeros = (index for index, val in enumerate(rel) if val)
    +        last_nonzero = max(nonzeros, default=0)
    +        return rel[: last_nonzero + 1]
    +
    +
    +def _parse_letter_version(
    +    letter: str | None, number: str | bytes | SupportsInt | None
    +) -> tuple[str, int] | None:
    +    if letter:
    +        # We consider there to be an implicit 0 in a pre-release if there is
    +        # not a numeral associated with it.
    +        if number is None:
    +            number = 0
    +
    +        # We normalize any letters to their lower case form
    +        letter = letter.lower()
    +
    +        # We consider some words to be alternate spellings of other words and
    +        # in those cases we want to normalize the spellings to our preferred
    +        # spelling.
    +        if letter == "alpha":
    +            letter = "a"
    +        elif letter == "beta":
    +            letter = "b"
    +        elif letter in ["c", "pre", "preview"]:
    +            letter = "rc"
    +        elif letter in ["rev", "r"]:
    +            letter = "post"
    +
    +        return letter, int(number)
    +
    +    assert not letter
    +    if number:
    +        # We assume if we are given a number, but we are not given a letter
    +        # then this is using the implicit post release syntax (e.g. 1.0-1)
    +        letter = "post"
    +
    +        return letter, int(number)
    +
    +    return None
    +
    +
    +_local_version_separators = re.compile(r"[\._-]")
    +
    +
    +def _parse_local_version(local: str | None) -> LocalType | None:
    +    """
    +    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    +    """
    +    if local is not None:
    +        return tuple(
    +            part.lower() if not part.isdigit() else int(part)
    +            for part in _local_version_separators.split(local)
    +        )
    +    return None
    +
    +
    +def _cmpkey(
    +    epoch: int,
    +    release: tuple[int, ...],
    +    pre: tuple[str, int] | None,
    +    post: tuple[str, int] | None,
    +    dev: tuple[str, int] | None,
    +    local: LocalType | None,
    +) -> CmpKey:
    +    # When we compare a release version, we want to compare it with all of the
    +    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    +    # leading zeros until we come to something non zero, then take the rest
    +    # re-reverse it back into the correct order and make it a tuple and use
    +    # that for our sorting key.
    +    _release = tuple(
    +        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
    +    )
    +
    +    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    +    # We'll do this by abusing the pre segment, but we _only_ want to do this
    +    # if there is not a pre or a post segment. If we have one of those then
    +    # the normal sorting rules will handle this case correctly.
    +    if pre is None and post is None and dev is not None:
    +        _pre: CmpPrePostDevType = NegativeInfinity
    +    # Versions without a pre-release (except as noted above) should sort after
    +    # those with one.
    +    elif pre is None:
    +        _pre = Infinity
    +    else:
    +        _pre = pre
    +
    +    # Versions without a post segment should sort before those with one.
    +    if post is None:
    +        _post: CmpPrePostDevType = NegativeInfinity
    +
    +    else:
    +        _post = post
    +
    +    # Versions without a development segment should sort after those with one.
    +    if dev is None:
    +        _dev: CmpPrePostDevType = Infinity
    +
    +    else:
    +        _dev = dev
    +
    +    if local is None:
    +        # Versions without a local segment should sort before those with one.
    +        _local: CmpLocalType = NegativeInfinity
    +    else:
    +        # Versions with a local segment need that segment parsed to implement
    +        # the sorting rules in PEP440.
    +        # - Alpha numeric segments sort before numeric segments
    +        # - Alpha numeric segments sort lexicographically
    +        # - Numeric segments sort numerically
    +        # - Shorter versions sort before longer versions when the prefixes
    +        #   match exactly
    +        _local = tuple(
    +            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
    +        )
    +
    +    return epoch, _release, _pre, _post, _dev, _local
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/AUTHORS.txt b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/AUTHORS.txt
    new file mode 100644
    index 0000000..8ccefbc
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/AUTHORS.txt
    @@ -0,0 +1,799 @@
    +@Switch01
    +A_Rog
    +Aakanksha Agrawal
    +Abhinav Sagar
    +ABHYUDAY PRATAP SINGH
    +abs51295
    +AceGentile
    +Adam Chainz
    +Adam Tse
    +Adam Wentz
    +admin
    +Adolfo Ochagavía
    +Adrien Morison
    +Agus
    +ahayrapetyan
    +Ahilya
    +AinsworthK
    +Akash Srivastava
    +Alan Yee
    +Albert Tugushev
    +Albert-Guan
    +albertg
    +Alberto Sottile
    +Aleks Bunin
    +Ales Erjavec
    +Alethea Flowers
    +Alex Gaynor
    +Alex Grönholm
    +Alex Hedges
    +Alex Loosley
    +Alex Morega
    +Alex Stachowiak
    +Alexander Shtyrov
    +Alexandre Conrad
    +Alexey Popravka
    +Aleš Erjavec
    +Alli
    +Ami Fischman
    +Ananya Maiti
    +Anatoly Techtonik
    +Anders Kaseorg
    +Andre Aguiar
    +Andreas Lutro
    +Andrei Geacar
    +Andrew Gaul
    +Andrew Shymanel
    +Andrey Bienkowski
    +Andrey Bulgakov
    +Andrés Delfino
    +Andy Freeland
    +Andy Kluger
    +Ani Hayrapetyan
    +Aniruddha Basak
    +Anish Tambe
    +Anrs Hu
    +Anthony Sottile
    +Antoine Musso
    +Anton Ovchinnikov
    +Anton Patrushev
    +Anton Zelenov
    +Antonio Alvarado Hernandez
    +Antony Lee
    +Antti Kaihola
    +Anubhav Patel
    +Anudit Nagar
    +Anuj Godase
    +AQNOUCH Mohammed
    +AraHaan
    +arena
    +arenasys
    +Arindam Choudhury
    +Armin Ronacher
    +Arnon Yaari
    +Artem
    +Arun Babu Neelicattu
    +Ashley Manton
    +Ashwin Ramaswami
    +atse
    +Atsushi Odagiri
    +Avinash Karhana
    +Avner Cohen
    +Awit (Ah-Wit) Ghirmai
    +Baptiste Mispelon
    +Barney Gale
    +barneygale
    +Bartek Ogryczak
    +Bastian Venthur
    +Ben Bodenmiller
    +Ben Darnell
    +Ben Hoyt
    +Ben Mares
    +Ben Rosser
    +Bence Nagy
    +Benjamin Peterson
    +Benjamin VanEvery
    +Benoit Pierre
    +Berker Peksag
    +Bernard
    +Bernard Tyers
    +Bernardo B. Marques
    +Bernhard M. Wiedemann
    +Bertil Hatt
    +Bhavam Vidyarthi
    +Blazej Michalik
    +Bogdan Opanchuk
    +BorisZZZ
    +Brad Erickson
    +Bradley Ayers
    +Branch Vincent
    +Brandon L. Reiss
    +Brandt Bucher
    +Brannon Dorsey
    +Brett Randall
    +Brett Rosen
    +Brian Cristante
    +Brian Rosner
    +briantracy
    +BrownTruck
    +Bruno Oliveira
    +Bruno Renié
    +Bruno S
    +Bstrdsmkr
    +Buck Golemon
    +burrows
    +Bussonnier Matthias
    +bwoodsend
    +c22
    +Caleb Martinez
    +Calvin Smith
    +Carl Meyer
    +Carlos Liam
    +Carol Willing
    +Carter Thayer
    +Cass
    +Chandrasekhar Atina
    +Charlie Marsh
    +Chih-Hsuan Yen
    +Chris Brinker
    +Chris Hunt
    +Chris Jerdonek
    +Chris Kuehl
    +Chris Markiewicz
    +Chris McDonough
    +Chris Pawley
    +Chris Pryer
    +Chris Wolfe
    +Christian Clauss
    +Christian Heimes
    +Christian Oudard
    +Christoph Reiter
    +Christopher Hunt
    +Christopher Snyder
    +chrysle
    +cjc7373
    +Clark Boylan
    +Claudio Jolowicz
    +Clay McClure
    +Cody
    +Cody Soyland
    +Colin Watson
    +Collin Anderson
    +Connor Osborn
    +Cooper Lees
    +Cooper Ry Lees
    +Cory Benfield
    +Cory Wright
    +Craig Kerstiens
    +Cristian Sorinel
    +Cristina
    +Cristina Muñoz
    +ctg123
    +Curtis Doty
    +cytolentino
    +Daan De Meyer
    +Dale
    +Damian
    +Damian Quiroga
    +Damian Shaw
    +Dan Black
    +Dan Savilonis
    +Dan Sully
    +Dane Hillard
    +daniel
    +Daniel Collins
    +Daniel Hahler
    +Daniel Holth
    +Daniel Jost
    +Daniel Katz
    +Daniel Shaulov
    +Daniele Esposti
    +Daniele Nicolodi
    +Daniele Procida
    +Daniil Konovalenko
    +Danny Hermes
    +Danny McClanahan
    +Darren Kavanagh
    +Dav Clark
    +Dave Abrahams
    +Dave Jones
    +David Aguilar
    +David Black
    +David Bordeynik
    +David Caro
    +David D Lowe
    +David Evans
    +David Hewitt
    +David Linke
    +David Poggi
    +David Poznik
    +David Pursehouse
    +David Runge
    +David Tucker
    +David Wales
    +Davidovich
    +ddelange
    +Deepak Sharma
    +Deepyaman Datta
    +Denise Yu
    +dependabot[bot]
    +derwolfe
    +Desetude
    +Devesh Kumar Singh
    +devsagul
    +Diego Caraballo
    +Diego Ramirez
    +DiegoCaraballo
    +Dimitri Merejkowsky
    +Dimitri Papadopoulos
    +Dimitri Papadopoulos Orfanos
    +Dirk Stolle
    +Dmitry Gladkov
    +Dmitry Volodin
    +Domen Kožar
    +Dominic Davis-Foster
    +Donald Stufft
    +Dongweiming
    +doron zarhi
    +Dos Moonen
    +Douglas Thor
    +DrFeathers
    +Dustin Ingram
    +Dustin Rodrigues
    +Dwayne Bailey
    +Ed Morley
    +Edgar Ramírez
    +Edgar Ramírez Mondragón
    +Ee Durbin
    +Efflam Lemaillet
    +efflamlemaillet
    +Eitan Adler
    +ekristina
    +elainechan
    +Eli Schwartz
    +Elisha Hollander
    +Ellen Marie Dash
    +Emil Burzo
    +Emil Styrke
    +Emmanuel Arias
    +Endoh Takanao
    +enoch
    +Erdinc Mutlu
    +Eric Cousineau
    +Eric Gillingham
    +Eric Hanchrow
    +Eric Hopper
    +Erik M. Bray
    +Erik Rose
    +Erwin Janssen
    +Eugene Vereshchagin
    +everdimension
    +Federico
    +Felipe Peter
    +Felix Yan
    +fiber-space
    +Filip Kokosiński
    +Filipe Laíns
    +Finn Womack
    +finnagin
    +Flavio Amurrio
    +Florian Briand
    +Florian Rathgeber
    +Francesco
    +Francesco Montesano
    +Fredrik Orderud
    +Frost Ming
    +Gabriel Curio
    +Gabriel de Perthuis
    +Garry Polley
    +gavin
    +gdanielson
    +Geoffrey Sneddon
    +George Song
    +Georgi Valkov
    +Georgy Pchelkin
    +ghost
    +Giftlin Rajaiah
    +gizmoguy1
    +gkdoc
    +Godefroid Chapelle
    +Gopinath M
    +GOTO Hayato
    +gousaiyang
    +gpiks
    +Greg Roodt
    +Greg Ward
    +Guilherme Espada
    +Guillaume Seguin
    +gutsytechster
    +Guy Rozendorn
    +Guy Tuval
    +gzpan123
    +Hanjun Kim
    +Hari Charan
    +Harsh Vardhan
    +harupy
    +Harutaka Kawamura
    +hauntsaninja
    +Henrich Hartzer
    +Henry Schreiner
    +Herbert Pfennig
    +Holly Stotelmyer
    +Honnix
    +Hsiaoming Yang
    +Hugo Lopes Tavares
    +Hugo van Kemenade
    +Hugues Bruant
    +Hynek Schlawack
    +Ian Bicking
    +Ian Cordasco
    +Ian Lee
    +Ian Stapleton Cordasco
    +Ian Wienand
    +Igor Kuzmitshov
    +Igor Sobreira
    +Ikko Ashimine
    +Ilan Schnell
    +Illia Volochii
    +Ilya Baryshev
    +Inada Naoki
    +Ionel Cristian Mărieș
    +Ionel Maries Cristian
    +Itamar Turner-Trauring
    +Ivan Pozdeev
    +J. Nick Koston
    +Jacob Kim
    +Jacob Walls
    +Jaime Sanz
    +jakirkham
    +Jakub Kuczys
    +Jakub Stasiak
    +Jakub Vysoky
    +Jakub Wilk
    +James Cleveland
    +James Curtin
    +James Firth
    +James Gerity
    +James Polley
    +Jan Pokorný
    +Jannis Leidel
    +Jarek Potiuk
    +jarondl
    +Jason Curtis
    +Jason R. Coombs
    +JasonMo
    +JasonMo1
    +Jay Graves
    +Jean Abou Samra
    +Jean-Christophe Fillion-Robin
    +Jeff Barber
    +Jeff Dairiki
    +Jeff Widman
    +Jelmer Vernooij
    +jenix21
    +Jeremy Fleischman
    +Jeremy Stanley
    +Jeremy Zafran
    +Jesse Rittner
    +Jiashuo Li
    +Jim Fisher
    +Jim Garrison
    +Jinzhe Zeng
    +Jiun Bae
    +Jivan Amara
    +Joe Bylund
    +Joe Michelini
    +John Paton
    +John Sirois
    +John T. Wodder II
    +John-Scott Atlakson
    +johnthagen
    +Jon Banafato
    +Jon Dufresne
    +Jon Parise
    +Jonas Nockert
    +Jonathan Herbert
    +Joonatan Partanen
    +Joost Molenaar
    +Jorge Niedbalski
    +Joseph Bylund
    +Joseph Long
    +Josh Bronson
    +Josh Cannon
    +Josh Hansen
    +Josh Schneier
    +Joshua
    +Juan Luis Cano Rodríguez
    +Juanjo Bazán
    +Judah Rand
    +Julian Berman
    +Julian Gethmann
    +Julien Demoor
    +Jussi Kukkonen
    +jwg4
    +Jyrki Pulliainen
    +Kai Chen
    +Kai Mueller
    +Kamal Bin Mustafa
    +kasium
    +kaustav haldar
    +keanemind
    +Keith Maxwell
    +Kelsey Hightower
    +Kenneth Belitzky
    +Kenneth Reitz
    +Kevin Burke
    +Kevin Carter
    +Kevin Frommelt
    +Kevin R Patterson
    +Kexuan Sun
    +Kit Randel
    +Klaas van Schelven
    +KOLANICH
    +konstin
    +kpinc
    +Krishna Oza
    +Kumar McMillan
    +Kuntal Majumder
    +Kurt McKee
    +Kyle Persohn
    +lakshmanaram
    +Laszlo Kiss-Kollar
    +Laurent Bristiel
    +Laurent LAPORTE
    +Laurie O
    +Laurie Opperman
    +layday
    +Leon Sasson
    +Lev Givon
    +Lincoln de Sousa
    +Lipis
    +lorddavidiii
    +Loren Carvalho
    +Lucas Cimon
    +Ludovic Gasc
    +Luis Medel
    +Lukas Geiger
    +Lukas Juhrich
    +Luke Macken
    +Luo Jiebin
    +luojiebin
    +luz.paz
    +László Kiss Kollár
    +M00nL1ght
    +Marc Abramowitz
    +Marc Tamlyn
    +Marcus Smith
    +Mariatta
    +Mark Kohler
    +Mark McLoughlin
    +Mark Williams
    +Markus Hametner
    +Martey Dodoo
    +Martin Fischer
    +Martin Häcker
    +Martin Pavlasek
    +Masaki
    +Masklinn
    +Matej Stuchlik
    +Mathew Jennings
    +Mathieu Bridon
    +Mathieu Kniewallner
    +Matt Bacchi
    +Matt Good
    +Matt Maker
    +Matt Robenolt
    +Matt Wozniski
    +matthew
    +Matthew Einhorn
    +Matthew Feickert
    +Matthew Gilliard
    +Matthew Hughes
    +Matthew Iversen
    +Matthew Treinish
    +Matthew Trumbell
    +Matthew Willson
    +Matthias Bussonnier
    +mattip
    +Maurits van Rees
    +Max W Chase
    +Maxim Kurnikov
    +Maxime Rouyrre
    +mayeut
    +mbaluna
    +mdebi
    +memoselyk
    +meowmeowcat
    +Michael
    +Michael Aquilina
    +Michael E. Karpeles
    +Michael Klich
    +Michael Mintz
    +Michael Williamson
    +michaelpacer
    +Michał Górny
    +Mickaël Schoentgen
    +Miguel Araujo Perez
    +Mihir Singh
    +Mike
    +Mike Hendricks
    +Min RK
    +MinRK
    +Miro Hrončok
    +Monica Baluna
    +montefra
    +Monty Taylor
    +morotti
    +mrKazzila
    +Muha Ajjan
    +Nadav Wexler
    +Nahuel Ambrosini
    +Nate Coraor
    +Nate Prewitt
    +Nathan Houghton
    +Nathaniel J. Smith
    +Nehal J Wani
    +Neil Botelho
    +Nguyễn Gia Phong
    +Nicholas Serra
    +Nick Coghlan
    +Nick Stenning
    +Nick Timkovich
    +Nicolas Bock
    +Nicole Harris
    +Nikhil Benesch
    +Nikhil Ladha
    +Nikita Chepanov
    +Nikolay Korolev
    +Nipunn Koorapati
    +Nitesh Sharma
    +Niyas Sait
    +Noah
    +Noah Gorny
    +Nowell Strite
    +NtaleGrey
    +nvdv
    +OBITORASU
    +Ofek Lev
    +ofrinevo
    +Oliver Freund
    +Oliver Jeeves
    +Oliver Mannion
    +Oliver Tonnhofer
    +Olivier Girardot
    +Olivier Grisel
    +Ollie Rutherfurd
    +OMOTO Kenji
    +Omry Yadan
    +onlinejudge95
    +Oren Held
    +Oscar Benjamin
    +Oz N Tiram
    +Pachwenko
    +Patrick Dubroy
    +Patrick Jenkins
    +Patrick Lawson
    +patricktokeeffe
    +Patrik Kopkan
    +Paul Ganssle
    +Paul Kehrer
    +Paul Moore
    +Paul Nasrat
    +Paul Oswald
    +Paul van der Linden
    +Paulus Schoutsen
    +Pavel Safronov
    +Pavithra Eswaramoorthy
    +Pawel Jasinski
    +Paweł Szramowski
    +Pekka Klärck
    +Peter Gessler
    +Peter Lisák
    +Peter Shen
    +Peter Waller
    +Petr Viktorin
    +petr-tik
    +Phaneendra Chiruvella
    +Phil Elson
    +Phil Freo
    +Phil Pennock
    +Phil Whelan
    +Philip Jägenstedt
    +Philip Molloy
    +Philippe Ombredanne
    +Pi Delport
    +Pierre-Yves Rofes
    +Pieter Degroote
    +pip
    +Prabakaran Kumaresshan
    +Prabhjyotsing Surjit Singh Sodhi
    +Prabhu Marappan
    +Pradyun Gedam
    +Prashant Sharma
    +Pratik Mallya
    +pre-commit-ci[bot]
    +Preet Thakkar
    +Preston Holmes
    +Przemek Wrzos
    +Pulkit Goyal
    +q0w
    +Qiangning Hong
    +Qiming Xu
    +Quentin Lee
    +Quentin Pradet
    +R. David Murray
    +Rafael Caricio
    +Ralf Schmitt
    +Ran Benita
    +Razzi Abuissa
    +rdb
    +Reece Dunham
    +Remi Rampin
    +Rene Dudfield
    +Riccardo Magliocchetti
    +Riccardo Schirone
    +Richard Jones
    +Richard Si
    +Ricky Ng-Adam
    +Rishi
    +rmorotti
    +RobberPhex
    +Robert Collins
    +Robert McGibbon
    +Robert Pollak
    +Robert T. McGibbon
    +robin elisha robinson
    +Roey Berman
    +Rohan Jain
    +Roman Bogorodskiy
    +Roman Donchenko
    +Romuald Brunet
    +ronaudinho
    +Ronny Pfannschmidt
    +Rory McCann
    +Ross Brattain
    +Roy Wellington Ⅳ
    +Ruairidh MacLeod
    +Russell Keith-Magee
    +Ryan Shepherd
    +Ryan Wooden
    +ryneeverett
    +S. Guliaev
    +Sachi King
    +Salvatore Rinchiera
    +sandeepkiran-js
    +Sander Van Balen
    +Savio Jomton
    +schlamar
    +Scott Kitterman
    +Sean
    +seanj
    +Sebastian Jordan
    +Sebastian Schaetz
    +Segev Finer
    +SeongSoo Cho
    +Sergey Vasilyev
    +Seth Michael Larson
    +Seth Woodworth
    +Shahar Epstein
    +Shantanu
    +shenxianpeng
    +shireenrao
    +Shivansh-007
    +Shixian Sheng
    +Shlomi Fish
    +Shovan Maity
    +Simeon Visser
    +Simon Cross
    +Simon Pichugin
    +sinoroc
    +sinscary
    +snook92
    +socketubs
    +Sorin Sbarnea
    +Srinivas Nyayapati
    +Srishti Hegde
    +Stavros Korokithakis
    +Stefan Scherfke
    +Stefano Rivera
    +Stephan Erb
    +Stephen Rosen
    +stepshal
    +Steve (Gadget) Barnes
    +Steve Barnes
    +Steve Dower
    +Steve Kowalik
    +Steven Myint
    +Steven Silvester
    +stonebig
    +studioj
    +Stéphane Bidoul
    +Stéphane Bidoul (ACSONE)
    +Stéphane Klein
    +Sumana Harihareswara
    +Surbhi Sharma
    +Sviatoslav Sydorenko
    +Sviatoslav Sydorenko (Святослав Сидоренко)
    +Swat009
    +Sylvain
    +Takayuki SHIMIZUKAWA
    +Taneli Hukkinen
    +tbeswick
    +Thiago
    +Thijs Triemstra
    +Thomas Fenzl
    +Thomas Grainger
    +Thomas Guettler
    +Thomas Johansson
    +Thomas Kluyver
    +Thomas Smith
    +Thomas VINCENT
    +Tim D. Smith
    +Tim Gates
    +Tim Harder
    +Tim Heap
    +tim smith
    +tinruufu
    +Tobias Hermann
    +Tom Forbes
    +Tom Freudenheim
    +Tom V
    +Tomas Hrnciar
    +Tomas Orsava
    +Tomer Chachamu
    +Tommi Enenkel | AnB
    +Tomáš Hrnčiar
    +Tony Beswick
    +Tony Narlock
    +Tony Zhaocheng Tan
    +TonyBeswick
    +toonarmycaptain
    +Toshio Kuratomi
    +toxinu
    +Travis Swicegood
    +Tushar Sadhwani
    +Tzu-ping Chung
    +Valentin Haenel
    +Victor Stinner
    +victorvpaulo
    +Vikram - Google
    +Viktor Szépe
    +Ville Skyttä
    +Vinay Sajip
    +Vincent Philippon
    +Vinicyus Macedo
    +Vipul Kumar
    +Vitaly Babiy
    +Vladimir Fokow
    +Vladimir Rutsky
    +W. Trevor King
    +Wil Tan
    +Wilfred Hughes
    +William Edwards
    +William ML Leslie
    +William T Olson
    +William Woodruff
    +Wilson Mo
    +wim glenn
    +Winson Luk
    +Wolfgang Maier
    +Wu Zhenyu
    +XAMES3
    +Xavier Fernandez
    +Xianpeng Shen
    +xoviat
    +xtreak
    +YAMAMOTO Takashi
    +Yen Chi Hsuan
    +Yeray Diaz Diaz
    +Yoval P
    +Yu Jian
    +Yuan Jing Vincent Yan
    +Yusuke Hayashi
    +Zearin
    +Zhiping Deng
    +ziebam
    +Zvezdan Petkovic
    +Łukasz Langa
    +Роман Донченко
    +Семён Марьясин
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/INSTALLER b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/INSTALLER
    new file mode 100644
    index 0000000..a1b589e
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/INSTALLER
    @@ -0,0 +1 @@
    +pip
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/LICENSE.txt b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/LICENSE.txt
    new file mode 100644
    index 0000000..8e7b65e
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/LICENSE.txt
    @@ -0,0 +1,20 @@
    +Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
    +
    +Permission is hereby granted, free of charge, to any person obtaining
    +a copy of this software and associated documentation files (the
    +"Software"), to deal in the Software without restriction, including
    +without limitation the rights to use, copy, modify, merge, publish,
    +distribute, sublicense, and/or sell copies of the Software, and to
    +permit persons to whom the Software is furnished to do so, subject to
    +the following conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/METADATA b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/METADATA
    new file mode 100644
    index 0000000..9e5aa3a
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/METADATA
    @@ -0,0 +1,90 @@
    +Metadata-Version: 2.1
    +Name: pip
    +Version: 24.3.1
    +Summary: The PyPA recommended tool for installing Python packages.
    +Author-email: The pip developers 
    +License: MIT
    +Project-URL: Homepage, https://pip.pypa.io/
    +Project-URL: Documentation, https://pip.pypa.io
    +Project-URL: Source, https://github.com/pypa/pip
    +Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
    +Classifier: Development Status :: 5 - Production/Stable
    +Classifier: Intended Audience :: Developers
    +Classifier: License :: OSI Approved :: MIT License
    +Classifier: Topic :: Software Development :: Build Tools
    +Classifier: Programming Language :: Python
    +Classifier: Programming Language :: Python :: 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 :: Implementation :: CPython
    +Classifier: Programming Language :: Python :: Implementation :: PyPy
    +Requires-Python: >=3.8
    +Description-Content-Type: text/x-rst
    +License-File: LICENSE.txt
    +License-File: AUTHORS.txt
    +
    +pip - The Python Package Installer
    +==================================
    +
    +.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
    +   :target: https://pypi.org/project/pip/
    +   :alt: PyPI
    +
    +.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
    +   :target: https://pypi.org/project/pip
    +   :alt: PyPI - Python Version
    +
    +.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
    +   :target: https://pip.pypa.io/en/latest
    +   :alt: Documentation
    +
    +|pypi-version| |python-versions| |docs-badge|
    +
    +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
    +
    +Please take a look at our documentation for how to install and use pip:
    +
    +* `Installation`_
    +* `Usage`_
    +
    +We release updates regularly, with a new version every 3 months. Find more details in our documentation:
    +
    +* `Release notes`_
    +* `Release process`_
    +
    +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
    +
    +* `Issue tracking`_
    +* `Discourse channel`_
    +* `User IRC`_
    +
    +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
    +
    +* `GitHub page`_
    +* `Development documentation`_
    +* `Development IRC`_
    +
    +Code of Conduct
    +---------------
    +
    +Everyone interacting in the pip project's codebases, issue trackers, chat
    +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
    +
    +.. _package installer: https://packaging.python.org/guides/tool-recommendations/
    +.. _Python Package Index: https://pypi.org
    +.. _Installation: https://pip.pypa.io/en/stable/installation/
    +.. _Usage: https://pip.pypa.io/en/stable/
    +.. _Release notes: https://pip.pypa.io/en/stable/news.html
    +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
    +.. _GitHub page: https://github.com/pypa/pip
    +.. _Development documentation: https://pip.pypa.io/en/latest/development
    +.. _Issue tracking: https://github.com/pypa/pip/issues
    +.. _Discourse channel: https://discuss.python.org/c/packaging
    +.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
    +.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
    +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/RECORD b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/RECORD
    new file mode 100644
    index 0000000..49c08a1
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/RECORD
    @@ -0,0 +1,853 @@
    +../../../bin/pip,sha256=RaLZny-XHuA0__1DxXUQAJfahDTKfgr7WCQ4ytVARZI,268
    +../../../bin/pip3,sha256=RaLZny-XHuA0__1DxXUQAJfahDTKfgr7WCQ4ytVARZI,268
    +../../../bin/pip3.12,sha256=RaLZny-XHuA0__1DxXUQAJfahDTKfgr7WCQ4ytVARZI,268
    +pip-24.3.1.dist-info/AUTHORS.txt,sha256=Cbb630k8EL9FkBzX9Vpi6hpYWrLSlh08eXodL5u0eLI,10925
    +pip-24.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
    +pip-24.3.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
    +pip-24.3.1.dist-info/METADATA,sha256=V8iCNK1GYbC82PWsLMsASDh9AO4veocRlM4Pn9q2KFI,3677
    +pip-24.3.1.dist-info/RECORD,,
    +pip-24.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip-24.3.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
    +pip-24.3.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
    +pip-24.3.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
    +pip/__init__.py,sha256=faXY_neeYrA_88plEhkyhwAaYeds7wu5U1iGwP24J0s,357
    +pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
    +pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450
    +pip/__pycache__/__init__.cpython-312.pyc,,
    +pip/__pycache__/__main__.cpython-312.pyc,,
    +pip/__pycache__/__pip-runner__.cpython-312.pyc,,
    +pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
    +pip/_internal/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/__pycache__/build_env.cpython-312.pyc,,
    +pip/_internal/__pycache__/cache.cpython-312.pyc,,
    +pip/_internal/__pycache__/configuration.cpython-312.pyc,,
    +pip/_internal/__pycache__/exceptions.cpython-312.pyc,,
    +pip/_internal/__pycache__/main.cpython-312.pyc,,
    +pip/_internal/__pycache__/pyproject.cpython-312.pyc,,
    +pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,,
    +pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,,
    +pip/_internal/build_env.py,sha256=wsTPOWyPTKvUREUcO585OU01kbQufpdigY8fVHv3WIw,10584
    +pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369
    +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
    +pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/index_command.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/main.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/parser.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,,
    +pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,,
    +pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMyS5TVrs,6865
    +pip/_internal/cli/base_command.py,sha256=F8nUcSM-Y-MQljJUe724-yxmc5viFXHyM_zH70NmIh4,8289
    +pip/_internal/cli/cmdoptions.py,sha256=mDqBr0d0hoztbRJs-PWtcKpqNAc7khU6ZpoesZKocT8,30110
    +pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
    +pip/_internal/cli/index_command.py,sha256=-0oPTruZGkLSMrWDleZ6UtcKP3G-SImRRuhH0RfVE3o,5631
    +pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817
    +pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
    +pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
    +pip/_internal/cli/progress_bars.py,sha256=VgydyqjZvfhqpuNcFDn00QNuA9GxRe9CKrRG8jhPuKU,2723
    +pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250
    +pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
    +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
    +pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
    +pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/cache.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/check.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/completion.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/debug.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/download.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/hash.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/help.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/index.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/install.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/list.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/search.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/show.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,,
    +pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944
    +pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
    +pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
    +pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
    +pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
    +pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
    +pip/_internal/commands/freeze.py,sha256=2Vt72BYTSm9rzue6d8dNzt8idxWK4Db6Hd-anq7GQ80,3203
    +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
    +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
    +pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731
    +pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
    +pip/_internal/commands/install.py,sha256=iqesiLIZc6Op9uihMQFYRhAA2DQRZUxbM4z1BwXoFls,29428
    +pip/_internal/commands/list.py,sha256=oiIzSjLP6__d7dIS3q0Xb5ywsaOThBWRqMyjjKzkPdM,12769
    +pip/_internal/commands/search.py,sha256=fWkUQVx_gm8ebbFAlCgqtxKXT9rNahpJ-BI__3HNZpg,5626
    +pip/_internal/commands/show.py,sha256=IG9L5uo8w6UA4tI_IlmaxLCoNKPa5JNJCljj3NWs0OE,7507
    +pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
    +pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414
    +pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006
    +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
    +pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/distributions/__pycache__/base.cpython-312.pyc,,
    +pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,,
    +pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,,
    +pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
    +pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
    +pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
    +pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
    +pip/_internal/exceptions.py,sha256=2_byISIv3kSnI_9T-Esfxrt0LnTRgcUHyxu0twsHjQY,26481
    +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
    +pip/_internal/index/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/index/__pycache__/collector.cpython-312.pyc,,
    +pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,,
    +pip/_internal/index/__pycache__/sources.cpython-312.pyc,,
    +pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
    +pip/_internal/index/package_finder.py,sha256=yRC4xsyudwKnNoU6IXvNoyqYo5ScT7lB6Wa-z2eh7cs,37666
    +pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
    +pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925
    +pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,,
    +pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,,
    +pip/_internal/locations/__pycache__/base.cpython-312.pyc,,
    +pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
    +pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
    +pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
    +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
    +pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339
    +pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,,
    +pip/_internal/metadata/__pycache__/base.cpython-312.pyc,,
    +pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,,
    +pip/_internal/metadata/_json.py,sha256=P0cAJrH_mtmMZvlZ16ZXm_-izA4lpr5wy08laICuiaA,2644
    +pip/_internal/metadata/base.py,sha256=ft0K5XNgI4ETqZnRv2-CtvgYiMOMAeGMAzxT-f6VLJA,25298
    +pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
    +pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,,
    +pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,,
    +pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,,
    +pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
    +pip/_internal/metadata/importlib/_dists.py,sha256=anh0mLI-FYRPUhAdipd0Va3YJJc6HelCKQ0bFhY10a0,8017
    +pip/_internal/metadata/importlib/_envs.py,sha256=UUB980XSrDWrMpQ1_G45i0r8Hqlg_tg3IPQ63mEqbNc,7431
    +pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
    +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
    +pip/_internal/models/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/candidate.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/format_control.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/index.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/link.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/scheme.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/target_python.cpython-312.pyc,,
    +pip/_internal/models/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
    +pip/_internal/models/direct_url.py,sha256=uBtY2HHd3TO9cKQJWh0ThvE5FRr-MWRYChRU4IG9HZE,6578
    +pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
    +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
    +pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
    +pip/_internal/models/link.py,sha256=jHax9O-9zlSzEwjBCDkx0OXjKXwBDwOuPwn-PsR8dCs,21034
    +pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
    +pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
    +pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
    +pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
    +pip/_internal/models/wheel.py,sha256=G7dND_s4ebPkEL7RJ1qCY0QhUUWIIK6AnjWgRATF5no,4539
    +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
    +pip/_internal/network/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/auth.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/cache.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/download.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/session.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/utils.cpython-312.pyc,,
    +pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,,
    +pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
    +pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
    +pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048
    +pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
    +pip/_internal/network/session.py,sha256=XmanBKjVwPFmh1iJ58q6TDh9xabH37gREuQJ_feuZGA,18741
    +pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
    +pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
    +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/operations/__pycache__/check.cpython-312.pyc,,
    +pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,,
    +pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,,
    +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,,
    +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,,
    +pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
    +pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
    +pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
    +pip/_internal/operations/build/metadata_legacy.py,sha256=8i6i1QZX9m_lKPStEFsHKM0MT4a-CD408JOw99daLmo,2190
    +pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
    +pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
    +pip/_internal/operations/build/wheel_legacy.py,sha256=K-6kNhmj-1xDF45ny1yheMerF0ui4EoQCLzEoHh6-tc,3045
    +pip/_internal/operations/check.py,sha256=L24vRL8VWbyywdoeAhM89WCd8zLTnjIbULlKelUgIec,5912
    +pip/_internal/operations/freeze.py,sha256=V59yEyCSz_YhZuhH09-6aV_zvYBMrS_IxFFNqn2QzlA,9864
    +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
    +pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,,
    +pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/operations/install/editable_legacy.py,sha256=PoEsNEPGbIZ2yQphPsmYTKLOCMs4gv5OcCdzW124NcA,1283
    +pip/_internal/operations/install/wheel.py,sha256=X5Iz9yUg5LlK5VNQ9g2ikc6dcRu8EPi_SUi5iuEDRgo,27615
    +pip/_internal/operations/prepare.py,sha256=joWJwPkuqGscQgVNImLK71e9hRapwKvRCM8HclysmvU,28118
    +pip/_internal/pyproject.py,sha256=rw4fwlptDp1hZgYoplwbAGwWA32sWQkp7ysf8Ju6iXc,7287
    +pip/_internal/req/__init__.py,sha256=HxBFtZy_BbCclLgr26waMtpzYdO5T3vxePvpGAXSt5s,2653
    +pip/_internal/req/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/req/__pycache__/constructors.cpython-312.pyc,,
    +pip/_internal/req/__pycache__/req_file.cpython-312.pyc,,
    +pip/_internal/req/__pycache__/req_install.cpython-312.pyc,,
    +pip/_internal/req/__pycache__/req_set.cpython-312.pyc,,
    +pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,,
    +pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
    +pip/_internal/req/req_file.py,sha256=gOOJTzL-mDRPcQhjwqjDrjn4V-3rK9TnEFnU3v8RA4Q,18752
    +pip/_internal/req/req_install.py,sha256=yhT98NGDoAEk03jznTJnYCznzhiMEEA2ocgsUG_dcNU,35788
    +pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
    +pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853
    +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/resolution/__pycache__/base.cpython-312.pyc,,
    +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
    +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,,
    +pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
    +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,,
    +pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
    +pip/_internal/resolution/resolvelib/candidates.py,sha256=5UZ1upNnmqsP-nmEZaDYxaBgCoejw_e2WVGmmAvBxXc,20001
    +pip/_internal/resolution/resolvelib/factory.py,sha256=511CaUR41LqjALuFafLVfx15WRvMhxYTdjQCoSvp4gw,32661
    +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383
    +pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935
    +pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168
    +pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
    +pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
    +pip/_internal/self_outdated_check.py,sha256=pkjQixuWyQ1vrVxZAaYD6SSHgXuFUnHZybXEWTkh0S0,8145
    +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/_log.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/compat.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/logging.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/misc.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/retry.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/urls.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,,
    +pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,,
    +pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
    +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
    +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
    +pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
    +pip/_internal/utils/compatibility_tags.py,sha256=OWq5axHpW-MEEPztGdvgADrgJPAcV9a88Rxm4Z8VBs8,6272
    +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
    +pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
    +pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
    +pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
    +pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
    +pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
    +pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
    +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
    +pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
    +pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
    +pip/_internal/utils/logging.py,sha256=7BFKB1uFjdxD5crM-GtwA5T2qjbQ2LPD-gJDuJeDNTg,11606
    +pip/_internal/utils/misc.py,sha256=NRV0_2fFhzy1jhvInSBv4dqCmTwct8PV7Kp0m-BPRGM,23530
    +pip/_internal/utils/packaging.py,sha256=iI3LH43lVNR4hWBOqF6lFsZq4aycb2j0UcHlmDmcqUg,2109
    +pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
    +pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
    +pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
    +pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
    +pip/_internal/utils/unpacking.py,sha256=eyDkSsk4nW8ZfiSjNzJduCznpHyaGHVv3ak_LMGsiEM,11951
    +pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
    +pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
    +pip/_internal/utils/wheel.py,sha256=b442jkydFHjXzDy6cMR7MpzWBJ1Q82hR5F33cmcHV3g,4494
    +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
    +pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,,
    +pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,,
    +pip/_internal/vcs/__pycache__/git.cpython-312.pyc,,
    +pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,,
    +pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,,
    +pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,,
    +pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
    +pip/_internal/vcs/git.py,sha256=3tpc9LQA_J4IVW5r5NvWaaSeDzcmJOrSFZN0J8vIKfU,18177
    +pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
    +pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
    +pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
    +pip/_internal/wheel_builder.py,sha256=DL3A8LKeRj_ACp11WS5wSgASgPFqeyAeXJKdXfmaWXU,11799
    +pip/_vendor/__init__.py,sha256=JYuAXvClhInxIrA2FTp5p-uuWVL7WV6-vEpTs46-Qh4,4873
    +pip/_vendor/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__init__.py,sha256=GiYoagwPEiJ_xR_lbwWGaoCiPtF_rz4isjfjdDAgHU4,676
    +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
    +pip/_vendor/cachecontrol/adapter.py,sha256=fByO_Pd_EOemjWbuocvBWdN85xT0q_TBm2lxS6vD4fk,6355
    +pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952
    +pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
    +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,,
    +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=9AlmmTJc6cslb6k5z_6q0sGPHVrMj8zv-uWy-simmfE,5406
    +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
    +pip/_vendor/cachecontrol/controller.py,sha256=o-ejGJlBmpKK8QQLyTPJj0t7siU8XVHXuV8MCybCxQ8,18575
    +pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292
    +pip/_vendor/cachecontrol/heuristics.py,sha256=IYe4QmHERWsMvtxNrp920WeaIsaTTyqLB14DSheSbtY,4834
    +pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
    +pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
    +pip/_vendor/certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94
    +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
    +pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,,
    +pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,,
    +pip/_vendor/certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427
    +pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
    +pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
    +pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,,
    +pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,,
    +pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
    +pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
    +pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
    +pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
    +pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
    +pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
    +pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
    +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
    +pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
    +pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
    +pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
    +pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
    +pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
    +pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
    +pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
    +pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
    +pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
    +pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
    +pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
    +pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
    +pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,,
    +pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,,
    +pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
    +pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
    +pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/core.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,,
    +pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,,
    +pip/_vendor/idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426
    +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
    +pip/_vendor/idna/core.py,sha256=lyhpoe2vulEaB_65xhXmoKgO-xUqFDvcwxu5hpNNO4E,12663
    +pip/_vendor/idna/idnadata.py,sha256=dqRwytzkjIHMBa2R1lYvHDwACenZPt8eGVu1Y8UBE-E,78320
    +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
    +pip/_vendor/idna/package_data.py,sha256=Tkt0KnIeyIlnHddOaz9WSkkislNgokJAuE-p5GorMqo,21
    +pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503
    +pip/_vendor/msgpack/__init__.py,sha256=gsMP7JTECZNUSjvOyIbdhNOkpB9Z8BcGwabVGY2UcdQ,1077
    +pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,,
    +pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,,
    +pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,,
    +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
    +pip/_vendor/msgpack/ext.py,sha256=fKp00BqDLjUtZnPd70Llr138zk8JsCuSpJkkZ5S4dt8,5629
    +pip/_vendor/msgpack/fallback.py,sha256=wdUWJkWX2gzfRW9BBCTOuIE1Wvrf5PtBtR8ZtY7G_EE,33175
    +pip/_vendor/packaging/__init__.py,sha256=dtw2bNmWCQ9WnMoK3bk_elL1svSlikXtLpZhCFIB9SE,496
    +pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,,
    +pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,,
    +pip/_vendor/packaging/_elffile.py,sha256=_LcJW4YNKywYsl4169B2ukKRqwxjxst_8H0FRVQKlz8,3282
    +pip/_vendor/packaging/_manylinux.py,sha256=Xo4V0PZz8sbuVCbTni0t1CR0AHeir_7ib4lTmV8scD4,9586
    +pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
    +pip/_vendor/packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236
    +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
    +pip/_vendor/packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273
    +pip/_vendor/packaging/markers.py,sha256=dWKSqn5Sp-jDmOG-W3GfLHKjwhf1IsznbT71VlBoB5M,10671
    +pip/_vendor/packaging/metadata.py,sha256=KINuSkJ12u-SyoKNTy_pHNGAfMUtxNvZ53qA1zAKcKI,32349
    +pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
    +pip/_vendor/packaging/specifiers.py,sha256=HfGgfNJRvrzC759gnnoojHyiWs_DYmcw5PEh5jHH-YE,39738
    +pip/_vendor/packaging/tags.py,sha256=Fo6_cit95-7QfcMb16XtI7AUiSMgdwA_hCO_9lV2pz4,21388
    +pip/_vendor/packaging/utils.py,sha256=NAdYUwnlAOpkat_RthavX8a07YuVxgGL_vwrx73GSDM,5287
    +pip/_vendor/packaging/version.py,sha256=wE4sSVlF-d1H6HFC1vszEe35CwTig_fh4HHIFg95hFE,16210
    +pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
    +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__init__.py,sha256=FTA6LGNm40GwNZt3gG3uLAacWvf2E_2HTmH0rAALGR8,22285
    +pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
    +pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,,
    +pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,,
    +pip/_vendor/platformdirs/android.py,sha256=xZXY9Jd46WOsxT2U6-5HsNtDZ-IQqxcEUrBLl3hYk4o,9016
    +pip/_vendor/platformdirs/api.py,sha256=QBYdUac2eC521ek_y53uD1Dcq-lJX8IgSRVd4InC6uc,8996
    +pip/_vendor/platformdirs/macos.py,sha256=wftsbsvq6nZ0WORXSiCrZNkRHz_WKuktl0a6mC7MFkI,5580
    +pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/platformdirs/unix.py,sha256=Cci9Wqt35dAMsg6HT9nRGHSBW5obb0pR3AE1JJnsCXg,10643
    +pip/_vendor/platformdirs/version.py,sha256=r7F76tZRjgQKzrpx_I0_ZMQOMU-PS7eGnHD7zEK3KB0,411
    +pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
    +pip/_vendor/pygments/__init__.py,sha256=7N1oiaWulw_nCsTY4EEixYLz15pWY5u4uPAFFi-ielU,2983
    +pip/_vendor/pygments/__main__.py,sha256=isIhBxLg65nLlXukG4VkMuPfNdd7gFzTZ_R_z3Q8diY,353
    +pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,,
    +pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,,
    +pip/_vendor/pygments/cmdline.py,sha256=LIVzmAunlk9sRJJp54O4KRy9GDIN4Wu13v9p9QzfGPM,23656
    +pip/_vendor/pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718
    +pip/_vendor/pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910
    +pip/_vendor/pygments/filters/__init__.py,sha256=RdedK2KWKXlKwR7cvkfr3NUj9YiZQgMgilRMFUg2jPA,40392
    +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pygments/formatter.py,sha256=jDWBTndlBH2Z5IYZFVDnP0qn1CaTQjTWt7iAGtCnJEg,4390
    +pip/_vendor/pygments/formatters/__init__.py,sha256=8No-NUs8rBTSSBJIv4hSEQt2M0cFB4hwAT0snVc2QGE,5385
    +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,,
    +pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
    +pip/_vendor/pygments/formatters/bbcode.py,sha256=3JQLI45tcrQ_kRUMjuab6C7Hb0XUsbVWqqbSn9cMjkI,3320
    +pip/_vendor/pygments/formatters/groff.py,sha256=M39k0PaSSZRnxWjqBSVPkF0mu1-Vr7bm6RsFvs-CNN4,5106
    +pip/_vendor/pygments/formatters/html.py,sha256=SE2jc3YCqbMS3rZW9EAmDlAUhdVxJ52gA4dileEvCGU,35669
    +pip/_vendor/pygments/formatters/img.py,sha256=MwA4xWPLOwh6j7Yc6oHzjuqSPt0M1fh5r-5BTIIUfsU,23287
    +pip/_vendor/pygments/formatters/irc.py,sha256=dp1Z0l_ObJ5NFh9MhqLGg5ptG5hgJqedT2Vkutt9v0M,4981
    +pip/_vendor/pygments/formatters/latex.py,sha256=XMmhOCqUKDBQtG5mGJNAFYxApqaC5puo5cMmPfK3944,19306
    +pip/_vendor/pygments/formatters/other.py,sha256=56PMJOliin-rAUdnRM0i1wsV1GdUPd_dvQq0_UPfF9c,5034
    +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=y16U00aVYYEFpeCfGXlYBSMacG425CbfoG8oKbKegIg,2218
    +pip/_vendor/pygments/formatters/rtf.py,sha256=ZT90dmcKyJboIB0mArhL7IhE467GXRN0G7QAUgG03To,11957
    +pip/_vendor/pygments/formatters/svg.py,sha256=KKsiophPupHuxm0So-MsbQEWOT54IAiSF7hZPmxtKXE,7174
    +pip/_vendor/pygments/formatters/terminal.py,sha256=AojNG4MlKq2L6IsC_VnXHu4AbHCBn9Otog6u45XvxeI,4674
    +pip/_vendor/pygments/formatters/terminal256.py,sha256=kGkNUVo3FpwjytIDS0if79EuUoroAprcWt3igrcIqT0,11753
    +pip/_vendor/pygments/lexer.py,sha256=TYHDt___gNW4axTl2zvPZff-VQi8fPaIh5OKRcVSjUM,35349
    +pip/_vendor/pygments/lexers/__init__.py,sha256=pIlxyQJuu_syh9lE080cq8ceVbEVcKp0osAFU5fawJU,12115
    +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,,
    +pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,,
    +pip/_vendor/pygments/lexers/_mapping.py,sha256=61-h3zr103m01OS5BUq_AfUiL9YI06Ves9ipQ7k4vr4,76097
    +pip/_vendor/pygments/lexers/python.py,sha256=2J_YJrPTr_A6fJY_qKiKv0GpgPwHMrlMSeo59qN3fe4,53687
    +pip/_vendor/pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005
    +pip/_vendor/pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891
    +pip/_vendor/pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072
    +pip/_vendor/pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092
    +pip/_vendor/pygments/sphinxext.py,sha256=iOptJBcqOGPwMEJ2p70PvwpZPIGdvdZ8dxvq6kzxDgA,7981
    +pip/_vendor/pygments/style.py,sha256=rSCZWFpg1_DwFMXDU0nEVmAcBHpuQGf9RxvOPPQvKLQ,6420
    +pip/_vendor/pygments/styles/__init__.py,sha256=qUk6_1z5KmT8EdJFZYgESmG6P_HJF_2vVrDD7HSCGYY,2042
    +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc,,
    +pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
    +pip/_vendor/pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226
    +pip/_vendor/pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208
    +pip/_vendor/pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031
    +pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
    +pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,,
    +pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,,
    +pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
    +pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
    +pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
    +pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,,
    +pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
    +pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
    +pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/api.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/help.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/models.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,,
    +pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,,
    +pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
    +pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
    +pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
    +pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
    +pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
    +pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
    +pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
    +pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
    +pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
    +pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
    +pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
    +pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
    +pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
    +pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
    +pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
    +pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
    +pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
    +pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
    +pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,,
    +pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,,
    +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,,
    +pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,,
    +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,,
    +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
    +pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
    +pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
    +pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
    +pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
    +pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
    +pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
    +pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/align.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/box.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/color.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/console.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/control.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/json.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/live.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/region.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/status.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/style.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/table.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/text.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,,
    +pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,,
    +pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
    +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
    +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
    +pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
    +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
    +pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
    +pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
    +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
    +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
    +pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
    +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
    +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
    +pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
    +pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
    +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
    +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
    +pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
    +pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
    +pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
    +pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
    +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
    +pip/_vendor/rich/align.py,sha256=sCUkisXkQfoq-IQPyBELfJ8l7LihZJX3HbH8K7Cie-M,10368
    +pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
    +pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
    +pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
    +pip/_vendor/rich/cells.py,sha256=aMmGK4BjXhgE6_JF1ZEGmW3O7mKkE8g84vUnj4Et4To,4780
    +pip/_vendor/rich/color.py,sha256=bCRATVdRe5IClJ6Hl62de2PKQ_U4i2MZ4ugjUEg7Tao,18223
    +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
    +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
    +pip/_vendor/rich/console.py,sha256=deFZIubq2M9A2MCsKFAsFQlWDvcOMsGuUA07QkOaHIw,99173
    +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
    +pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
    +pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
    +pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
    +pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
    +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
    +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
    +pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
    +pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
    +pip/_vendor/rich/highlighter.py,sha256=6ZAjUcNhBRajBCo9umFUclyi2xL0-55JL7S0vYGUJu4,9585
    +pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
    +pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
    +pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
    +pip/_vendor/rich/live.py,sha256=vUcnJV2LMSK3sQNaILbm0-_B8BpAeiHfcQMAMLfpRe0,14271
    +pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
    +pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
    +pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
    +pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
    +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
    +pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
    +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
    +pip/_vendor/rich/panel.py,sha256=2Fd1V7e1kHxlPFIusoHY5T7-Cs0RpkrihgVG9ZVqJ4g,10705
    +pip/_vendor/rich/pretty.py,sha256=5oIHP_CGWnHEnD0zMdW5qfGC5kHqIKn7zH_eC4crULE,35848
    +pip/_vendor/rich/progress.py,sha256=P02xi7T2Ua3qq17o83bkshe4c0v_45cg8VyTj6US6Vg,59715
    +pip/_vendor/rich/progress_bar.py,sha256=L4jw8E6Qb_x-jhOrLVhkuMaPmiAhFIl8jHQbWFrKuR8,8164
    +pip/_vendor/rich/prompt.py,sha256=wdOn2X8XTJKnLnlw6PoMY7xG4iUPp3ezt4O5gqvpV-E,11304
    +pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
    +pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
    +pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
    +pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
    +pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
    +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
    +pip/_vendor/rich/segment.py,sha256=hU1ueeXqI6YeFa08K9DAjlF2QLxcJY9pwZx7RsXavlk,24246
    +pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
    +pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
    +pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
    +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
    +pip/_vendor/rich/syntax.py,sha256=TnZDuOD4DeHFbkaVEAji1gf8qgAlMU9Boe_GksMGCkk,35475
    +pip/_vendor/rich/table.py,sha256=nGEvAZHF4dy1vT9h9Gj9O5qhSQO3ODAxJv0RY1vnIB8,39680
    +pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
    +pip/_vendor/rich/text.py,sha256=5rQ3zvNrg5UZKNLecbh7fiw9v3HeFulNVtRY_CBDjjE,47312
    +pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
    +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
    +pip/_vendor/rich/traceback.py,sha256=CUpxYLjQWIb6vQQ6O72X0hvDV6caryGqU6UweHgOyCY,29601
    +pip/_vendor/rich/tree.py,sha256=meAOUU6sYnoBEOX2ILrPLY9k5bWrWNQKkaiEFvHinXM,9167
    +pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
    +pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,,
    +pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,,
    +pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,,
    +pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
    +pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
    +pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
    +pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
    +pip/_vendor/truststore/__init__.py,sha256=WIDeyzWm7EVX44g354M25vpRXbeY1lsPH6EmUJUcq4o,1264
    +pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,,
    +pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,,
    +pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,,
    +pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,,
    +pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,,
    +pip/_vendor/truststore/_api.py,sha256=GeXRNTlxPZ3kif4kNoh6JY0oE4QRzTGcgXr6l_X_Gk0,10555
    +pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
    +pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
    +pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
    +pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
    +pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499
    +pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
    +pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,,
    +pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,,
    +pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
    +pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
    +pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
    +pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
    +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
    +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,,
    +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
    +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
    +pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
    +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
    +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
    +pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
    +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
    +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
    +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
    +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
    +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,,
    +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
    +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,,
    +pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,,
    +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
    +pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
    +pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
    +pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
    +pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
    +pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
    +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
    +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,,
    +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
    +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
    +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
    +pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
    +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
    +pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
    +pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
    +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
    +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
    +pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
    +pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
    +pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
    +pip/_vendor/vendor.txt,sha256=43152uDtpsunEE29vmLqqKZUosdrbvzIFkzscLB55Cg,332
    +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/REQUESTED b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/REQUESTED
    new file mode 100644
    index 0000000..e69de29
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/WHEEL b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/WHEEL
    new file mode 100644
    index 0000000..da25d7b
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/WHEEL
    @@ -0,0 +1,5 @@
    +Wheel-Version: 1.0
    +Generator: setuptools (75.2.0)
    +Root-Is-Purelib: true
    +Tag: py3-none-any
    +
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/entry_points.txt b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/entry_points.txt
    new file mode 100644
    index 0000000..25fcf7e
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/entry_points.txt
    @@ -0,0 +1,3 @@
    +[console_scripts]
    +pip = pip._internal.cli.main:main
    +pip3 = pip._internal.cli.main:main
    diff --git a/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/top_level.txt b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/top_level.txt
    new file mode 100644
    index 0000000..a1b589e
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip-24.3.1.dist-info/top_level.txt
    @@ -0,0 +1 @@
    +pip
    diff --git a/env/lib/python3.12/site-packages/pip/__init__.py b/env/lib/python3.12/site-packages/pip/__init__.py
    new file mode 100644
    index 0000000..efefccf
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/__init__.py
    @@ -0,0 +1,13 @@
    +from typing import List, Optional
    +
    +__version__ = "24.3.1"
    +
    +
    +def main(args: Optional[List[str]] = None) -> int:
    +    """This is an internal API only meant for use by pip's own console scripts.
    +
    +    For additional details, see https://github.com/pypa/pip/issues/7498.
    +    """
    +    from pip._internal.utils.entrypoints import _wrapper
    +
    +    return _wrapper(args)
    diff --git a/env/lib/python3.12/site-packages/pip/__main__.py b/env/lib/python3.12/site-packages/pip/__main__.py
    new file mode 100644
    index 0000000..5991326
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/__main__.py
    @@ -0,0 +1,24 @@
    +import os
    +import sys
    +
    +# Remove '' and current working directory from the first entry
    +# of sys.path, if present to avoid using current directory
    +# in pip commands check, freeze, install, list and show,
    +# when invoked as python -m pip 
    +if sys.path[0] in ("", os.getcwd()):
    +    sys.path.pop(0)
    +
    +# If we are running from a wheel, add the wheel to sys.path
    +# This allows the usage python pip-*.whl/pip install pip-*.whl
    +if __package__ == "":
    +    # __file__ is pip-*.whl/pip/__main__.py
    +    # first dirname call strips of '/__main__.py', second strips off '/pip'
    +    # Resulting path is the name of the wheel itself
    +    # Add that to sys.path so we can import pip
    +    path = os.path.dirname(os.path.dirname(__file__))
    +    sys.path.insert(0, path)
    +
    +if __name__ == "__main__":
    +    from pip._internal.cli.main import main as _main
    +
    +    sys.exit(_main())
    diff --git a/env/lib/python3.12/site-packages/pip/__pip-runner__.py b/env/lib/python3.12/site-packages/pip/__pip-runner__.py
    new file mode 100644
    index 0000000..c633787
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/__pip-runner__.py
    @@ -0,0 +1,50 @@
    +"""Execute exactly this copy of pip, within a different environment.
    +
    +This file is named as it is, to ensure that this module can't be imported via
    +an import statement.
    +"""
    +
    +# /!\ This version compatibility check section must be Python 2 compatible. /!\
    +
    +import sys
    +
    +# Copied from pyproject.toml
    +PYTHON_REQUIRES = (3, 8)
    +
    +
    +def version_str(version):  # type: ignore
    +    return ".".join(str(v) for v in version)
    +
    +
    +if sys.version_info[:2] < PYTHON_REQUIRES:
    +    raise SystemExit(
    +        "This version of pip does not support python {} (requires >={}).".format(
    +            version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
    +        )
    +    )
    +
    +# From here on, we can use Python 3 features, but the syntax must remain
    +# Python 2 compatible.
    +
    +import runpy  # noqa: E402
    +from importlib.machinery import PathFinder  # noqa: E402
    +from os.path import dirname  # noqa: E402
    +
    +PIP_SOURCES_ROOT = dirname(dirname(__file__))
    +
    +
    +class PipImportRedirectingFinder:
    +    @classmethod
    +    def find_spec(self, fullname, path=None, target=None):  # type: ignore
    +        if fullname != "pip":
    +            return None
    +
    +        spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
    +        assert spec, (PIP_SOURCES_ROOT, fullname)
    +        return spec
    +
    +
    +sys.meta_path.insert(0, PipImportRedirectingFinder())
    +
    +assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
    +runpy.run_module("pip", run_name="__main__", alter_sys=True)
    diff --git a/env/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..2d15049b532f57047968ba6a0ed8e15012b53f1f
    GIT binary patch
    literal 705
    zcmX|9&ubJh6i#Mlr|Yg&R1oSxqZe6lCv7ciMG9j51=0%jvTC*8f29Pw}GHxu|&ZR;gY*`Leb?=Dm3@eEHs&ynLLV?jW$c>C=(G2z~d(k+lw!
    zgKLoNB91uDQGo}z2nGR0JQ#$0ibo<4SVS{`@y=VKwI1>KWor=EVXytelk|cndL*rD
    z+N;{hQn7q1o?l3=CUYxI#LUPxu@SB^DgzDwEriVb!FdSKAM?QXe}ORy&^F#i9}dxL
    zs26VSJ{e0(;A4tN<%EGQ!l%;6=YZwE%jwf%1uSGQrR*W#AZfn
    zXOm8cfZYQq<6QoeOSo`M=JpD)LXfd@+TNseB;B|gCRtffU28^xlS*qVVd?dS#T&_l
    z$ONFihnse~X_(f+z-3$jWRf1KOezP|iBQhex`b70+I~-9`~)Vs^(2J+VRT#;f)>@7
    z6$RsTxy-5pHd=aLx(C&e&dtvDmsxH5tLyzcB^Okv4Vud#2z298!Hv&TE1l?TmOW!5
    zQ0hgephdbgO?2Hv1(V8jpG+A0`J@^juzIpS_`@VV1=X5#&Ebb{!n~z0+
    zUwjirWCV_1A%GpgfRPThVMaAXP+JPAry0XE+h9Qe0`0NWdWiZX&=A(anZ3A2J07x6
    zGlo8M!2@Nn;)&C1
    zYb_;u@-O|V6!R+Ee^43NO>7fa5T3WY{*PmW6B0s!MNk@7{vkjGszRt5LI_AnNW!63tJUItPByW3&F(tH
    z!I9D^QmIs_IaCe3!KH$xm3r*4_g-v_ny?ZQReNY|0U!Ev>O8NPM566TJMYcTn|U+y
    zzL}rG;UFLlNgqys;{o`U2`&X%n}$UI)WFj4UOszlujK3%f_~dKS_;<#0lH5K
    z&GiD9zN?_Lx%w4$+BbXRU;KoXkkbBbWP^8f1j<}Iy7=|b0?n2zD$)fxYvs$LHKUqh
    zRxg%CJtr2`VnV#F;y+E4MMcf!s6jPLq}se{=vo2ysbFx5ndH-(%0#!uW6jckw
    zglOq_+AJ9qJ3Bg<1{iv5}Dnr#ea+xZWStU3EWz_FEj~pe$*zZ*F2sXc39O$I7a{Che*qZeqp
    zP@0ho1zAa7(z7L&q?sO8tt+LQ>Aq8^l9%MNnHv}9v4<)KXqJb*dW@TBt*u+rFK?`}JqEp0^
    zZi!~8$N(Zb1rYBniMIA|clQC{H@9K;1iMktfGVE2rx#gQg5Cn$QOSxeQXoeM^@tR^nuTyxMjgB!#N
    zPK&v7IG0EncCj+snklXkTPwtRufndjLUNoN-U_J*h*@sb=JCnn
    zys;l$*?}CUE}2D|wWH%BLH^uHPaDHzUVuk>mHT
    zJV{@yrr!JUWIZx+S9ltURsDTW4xD`GuXgs;{e5?>tw`){$Y3zUv_>&pza+6RCCLs-
    zk~1!F-zG`7N^&y+ltS6OY?=j%O`$Y{eFRMxPV@}U24g4iGdqy2!j>oclJj~x8a#OS
    zym9>M5UHwr$r|=gQ0v1TiuT~&B*P5oVTzO
    z&9WJf**-~9^eo2AqijdUKbX2QHY!aFUB59hF*Mn17Q4-DA63igc5t$6;_w?|KpmD1z$13j`ay5c2MT;PE#00|`Hax1YhGUt&F9ox6X&ekf6oC94qq!|Nv<
    zF96xj0U*LB;g7?c&{2bqwd=L+)AjDNPvD*BzR23Uk9~)$Fi|}^QAh4Oyamx^&n84`
    R5MArM-}AloGxRqz{s%41DZKyy
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/__init__.py
    new file mode 100644
    index 0000000..1a5b7f8
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/__init__.py
    @@ -0,0 +1,18 @@
    +from typing import List, Optional
    +
    +from pip._internal.utils import _log
    +
    +# init_logging() must be called before any call to logging.getLogger()
    +# which happens at import of most modules.
    +_log.init_logging()
    +
    +
    +def main(args: Optional[List[str]] = None) -> int:
    +    """This is preserved for old console scripts that may still be referencing
    +    it.
    +
    +    For additional details, see https://github.com/pypa/pip/issues/7498.
    +    """
    +    from pip._internal.utils.entrypoints import _wrapper
    +
    +    return _wrapper(args)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..eeac283b9de293ebc88e699f6d92a54ee7e722c7
    GIT binary patch
    literal 805
    zcmZuvy=xRf6rb7MyKKIY7@Jt=C^iS)PNG7LNE+iuAxROdLs;i_=XS^J$1pP+U5Svw
    zLa?zjHr7i16dMDAu#JdV*hQj^m2Wnum5-VCF}#o8dvD&)&Q2kqo8kQgI|zNX#$W1;
    zm7@osyh1UGafWg{z_~MUu(h4c&Aow#k%PGRu+8*0_*m|bP4J$GJ??PKy9@AUZ`|P%
    zBQNeg>kRzb?fKuWZ_jDGyF#1B-;hR>11g(h&M;+m^%9+Oe2NSVbXDhpj^oajgiX*4k@
    zGbCp<(MDt$8FHfdh$~)1qDZC)kTAhitK5PVERMx7Y7%q9M5Zqi%{fVpk@^~?i7;t3
    z45BipvX+cWA*s;1;+igBS-Bdti4^PsLDzoxNHHn7f|;BJ&ma_q;R;3)RDebYyfCVk
    zCA?}iX=5DK1<~r-CL!ea7EQ~X)4WPqp0k*)l~I*Lpr*Hlxl;}4(&A!&jn%rpG3wta
    zV@`RoO*1hBfF>=A%fZqms)gZw$)YWm08$J39~2sbDohv#vTnSbi9*dlW&0KM9I##V
    zYX)^zzD&=*Tzj$l!CN?jN9b<7H`#PeEn$qxZccf?n)&~Z`_e_YhG
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..7ae083daf2df777de804547f5786b1a1f0879e00
    GIT binary patch
    literal 14517
    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
    Ho%jC*8Efa#
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..ab55d061535c09b14cd5abe632ce6835b2fbcabf
    GIT binary patch
    literal 12685
    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
    Xwfp!chq~YG9TE6${&S9HY`y*;XHwW5
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..d8665047c9c51994530ac2a766dcc3b05803debe
    GIT binary patch
    literal 36863
    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
    Lt~_IPOq2W{ZFfK`
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..105c7d357a909105c22d1ab22b746243c0ce1f18
    GIT binary patch
    literal 13633
    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 Union[Tuple[str], Tuple[str, str]]:
    +    return (a, b) if a != b else (a,)
    +
    +
    +class _Prefix:
    +    def __init__(self, path: str) -> None:
    +        self.path = path
    +        self.setup = False
    +        scheme = get_scheme("", prefix=path)
    +        self.bin_dir = scheme.scripts
    +        self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
    +
    +
    +def get_runnable_pip() -> str:
    +    """Get a file to pass to a Python executable, to run the currently-running pip.
    +
    +    This is used to run a pip subprocess, for installing requirements into the build
    +    environment.
    +    """
    +    source = pathlib.Path(pip_location).resolve().parent
    +
    +    if not source.is_dir():
    +        # This would happen if someone is using pip from inside a zip file. In that
    +        # case, we can use that directly.
    +        return str(source)
    +
    +    return os.fsdecode(source / "__pip-runner__.py")
    +
    +
    +def _get_system_sitepackages() -> Set[str]:
    +    """Get system site packages
    +
    +    Usually from site.getsitepackages,
    +    but fallback on `get_purelib()/get_platlib()` if unavailable
    +    (e.g. in a virtualenv created by virtualenv<20)
    +
    +    Returns normalized set of strings.
    +    """
    +    if hasattr(site, "getsitepackages"):
    +        system_sites = site.getsitepackages()
    +    else:
    +        # virtualenv < 20 overwrites site.py without getsitepackages
    +        # fallback on get_purelib/get_platlib.
    +        # this is known to miss things, but shouldn't in the cases
    +        # where getsitepackages() has been removed (inside a virtualenv)
    +        system_sites = [get_purelib(), get_platlib()]
    +    return {os.path.normcase(path) for path in system_sites}
    +
    +
    +class BuildEnvironment:
    +    """Creates and manages an isolated environment to install build deps"""
    +
    +    def __init__(self) -> None:
    +        temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
    +
    +        self._prefixes = OrderedDict(
    +            (name, _Prefix(os.path.join(temp_dir.path, name)))
    +            for name in ("normal", "overlay")
    +        )
    +
    +        self._bin_dirs: List[str] = []
    +        self._lib_dirs: List[str] = []
    +        for prefix in reversed(list(self._prefixes.values())):
    +            self._bin_dirs.append(prefix.bin_dir)
    +            self._lib_dirs.extend(prefix.lib_dirs)
    +
    +        # Customize site to:
    +        # - ensure .pth files are honored
    +        # - prevent access to system site packages
    +        system_sites = _get_system_sitepackages()
    +
    +        self._site_dir = os.path.join(temp_dir.path, "site")
    +        if not os.path.exists(self._site_dir):
    +            os.mkdir(self._site_dir)
    +        with open(
    +            os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
    +        ) as fp:
    +            fp.write(
    +                textwrap.dedent(
    +                    """
    +                import os, site, sys
    +
    +                # First, drop system-sites related paths.
    +                original_sys_path = sys.path[:]
    +                known_paths = set()
    +                for path in {system_sites!r}:
    +                    site.addsitedir(path, known_paths=known_paths)
    +                system_paths = set(
    +                    os.path.normcase(path)
    +                    for path in sys.path[len(original_sys_path):]
    +                )
    +                original_sys_path = [
    +                    path for path in original_sys_path
    +                    if os.path.normcase(path) not in system_paths
    +                ]
    +                sys.path = original_sys_path
    +
    +                # Second, add lib directories.
    +                # ensuring .pth file are processed.
    +                for path in {lib_dirs!r}:
    +                    assert not path in sys.path
    +                    site.addsitedir(path)
    +                """
    +                ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
    +            )
    +
    +    def __enter__(self) -> None:
    +        self._save_env = {
    +            name: os.environ.get(name, None)
    +            for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
    +        }
    +
    +        path = self._bin_dirs[:]
    +        old_path = self._save_env["PATH"]
    +        if old_path:
    +            path.extend(old_path.split(os.pathsep))
    +
    +        pythonpath = [self._site_dir]
    +
    +        os.environ.update(
    +            {
    +                "PATH": os.pathsep.join(path),
    +                "PYTHONNOUSERSITE": "1",
    +                "PYTHONPATH": os.pathsep.join(pythonpath),
    +            }
    +        )
    +
    +    def __exit__(
    +        self,
    +        exc_type: Optional[Type[BaseException]],
    +        exc_val: Optional[BaseException],
    +        exc_tb: Optional[TracebackType],
    +    ) -> None:
    +        for varname, old_value in self._save_env.items():
    +            if old_value is None:
    +                os.environ.pop(varname, None)
    +            else:
    +                os.environ[varname] = old_value
    +
    +    def check_requirements(
    +        self, reqs: Iterable[str]
    +    ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
    +        """Return 2 sets:
    +        - conflicting requirements: set of (installed, wanted) reqs tuples
    +        - missing requirements: set of reqs
    +        """
    +        missing = set()
    +        conflicting = set()
    +        if reqs:
    +            env = (
    +                get_environment(self._lib_dirs)
    +                if hasattr(self, "_lib_dirs")
    +                else get_default_environment()
    +            )
    +            for req_str in reqs:
    +                req = get_requirement(req_str)
    +                # We're explicitly evaluating with an empty extra value, since build
    +                # environments are not provided any mechanism to select specific extras.
    +                if req.marker is not None and not req.marker.evaluate({"extra": ""}):
    +                    continue
    +                dist = env.get_distribution(req.name)
    +                if not dist:
    +                    missing.add(req_str)
    +                    continue
    +                if isinstance(dist.version, Version):
    +                    installed_req_str = f"{req.name}=={dist.version}"
    +                else:
    +                    installed_req_str = f"{req.name}==={dist.version}"
    +                if not req.specifier.contains(dist.version, prereleases=True):
    +                    conflicting.add((installed_req_str, req_str))
    +                # FIXME: Consider direct URL?
    +        return conflicting, missing
    +
    +    def install_requirements(
    +        self,
    +        finder: "PackageFinder",
    +        requirements: Iterable[str],
    +        prefix_as_string: str,
    +        *,
    +        kind: str,
    +    ) -> None:
    +        prefix = self._prefixes[prefix_as_string]
    +        assert not prefix.setup
    +        prefix.setup = True
    +        if not requirements:
    +            return
    +        self._install_requirements(
    +            get_runnable_pip(),
    +            finder,
    +            requirements,
    +            prefix,
    +            kind=kind,
    +        )
    +
    +    @staticmethod
    +    def _install_requirements(
    +        pip_runnable: str,
    +        finder: "PackageFinder",
    +        requirements: Iterable[str],
    +        prefix: _Prefix,
    +        *,
    +        kind: str,
    +    ) -> None:
    +        args: List[str] = [
    +            sys.executable,
    +            pip_runnable,
    +            "install",
    +            "--ignore-installed",
    +            "--no-user",
    +            "--prefix",
    +            prefix.path,
    +            "--no-warn-script-location",
    +            "--disable-pip-version-check",
    +            # The prefix specified two lines above, thus
    +            # target from config file or env var should be ignored
    +            "--target",
    +            "",
    +        ]
    +        if logger.getEffectiveLevel() <= logging.DEBUG:
    +            args.append("-vv")
    +        elif logger.getEffectiveLevel() <= VERBOSE:
    +            args.append("-v")
    +        for format_control in ("no_binary", "only_binary"):
    +            formats = getattr(finder.format_control, format_control)
    +            args.extend(
    +                (
    +                    "--" + format_control.replace("_", "-"),
    +                    ",".join(sorted(formats or {":none:"})),
    +                )
    +            )
    +
    +        index_urls = finder.index_urls
    +        if index_urls:
    +            args.extend(["-i", index_urls[0]])
    +            for extra_index in index_urls[1:]:
    +                args.extend(["--extra-index-url", extra_index])
    +        else:
    +            args.append("--no-index")
    +        for link in finder.find_links:
    +            args.extend(["--find-links", link])
    +
    +        for host in finder.trusted_hosts:
    +            args.extend(["--trusted-host", host])
    +        if finder.allow_all_prereleases:
    +            args.append("--pre")
    +        if finder.prefer_binary:
    +            args.append("--prefer-binary")
    +        args.append("--")
    +        args.extend(requirements)
    +        extra_environ = {"_PIP_STANDALONE_CERT": where()}
    +        with open_spinner(f"Installing {kind}") as spinner:
    +            call_subprocess(
    +                args,
    +                command_desc=f"pip subprocess to install {kind}",
    +                spinner=spinner,
    +                extra_environ=extra_environ,
    +            )
    +
    +
    +class NoOpBuildEnvironment(BuildEnvironment):
    +    """A no-op drop-in replacement for BuildEnvironment"""
    +
    +    def __init__(self) -> None:
    +        pass
    +
    +    def __enter__(self) -> None:
    +        pass
    +
    +    def __exit__(
    +        self,
    +        exc_type: Optional[Type[BaseException]],
    +        exc_val: Optional[BaseException],
    +        exc_tb: Optional[TracebackType],
    +    ) -> None:
    +        pass
    +
    +    def cleanup(self) -> None:
    +        pass
    +
    +    def install_requirements(
    +        self,
    +        finder: "PackageFinder",
    +        requirements: Iterable[str],
    +        prefix_as_string: str,
    +        *,
    +        kind: str,
    +    ) -> None:
    +        raise NotImplementedError()
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cache.py b/env/lib/python3.12/site-packages/pip/_internal/cache.py
    new file mode 100644
    index 0000000..6b45126
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cache.py
    @@ -0,0 +1,290 @@
    +"""Cache Management
    +"""
    +
    +import hashlib
    +import json
    +import logging
    +import os
    +from pathlib import Path
    +from typing import Any, Dict, List, Optional
    +
    +from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.exceptions import InvalidWheelFilename
    +from pip._internal.models.direct_url import DirectUrl
    +from pip._internal.models.link import Link
    +from pip._internal.models.wheel import Wheel
    +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
    +from pip._internal.utils.urls import path_to_url
    +
    +logger = logging.getLogger(__name__)
    +
    +ORIGIN_JSON_NAME = "origin.json"
    +
    +
    +def _hash_dict(d: Dict[str, str]) -> str:
    +    """Return a stable sha224 of a dictionary."""
    +    s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
    +    return hashlib.sha224(s.encode("ascii")).hexdigest()
    +
    +
    +class Cache:
    +    """An abstract class - provides cache directories for data from links
    +
    +    :param cache_dir: The root of the cache.
    +    """
    +
    +    def __init__(self, cache_dir: str) -> None:
    +        super().__init__()
    +        assert not cache_dir or os.path.isabs(cache_dir)
    +        self.cache_dir = cache_dir or None
    +
    +    def _get_cache_path_parts(self, link: Link) -> List[str]:
    +        """Get parts of part that must be os.path.joined with cache_dir"""
    +
    +        # We want to generate an url to use as our cache key, we don't want to
    +        # just reuse the URL because it might have other items in the fragment
    +        # and we don't care about those.
    +        key_parts = {"url": link.url_without_fragment}
    +        if link.hash_name is not None and link.hash is not None:
    +            key_parts[link.hash_name] = link.hash
    +        if link.subdirectory_fragment:
    +            key_parts["subdirectory"] = link.subdirectory_fragment
    +
    +        # Include interpreter name, major and minor version in cache key
    +        # to cope with ill-behaved sdists that build a different wheel
    +        # depending on the python version their setup.py is being run on,
    +        # and don't encode the difference in compatibility tags.
    +        # https://github.com/pypa/pip/issues/7296
    +        key_parts["interpreter_name"] = interpreter_name()
    +        key_parts["interpreter_version"] = interpreter_version()
    +
    +        # Encode our key url with sha224, we'll use this because it has similar
    +        # security properties to sha256, but with a shorter total output (and
    +        # thus less secure). However the differences don't make a lot of
    +        # difference for our use case here.
    +        hashed = _hash_dict(key_parts)
    +
    +        # We want to nest the directories some to prevent having a ton of top
    +        # level directories where we might run out of sub directories on some
    +        # FS.
    +        parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
    +
    +        return parts
    +
    +    def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
    +        can_not_cache = not self.cache_dir or not canonical_package_name or not link
    +        if can_not_cache:
    +            return []
    +
    +        path = self.get_path_for_link(link)
    +        if os.path.isdir(path):
    +            return [(candidate, path) for candidate in os.listdir(path)]
    +        return []
    +
    +    def get_path_for_link(self, link: Link) -> str:
    +        """Return a directory to store cached items in for link."""
    +        raise NotImplementedError()
    +
    +    def get(
    +        self,
    +        link: Link,
    +        package_name: Optional[str],
    +        supported_tags: List[Tag],
    +    ) -> Link:
    +        """Returns a link to a cached item if it exists, otherwise returns the
    +        passed link.
    +        """
    +        raise NotImplementedError()
    +
    +
    +class SimpleWheelCache(Cache):
    +    """A cache of wheels for future installs."""
    +
    +    def __init__(self, cache_dir: str) -> None:
    +        super().__init__(cache_dir)
    +
    +    def get_path_for_link(self, link: Link) -> str:
    +        """Return a directory to store cached wheels for link
    +
    +        Because there are M wheels for any one sdist, we provide a directory
    +        to cache them in, and then consult that directory when looking up
    +        cache hits.
    +
    +        We only insert things into the cache if they have plausible version
    +        numbers, so that we don't contaminate the cache with things that were
    +        not unique. E.g. ./package might have dozens of installs done for it
    +        and build a version of 0.0...and if we built and cached a wheel, we'd
    +        end up using the same wheel even if the source has been edited.
    +
    +        :param link: The link of the sdist for which this will cache wheels.
    +        """
    +        parts = self._get_cache_path_parts(link)
    +        assert self.cache_dir
    +        # Store wheels within the root cache_dir
    +        return os.path.join(self.cache_dir, "wheels", *parts)
    +
    +    def get(
    +        self,
    +        link: Link,
    +        package_name: Optional[str],
    +        supported_tags: List[Tag],
    +    ) -> Link:
    +        candidates = []
    +
    +        if not package_name:
    +            return link
    +
    +        canonical_package_name = canonicalize_name(package_name)
    +        for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
    +            try:
    +                wheel = Wheel(wheel_name)
    +            except InvalidWheelFilename:
    +                continue
    +            if canonicalize_name(wheel.name) != canonical_package_name:
    +                logger.debug(
    +                    "Ignoring cached wheel %s for %s as it "
    +                    "does not match the expected distribution name %s.",
    +                    wheel_name,
    +                    link,
    +                    package_name,
    +                )
    +                continue
    +            if not wheel.supported(supported_tags):
    +                # Built for a different python/arch/etc
    +                continue
    +            candidates.append(
    +                (
    +                    wheel.support_index_min(supported_tags),
    +                    wheel_name,
    +                    wheel_dir,
    +                )
    +            )
    +
    +        if not candidates:
    +            return link
    +
    +        _, wheel_name, wheel_dir = min(candidates)
    +        return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
    +
    +
    +class EphemWheelCache(SimpleWheelCache):
    +    """A SimpleWheelCache that creates it's own temporary cache directory"""
    +
    +    def __init__(self) -> None:
    +        self._temp_dir = TempDirectory(
    +            kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
    +            globally_managed=True,
    +        )
    +
    +        super().__init__(self._temp_dir.path)
    +
    +
    +class CacheEntry:
    +    def __init__(
    +        self,
    +        link: Link,
    +        persistent: bool,
    +    ):
    +        self.link = link
    +        self.persistent = persistent
    +        self.origin: Optional[DirectUrl] = None
    +        origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
    +        if origin_direct_url_path.exists():
    +            try:
    +                self.origin = DirectUrl.from_json(
    +                    origin_direct_url_path.read_text(encoding="utf-8")
    +                )
    +            except Exception as e:
    +                logger.warning(
    +                    "Ignoring invalid cache entry origin file %s for %s (%s)",
    +                    origin_direct_url_path,
    +                    link.filename,
    +                    e,
    +                )
    +
    +
    +class WheelCache(Cache):
    +    """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
    +
    +    This Cache allows for gracefully degradation, using the ephem wheel cache
    +    when a certain link is not found in the simple wheel cache first.
    +    """
    +
    +    def __init__(self, cache_dir: str) -> None:
    +        super().__init__(cache_dir)
    +        self._wheel_cache = SimpleWheelCache(cache_dir)
    +        self._ephem_cache = EphemWheelCache()
    +
    +    def get_path_for_link(self, link: Link) -> str:
    +        return self._wheel_cache.get_path_for_link(link)
    +
    +    def get_ephem_path_for_link(self, link: Link) -> str:
    +        return self._ephem_cache.get_path_for_link(link)
    +
    +    def get(
    +        self,
    +        link: Link,
    +        package_name: Optional[str],
    +        supported_tags: List[Tag],
    +    ) -> Link:
    +        cache_entry = self.get_cache_entry(link, package_name, supported_tags)
    +        if cache_entry is None:
    +            return link
    +        return cache_entry.link
    +
    +    def get_cache_entry(
    +        self,
    +        link: Link,
    +        package_name: Optional[str],
    +        supported_tags: List[Tag],
    +    ) -> Optional[CacheEntry]:
    +        """Returns a CacheEntry with a link to a cached item if it exists or
    +        None. The cache entry indicates if the item was found in the persistent
    +        or ephemeral cache.
    +        """
    +        retval = self._wheel_cache.get(
    +            link=link,
    +            package_name=package_name,
    +            supported_tags=supported_tags,
    +        )
    +        if retval is not link:
    +            return CacheEntry(retval, persistent=True)
    +
    +        retval = self._ephem_cache.get(
    +            link=link,
    +            package_name=package_name,
    +            supported_tags=supported_tags,
    +        )
    +        if retval is not link:
    +            return CacheEntry(retval, persistent=False)
    +
    +        return None
    +
    +    @staticmethod
    +    def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
    +        origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
    +        if origin_path.exists():
    +            try:
    +                origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
    +            except Exception as e:
    +                logger.warning(
    +                    "Could not read origin file %s in cache entry (%s). "
    +                    "Will attempt to overwrite it.",
    +                    origin_path,
    +                    e,
    +                )
    +            else:
    +                # TODO: use DirectUrl.equivalent when
    +                # https://github.com/pypa/pip/pull/10564 is merged.
    +                if origin.url != download_info.url:
    +                    logger.warning(
    +                        "Origin URL %s in cache entry %s does not match download URL "
    +                        "%s. This is likely a pip bug or a cache corruption issue. "
    +                        "Will overwrite it with the new value.",
    +                        origin.url,
    +                        cache_dir,
    +                        download_info.url,
    +                    )
    +        origin_path.write_text(download_info.to_json(), encoding="utf-8")
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/cli/__init__.py
    new file mode 100644
    index 0000000..e589bb9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/__init__.py
    @@ -0,0 +1,4 @@
    +"""Subpackage containing all of pip's command line interface related code
    +"""
    +
    +# This file intentionally does not import submodules
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..eabccf4d781c259426d540b7e95085d4ff2d3731
    GIT binary patch
    literal 296
    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
    O`a=0x>)cYT;d$-sC
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..c6b619e5109110572f79cd81aa750786ceb62502
    GIT binary patch
    literal 10212
    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
    a3&)q8t=H|3?BB95r*jp}zel7%*ZAL@oCc%-
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..6c5e00ca1554807a1f449b6ffcf6f8844fbe6708
    GIT binary patch
    literal 30413
    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
    WA_z>LhBBO)>bU&$cW8{*@cLgEL5x!X
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..ee481b4b23c253df187f9e285f822d6c3195c011
    GIT binary patch
    literal 1792
    zcmZ`(O>7%g5Pom}yiVv&@&giO_gY=)F3W!vl^jPz=3(YwwpxZNjp0;Z{EC_
    zZ)V;v$z&ITb=mk}LE;hmoeAwFw3z*Of!RbBvTzYOSjP^hbC}6ok#_`La70~nBwfOY
    zLqxK8OZZmY;-b@fj6<`?k~WYP>*(aFtj7Oj1}YcCFR$4CRo^Up7@RJYT%WA?j_H~U
    zgsOaSdOFg)9chC2EO7}n{Spmg`D&TGXVQQ(@_7{p@j_|Iq_*k$h3M*tcCwfQ`D4g~
    zARSvs=d4%_&0~w(Na#EfEKEd;e->=!IZN0Owpu=P$r4G7$ZQ8}$>K1Uz5BmYY;kTay<}S61M7b;X^SO?XijC(gd8nxrc|gn#PvOG*7jeoT-PSX$46((syF)1
    z{OEMaA{ud*w4!}oD_8x+lKbM=#0#2d`((5X1%{$}TG=jZ5S34;YZkRa(bftPe(ey)
    z%2les^{daF0PI*hH5n|t0U%G-(L*_TE7p+DZp;0<0~cz-wtVj4xr<-EUlSh4{rg~p
    zR6du>9Vvzc+9CM%?*MrVVd#uCbOZR~i*j$Gn>Z{-XDiNZJH_d!(Ioh>(C7Rn4(9{-
    zcF%*%LCHF%Rk(Ztd3YHn=^C8E=#$h6e+@0;p<|ZIDAIq&FJnj}e?{eJH~66`AS$Lk
    z@bg%k4bWboLE><^R|ihQ@UTUa9cL5%2Sai%eP$;;d@ns*mxt@h@ZLZsM6<~W@sZtB
    z-%e`iero8~?!E&a^<}^{+PuPH#Sw?ZICpvJ(1Ae1-o;
    z2IhMiR6mMYKK4@##Jf^FtMGRf9<)Jst4obCEiKs=p@qXBcjhM#p8v00URbV^%X0%J
    z?D$&4Tdf&|Va7R?e+q7pgia^4-Istn!flL0A2}bMQ^9r}?JDUV
    zC38>7)a6WF$?P$4u%Qg@C|X0&>f=-Qm26$k(mt?;YZLIxsi)XnyQV{6uDcAwDOr^w
    z;}eGQQN=7qJK^L|_A*e`;q(k6EN#jLCJYs(KN|A_DHaU_S||-$VGB)#EksW-Q%2aU
    zPXuyFUC<Lqy3MKapsQ7Ccq_s;DU3Og{A$^D7ov#61Xu`B>@1+KQRF4;botc?gV*SJ*kV=m
    oE&^%t7~@B1{1KXLpvm9FL@j?izb&3$=MJP^d;M1&
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..be0709b7cc30b179c98e5ec201ad6bc9300fb880
    GIT binary patch
    literal 7142
    zcmb6-TWlLwc6WwD4xged*`h=}Jn~CsERnJj#m>X=Lvp;1wQ_c?-6BMa3C$Tvl!qMd
    zouOq36jm*aRt~c88ttxS>;m={1=fM{;ZN^ZE;kd&^%c&DQ3M%Z`POeu{pQq&jykK*7s<^Y$zFGeNk)5hLd5A
    zs3Hvlu2*Z$?nv%nYd){lt2dzCwV1!RY*p7
    za)v0Ot3+v1!}nY@xOOG1G%Gt)x8hg$NsrP3kR1%N6(D!2A+`OUP=k%m@v&X01F(gE
    zM9-P2OwN$fdN!NNDN|v(uUMw3JQFNtv9f(p1`%W;5orl*++`qF#{_k~ytP
    zIn|ui>7}^e|FfKyxui-N(~yje0Vq;dR|=ZiFH!Xua*cdHAZ3i&ie#7>O_K_^otB!1
    zow9kInug!do#Qy?Q1o1%DW$a8)SMwrXUxreO9$2XR9wM@iUe%2D@9{^LZ1HQyPGZX_cCp$qaT!?7M|-
    zYpsjdu3j;JoVju~2h;uw7shH+AH!(l9F~WwW`X7?vUA#gKD)-Z#J68B!ZY3^W_@jj
    zuXpPmg}Vf^w9Tw>03kDCeX-tAc!%paGDmzwaVbO-7VMr|1HND2I8x+hTI(qFPLa&)
    ztPkoPhu#8T3YXRwq|7}>hw0+d$q1Z1@`7IkiEoYvW<)T2yN%crmqTZU^_iU
    z*uZ}ezH63TalJ=ox&JpEPh&bUaXiLJTi9n^!S9e
    zOVd*dz|zd*oUG~T6v~W2ks&Sj?6gYNn2WX{4J2f_(&iNduUC?!@6E)to>dds!gLDM
    zm690M(}k>>GmXTVjQOL&#l+#k!GTdw5(DQa2S#*7O{lrc2`zImk!KeVH$9XvGNw9^
    zPo*!Vrc@&VCr`lVg2Dp9O{BF3jkqKOn1ZSy5ML0
    z6I6@jspv0@k&+l$?t3KmKJ_+T4_*td>>6M7p09*ktAgO(`MI~H>WB83_ob?z1a_7E
    zyG#DvcU)!ZNJ%>K*nf0!q#}rAp}Qn>|9N>$5fv>uArZ
    zH(Z~+&OyCJ-S_|n%lcKQ{vH&LO2AwaG?ic`150EQOy$*JQUC)as2+t^Mb)eNP`;Vz
    z5)}7U!4c@B--b~gL
    z!O*pJEz`GyF!&9(S>s;gisV;rxKaj42-tX1Br?h~D{~~qjf2f_gSde-d1YX?j48{|
    zt8E+OEx}N=Ny{h8%mB->f#}jA?SY2wgKEC3!RN*uT1NoF08fW}2mI#^T@y>*_Em4R
    z5+7O;eid4W1!9RhGfzgkelnPabK7?06X@I|Q)GcR>)%~u9+Bf?7}Ay%7id}X3`8AgX3EMIuXNi0iq=!wt-)R+$gbEw8Apb+C+VR
    zZ^IYe3iJlhFl49}N!3Hz+L!!K!)?Ewz2m=odNn-sw54OY@6H?dg~u(!OCwLhEtTeI
    zxw*I0+q_BTM)BGy8|n5^F3!&
    z@DC+LolF%pa{ydfQ0|IUldm{fl>M-U6#`qKQb%!HOS;+xcH
    zJ2E@p*XZ>c0Gs}C6&A4rLOp0vz$0pN}T%i$m7Jh$6aGf
    zqaXda>LokdZyvjGY^Ak-CD;!&*p2H8*A`a1UF@AK5!^!XP7O;$7Z&{8v;Z48#S0yL
    zj`gP?=@8*ybVIV-g224D&5$*W1$WU+drc=YA~Q%~TbT)Ln}A`_?L48u9!PP4cZfW+
    ztz714zzjQ+j-FibPB
    zW*hjZz*G%9(_)=Ti=I#1_iAjsAOel{7b%18YB*mM<+?`-5a=UpD-5&2JYd%E5irpT
    zY%2y2I(Jvm1z+r9U)%r&sMK#As7TvLz>w~5Jl}X$@%)|#n)R1ZL>Sd?8gNj2wv`|$
    zij87i8Lbs7fY&*;vdh;c9jzUMSSw$N2ZYVwb2uPiM6&=CeaokL-eXW6-f!Q?2tkI(|Gry;iGTf?N
    zF94ho2j60md>bUbV{1D*%RBd%cJ5#DJ!$RwXa0}kAH+X~{t&vGS(T2ic#p1xkFEte
    z?nKJHqb2wcj6RJXeH?xL+PSr8&(gUsTDqPbJ^7D&ZuZ^iyV-xEe|he1Y_;W;PtD5i
    z11r0SZk%}_{!92z;Yzf(98Hv>iAtoi963~q9J+hvapaXs``+gPPpf}PthSI~>-9H3
    ze6!NM@Amt*-d{TN(Kr~|U~4(h^C-|$>D*K9jF&p&Fh9oTuOI*L_^qi*Y;Yy^=B=qu
    z`~EfYFae9_?Zsms9$RbQeLHk3ROygzci-y%+U?ri#MZr}_rTJb)nGS39vCR^A1>`5
    zUg;fP5-~hj_4ZT_Cdvm-ln$P7X7;az+m@P`!UxNQiUcCf@$py~UC3N2tAY#Zmt{N6
    z0{x&Y|Dur6YAd2FD|%X%ne&M319_dS3el%R(Kb+2_7wFR#C0ZREJt5sL*R7ws8*=v
    zjiyyiljRsk`(WKb@9>1}m-a%JVufO4{2f%^T_s=hyxaS&mv_GmcFeP*$_Lzg?o3t*
    zH22#d?0aDRDONf>`VEfPT@FAs>UDSDeYHxUxv#BbQ;m{62P(b$zxEBfBWpV%RX4P7
    zcP-K7y*Ik6B96Sy2w@wz7eMyA3n~_yO7^hOrno$e>@+mq2&)Zq*eG#z{xnK=iL+H}FT;!I<~x
    zX2?#AYx{~3x$zeC1Hi_MHc+uIl4rtCz7Tv%eZM~P??Na0>@>{Ri(~88C79Y4wDGC{
    z86E*bFbK_(?l~dmv38tAulNkr3;9}9HUC>biu=inz$BOiyqJP424kkpVHM=*Fgb`B
    zLE9CcLK1a{+s|lBVCpZWvFsiN9hlc4yC#`BLrdE^G8j*%ObOzoY%R+N_fSulu#2ii
    zXn1wDP;7bBy6^J=@F_%TP}>D#8Rt1|Zw2hm=18apX9Qv1xi<$HTFTAwK6HQ^WX^!L
    z%k(+GiU1VqIVxus;=|f*;7=giLBYJ(Fo6u#hL^x^W;%t(KL-z(kl#xVg9Oe3i@pbV
    zI8)DNHQ6*-RxANDo1Jl^e4Vl>o3#nDZj&8c2*X9i`-yMk43Ip#aZA
    zY5{Y0nm)_8oFPtt;Ct08X^7w^^;p0Xr&9)t3_EIH#zc0DLSSdJb*U>07M@ww58!l`
    z@AQ?l%ED2KJ}E_~lH%=yW;FQ@qT2r`L#d0V0bffBl4I3
    z4!1+v%6I%}u;u#rwegkC3#-8i9E@EXTj_{D*ts`E`VObxr12Y%~;+yZI|LLN@0i!
    z)WAEcx;T#en)h(RdNbj|pA+Bb#Q%(R{wEnMk-;y??k~yEGjj3^SMxKW=S$(}nlHK(
    zDf^-&Uv&BCW8c0-Pu0`Ph3|Urca;vlwN9Y_y#FU07g>o8JSW(xPV+9V>(2XC0?mWB
    aS@Ws6j-%(n9`5+ExYGN|w*-3ZwEqi^7_dhG
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..5c11f76240273197d2b1e2b347d81a963e0e0fe3
    GIT binary patch
    literal 2318
    zcma)7O>7fK6rTO{`X_c`f)fG(CpZX$9Fu}XL1_gg5k-vxfq)M_d6F;io)iiK
    zNKO;=P$8sC1&N{icrC0)3K0(rT2zk}VjdQ?7Cl~wdpM*e^wvVFhb65|PZp94Vi9I5
    zdwiz?iQDIy=B%()i78<$;Sf%31B(8Y2=2JVE79vhp|i$jTPD+Ih^ot^mX<9`Q%ka=
    znnoHM4yjqDYB>Fom(>=+TJAn}h$_J(kA1j;6Ob
    zl=nsjxDN+J6?LI0(jW&U-}3*hAxGsS{-m#?j)eH2J%r;jVWJ_@8F&TqUeoW0-YuQ7^rjlF{Ihkfmo
    zP!}pWUmwUi>-%#K?M6=0*JKbernq-v+U{!tS?LI{j})QKeT%-^v
    zOQp+4f%N?a%bOWd*%9b{q%gtC^H7mf+*R(zk4-twjH3zeJQ`=_zlhi8Jv}kjJ~8UyP{e)OoAs9{rjxT(X@*u`%cmQs!>j3S~lrEJ3T&zjkJv&
    zhq9Vkl3_NqR7m+Y^
    zKcyPBBWqf5V`)({%VqF{mKLE^MQ9PZqU|Way23b79qh8E?S?efz&5sA9#5!_D>fZ<
    z!{GP^6h}@JkB^MFg4Yn}3ToOF6nwE-CLwB<*JahniiCD!h?A}q4Oz!cr0RTLy_g?3a3D7%*X-QsOSu!K
    zg7et8lGoIWd8_7(na08XfsgVwyid-OOPA#`w)2*1<%`f3F@X-4FKKF?I@oX3NFSW*
    zJ@No-=(3I&xry0{2Gd|?>NEU$3<)jE{PsnD`;$b+QtzRKPe%XdSV3Hm
    zAfa`c-?PZ?S>pG;;9IYcuJVG={;Yf7y+e1IuMr1U
    zrRZE_HqtcGIDGfu-M+@IB`NzJe>-`n>sHs2l%cFNE8T3Hi_S*hu7<$C+w~-hdDdSe
    z7Cd?(#phzPv4yRJKgr9|u|?_F+f{)o-q-^Wkq2$@&obyiIy1BrJK1UaKck24HwnFc~SjvQT^|HtDxw-1a`asyNupv(ff`OFTdT?2Wy%iH@lgio$o6l
    z8L{_yw3}tI<$ZP4Q8l|+SK%^tMw8QxtiM5`UncztE8tba({~tf1Tq+W$P<
    uHPf*i?ph3YH9meE&P-`~LzFHzpPU
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..1c2299cd4760041151319e4a7d1987454eaceddb
    GIT binary patch
    literal 4924
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..8abb991522832306d4c45cae591cd967be20f379
    GIT binary patch
    literal 15058
    zcmaibZFC#gncfTr0|EpHkOT>W5J`GbBOb
    zgPs|RB0|R6)Z3D=T9NB)NHA<_$GqBhJ)dba)t
    zn@Zz&drtejcQ7Cb!OlJ8y?5^1``$bEspb%#jr{S@**zThYkIJPSjcSb
    z<2i1gleqy-=4D%gAK+PP8?dod7!X)$AF#7j91xKT2}iPOpo*t9_JlL(8gM162db0q
    z0e8|f;7QgD)FizF-lT89$LffQ+GO289m_is^-2GLKiM$Qz@DoTjmf}3AlWp~#B(-I
    z;YapagWOD&=Jzm83Iib<*U!n$H#ym**hUVUrKRzEg84Mi!fIBdrdw$#mbS7|4@zs$
    z{>jpoX1-W+JFDqMO`o#8SSn4}!nK*;Gf_>E(xZAjosveQs-~!trs!j%9}$rYVcu|R
    zW22+0qG{nOLpYh5Fzlz}G2L+WD=9^d>S@)mpO0(0;k=N35e?Op;k?MmMH7bj(%5K1
    z0g;-QFPyt@@sBPO30
    z9dCND2dWguh_{rCnV0Q~bI^{}u@AUhoZR%e^<0WmuEsyrcgpTJ#er(sQ+T$^HE8da
    zy~SrAo;`A{QlmJV(NUq7I+S|l`m$0#N_}zz+BO#2JLCY$YNxqt{6O6$E*v!cUs4ra
    zpE#o=MxRTo$*8U?YUZ(%64p!Co&t2~Tq(x6q3a
    z(-qZlMnEC1MCCha3svn*7u
    zE%S5;tjXcA-A77$EztM^niXo7)6}c1p-kGXo@CpV)0pOZjMZYARwbmeZBlrzu*hso
    z?vj^0P7uE%)6mCGW%8V0dXq
    zHrT!D>3QJxPU~+yG5h*Ak6ShPg~O|!ohIR|yLHvQea+uIe{Am9vVYIAXAk1FK+Ak;
    zE_FX}Y{~Is_Z@ex>xpdF6DwWEru!`-RquM=@h*@D!sLWh~1m1ccw9Y&)Ggury&^|SH&G!u<$zQ97`%p1$jHuDq2
    zF%2Sb%Lfq4Vjqw~hO~@|QiZF;X!W8FF+!WAENn_5*=Di0_X-kg$~I}kv`A6q%{!Uy_F=SwTzm#2j_U;T8oxt{KlFWa)Jv@&c}|0goEE!8WVx*{}(
    zg2=(kVvu=jl~ic(Q?`^%7O+nINO6^mRiR54SCRxzQS5EjC<+oDy;Tr=dQs3-5@{uS
    zN3=#Y1^xFsoa~t75!=6K$1{J4o2Y`OYS@#}I832aBp*_;X1GspuDHQht0yrqmDFB#
    z`e0jC4M#O7@L-Cju4gzB#ILc)*iJ~*XQ=WiiXgqQQ_VH+M;`1ndRa+qUG@6Hs+X)s
    zX4e<2eM!CNKvR1i(RJ=u?!W_IU{;_1+T7O`pIi0qT?_7<6W4>Cv*LQFGZ*U4hPszt
    zS_vJPK39BR3H8!bTQ0OW8`}HBGe5p~=iMI|;@s+YuUJlanQk_{Ubz%o!E%s0vC%ghN97^nOrr+Ds8mNY@(D6MNmsSiU{nz@8FL!
    zcQW@nR{Ne>X?Qx@_tc_3`^tj+_G`<1Pffd)8=i*NeRE=FVxf7(*S_p*|NSQd*Lad=
    zHq^H~2kl{7MwFiX+SG}Rty>D$lL?lJCY4A8+C?Opmd6s5_e3JEk3|!OH&u~{oQ_2z
    zsvTosR*~U^s=yA9;V?y;A>in!5Plrf6;xtvD(!BS&cFI1MK4oCpKR0=jJueUNJJuc
    zcy$L#HCn2t&50rHRHcXvLhVCDpT5cc+Ma=UKY$@@$BxlYdMQw=bdtBulXk
    zO7hhX(ZAT9=a4M5Z%~r2trY`H!*{hi$vlTFb%rG0A&P;;GfS6ly+A_?+ywz7d9O|E
    zSoG&PBugNTbM^
    zC29;xAzdFW3Z0%zXlcm=tRw=gBm%4?09KMdF=|0<8Y9mvT(tpnwM9Y}^&T5!A;VWV
    zNIR~Qq4}rNdXeo^uAy7Y#aYryGmWx}^eV~A%5+DZ1#_@+&lTv65Z^5e
    zV5Jo(Ta0wdrWZ}k84>6aj_#(!CdR710t$3)%R)gp?k|~7n@&r^f;D$4C=BuFWpmbT
    zdZ4_P23Agb)WiNO-63@G$q{FZs#Ti91+_ELwNbc^I@-g
    z0ridQxCYBgkEUXZg_oA@eWNyF?)Qkb)eWbWQx6gW0g#u<5Hzp3`>mSHx>D(|lWZV6
    zO;tt{(U_vrq?X!chPOb{H0w0O#c((#4+U6yCd(|^Y1d7@nFf_i_ZJ@b-mN1_qJ{Pg
    zM1Zi?np>y6Yi{4oV>8E=-8&!nTNmVaue@_*b?@<2|A}SKiDmzZg58w!bY(qVOASBX
    zc4u2Id^{UIzUn#gi22pJ!G`Ye{&COSkFjhZww5hLtLGlbFfsJb5=SW4YE@|&|{h-SU5`kdi60huk7
    zGrJz0^WF;e{tO*xXAr>{baHjOX6?D!&TMVxqP|>vcO)CK%+Od^8LTyY)YpyNXv46KUlQDC^A
    zV;WA{D(wtQbnqNwxUeOlg+AG@(9&2a9+ZLtIHz?(^v4oo1&x8+DNqH>)sf6u@4XNf
    z40mC{h=NK`i{XH+0GzB~uNeYdX$BwH=!=UMy04^F1f6DfR#=^~Idw0MfuWQWJwXfE-PoG@#_-;Nw^Ze}V^HXzEA9^~$gX%ko2l)#o`-QNl
    zj0YJ4d=I8xO^nEJUu3(mpSGkrMJ3KrH4R^hKB3Y{Fgevfr5qVyCU@CMxvN(6CNkQW
    z5xvRfZ7#8K%^%1Mly2W?roH=Fy6&pWxmvTX)(sJF^8wD`&4Ziy7aJCbZ>MjivpWud
    zLb~pTfH%bF{AO>|Q4IgZU>Wlp>nM6uTa|_H@^HVw9jJ)1Lvg^t2X~+B8mwlzYW17m
    zfhxFLofTCE58BjFeZ>yG=LO%ZM&7NU93?j5bFvGxgaXGSw_gq1e%_Mz&eA8i8p#Rh
    z0~P0pgyv-dT(chU>tsKAb}IF#-+*U7)217+a~stwXp+$iIohcBP;PGwn21>X`+a1s@{Aw&1mjtLYTEwxS6MNOnAW8SkDWA8}kuCkX#$
    zyvVSViKb3tM9gc(nD?eDk$7a0dlSS*sxG)EN8-;6rD~RSPVv6LU7^}l#Y{C~hNPwOuqx~`iXOnq3eI+r$!x1&k613b
    ze~k*-VMNep@?Ng7dD?!%^&rr`cxENggS>m44CHT4KrNV_c+>-D?(q&9tZ+q{P<7-LF4I?j)C*MwKOaXu_u$aI}dNeVgrrF1Md23t#(|y_Vj)F
    zz}J-Xb!B~BpKvx;@PVgpx#7usm+n2gT>s3f=hOqR=`%BDX1`2sh=0tBsPdUcO4K*%
    z8n|!yPc{g*+fVw0pZG*%x5!Ug`*!?q{0V0J9Ojxi<}02M*)}8)ND17@7K3I4+zGA8
    zWEtY#w%w=#=0pH%MH%}=dJ^O>Oq4&yZUSZ{PKsKSPBs7wm7rE!7bww{Zfu8V&*Ils
    zGo*A`!`iKkwqvSl5@739Xuvm~m=q=*#9u2Ki&c~2V9D;g@g{Z7F!!eXdUydd+;!!ZfqnRUThf?WB
    zx2l9=D(&vnc1uw}5&CZ2!l0c=sDzRn)hBulzLz=H!c`_GdJCUoh`0rigli4p=Mdau
    zqO4pV8&U`GO6^4yb}}f>@TPI4LygNyB(2KG5uY+@G$0hX3lTACxUENvUl>(|61Md<
    zC)z;&V1Zd_h7_SI5sacDN46Y1lV;{%B@Xuo8vT3pqpc$P-;DP;xoz!>r*EIVb#`fd
    zx%tSn_hTowbKizwJ68Sk9eoQ8)2C;5&YW3ngO=h70F*jb4OL}F=WX{bcTU=$mG=L=
    zbTI2_nLfAR|CK-Rpf)h?ne(hQys*}={h=t-)svFiyuNK$Zd-SDTldnXyE|64JvMWG
    zx_|Z(d7gUj`?}U@TNj41wYze)J=xlxCGGC1rI8P7pU5|HJ09C;fq@1$TuXRq_iD?5
    zIp?f^hJogVgR{eLdp{Pq)`N(GyMF&kJBIdqEr1XEM#D2b{I{#0>9Q}Lr0h=)J&sr<
    z6Lt%{L%fpl=yf~s=uPKGCD#YeAZnEdi=RRk5+xQkc`z{{3hV?|I8WC5)7&io+J7nR
    ze1X|T6#y4-dxk|@ebTwU&fjQ*XWeV|QyLc_9&rTnwmitfRZjJ~INfi(*@Qi&?6Z6-
    z4w{wPIhfy4)9IMAPy);pB+DW2yUKKBTus_^^P$!sqEZ2rnX*4Z1;CCO0ON$Lyv3zd
    z+)y5-gxLALqRWcsQvdKdbKqigupbk+`3A2@rk;a5?a7N9y+H^k2>T|1-SZ`6#u*s@q07AAN@w750g>
    zn_wY}BfB4MRs14wXh&S@`gd9Bb9*#Xm51S<`3;cv2+){%H4R)(#zVp
    z{gAWcn8{ah#&{a@_f3th!kZiBn}W1-jB{a6=KBorE5Pq2*kR$3(s&#IIg^N*iIWqk
    zZi<{ui=*0-PxP{2ee_DF(`1jpMAvoPmC;6(SRCfaFu;5`vxeBMMgW&Oysr#+hueOz
    zNXWE{G^vZsb1mGPvGw#^fV-?3o(5Hk=qhfixXt`vG@&V(5DDy5nlJ&3HZB*WI6Mea
    z=3>G8@0M_Bhi=ibu?$Y2E?rJlfccm*KM}v8NE5i$mr8d_)JGp9E`iAYzJ0(EG#%GC
    zdJQp_9xGg0%>1)*;)PnpP87@_?&?M{x>Qd}8G6wZm}6fJt1&@he37CV%;IA50
    z*fG@ECdQ^!qmi{S3pXs(1j;h)m9(QWNdCW}qIMSY;X3!w!!>Ou&)=eaJ9#U)5_pX4
    zzy}RYZ$CTjS`W75g2%JLx1*HbFGWJ@7IMNG`4dtv2n2%Jk)bH@?;ooPU1q`L%6r3!Tf`
    zpSah4uMz&qrw$`(KKxrjYz*W*R$pEB>u~F-c|JZDfBVX;@bgp8tpxgia`0YsR?jts
    zvrXZpU3c5>zW!m;6Yn3K6|#Z;wYnxY$UXP#y4RXo=iiunW4Y?`wMo%`yFXGcEDbInil8#2!|v`(LT&_W9Cxm)M%`d3;G
    zq28r$z5s2up%s*9h1Yyd)4oq1zQA+Aou6=GU7+Gb+MYTD?YH^R{}Jq%NCDM8`<)kS
    zlWh!t_79C=B>(r50M~Se*Y;sc{p6_o%wF41J3VLX#Q*B_oNW_-)*U*#*YUw#>8w}$
    z+ZvwYI`Ql_*Wb2@XS-Zm>_ki9v@MI0H4dg37xlnRx>h~N<0~YO;kYa6cAK?|+D=gi+!NARG7K^;C2?!i
    z1S<=mq&i^A~!`biby0F_E>s!
    z0*+Y{TM(fI4~)j-p_-y0FQvARMqUIgUD1B^d|K`;;H-=tWi(Yx4LCB
    zofTx!qt(1HqO^yg$y^Av4Y(M8-?!&C{%!M5%{{gF*zM!Dj<5LlFMIaq9fGT`=woex
    z0lw;KgQ?vR%=x>re)71s-f7K+k7dKhR>Ej>V%oVzjB{@`u=nqQa6b2l6Bf5#5_5^g
    z!?%y!I<^w%o9-vy>h2#L{Lr_%jG=e+=DLn%yN=#F@_zqH*ZEoJLg3wP?`*qY+nINB
    zO}&t#wZWTj%)GI1ZN=BM?CkpVVIx-y*2TJrzpS8|@-tf%)M^8#Ld
    zrjd2_qtI!A`RCLscxcJC82ZrJ
    z%}{B$9$rJ6atF4Z%IF{%c2b5JtX|^PW_leNIx4ACOkq@MirKMI*&+MS^hi^p(y%Lg
    zzrn0I=K1(n$Y}o^5%YfY;t}XMq3xfz+~S^fUwvLgN=~x+d==%KoWChg@1R1#59Owu
    zhpYDfwuW*cQ4B7gxqb20MY=8(yoWnhNZvoik`GSN<*8ua8xps#yXt2TE%+B=3qc&0
    z(@P!8{@$#sZ$rep{NpFY;8MdLm<
    z0k3>G-)$3n7TArfp2Z+t#p*GEfBMYu4t6uZs3L3-oY9=j7McLs1?nk8Mm6+dx{HAy
    z7cq6(aNzC{Rc6b0?o5_D^S`*qf61NwC3kw=6`F3!xk6c2XyNe{SI2e7L&rs)?^x){
    zg&xm_9)HNu(?i+T$~P}}9C^qgefTu*=lu)8Tyt->x%VN5hlkzgZG6vi^WNWblwo81
    E|EJ}b;Q#;t
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..671e1e36131bde7dc2f4948398225ea8ff6e75d1
    GIT binary patch
    literal 3862
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..b031a26c2bf8ae71ecff77d01aeced1ee174c8af
    GIT binary patch
    literal 7851
    zcmb_hdu&u!dO!CybLZh1zwH@=Jz#^G1Z)U|*Yena37Ak*g>-2gcBjMKJ9x}I+;gvS
    zX6mSvBGqhD!FHoyw5;HtN<>lB^si>Cl{QKL>_48hEsrj)iquqU{~Iz?S+%RG-*@g~
    z9*kil^}u}R-0wW@x!?JHkMsGTTUxvX%Bk3;EC1U;$iLx(U1Y0KImZ!lmncNx(qz)C
    zxk-*a^OHQQg-LCVWLGKX`7v?t@8^s=^?_GSE&eva@&<)_2;
    z3#+vn_!QoWWirT<(?pSO62`Ka4yy)cu?!b``q
    zx=NGrglf2`s?XBwM8c9gTNLGu(yer}rFEyzmd6e56K>)Y&ghuP>EoH1w3>k}s>&%!
    za}?O3rlyk`&WikZZgeV_QAabgQ}IkDu8fZ560ts$*N7d}L(RAwa=uBRp%4PSC?0IceOX=#anRw!A{EDiL&ZK5WK`ihIAhFRzIyI`9
    zpQVk=(h+0_@uPe|u9Nk^mgT_Uk~~;}M`HMsDOfC~fuLu#gatV40j$1M
    z7}O7AXbX@}c-o5XE+87tj6`S~RE7)IPia$yp6B*ucC_Ox&_qHzfxt4TpA%7+A;)6b
    zct(xI3~wx!$tkmGZ2M!eKc0=J%^r%A4MEc>?ZwIF8tlE)0}Mt2(9lrjZjuVmNke59
    zkcWHA1gb~-o?*pa%?8&24VS=D`6D1zpm_-XQ(6>W6%;`gRY_%lc}_7
    zc=0r2iK#f%jJ^ysXJ?eSu9~R0h6kx8a#=-7NVs#WV4J}@0?@om=DB$iv-`+Af4xA-NE$NB7;sKRLWGR_Y1?)4RTT$5M1`dGo0S
    zaYYW7LjAxDeBC$n;P}1cj}9;Q?MHs^6WM>;d&|2f_ZH>e#g6-bx;(JE7~1{WzJECS
    z_eYDN?|*Ti7&^Nmzg6n)SrGrq#}o~PhsK6!dY#2_aQcTPPMe+~<@JgEDcp4?!Q093BM{lqaB4wVh$IEwEo2#O%MrRx@;0|2{D;uneCcB~7DCZF4
    z4sNT1rX78&@~U$H-@=5!$#gsPMrFDSD*76dSCH%hVhCw9Ye>oTtTsh=B1598rs`3_
    z#Ns|=xh{iKnw`>%rH(B1hJ{LyOygdKIAR
    zt6KpPEc@5wa8VAg$&sQQS(UdkFxI($2Y>frhhQh0q$rI*xqb~FG>?4XRdHOw=YlvC(eVy)xCPgfm@rdaa(P0*Pnj82}Y3#$K$)@`)F*jb1f7thN8=z
    zudK?intl|mbe&owM(|hp9LP(=isKr}yrVD-@?t|bJT_Bo<>j*+cT-)_J}z(z=<=Kn
    zOKrUGfI(&|gMzNA3`MC?W?K;#mPuwoNmFGoJ;E^O=!swp35Lg78pusjmdW67DZJ&$uGgNnv`f8D+B(Y;)S%J9o;!4L
    z@F#P{z(CoJESYrmmOa?=lkKloaCmu#R~lTrP$p14e5Zm{rB{-6mIE%SAEPv=FiL~U
    z+z7rt0Y9hMDpffPtZI~|_!JIeEFLZca3x5(;4&ahN{S13_$(@Jh`U^hUy-49D;|fB
    z@tK?#!RL2PO=XC&
    zLla92hQ^XUlPy0{aBb5LN49CTmX;oZ9UHE6?#dO2^~6**nPXy)S{ESv)Y=OWeG?dk
    z%^L{TjNaeIIj;k0@QMvSYen9=E(g%?-Z`_VJjmS3Jo>?^ypM^v&W|}LyasD-DBb^O
    zKUQmS0hu7ZR!vW((-AtG&8D(fAexSfRgXoF!rqv0nmeg*bBUp!x`^T$F~#+AKLto!
    z>Ka~^cbHIo&O13!{K3nG^NsT&&<@*)K@1
    zFDA+as)tGitBO~WqUC^S8h)tI@Iz%D94?)JpHoDuRl!K7#_%(UW6NOR4(bdBI^sfS&5hErzeya52LK1X^E6(-qNTy11#wjlJ#Pe@PrzAsNi~->
    z4bP3mj(a`;G&eW61u&RqBB0sT>gpvzE?8lyV2FAuqtf4pm(cS-EYD*I+1#8VDQa4e
    z*ZUqc1%Z-a|$B
    zA3U@qA9{f(_QQ(5t0-!3XLiKRQ#94)moT$viHfh;4g?}Ho|m?LcB)LE`W!S1sPmd5En28;aB-b4mFxXvB9HRzU$?O?s>68w$Z2KHdtwPvAqgm
    zEcNRscUI<|B+dt1)~92(@j1SS=$Kn%<;DBAL$KH3Tj#ltg}WTf+(Rbc&Y~l~X$q?5
    zrjZAs?SUKD9M6$=VI_`y*!RBhE}7#7iQaARWC${z8?IIp;N2iPhT*Kda88Zyxk2WL
    z`NqE$=D4UhVTejDs~U15o=vD}$U;dfW~-wu6#pVX(Qg>8lor?ZJVmQ*v_bOyR5Gcu
    zJmfj`nwmD;818@%H^lLYH_x*x05kPQ%T!8%EPX67OSPPtg*DpVQuCK{ajLM`na0m|3Q9pojeN=+4mQPKP#-c
    zdyDSg6?gdlwY7l*#eoCM1BZTj@mH6Aap~6s`&J-<;c`3iwB8Qf3f#H2D))ce0j#B#?f>(&Z__uR
    zI)RcLWSs?wzDjb-y05d2J+~qc0J|)~(BEokUv9k7ce0QBvOjcUEBW$(bfR1M@`w!W
    zuf%rXf7LCW7;t~p=SI%f{U>{cf9e&0UvTxkcl@>2(^fsjl6?@~Pt^Z`0)rK%mOGlL
    zC6yHNF^9lq84C1Y4aHV8x=k1Du4b2Kdz>yiqa4+=IfPst1N_v#v!&W=w{%Rvvtp|l
    zhv{?jF^@Y1XVYvB8q9_{s9L}K=vpN(vn3viHjTcA1aVHmWfA&ABp5)MsW0D|@v&2}
    zlYj8`h4XJ4z6)p0U$h>g96OQPTnc6fD3aUo({MEg(*Kf)99#!T$ON3$d$->E@Q3%4
    zYyJC+{ri{u5B~DNua5lU$glfP!w4&X_0jhLLuFp@3_bR@J@L2RK6~rzM}M;FAN)N
    zIx{9>yueni1&g?hfVIU;JR65Al$nh{U8m^7Xc7q%ZGG~=kdK&u1Ug1DFa+RFv=ty_
    zf#bNxr0p?jeM|z6iT5$_{VRE;NM8AOGV(9vz!Oh+p=Zq#E_%X?2bVoV*InPbByQ*_
    z0rISMgzH}lMV}F_<$
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..c97ee736873ace150bc960bf76d10c823a73cdaa
    GIT binary patch
    literal 393
    zcmXw#&rZTX5XQGa1u=~fF_6gFghN@-t1-d03K3h=QcN0?P3cx>?7y(BNpHM`&)~Co
    z!CTX-CvGO(Jh=_{9ey*Dd|zfVpBz^OR1$igN3?$D!@rn)vu)Gn9bjMp%oq$V7zJE3
    zinwHyFl(^ML8rXQt(!csDdZ^TDCKBU$en|%tm%RvXL None:
    +    """Entry Point for completion of main and subcommand options."""
    +    # Don't complete if user hasn't sourced bash_completion file.
    +    if "PIP_AUTO_COMPLETE" not in os.environ:
    +        return
    +    # Don't complete if autocompletion environment variables
    +    # are not present
    +    if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
    +        return
    +    cwords = os.environ["COMP_WORDS"].split()[1:]
    +    cword = int(os.environ["COMP_CWORD"])
    +    try:
    +        current = cwords[cword - 1]
    +    except IndexError:
    +        current = ""
    +
    +    parser = create_main_parser()
    +    subcommands = list(commands_dict)
    +    options = []
    +
    +    # subcommand
    +    subcommand_name: Optional[str] = None
    +    for word in cwords:
    +        if word in subcommands:
    +            subcommand_name = word
    +            break
    +    # subcommand options
    +    if subcommand_name is not None:
    +        # special case: 'help' subcommand has no options
    +        if subcommand_name == "help":
    +            sys.exit(1)
    +        # special case: list locally installed dists for show and uninstall
    +        should_list_installed = not current.startswith("-") and subcommand_name in [
    +            "show",
    +            "uninstall",
    +        ]
    +        if should_list_installed:
    +            env = get_default_environment()
    +            lc = current.lower()
    +            installed = [
    +                dist.canonical_name
    +                for dist in env.iter_installed_distributions(local_only=True)
    +                if dist.canonical_name.startswith(lc)
    +                and dist.canonical_name not in cwords[1:]
    +            ]
    +            # if there are no dists installed, fall back to option completion
    +            if installed:
    +                for dist in installed:
    +                    print(dist)
    +                sys.exit(1)
    +
    +        should_list_installables = (
    +            not current.startswith("-") and subcommand_name == "install"
    +        )
    +        if should_list_installables:
    +            for path in auto_complete_paths(current, "path"):
    +                print(path)
    +            sys.exit(1)
    +
    +        subcommand = create_command(subcommand_name)
    +
    +        for opt in subcommand.parser.option_list_all:
    +            if opt.help != optparse.SUPPRESS_HELP:
    +                options += [
    +                    (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
    +                ]
    +
    +        # filter out previously specified options from available options
    +        prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
    +        options = [(x, v) for (x, v) in options if x not in prev_opts]
    +        # filter options by current input
    +        options = [(k, v) for k, v in options if k.startswith(current)]
    +        # get completion type given cwords and available subcommand options
    +        completion_type = get_path_completion_type(
    +            cwords,
    +            cword,
    +            subcommand.parser.option_list_all,
    +        )
    +        # get completion files and directories if ``completion_type`` is
    +        # ````, ```` or ````
    +        if completion_type:
    +            paths = auto_complete_paths(current, completion_type)
    +            options = [(path, 0) for path in paths]
    +        for option in options:
    +            opt_label = option[0]
    +            # append '=' to options which require args
    +            if option[1] and option[0][:2] == "--":
    +                opt_label += "="
    +            print(opt_label)
    +    else:
    +        # show main parser options only when necessary
    +
    +        opts = [i.option_list for i in parser.option_groups]
    +        opts.append(parser.option_list)
    +        flattened_opts = chain.from_iterable(opts)
    +        if current.startswith("-"):
    +            for opt in flattened_opts:
    +                if opt.help != optparse.SUPPRESS_HELP:
    +                    subcommands += opt._long_opts + opt._short_opts
    +        else:
    +            # get completion type given cwords and all available options
    +            completion_type = get_path_completion_type(cwords, cword, flattened_opts)
    +            if completion_type:
    +                subcommands = list(auto_complete_paths(current, completion_type))
    +
    +        print(" ".join([x for x in subcommands if x.startswith(current)]))
    +    sys.exit(1)
    +
    +
    +def get_path_completion_type(
    +    cwords: List[str], cword: int, opts: Iterable[Any]
    +) -> Optional[str]:
    +    """Get the type of path completion (``file``, ``dir``, ``path`` or None)
    +
    +    :param cwords: same as the environmental variable ``COMP_WORDS``
    +    :param cword: same as the environmental variable ``COMP_CWORD``
    +    :param opts: The available options to check
    +    :return: path completion type (``file``, ``dir``, ``path`` or None)
    +    """
    +    if cword < 2 or not cwords[cword - 2].startswith("-"):
    +        return None
    +    for opt in opts:
    +        if opt.help == optparse.SUPPRESS_HELP:
    +            continue
    +        for o in str(opt).split("/"):
    +            if cwords[cword - 2].split("=")[0] == o:
    +                if not opt.metavar or any(
    +                    x in ("path", "file", "dir") for x in opt.metavar.split("/")
    +                ):
    +                    return opt.metavar
    +    return None
    +
    +
    +def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
    +    """If ``completion_type`` is ``file`` or ``path``, list all regular files
    +    and directories starting with ``current``; otherwise only list directories
    +    starting with ``current``.
    +
    +    :param current: The word to be completed
    +    :param completion_type: path completion type(``file``, ``path`` or ``dir``)
    +    :return: A generator of regular files and/or directories
    +    """
    +    directory, filename = os.path.split(current)
    +    current_path = os.path.abspath(directory)
    +    # Don't complete paths if they can't be accessed
    +    if not os.access(current_path, os.R_OK):
    +        return
    +    filename = os.path.normcase(filename)
    +    # list all files that start with ``filename``
    +    file_list = (
    +        x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
    +    )
    +    for f in file_list:
    +        opt = os.path.join(current_path, f)
    +        comp_file = os.path.normcase(os.path.join(directory, f))
    +        # complete regular files when there is not ```` after option
    +        # complete directories when there is ````, ```` or
    +        # ````after option
    +        if completion_type != "dir" and os.path.isfile(opt):
    +            yield comp_file
    +        elif os.path.isdir(opt):
    +            yield os.path.join(comp_file, "")
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
    new file mode 100644
    index 0000000..bc1ab65
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
    @@ -0,0 +1,231 @@
    +"""Base Command class, and related routines"""
    +
    +import logging
    +import logging.config
    +import optparse
    +import os
    +import sys
    +import traceback
    +from optparse import Values
    +from typing import List, Optional, Tuple
    +
    +from pip._vendor.rich import reconfigure
    +from pip._vendor.rich import traceback as rich_traceback
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.command_context import CommandContextMixIn
    +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
    +from pip._internal.cli.status_codes import (
    +    ERROR,
    +    PREVIOUS_BUILD_DIR_ERROR,
    +    UNKNOWN_ERROR,
    +    VIRTUALENV_NOT_FOUND,
    +)
    +from pip._internal.exceptions import (
    +    BadCommand,
    +    CommandError,
    +    DiagnosticPipError,
    +    InstallationError,
    +    NetworkConnectionError,
    +    PreviousBuildDirError,
    +)
    +from pip._internal.utils.filesystem import check_path_owner
    +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
    +from pip._internal.utils.misc import get_prog, normalize_path
    +from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
    +from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
    +from pip._internal.utils.virtualenv import running_under_virtualenv
    +
    +__all__ = ["Command"]
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class Command(CommandContextMixIn):
    +    usage: str = ""
    +    ignore_require_venv: bool = False
    +
    +    def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
    +        super().__init__()
    +
    +        self.name = name
    +        self.summary = summary
    +        self.parser = ConfigOptionParser(
    +            usage=self.usage,
    +            prog=f"{get_prog()} {name}",
    +            formatter=UpdatingDefaultsHelpFormatter(),
    +            add_help_option=False,
    +            name=name,
    +            description=self.__doc__,
    +            isolated=isolated,
    +        )
    +
    +        self.tempdir_registry: Optional[TempDirRegistry] = None
    +
    +        # Commands should add options to this option group
    +        optgroup_name = f"{self.name.capitalize()} Options"
    +        self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
    +
    +        # Add the general options
    +        gen_opts = cmdoptions.make_option_group(
    +            cmdoptions.general_group,
    +            self.parser,
    +        )
    +        self.parser.add_option_group(gen_opts)
    +
    +        self.add_options()
    +
    +    def add_options(self) -> None:
    +        pass
    +
    +    def handle_pip_version_check(self, options: Values) -> None:
    +        """
    +        This is a no-op so that commands by default do not do the pip version
    +        check.
    +        """
    +        # Make sure we do the pip version check if the index_group options
    +        # are present.
    +        assert not hasattr(options, "no_index")
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        raise NotImplementedError
    +
    +    def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int:
    +        def _inner_run() -> int:
    +            try:
    +                return self.run(options, args)
    +            finally:
    +                self.handle_pip_version_check(options)
    +
    +        if options.debug_mode:
    +            rich_traceback.install(show_locals=True)
    +            return _inner_run()
    +
    +        try:
    +            status = _inner_run()
    +            assert isinstance(status, int)
    +            return status
    +        except DiagnosticPipError as exc:
    +            logger.error("%s", exc, extra={"rich": True})
    +            logger.debug("Exception information:", exc_info=True)
    +
    +            return ERROR
    +        except PreviousBuildDirError as exc:
    +            logger.critical(str(exc))
    +            logger.debug("Exception information:", exc_info=True)
    +
    +            return PREVIOUS_BUILD_DIR_ERROR
    +        except (
    +            InstallationError,
    +            BadCommand,
    +            NetworkConnectionError,
    +        ) as exc:
    +            logger.critical(str(exc))
    +            logger.debug("Exception information:", exc_info=True)
    +
    +            return ERROR
    +        except CommandError as exc:
    +            logger.critical("%s", exc)
    +            logger.debug("Exception information:", exc_info=True)
    +
    +            return ERROR
    +        except BrokenStdoutLoggingError:
    +            # Bypass our logger and write any remaining messages to
    +            # stderr because stdout no longer works.
    +            print("ERROR: Pipe to stdout was broken", file=sys.stderr)
    +            if level_number <= logging.DEBUG:
    +                traceback.print_exc(file=sys.stderr)
    +
    +            return ERROR
    +        except KeyboardInterrupt:
    +            logger.critical("Operation cancelled by user")
    +            logger.debug("Exception information:", exc_info=True)
    +
    +            return ERROR
    +        except BaseException:
    +            logger.critical("Exception:", exc_info=True)
    +
    +            return UNKNOWN_ERROR
    +
    +    def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
    +        # factored out for testability
    +        return self.parser.parse_args(args)
    +
    +    def main(self, args: List[str]) -> int:
    +        try:
    +            with self.main_context():
    +                return self._main(args)
    +        finally:
    +            logging.shutdown()
    +
    +    def _main(self, args: List[str]) -> int:
    +        # We must initialize this before the tempdir manager, otherwise the
    +        # configuration would not be accessible by the time we clean up the
    +        # tempdir manager.
    +        self.tempdir_registry = self.enter_context(tempdir_registry())
    +        # Intentionally set as early as possible so globally-managed temporary
    +        # directories are available to the rest of the code.
    +        self.enter_context(global_tempdir_manager())
    +
    +        options, args = self.parse_args(args)
    +
    +        # Set verbosity so that it can be used elsewhere.
    +        self.verbosity = options.verbose - options.quiet
    +
    +        reconfigure(no_color=options.no_color)
    +        level_number = setup_logging(
    +            verbosity=self.verbosity,
    +            no_color=options.no_color,
    +            user_log_file=options.log,
    +        )
    +
    +        always_enabled_features = set(options.features_enabled) & set(
    +            cmdoptions.ALWAYS_ENABLED_FEATURES
    +        )
    +        if always_enabled_features:
    +            logger.warning(
    +                "The following features are always enabled: %s. ",
    +                ", ".join(sorted(always_enabled_features)),
    +            )
    +
    +        # Make sure that the --python argument isn't specified after the
    +        # subcommand. We can tell, because if --python was specified,
    +        # we should only reach this point if we're running in the created
    +        # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
    +        # variable set.
    +        if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
    +            logger.critical(
    +                "The --python option must be placed before the pip subcommand name"
    +            )
    +            sys.exit(ERROR)
    +
    +        # TODO: Try to get these passing down from the command?
    +        #       without resorting to os.environ to hold these.
    +        #       This also affects isolated builds and it should.
    +
    +        if options.no_input:
    +            os.environ["PIP_NO_INPUT"] = "1"
    +
    +        if options.exists_action:
    +            os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
    +
    +        if options.require_venv and not self.ignore_require_venv:
    +            # If a venv is required check if it can really be found
    +            if not running_under_virtualenv():
    +                logger.critical("Could not find an activated virtualenv (required).")
    +                sys.exit(VIRTUALENV_NOT_FOUND)
    +
    +        if options.cache_dir:
    +            options.cache_dir = normalize_path(options.cache_dir)
    +            if not check_path_owner(options.cache_dir):
    +                logger.warning(
    +                    "The directory '%s' or its parent directory is not owned "
    +                    "or is not writable by the current user. The cache "
    +                    "has been disabled. Check the permissions and owner of "
    +                    "that directory. If executing pip with sudo, you should "
    +                    "use sudo's -H flag.",
    +                    options.cache_dir,
    +                )
    +                options.cache_dir = None
    +
    +        return self._run_wrapper(level_number, options, args)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py b/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py
    new file mode 100644
    index 0000000..0b7cff7
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py
    @@ -0,0 +1,1075 @@
    +"""
    +shared options and groups
    +
    +The principle here is to define options once, but *not* instantiate them
    +globally. One reason being that options with action='append' can carry state
    +between parses. pip parses general options twice internally, and shouldn't
    +pass on state. To be consistent, all options will follow this design.
    +"""
    +
    +# The following comment should be removed at some point in the future.
    +# mypy: strict-optional=False
    +
    +import importlib.util
    +import logging
    +import os
    +import textwrap
    +from functools import partial
    +from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
    +from textwrap import dedent
    +from typing import Any, Callable, Dict, Optional, Tuple
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.cli.parser import ConfigOptionParser
    +from pip._internal.exceptions import CommandError
    +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
    +from pip._internal.models.format_control import FormatControl
    +from pip._internal.models.index import PyPI
    +from pip._internal.models.target_python import TargetPython
    +from pip._internal.utils.hashes import STRONG_HASHES
    +from pip._internal.utils.misc import strtobool
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
    +    """
    +    Raise an option parsing error using parser.error().
    +
    +    Args:
    +      parser: an OptionParser instance.
    +      option: an Option instance.
    +      msg: the error text.
    +    """
    +    msg = f"{option} error: {msg}"
    +    msg = textwrap.fill(" ".join(msg.split()))
    +    parser.error(msg)
    +
    +
    +def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
    +    """
    +    Return an OptionGroup object
    +    group  -- assumed to be dict with 'name' and 'options' keys
    +    parser -- an optparse Parser
    +    """
    +    option_group = OptionGroup(parser, group["name"])
    +    for option in group["options"]:
    +        option_group.add_option(option())
    +    return option_group
    +
    +
    +def check_dist_restriction(options: Values, check_target: bool = False) -> None:
    +    """Function for determining if custom platform options are allowed.
    +
    +    :param options: The OptionParser options.
    +    :param check_target: Whether or not to check if --target is being used.
    +    """
    +    dist_restriction_set = any(
    +        [
    +            options.python_version,
    +            options.platforms,
    +            options.abis,
    +            options.implementation,
    +        ]
    +    )
    +
    +    binary_only = FormatControl(set(), {":all:"})
    +    sdist_dependencies_allowed = (
    +        options.format_control != binary_only and not options.ignore_dependencies
    +    )
    +
    +    # Installations or downloads using dist restrictions must not combine
    +    # source distributions and dist-specific wheels, as they are not
    +    # guaranteed to be locally compatible.
    +    if dist_restriction_set and sdist_dependencies_allowed:
    +        raise CommandError(
    +            "When restricting platform and interpreter constraints using "
    +            "--python-version, --platform, --abi, or --implementation, "
    +            "either --no-deps must be set, or --only-binary=:all: must be "
    +            "set and --no-binary must not be set (or must be set to "
    +            ":none:)."
    +        )
    +
    +    if check_target:
    +        if not options.dry_run and dist_restriction_set and not options.target_dir:
    +            raise CommandError(
    +                "Can not use any platform or abi specific options unless "
    +                "installing via '--target' or using '--dry-run'"
    +            )
    +
    +
    +def _path_option_check(option: Option, opt: str, value: str) -> str:
    +    return os.path.expanduser(value)
    +
    +
    +def _package_name_option_check(option: Option, opt: str, value: str) -> str:
    +    return canonicalize_name(value)
    +
    +
    +class PipOption(Option):
    +    TYPES = Option.TYPES + ("path", "package_name")
    +    TYPE_CHECKER = Option.TYPE_CHECKER.copy()
    +    TYPE_CHECKER["package_name"] = _package_name_option_check
    +    TYPE_CHECKER["path"] = _path_option_check
    +
    +
    +###########
    +# options #
    +###########
    +
    +help_: Callable[..., Option] = partial(
    +    Option,
    +    "-h",
    +    "--help",
    +    dest="help",
    +    action="help",
    +    help="Show help.",
    +)
    +
    +debug_mode: Callable[..., Option] = partial(
    +    Option,
    +    "--debug",
    +    dest="debug_mode",
    +    action="store_true",
    +    default=False,
    +    help=(
    +        "Let unhandled exceptions propagate outside the main subroutine, "
    +        "instead of logging them to stderr."
    +    ),
    +)
    +
    +isolated_mode: Callable[..., Option] = partial(
    +    Option,
    +    "--isolated",
    +    dest="isolated_mode",
    +    action="store_true",
    +    default=False,
    +    help=(
    +        "Run pip in an isolated mode, ignoring environment variables and user "
    +        "configuration."
    +    ),
    +)
    +
    +require_virtualenv: Callable[..., Option] = partial(
    +    Option,
    +    "--require-virtualenv",
    +    "--require-venv",
    +    dest="require_venv",
    +    action="store_true",
    +    default=False,
    +    help=(
    +        "Allow pip to only run in a virtual environment; "
    +        "exit with an error otherwise."
    +    ),
    +)
    +
    +override_externally_managed: Callable[..., Option] = partial(
    +    Option,
    +    "--break-system-packages",
    +    dest="override_externally_managed",
    +    action="store_true",
    +    help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
    +)
    +
    +python: Callable[..., Option] = partial(
    +    Option,
    +    "--python",
    +    dest="python",
    +    help="Run pip with the specified Python interpreter.",
    +)
    +
    +verbose: Callable[..., Option] = partial(
    +    Option,
    +    "-v",
    +    "--verbose",
    +    dest="verbose",
    +    action="count",
    +    default=0,
    +    help="Give more output. Option is additive, and can be used up to 3 times.",
    +)
    +
    +no_color: Callable[..., Option] = partial(
    +    Option,
    +    "--no-color",
    +    dest="no_color",
    +    action="store_true",
    +    default=False,
    +    help="Suppress colored output.",
    +)
    +
    +version: Callable[..., Option] = partial(
    +    Option,
    +    "-V",
    +    "--version",
    +    dest="version",
    +    action="store_true",
    +    help="Show version and exit.",
    +)
    +
    +quiet: Callable[..., Option] = partial(
    +    Option,
    +    "-q",
    +    "--quiet",
    +    dest="quiet",
    +    action="count",
    +    default=0,
    +    help=(
    +        "Give less output. Option is additive, and can be used up to 3"
    +        " times (corresponding to WARNING, ERROR, and CRITICAL logging"
    +        " levels)."
    +    ),
    +)
    +
    +progress_bar: Callable[..., Option] = partial(
    +    Option,
    +    "--progress-bar",
    +    dest="progress_bar",
    +    type="choice",
    +    choices=["on", "off", "raw"],
    +    default="on",
    +    help="Specify whether the progress bar should be used [on, off, raw] (default: on)",
    +)
    +
    +log: Callable[..., Option] = partial(
    +    PipOption,
    +    "--log",
    +    "--log-file",
    +    "--local-log",
    +    dest="log",
    +    metavar="path",
    +    type="path",
    +    help="Path to a verbose appending log.",
    +)
    +
    +no_input: Callable[..., Option] = partial(
    +    Option,
    +    # Don't ask for input
    +    "--no-input",
    +    dest="no_input",
    +    action="store_true",
    +    default=False,
    +    help="Disable prompting for input.",
    +)
    +
    +keyring_provider: Callable[..., Option] = partial(
    +    Option,
    +    "--keyring-provider",
    +    dest="keyring_provider",
    +    choices=["auto", "disabled", "import", "subprocess"],
    +    default="auto",
    +    help=(
    +        "Enable the credential lookup via the keyring library if user input is allowed."
    +        " Specify which mechanism to use [disabled, import, subprocess]."
    +        " (default: disabled)"
    +    ),
    +)
    +
    +proxy: Callable[..., Option] = partial(
    +    Option,
    +    "--proxy",
    +    dest="proxy",
    +    type="str",
    +    default="",
    +    help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
    +)
    +
    +retries: Callable[..., Option] = partial(
    +    Option,
    +    "--retries",
    +    dest="retries",
    +    type="int",
    +    default=5,
    +    help="Maximum number of retries each connection should attempt "
    +    "(default %default times).",
    +)
    +
    +timeout: Callable[..., Option] = partial(
    +    Option,
    +    "--timeout",
    +    "--default-timeout",
    +    metavar="sec",
    +    dest="timeout",
    +    type="float",
    +    default=15,
    +    help="Set the socket timeout (default %default seconds).",
    +)
    +
    +
    +def exists_action() -> Option:
    +    return Option(
    +        # Option when path already exist
    +        "--exists-action",
    +        dest="exists_action",
    +        type="choice",
    +        choices=["s", "i", "w", "b", "a"],
    +        default=[],
    +        action="append",
    +        metavar="action",
    +        help="Default action when a path already exists: "
    +        "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
    +    )
    +
    +
    +cert: Callable[..., Option] = partial(
    +    PipOption,
    +    "--cert",
    +    dest="cert",
    +    type="path",
    +    metavar="path",
    +    help=(
    +        "Path to PEM-encoded CA certificate bundle. "
    +        "If provided, overrides the default. "
    +        "See 'SSL Certificate Verification' in pip documentation "
    +        "for more information."
    +    ),
    +)
    +
    +client_cert: Callable[..., Option] = partial(
    +    PipOption,
    +    "--client-cert",
    +    dest="client_cert",
    +    type="path",
    +    default=None,
    +    metavar="path",
    +    help="Path to SSL client certificate, a single file containing the "
    +    "private key and the certificate in PEM format.",
    +)
    +
    +index_url: Callable[..., Option] = partial(
    +    Option,
    +    "-i",
    +    "--index-url",
    +    "--pypi-url",
    +    dest="index_url",
    +    metavar="URL",
    +    default=PyPI.simple_url,
    +    help="Base URL of the Python Package Index (default %default). "
    +    "This should point to a repository compliant with PEP 503 "
    +    "(the simple repository API) or a local directory laid out "
    +    "in the same format.",
    +)
    +
    +
    +def extra_index_url() -> Option:
    +    return Option(
    +        "--extra-index-url",
    +        dest="extra_index_urls",
    +        metavar="URL",
    +        action="append",
    +        default=[],
    +        help="Extra URLs of package indexes to use in addition to "
    +        "--index-url. Should follow the same rules as "
    +        "--index-url.",
    +    )
    +
    +
    +no_index: Callable[..., Option] = partial(
    +    Option,
    +    "--no-index",
    +    dest="no_index",
    +    action="store_true",
    +    default=False,
    +    help="Ignore package index (only looking at --find-links URLs instead).",
    +)
    +
    +
    +def find_links() -> Option:
    +    return Option(
    +        "-f",
    +        "--find-links",
    +        dest="find_links",
    +        action="append",
    +        default=[],
    +        metavar="url",
    +        help="If a URL or path to an html file, then parse for links to "
    +        "archives such as sdist (.tar.gz) or wheel (.whl) files. "
    +        "If a local path or file:// URL that's a directory, "
    +        "then look for archives in the directory listing. "
    +        "Links to VCS project URLs are not supported.",
    +    )
    +
    +
    +def trusted_host() -> Option:
    +    return Option(
    +        "--trusted-host",
    +        dest="trusted_hosts",
    +        action="append",
    +        metavar="HOSTNAME",
    +        default=[],
    +        help="Mark this host or host:port pair as trusted, even though it "
    +        "does not have valid or any HTTPS.",
    +    )
    +
    +
    +def constraints() -> Option:
    +    return Option(
    +        "-c",
    +        "--constraint",
    +        dest="constraints",
    +        action="append",
    +        default=[],
    +        metavar="file",
    +        help="Constrain versions using the given constraints file. "
    +        "This option can be used multiple times.",
    +    )
    +
    +
    +def requirements() -> Option:
    +    return Option(
    +        "-r",
    +        "--requirement",
    +        dest="requirements",
    +        action="append",
    +        default=[],
    +        metavar="file",
    +        help="Install from the given requirements file. "
    +        "This option can be used multiple times.",
    +    )
    +
    +
    +def editable() -> Option:
    +    return Option(
    +        "-e",
    +        "--editable",
    +        dest="editables",
    +        action="append",
    +        default=[],
    +        metavar="path/url",
    +        help=(
    +            "Install a project in editable mode (i.e. setuptools "
    +            '"develop mode") from a local project path or a VCS url.'
    +        ),
    +    )
    +
    +
    +def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
    +    value = os.path.abspath(value)
    +    setattr(parser.values, option.dest, value)
    +
    +
    +src: Callable[..., Option] = partial(
    +    PipOption,
    +    "--src",
    +    "--source",
    +    "--source-dir",
    +    "--source-directory",
    +    dest="src_dir",
    +    type="path",
    +    metavar="dir",
    +    default=get_src_prefix(),
    +    action="callback",
    +    callback=_handle_src,
    +    help="Directory to check out editable projects into. "
    +    'The default in a virtualenv is "/src". '
    +    'The default for global installs is "/src".',
    +)
    +
    +
    +def _get_format_control(values: Values, option: Option) -> Any:
    +    """Get a format_control object."""
    +    return getattr(values, option.dest)
    +
    +
    +def _handle_no_binary(
    +    option: Option, opt_str: str, value: str, parser: OptionParser
    +) -> None:
    +    existing = _get_format_control(parser.values, option)
    +    FormatControl.handle_mutual_excludes(
    +        value,
    +        existing.no_binary,
    +        existing.only_binary,
    +    )
    +
    +
    +def _handle_only_binary(
    +    option: Option, opt_str: str, value: str, parser: OptionParser
    +) -> None:
    +    existing = _get_format_control(parser.values, option)
    +    FormatControl.handle_mutual_excludes(
    +        value,
    +        existing.only_binary,
    +        existing.no_binary,
    +    )
    +
    +
    +def no_binary() -> Option:
    +    format_control = FormatControl(set(), set())
    +    return Option(
    +        "--no-binary",
    +        dest="format_control",
    +        action="callback",
    +        callback=_handle_no_binary,
    +        type="str",
    +        default=format_control,
    +        help="Do not use binary packages. Can be supplied multiple times, and "
    +        'each time adds to the existing value. Accepts either ":all:" to '
    +        'disable all binary packages, ":none:" to empty the set (notice '
    +        "the colons), or one or more package names with commas between "
    +        "them (no colons). Note that some packages are tricky to compile "
    +        "and may fail to install when this option is used on them.",
    +    )
    +
    +
    +def only_binary() -> Option:
    +    format_control = FormatControl(set(), set())
    +    return Option(
    +        "--only-binary",
    +        dest="format_control",
    +        action="callback",
    +        callback=_handle_only_binary,
    +        type="str",
    +        default=format_control,
    +        help="Do not use source packages. Can be supplied multiple times, and "
    +        'each time adds to the existing value. Accepts either ":all:" to '
    +        'disable all source packages, ":none:" to empty the set, or one '
    +        "or more package names with commas between them. Packages "
    +        "without binary distributions will fail to install when this "
    +        "option is used on them.",
    +    )
    +
    +
    +platforms: Callable[..., Option] = partial(
    +    Option,
    +    "--platform",
    +    dest="platforms",
    +    metavar="platform",
    +    action="append",
    +    default=None,
    +    help=(
    +        "Only use wheels compatible with . Defaults to the "
    +        "platform of the running system. Use this option multiple times to "
    +        "specify multiple platforms supported by the target interpreter."
    +    ),
    +)
    +
    +
    +# This was made a separate function for unit-testing purposes.
    +def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
    +    """
    +    Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
    +
    +    :return: A 2-tuple (version_info, error_msg), where `error_msg` is
    +        non-None if and only if there was a parsing error.
    +    """
    +    if not value:
    +        # The empty string is the same as not providing a value.
    +        return (None, None)
    +
    +    parts = value.split(".")
    +    if len(parts) > 3:
    +        return ((), "at most three version parts are allowed")
    +
    +    if len(parts) == 1:
    +        # Then we are in the case of "3" or "37".
    +        value = parts[0]
    +        if len(value) > 1:
    +            parts = [value[0], value[1:]]
    +
    +    try:
    +        version_info = tuple(int(part) for part in parts)
    +    except ValueError:
    +        return ((), "each version part must be an integer")
    +
    +    return (version_info, None)
    +
    +
    +def _handle_python_version(
    +    option: Option, opt_str: str, value: str, parser: OptionParser
    +) -> None:
    +    """
    +    Handle a provided --python-version value.
    +    """
    +    version_info, error_msg = _convert_python_version(value)
    +    if error_msg is not None:
    +        msg = f"invalid --python-version value: {value!r}: {error_msg}"
    +        raise_option_error(parser, option=option, msg=msg)
    +
    +    parser.values.python_version = version_info
    +
    +
    +python_version: Callable[..., Option] = partial(
    +    Option,
    +    "--python-version",
    +    dest="python_version",
    +    metavar="python_version",
    +    action="callback",
    +    callback=_handle_python_version,
    +    type="str",
    +    default=None,
    +    help=dedent(
    +        """\
    +    The Python interpreter version to use for wheel and "Requires-Python"
    +    compatibility checks. Defaults to a version derived from the running
    +    interpreter. The version can be specified using up to three dot-separated
    +    integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
    +    version can also be given as a string without dots (e.g. "37" for 3.7.0).
    +    """
    +    ),
    +)
    +
    +
    +implementation: Callable[..., Option] = partial(
    +    Option,
    +    "--implementation",
    +    dest="implementation",
    +    metavar="implementation",
    +    default=None,
    +    help=(
    +        "Only use wheels compatible with Python "
    +        "implementation , e.g. 'pp', 'jy', 'cp', "
    +        " or 'ip'. If not specified, then the current "
    +        "interpreter implementation is used.  Use 'py' to force "
    +        "implementation-agnostic wheels."
    +    ),
    +)
    +
    +
    +abis: Callable[..., Option] = partial(
    +    Option,
    +    "--abi",
    +    dest="abis",
    +    metavar="abi",
    +    action="append",
    +    default=None,
    +    help=(
    +        "Only use wheels compatible with Python abi , e.g. 'pypy_41'. "
    +        "If not specified, then the current interpreter abi tag is used. "
    +        "Use this option multiple times to specify multiple abis supported "
    +        "by the target interpreter. Generally you will need to specify "
    +        "--implementation, --platform, and --python-version when using this "
    +        "option."
    +    ),
    +)
    +
    +
    +def add_target_python_options(cmd_opts: OptionGroup) -> None:
    +    cmd_opts.add_option(platforms())
    +    cmd_opts.add_option(python_version())
    +    cmd_opts.add_option(implementation())
    +    cmd_opts.add_option(abis())
    +
    +
    +def make_target_python(options: Values) -> TargetPython:
    +    target_python = TargetPython(
    +        platforms=options.platforms,
    +        py_version_info=options.python_version,
    +        abis=options.abis,
    +        implementation=options.implementation,
    +    )
    +
    +    return target_python
    +
    +
    +def prefer_binary() -> Option:
    +    return Option(
    +        "--prefer-binary",
    +        dest="prefer_binary",
    +        action="store_true",
    +        default=False,
    +        help=(
    +            "Prefer binary packages over source packages, even if the "
    +            "source packages are newer."
    +        ),
    +    )
    +
    +
    +cache_dir: Callable[..., Option] = partial(
    +    PipOption,
    +    "--cache-dir",
    +    dest="cache_dir",
    +    default=USER_CACHE_DIR,
    +    metavar="dir",
    +    type="path",
    +    help="Store the cache data in .",
    +)
    +
    +
    +def _handle_no_cache_dir(
    +    option: Option, opt: str, value: str, parser: OptionParser
    +) -> None:
    +    """
    +    Process a value provided for the --no-cache-dir option.
    +
    +    This is an optparse.Option callback for the --no-cache-dir option.
    +    """
    +    # The value argument will be None if --no-cache-dir is passed via the
    +    # command-line, since the option doesn't accept arguments.  However,
    +    # the value can be non-None if the option is triggered e.g. by an
    +    # environment variable, like PIP_NO_CACHE_DIR=true.
    +    if value is not None:
    +        # Then parse the string value to get argument error-checking.
    +        try:
    +            strtobool(value)
    +        except ValueError as exc:
    +            raise_option_error(parser, option=option, msg=str(exc))
    +
    +    # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
    +    # converted to 0 (like "false" or "no") caused cache_dir to be disabled
    +    # rather than enabled (logic would say the latter).  Thus, we disable
    +    # the cache directory not just on values that parse to True, but (for
    +    # backwards compatibility reasons) also on values that parse to False.
    +    # In other words, always set it to False if the option is provided in
    +    # some (valid) form.
    +    parser.values.cache_dir = False
    +
    +
    +no_cache: Callable[..., Option] = partial(
    +    Option,
    +    "--no-cache-dir",
    +    dest="cache_dir",
    +    action="callback",
    +    callback=_handle_no_cache_dir,
    +    help="Disable the cache.",
    +)
    +
    +no_deps: Callable[..., Option] = partial(
    +    Option,
    +    "--no-deps",
    +    "--no-dependencies",
    +    dest="ignore_dependencies",
    +    action="store_true",
    +    default=False,
    +    help="Don't install package dependencies.",
    +)
    +
    +ignore_requires_python: Callable[..., Option] = partial(
    +    Option,
    +    "--ignore-requires-python",
    +    dest="ignore_requires_python",
    +    action="store_true",
    +    help="Ignore the Requires-Python information.",
    +)
    +
    +no_build_isolation: Callable[..., Option] = partial(
    +    Option,
    +    "--no-build-isolation",
    +    dest="build_isolation",
    +    action="store_false",
    +    default=True,
    +    help="Disable isolation when building a modern source distribution. "
    +    "Build dependencies specified by PEP 518 must be already installed "
    +    "if this option is used.",
    +)
    +
    +check_build_deps: Callable[..., Option] = partial(
    +    Option,
    +    "--check-build-dependencies",
    +    dest="check_build_deps",
    +    action="store_true",
    +    default=False,
    +    help="Check the build dependencies when PEP517 is used.",
    +)
    +
    +
    +def _handle_no_use_pep517(
    +    option: Option, opt: str, value: str, parser: OptionParser
    +) -> None:
    +    """
    +    Process a value provided for the --no-use-pep517 option.
    +
    +    This is an optparse.Option callback for the no_use_pep517 option.
    +    """
    +    # Since --no-use-pep517 doesn't accept arguments, the value argument
    +    # will be None if --no-use-pep517 is passed via the command-line.
    +    # However, the value can be non-None if the option is triggered e.g.
    +    # by an environment variable, for example "PIP_NO_USE_PEP517=true".
    +    if value is not None:
    +        msg = """A value was passed for --no-use-pep517,
    +        probably using either the PIP_NO_USE_PEP517 environment variable
    +        or the "no-use-pep517" config file option. Use an appropriate value
    +        of the PIP_USE_PEP517 environment variable or the "use-pep517"
    +        config file option instead.
    +        """
    +        raise_option_error(parser, option=option, msg=msg)
    +
    +    # If user doesn't wish to use pep517, we check if setuptools and wheel are installed
    +    # and raise error if it is not.
    +    packages = ("setuptools", "wheel")
    +    if not all(importlib.util.find_spec(package) for package in packages):
    +        msg = (
    +            f"It is not possible to use --no-use-pep517 "
    +            f"without {' and '.join(packages)} installed."
    +        )
    +        raise_option_error(parser, option=option, msg=msg)
    +
    +    # Otherwise, --no-use-pep517 was passed via the command-line.
    +    parser.values.use_pep517 = False
    +
    +
    +use_pep517: Any = partial(
    +    Option,
    +    "--use-pep517",
    +    dest="use_pep517",
    +    action="store_true",
    +    default=None,
    +    help="Use PEP 517 for building source distributions "
    +    "(use --no-use-pep517 to force legacy behaviour).",
    +)
    +
    +no_use_pep517: Any = partial(
    +    Option,
    +    "--no-use-pep517",
    +    dest="use_pep517",
    +    action="callback",
    +    callback=_handle_no_use_pep517,
    +    default=None,
    +    help=SUPPRESS_HELP,
    +)
    +
    +
    +def _handle_config_settings(
    +    option: Option, opt_str: str, value: str, parser: OptionParser
    +) -> None:
    +    key, sep, val = value.partition("=")
    +    if sep != "=":
    +        parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL")
    +    dest = getattr(parser.values, option.dest)
    +    if dest is None:
    +        dest = {}
    +        setattr(parser.values, option.dest, dest)
    +    if key in dest:
    +        if isinstance(dest[key], list):
    +            dest[key].append(val)
    +        else:
    +            dest[key] = [dest[key], val]
    +    else:
    +        dest[key] = val
    +
    +
    +config_settings: Callable[..., Option] = partial(
    +    Option,
    +    "-C",
    +    "--config-settings",
    +    dest="config_settings",
    +    type=str,
    +    action="callback",
    +    callback=_handle_config_settings,
    +    metavar="settings",
    +    help="Configuration settings to be passed to the PEP 517 build backend. "
    +    "Settings take the form KEY=VALUE. Use multiple --config-settings options "
    +    "to pass multiple keys to the backend.",
    +)
    +
    +build_options: Callable[..., Option] = partial(
    +    Option,
    +    "--build-option",
    +    dest="build_options",
    +    metavar="options",
    +    action="append",
    +    help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
    +)
    +
    +global_options: Callable[..., Option] = partial(
    +    Option,
    +    "--global-option",
    +    dest="global_options",
    +    action="append",
    +    metavar="options",
    +    help="Extra global options to be supplied to the setup.py "
    +    "call before the install or bdist_wheel command.",
    +)
    +
    +no_clean: Callable[..., Option] = partial(
    +    Option,
    +    "--no-clean",
    +    action="store_true",
    +    default=False,
    +    help="Don't clean up build directories.",
    +)
    +
    +pre: Callable[..., Option] = partial(
    +    Option,
    +    "--pre",
    +    action="store_true",
    +    default=False,
    +    help="Include pre-release and development versions. By default, "
    +    "pip only finds stable versions.",
    +)
    +
    +disable_pip_version_check: Callable[..., Option] = partial(
    +    Option,
    +    "--disable-pip-version-check",
    +    dest="disable_pip_version_check",
    +    action="store_true",
    +    default=False,
    +    help="Don't periodically check PyPI to determine whether a new version "
    +    "of pip is available for download. Implied with --no-index.",
    +)
    +
    +root_user_action: Callable[..., Option] = partial(
    +    Option,
    +    "--root-user-action",
    +    dest="root_user_action",
    +    default="warn",
    +    choices=["warn", "ignore"],
    +    help="Action if pip is run as a root user [warn, ignore] (default: warn)",
    +)
    +
    +
    +def _handle_merge_hash(
    +    option: Option, opt_str: str, value: str, parser: OptionParser
    +) -> None:
    +    """Given a value spelled "algo:digest", append the digest to a list
    +    pointed to in a dict by the algo name."""
    +    if not parser.values.hashes:
    +        parser.values.hashes = {}
    +    try:
    +        algo, digest = value.split(":", 1)
    +    except ValueError:
    +        parser.error(
    +            f"Arguments to {opt_str} must be a hash name "
    +            "followed by a value, like --hash=sha256:"
    +            "abcde..."
    +        )
    +    if algo not in STRONG_HASHES:
    +        parser.error(
    +            "Allowed hash algorithms for {} are {}.".format(
    +                opt_str, ", ".join(STRONG_HASHES)
    +            )
    +        )
    +    parser.values.hashes.setdefault(algo, []).append(digest)
    +
    +
    +hash: Callable[..., Option] = partial(
    +    Option,
    +    "--hash",
    +    # Hash values eventually end up in InstallRequirement.hashes due to
    +    # __dict__ copying in process_line().
    +    dest="hashes",
    +    action="callback",
    +    callback=_handle_merge_hash,
    +    type="string",
    +    help="Verify that the package's archive matches this "
    +    "hash before installing. Example: --hash=sha256:abcdef...",
    +)
    +
    +
    +require_hashes: Callable[..., Option] = partial(
    +    Option,
    +    "--require-hashes",
    +    dest="require_hashes",
    +    action="store_true",
    +    default=False,
    +    help="Require a hash to check each requirement against, for "
    +    "repeatable installs. This option is implied when any package in a "
    +    "requirements file has a --hash option.",
    +)
    +
    +
    +list_path: Callable[..., Option] = partial(
    +    PipOption,
    +    "--path",
    +    dest="path",
    +    type="path",
    +    action="append",
    +    help="Restrict to the specified installation path for listing "
    +    "packages (can be used multiple times).",
    +)
    +
    +
    +def check_list_path_option(options: Values) -> None:
    +    if options.path and (options.user or options.local):
    +        raise CommandError("Cannot combine '--path' with '--user' or '--local'")
    +
    +
    +list_exclude: Callable[..., Option] = partial(
    +    PipOption,
    +    "--exclude",
    +    dest="excludes",
    +    action="append",
    +    metavar="package",
    +    type="package_name",
    +    help="Exclude specified package from the output",
    +)
    +
    +
    +no_python_version_warning: Callable[..., Option] = partial(
    +    Option,
    +    "--no-python-version-warning",
    +    dest="no_python_version_warning",
    +    action="store_true",
    +    default=False,
    +    help="Silence deprecation warnings for upcoming unsupported Pythons.",
    +)
    +
    +
    +# Features that are now always on. A warning is printed if they are used.
    +ALWAYS_ENABLED_FEATURES = [
    +    "truststore",  # always on since 24.2
    +    "no-binary-enable-wheel-cache",  # always on since 23.1
    +]
    +
    +use_new_feature: Callable[..., Option] = partial(
    +    Option,
    +    "--use-feature",
    +    dest="features_enabled",
    +    metavar="feature",
    +    action="append",
    +    default=[],
    +    choices=[
    +        "fast-deps",
    +    ]
    +    + ALWAYS_ENABLED_FEATURES,
    +    help="Enable new functionality, that may be backward incompatible.",
    +)
    +
    +use_deprecated_feature: Callable[..., Option] = partial(
    +    Option,
    +    "--use-deprecated",
    +    dest="deprecated_features_enabled",
    +    metavar="feature",
    +    action="append",
    +    default=[],
    +    choices=[
    +        "legacy-resolver",
    +        "legacy-certs",
    +    ],
    +    help=("Enable deprecated functionality, that will be removed in the future."),
    +)
    +
    +
    +##########
    +# groups #
    +##########
    +
    +general_group: Dict[str, Any] = {
    +    "name": "General Options",
    +    "options": [
    +        help_,
    +        debug_mode,
    +        isolated_mode,
    +        require_virtualenv,
    +        python,
    +        verbose,
    +        version,
    +        quiet,
    +        log,
    +        no_input,
    +        keyring_provider,
    +        proxy,
    +        retries,
    +        timeout,
    +        exists_action,
    +        trusted_host,
    +        cert,
    +        client_cert,
    +        cache_dir,
    +        no_cache,
    +        disable_pip_version_check,
    +        no_color,
    +        no_python_version_warning,
    +        use_new_feature,
    +        use_deprecated_feature,
    +    ],
    +}
    +
    +index_group: Dict[str, Any] = {
    +    "name": "Package Index Options",
    +    "options": [
    +        index_url,
    +        extra_index_url,
    +        no_index,
    +        find_links,
    +    ],
    +}
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/command_context.py b/env/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
    new file mode 100644
    index 0000000..139995a
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
    @@ -0,0 +1,27 @@
    +from contextlib import ExitStack, contextmanager
    +from typing import ContextManager, Generator, TypeVar
    +
    +_T = TypeVar("_T", covariant=True)
    +
    +
    +class CommandContextMixIn:
    +    def __init__(self) -> None:
    +        super().__init__()
    +        self._in_main_context = False
    +        self._main_context = ExitStack()
    +
    +    @contextmanager
    +    def main_context(self) -> Generator[None, None, None]:
    +        assert not self._in_main_context
    +
    +        self._in_main_context = True
    +        try:
    +            with self._main_context:
    +                yield
    +        finally:
    +            self._in_main_context = False
    +
    +    def enter_context(self, context_provider: ContextManager[_T]) -> _T:
    +        assert self._in_main_context
    +
    +        return self._main_context.enter_context(context_provider)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py
    new file mode 100644
    index 0000000..db105d0
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/index_command.py
    @@ -0,0 +1,170 @@
    +"""
    +Contains command classes which may interact with an index / the network.
    +
    +Unlike its sister module, req_command, this module still uses lazy imports
    +so commands which don't always hit the network (e.g. list w/o --outdated or
    +--uptodate) don't need waste time importing PipSession and friends.
    +"""
    +
    +import logging
    +import os
    +import sys
    +from optparse import Values
    +from typing import TYPE_CHECKING, List, Optional
    +
    +from pip._vendor import certifi
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.command_context import CommandContextMixIn
    +
    +if TYPE_CHECKING:
    +    from ssl import SSLContext
    +
    +    from pip._internal.network.session import PipSession
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def _create_truststore_ssl_context() -> Optional["SSLContext"]:
    +    if sys.version_info < (3, 10):
    +        logger.debug("Disabling truststore because Python version isn't 3.10+")
    +        return None
    +
    +    try:
    +        import ssl
    +    except ImportError:
    +        logger.warning("Disabling truststore since ssl support is missing")
    +        return None
    +
    +    try:
    +        from pip._vendor import truststore
    +    except ImportError:
    +        logger.warning("Disabling truststore because platform isn't supported")
    +        return None
    +
    +    ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    +    ctx.load_verify_locations(certifi.where())
    +    return ctx
    +
    +
    +class SessionCommandMixin(CommandContextMixIn):
    +    """
    +    A class mixin for command classes needing _build_session().
    +    """
    +
    +    def __init__(self) -> None:
    +        super().__init__()
    +        self._session: Optional[PipSession] = None
    +
    +    @classmethod
    +    def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
    +        """Return a list of index urls from user-provided options."""
    +        index_urls = []
    +        if not getattr(options, "no_index", False):
    +            url = getattr(options, "index_url", None)
    +            if url:
    +                index_urls.append(url)
    +        urls = getattr(options, "extra_index_urls", None)
    +        if urls:
    +            index_urls.extend(urls)
    +        # Return None rather than an empty list
    +        return index_urls or None
    +
    +    def get_default_session(self, options: Values) -> "PipSession":
    +        """Get a default-managed session."""
    +        if self._session is None:
    +            self._session = self.enter_context(self._build_session(options))
    +            # there's no type annotation on requests.Session, so it's
    +            # automatically ContextManager[Any] and self._session becomes Any,
    +            # then https://github.com/python/mypy/issues/7696 kicks in
    +            assert self._session is not None
    +        return self._session
    +
    +    def _build_session(
    +        self,
    +        options: Values,
    +        retries: Optional[int] = None,
    +        timeout: Optional[int] = None,
    +    ) -> "PipSession":
    +        from pip._internal.network.session import PipSession
    +
    +        cache_dir = options.cache_dir
    +        assert not cache_dir or os.path.isabs(cache_dir)
    +
    +        if "legacy-certs" not in options.deprecated_features_enabled:
    +            ssl_context = _create_truststore_ssl_context()
    +        else:
    +            ssl_context = None
    +
    +        session = PipSession(
    +            cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
    +            retries=retries if retries is not None else options.retries,
    +            trusted_hosts=options.trusted_hosts,
    +            index_urls=self._get_index_urls(options),
    +            ssl_context=ssl_context,
    +        )
    +
    +        # Handle custom ca-bundles from the user
    +        if options.cert:
    +            session.verify = options.cert
    +
    +        # Handle SSL client certificate
    +        if options.client_cert:
    +            session.cert = options.client_cert
    +
    +        # Handle timeouts
    +        if options.timeout or timeout:
    +            session.timeout = timeout if timeout is not None else options.timeout
    +
    +        # Handle configured proxies
    +        if options.proxy:
    +            session.proxies = {
    +                "http": options.proxy,
    +                "https": options.proxy,
    +            }
    +            session.trust_env = False
    +
    +        # Determine if we can prompt the user for authentication or not
    +        session.auth.prompting = not options.no_input
    +        session.auth.keyring_provider = options.keyring_provider
    +
    +        return session
    +
    +
    +def _pip_self_version_check(session: "PipSession", options: Values) -> None:
    +    from pip._internal.self_outdated_check import pip_self_version_check as check
    +
    +    check(session, options)
    +
    +
    +class IndexGroupCommand(Command, SessionCommandMixin):
    +    """
    +    Abstract base class for commands with the index_group options.
    +
    +    This also corresponds to the commands that permit the pip version check.
    +    """
    +
    +    def handle_pip_version_check(self, options: Values) -> None:
    +        """
    +        Do the pip version check if not disabled.
    +
    +        This overrides the default behavior of not doing the check.
    +        """
    +        # Make sure the index_group options are present.
    +        assert hasattr(options, "no_index")
    +
    +        if options.disable_pip_version_check or options.no_index:
    +            return
    +
    +        try:
    +            # Otherwise, check if we're using the latest version of pip available.
    +            session = self._build_session(
    +                options,
    +                retries=0,
    +                timeout=min(5, options.timeout),
    +            )
    +            with session:
    +                _pip_self_version_check(session, options)
    +        except Exception:
    +            logger.warning("There was an error checking the latest version of pip.")
    +            logger.debug("See below for error", exc_info=True)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/main.py b/env/lib/python3.12/site-packages/pip/_internal/cli/main.py
    new file mode 100644
    index 0000000..563ac79
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/main.py
    @@ -0,0 +1,80 @@
    +"""Primary application entrypoint.
    +"""
    +
    +import locale
    +import logging
    +import os
    +import sys
    +import warnings
    +from typing import List, Optional
    +
    +from pip._internal.cli.autocompletion import autocomplete
    +from pip._internal.cli.main_parser import parse_command
    +from pip._internal.commands import create_command
    +from pip._internal.exceptions import PipError
    +from pip._internal.utils import deprecation
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +# Do not import and use main() directly! Using it directly is actively
    +# discouraged by pip's maintainers. The name, location and behavior of
    +# this function is subject to change, so calling it directly is not
    +# portable across different pip versions.
    +
    +# In addition, running pip in-process is unsupported and unsafe. This is
    +# elaborated in detail at
    +# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
    +# That document also provides suggestions that should work for nearly
    +# all users that are considering importing and using main() directly.
    +
    +# However, we know that certain users will still want to invoke pip
    +# in-process. If you understand and accept the implications of using pip
    +# in an unsupported manner, the best approach is to use runpy to avoid
    +# depending on the exact location of this entry point.
    +
    +# The following example shows how to use runpy to invoke pip in that
    +# case:
    +#
    +#     sys.argv = ["pip", your, args, here]
    +#     runpy.run_module("pip", run_name="__main__")
    +#
    +# Note that this will exit the process after running, unlike a direct
    +# call to main. As it is not safe to do any processing after calling
    +# main, this should not be an issue in practice.
    +
    +
    +def main(args: Optional[List[str]] = None) -> int:
    +    if args is None:
    +        args = sys.argv[1:]
    +
    +    # Suppress the pkg_resources deprecation warning
    +    # Note - we use a module of .*pkg_resources to cover
    +    # the normal case (pip._vendor.pkg_resources) and the
    +    # devendored case (a bare pkg_resources)
    +    warnings.filterwarnings(
    +        action="ignore", category=DeprecationWarning, module=".*pkg_resources"
    +    )
    +
    +    # Configure our deprecation warnings to be sent through loggers
    +    deprecation.install_warning_logger()
    +
    +    autocomplete()
    +
    +    try:
    +        cmd_name, cmd_args = parse_command(args)
    +    except PipError as exc:
    +        sys.stderr.write(f"ERROR: {exc}")
    +        sys.stderr.write(os.linesep)
    +        sys.exit(1)
    +
    +    # Needed for locale.getpreferredencoding(False) to work
    +    # in pip._internal.utils.encoding.auto_decode
    +    try:
    +        locale.setlocale(locale.LC_ALL, "")
    +    except locale.Error as e:
    +        # setlocale can apparently crash if locale are uninitialized
    +        logger.debug("Ignoring error %s when setting locale", e)
    +    command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
    +
    +    return command.main(cmd_args)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py b/env/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
    new file mode 100644
    index 0000000..5ade356
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
    @@ -0,0 +1,134 @@
    +"""A single place for constructing and exposing the main parser
    +"""
    +
    +import os
    +import subprocess
    +import sys
    +from typing import List, Optional, Tuple
    +
    +from pip._internal.build_env import get_runnable_pip
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
    +from pip._internal.commands import commands_dict, get_similar_commands
    +from pip._internal.exceptions import CommandError
    +from pip._internal.utils.misc import get_pip_version, get_prog
    +
    +__all__ = ["create_main_parser", "parse_command"]
    +
    +
    +def create_main_parser() -> ConfigOptionParser:
    +    """Creates and returns the main parser for pip's CLI"""
    +
    +    parser = ConfigOptionParser(
    +        usage="\n%prog  [options]",
    +        add_help_option=False,
    +        formatter=UpdatingDefaultsHelpFormatter(),
    +        name="global",
    +        prog=get_prog(),
    +    )
    +    parser.disable_interspersed_args()
    +
    +    parser.version = get_pip_version()
    +
    +    # add the general options
    +    gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
    +    parser.add_option_group(gen_opts)
    +
    +    # so the help formatter knows
    +    parser.main = True  # type: ignore
    +
    +    # create command listing for description
    +    description = [""] + [
    +        f"{name:27} {command_info.summary}"
    +        for name, command_info in commands_dict.items()
    +    ]
    +    parser.description = "\n".join(description)
    +
    +    return parser
    +
    +
    +def identify_python_interpreter(python: str) -> Optional[str]:
    +    # If the named file exists, use it.
    +    # If it's a directory, assume it's a virtual environment and
    +    # look for the environment's Python executable.
    +    if os.path.exists(python):
    +        if os.path.isdir(python):
    +            # bin/python for Unix, Scripts/python.exe for Windows
    +            # Try both in case of odd cases like cygwin.
    +            for exe in ("bin/python", "Scripts/python.exe"):
    +                py = os.path.join(python, exe)
    +                if os.path.exists(py):
    +                    return py
    +        else:
    +            return python
    +
    +    # Could not find the interpreter specified
    +    return None
    +
    +
    +def parse_command(args: List[str]) -> Tuple[str, List[str]]:
    +    parser = create_main_parser()
    +
    +    # Note: parser calls disable_interspersed_args(), so the result of this
    +    # call is to split the initial args into the general options before the
    +    # subcommand and everything else.
    +    # For example:
    +    #  args: ['--timeout=5', 'install', '--user', 'INITools']
    +    #  general_options: ['--timeout==5']
    +    #  args_else: ['install', '--user', 'INITools']
    +    general_options, args_else = parser.parse_args(args)
    +
    +    # --python
    +    if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
    +        # Re-invoke pip using the specified Python interpreter
    +        interpreter = identify_python_interpreter(general_options.python)
    +        if interpreter is None:
    +            raise CommandError(
    +                f"Could not locate Python interpreter {general_options.python}"
    +            )
    +
    +        pip_cmd = [
    +            interpreter,
    +            get_runnable_pip(),
    +        ]
    +        pip_cmd.extend(args)
    +
    +        # Set a flag so the child doesn't re-invoke itself, causing
    +        # an infinite loop.
    +        os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
    +        returncode = 0
    +        try:
    +            proc = subprocess.run(pip_cmd)
    +            returncode = proc.returncode
    +        except (subprocess.SubprocessError, OSError) as exc:
    +            raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
    +        sys.exit(returncode)
    +
    +    # --version
    +    if general_options.version:
    +        sys.stdout.write(parser.version)
    +        sys.stdout.write(os.linesep)
    +        sys.exit()
    +
    +    # pip || pip help -> print_help()
    +    if not args_else or (args_else[0] == "help" and len(args_else) == 1):
    +        parser.print_help()
    +        sys.exit()
    +
    +    # the subcommand name
    +    cmd_name = args_else[0]
    +
    +    if cmd_name not in commands_dict:
    +        guess = get_similar_commands(cmd_name)
    +
    +        msg = [f'unknown command "{cmd_name}"']
    +        if guess:
    +            msg.append(f'maybe you meant "{guess}"')
    +
    +        raise CommandError(" - ".join(msg))
    +
    +    # all the args without the subcommand
    +    cmd_args = args[:]
    +    cmd_args.remove(cmd_name)
    +
    +    return cmd_name, cmd_args
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py b/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py
    new file mode 100644
    index 0000000..bc4aca0
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/parser.py
    @@ -0,0 +1,294 @@
    +"""Base option parser setup"""
    +
    +import logging
    +import optparse
    +import shutil
    +import sys
    +import textwrap
    +from contextlib import suppress
    +from typing import Any, Dict, Generator, List, NoReturn, Optional, Tuple
    +
    +from pip._internal.cli.status_codes import UNKNOWN_ERROR
    +from pip._internal.configuration import Configuration, ConfigurationError
    +from pip._internal.utils.misc import redact_auth_from_url, strtobool
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
    +    """A prettier/less verbose help formatter for optparse."""
    +
    +    def __init__(self, *args: Any, **kwargs: Any) -> None:
    +        # help position must be aligned with __init__.parseopts.description
    +        kwargs["max_help_position"] = 30
    +        kwargs["indent_increment"] = 1
    +        kwargs["width"] = shutil.get_terminal_size()[0] - 2
    +        super().__init__(*args, **kwargs)
    +
    +    def format_option_strings(self, option: optparse.Option) -> str:
    +        return self._format_option_strings(option)
    +
    +    def _format_option_strings(
    +        self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", "
    +    ) -> str:
    +        """
    +        Return a comma-separated list of option strings and metavars.
    +
    +        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
    +        :param mvarfmt: metavar format string
    +        :param optsep:  separator
    +        """
    +        opts = []
    +
    +        if option._short_opts:
    +            opts.append(option._short_opts[0])
    +        if option._long_opts:
    +            opts.append(option._long_opts[0])
    +        if len(opts) > 1:
    +            opts.insert(1, optsep)
    +
    +        if option.takes_value():
    +            assert option.dest is not None
    +            metavar = option.metavar or option.dest.lower()
    +            opts.append(mvarfmt.format(metavar.lower()))
    +
    +        return "".join(opts)
    +
    +    def format_heading(self, heading: str) -> str:
    +        if heading == "Options":
    +            return ""
    +        return heading + ":\n"
    +
    +    def format_usage(self, usage: str) -> str:
    +        """
    +        Ensure there is only one newline between usage and the first heading
    +        if there is no description.
    +        """
    +        msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), "  "))
    +        return msg
    +
    +    def format_description(self, description: Optional[str]) -> str:
    +        # leave full control over description to us
    +        if description:
    +            if hasattr(self.parser, "main"):
    +                label = "Commands"
    +            else:
    +                label = "Description"
    +            # some doc strings have initial newlines, some don't
    +            description = description.lstrip("\n")
    +            # some doc strings have final newlines and spaces, some don't
    +            description = description.rstrip()
    +            # dedent, then reindent
    +            description = self.indent_lines(textwrap.dedent(description), "  ")
    +            description = f"{label}:\n{description}\n"
    +            return description
    +        else:
    +            return ""
    +
    +    def format_epilog(self, epilog: Optional[str]) -> str:
    +        # leave full control over epilog to us
    +        if epilog:
    +            return epilog
    +        else:
    +            return ""
    +
    +    def indent_lines(self, text: str, indent: str) -> str:
    +        new_lines = [indent + line for line in text.split("\n")]
    +        return "\n".join(new_lines)
    +
    +
    +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
    +    """Custom help formatter for use in ConfigOptionParser.
    +
    +    This is updates the defaults before expanding them, allowing
    +    them to show up correctly in the help listing.
    +
    +    Also redact auth from url type options
    +    """
    +
    +    def expand_default(self, option: optparse.Option) -> str:
    +        default_values = None
    +        if self.parser is not None:
    +            assert isinstance(self.parser, ConfigOptionParser)
    +            self.parser._update_defaults(self.parser.defaults)
    +            assert option.dest is not None
    +            default_values = self.parser.defaults.get(option.dest)
    +        help_text = super().expand_default(option)
    +
    +        if default_values and option.metavar == "URL":
    +            if isinstance(default_values, str):
    +                default_values = [default_values]
    +
    +            # If its not a list, we should abort and just return the help text
    +            if not isinstance(default_values, list):
    +                default_values = []
    +
    +            for val in default_values:
    +                help_text = help_text.replace(val, redact_auth_from_url(val))
    +
    +        return help_text
    +
    +
    +class CustomOptionParser(optparse.OptionParser):
    +    def insert_option_group(
    +        self, idx: int, *args: Any, **kwargs: Any
    +    ) -> optparse.OptionGroup:
    +        """Insert an OptionGroup at a given position."""
    +        group = self.add_option_group(*args, **kwargs)
    +
    +        self.option_groups.pop()
    +        self.option_groups.insert(idx, group)
    +
    +        return group
    +
    +    @property
    +    def option_list_all(self) -> List[optparse.Option]:
    +        """Get a list of all options, including those in option groups."""
    +        res = self.option_list[:]
    +        for i in self.option_groups:
    +            res.extend(i.option_list)
    +
    +        return res
    +
    +
    +class ConfigOptionParser(CustomOptionParser):
    +    """Custom option parser which updates its defaults by checking the
    +    configuration files and environmental variables"""
    +
    +    def __init__(
    +        self,
    +        *args: Any,
    +        name: str,
    +        isolated: bool = False,
    +        **kwargs: Any,
    +    ) -> None:
    +        self.name = name
    +        self.config = Configuration(isolated)
    +
    +        assert self.name
    +        super().__init__(*args, **kwargs)
    +
    +    def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
    +        try:
    +            return option.check_value(key, val)
    +        except optparse.OptionValueError as exc:
    +            print(f"An error occurred during configuration: {exc}")
    +            sys.exit(3)
    +
    +    def _get_ordered_configuration_items(
    +        self,
    +    ) -> Generator[Tuple[str, Any], None, None]:
    +        # Configuration gives keys in an unordered manner. Order them.
    +        override_order = ["global", self.name, ":env:"]
    +
    +        # Pool the options into different groups
    +        section_items: Dict[str, List[Tuple[str, Any]]] = {
    +            name: [] for name in override_order
    +        }
    +        for section_key, val in self.config.items():
    +            # ignore empty values
    +            if not val:
    +                logger.debug(
    +                    "Ignoring configuration key '%s' as it's value is empty.",
    +                    section_key,
    +                )
    +                continue
    +
    +            section, key = section_key.split(".", 1)
    +            if section in override_order:
    +                section_items[section].append((key, val))
    +
    +        # Yield each group in their override order
    +        for section in override_order:
    +            for key, val in section_items[section]:
    +                yield key, val
    +
    +    def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
    +        """Updates the given defaults with values from the config files and
    +        the environ. Does a little special handling for certain types of
    +        options (lists)."""
    +
    +        # Accumulate complex default state.
    +        self.values = optparse.Values(self.defaults)
    +        late_eval = set()
    +        # Then set the options with those values
    +        for key, val in self._get_ordered_configuration_items():
    +            # '--' because configuration supports only long names
    +            option = self.get_option("--" + key)
    +
    +            # Ignore options not present in this parser. E.g. non-globals put
    +            # in [global] by users that want them to apply to all applicable
    +            # commands.
    +            if option is None:
    +                continue
    +
    +            assert option.dest is not None
    +
    +            if option.action in ("store_true", "store_false"):
    +                try:
    +                    val = strtobool(val)
    +                except ValueError:
    +                    self.error(
    +                        f"{val} is not a valid value for {key} option, "
    +                        "please specify a boolean value like yes/no, "
    +                        "true/false or 1/0 instead."
    +                    )
    +            elif option.action == "count":
    +                with suppress(ValueError):
    +                    val = strtobool(val)
    +                with suppress(ValueError):
    +                    val = int(val)
    +                if not isinstance(val, int) or val < 0:
    +                    self.error(
    +                        f"{val} is not a valid value for {key} option, "
    +                        "please instead specify either a non-negative integer "
    +                        "or a boolean value like yes/no or false/true "
    +                        "which is equivalent to 1/0."
    +                    )
    +            elif option.action == "append":
    +                val = val.split()
    +                val = [self.check_default(option, key, v) for v in val]
    +            elif option.action == "callback":
    +                assert option.callback is not None
    +                late_eval.add(option.dest)
    +                opt_str = option.get_opt_string()
    +                val = option.convert_value(opt_str, val)
    +                # From take_action
    +                args = option.callback_args or ()
    +                kwargs = option.callback_kwargs or {}
    +                option.callback(option, opt_str, val, self, *args, **kwargs)
    +            else:
    +                val = self.check_default(option, key, val)
    +
    +            defaults[option.dest] = val
    +
    +        for key in late_eval:
    +            defaults[key] = getattr(self.values, key)
    +        self.values = None
    +        return defaults
    +
    +    def get_default_values(self) -> optparse.Values:
    +        """Overriding to make updating the defaults after instantiation of
    +        the option parser possible, _update_defaults() does the dirty work."""
    +        if not self.process_default_values:
    +            # Old, pre-Optik 1.5 behaviour.
    +            return optparse.Values(self.defaults)
    +
    +        # Load the configuration, or error out in case of an error
    +        try:
    +            self.config.load()
    +        except ConfigurationError as err:
    +            self.exit(UNKNOWN_ERROR, str(err))
    +
    +        defaults = self._update_defaults(self.defaults.copy())  # ours
    +        for option in self._get_all_options():
    +            assert option.dest is not None
    +            default = defaults.get(option.dest)
    +            if isinstance(default, str):
    +                opt_str = option.get_opt_string()
    +                defaults[option.dest] = option.check_value(opt_str, default)
    +        return optparse.Values(defaults)
    +
    +    def error(self, msg: str) -> NoReturn:
    +        self.print_usage(sys.stderr)
    +        self.exit(UNKNOWN_ERROR, f"{msg}\n")
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py b/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
    new file mode 100644
    index 0000000..1236180
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
    @@ -0,0 +1,94 @@
    +import functools
    +import sys
    +from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
    +
    +from pip._vendor.rich.progress import (
    +    BarColumn,
    +    DownloadColumn,
    +    FileSizeColumn,
    +    Progress,
    +    ProgressColumn,
    +    SpinnerColumn,
    +    TextColumn,
    +    TimeElapsedColumn,
    +    TimeRemainingColumn,
    +    TransferSpeedColumn,
    +)
    +
    +from pip._internal.cli.spinners import RateLimiter
    +from pip._internal.utils.logging import get_indentation
    +
    +DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
    +
    +
    +def _rich_progress_bar(
    +    iterable: Iterable[bytes],
    +    *,
    +    bar_type: str,
    +    size: Optional[int],
    +) -> Generator[bytes, None, None]:
    +    assert bar_type == "on", "This should only be used in the default mode."
    +
    +    if not size:
    +        total = float("inf")
    +        columns: Tuple[ProgressColumn, ...] = (
    +            TextColumn("[progress.description]{task.description}"),
    +            SpinnerColumn("line", speed=1.5),
    +            FileSizeColumn(),
    +            TransferSpeedColumn(),
    +            TimeElapsedColumn(),
    +        )
    +    else:
    +        total = size
    +        columns = (
    +            TextColumn("[progress.description]{task.description}"),
    +            BarColumn(),
    +            DownloadColumn(),
    +            TransferSpeedColumn(),
    +            TextColumn("eta"),
    +            TimeRemainingColumn(),
    +        )
    +
    +    progress = Progress(*columns, refresh_per_second=5)
    +    task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
    +    with progress:
    +        for chunk in iterable:
    +            yield chunk
    +            progress.update(task_id, advance=len(chunk))
    +
    +
    +def _raw_progress_bar(
    +    iterable: Iterable[bytes],
    +    *,
    +    size: Optional[int],
    +) -> Generator[bytes, None, None]:
    +    def write_progress(current: int, total: int) -> None:
    +        sys.stdout.write("Progress %d of %d\n" % (current, total))
    +        sys.stdout.flush()
    +
    +    current = 0
    +    total = size or 0
    +    rate_limiter = RateLimiter(0.25)
    +
    +    write_progress(current, total)
    +    for chunk in iterable:
    +        current += len(chunk)
    +        if rate_limiter.ready() or current == total:
    +            write_progress(current, total)
    +            rate_limiter.reset()
    +        yield chunk
    +
    +
    +def get_download_progress_renderer(
    +    *, bar_type: str, size: Optional[int] = None
    +) -> DownloadProgressRenderer:
    +    """Get an object that can be used to render the download progress.
    +
    +    Returns a callable, that takes an iterable to "wrap".
    +    """
    +    if bar_type == "on":
    +        return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
    +    elif bar_type == "raw":
    +        return functools.partial(_raw_progress_bar, size=size)
    +    else:
    +        return iter  # no-op, when passed an iterator
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py b/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
    new file mode 100644
    index 0000000..92900f9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
    @@ -0,0 +1,329 @@
    +"""Contains the RequirementCommand base class.
    +
    +This class is in a separate module so the commands that do not always
    +need PackageFinder capability don't unnecessarily import the
    +PackageFinder machinery and all its vendored dependencies, etc.
    +"""
    +
    +import logging
    +from functools import partial
    +from optparse import Values
    +from typing import Any, List, Optional, Tuple
    +
    +from pip._internal.cache import WheelCache
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.index_command import IndexGroupCommand
    +from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin
    +from pip._internal.exceptions import CommandError, PreviousBuildDirError
    +from pip._internal.index.collector import LinkCollector
    +from pip._internal.index.package_finder import PackageFinder
    +from pip._internal.models.selection_prefs import SelectionPreferences
    +from pip._internal.models.target_python import TargetPython
    +from pip._internal.network.session import PipSession
    +from pip._internal.operations.build.build_tracker import BuildTracker
    +from pip._internal.operations.prepare import RequirementPreparer
    +from pip._internal.req.constructors import (
    +    install_req_from_editable,
    +    install_req_from_line,
    +    install_req_from_parsed_requirement,
    +    install_req_from_req_string,
    +)
    +from pip._internal.req.req_file import parse_requirements
    +from pip._internal.req.req_install import InstallRequirement
    +from pip._internal.resolution.base import BaseResolver
    +from pip._internal.utils.temp_dir import (
    +    TempDirectory,
    +    TempDirectoryTypeRegistry,
    +    tempdir_kinds,
    +)
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +KEEPABLE_TEMPDIR_TYPES = [
    +    tempdir_kinds.BUILD_ENV,
    +    tempdir_kinds.EPHEM_WHEEL_CACHE,
    +    tempdir_kinds.REQ_BUILD,
    +]
    +
    +
    +def with_cleanup(func: Any) -> Any:
    +    """Decorator for common logic related to managing temporary
    +    directories.
    +    """
    +
    +    def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None:
    +        for t in KEEPABLE_TEMPDIR_TYPES:
    +            registry.set_delete(t, False)
    +
    +    def wrapper(
    +        self: RequirementCommand, options: Values, args: List[Any]
    +    ) -> Optional[int]:
    +        assert self.tempdir_registry is not None
    +        if options.no_clean:
    +            configure_tempdir_registry(self.tempdir_registry)
    +
    +        try:
    +            return func(self, options, args)
    +        except PreviousBuildDirError:
    +            # This kind of conflict can occur when the user passes an explicit
    +            # build directory with a pre-existing folder. In that case we do
    +            # not want to accidentally remove it.
    +            configure_tempdir_registry(self.tempdir_registry)
    +            raise
    +
    +    return wrapper
    +
    +
    +class RequirementCommand(IndexGroupCommand):
    +    def __init__(self, *args: Any, **kw: Any) -> None:
    +        super().__init__(*args, **kw)
    +
    +        self.cmd_opts.add_option(cmdoptions.no_clean())
    +
    +    @staticmethod
    +    def determine_resolver_variant(options: Values) -> str:
    +        """Determines which resolver should be used, based on the given options."""
    +        if "legacy-resolver" in options.deprecated_features_enabled:
    +            return "legacy"
    +
    +        return "resolvelib"
    +
    +    @classmethod
    +    def make_requirement_preparer(
    +        cls,
    +        temp_build_dir: TempDirectory,
    +        options: Values,
    +        build_tracker: BuildTracker,
    +        session: PipSession,
    +        finder: PackageFinder,
    +        use_user_site: bool,
    +        download_dir: Optional[str] = None,
    +        verbosity: int = 0,
    +    ) -> RequirementPreparer:
    +        """
    +        Create a RequirementPreparer instance for the given parameters.
    +        """
    +        temp_build_dir_path = temp_build_dir.path
    +        assert temp_build_dir_path is not None
    +        legacy_resolver = False
    +
    +        resolver_variant = cls.determine_resolver_variant(options)
    +        if resolver_variant == "resolvelib":
    +            lazy_wheel = "fast-deps" in options.features_enabled
    +            if lazy_wheel:
    +                logger.warning(
    +                    "pip is using lazily downloaded wheels using HTTP "
    +                    "range requests to obtain dependency information. "
    +                    "This experimental feature is enabled through "
    +                    "--use-feature=fast-deps and it is not ready for "
    +                    "production."
    +                )
    +        else:
    +            legacy_resolver = True
    +            lazy_wheel = False
    +            if "fast-deps" in options.features_enabled:
    +                logger.warning(
    +                    "fast-deps has no effect when used with the legacy resolver."
    +                )
    +
    +        return RequirementPreparer(
    +            build_dir=temp_build_dir_path,
    +            src_dir=options.src_dir,
    +            download_dir=download_dir,
    +            build_isolation=options.build_isolation,
    +            check_build_deps=options.check_build_deps,
    +            build_tracker=build_tracker,
    +            session=session,
    +            progress_bar=options.progress_bar,
    +            finder=finder,
    +            require_hashes=options.require_hashes,
    +            use_user_site=use_user_site,
    +            lazy_wheel=lazy_wheel,
    +            verbosity=verbosity,
    +            legacy_resolver=legacy_resolver,
    +        )
    +
    +    @classmethod
    +    def make_resolver(
    +        cls,
    +        preparer: RequirementPreparer,
    +        finder: PackageFinder,
    +        options: Values,
    +        wheel_cache: Optional[WheelCache] = None,
    +        use_user_site: bool = False,
    +        ignore_installed: bool = True,
    +        ignore_requires_python: bool = False,
    +        force_reinstall: bool = False,
    +        upgrade_strategy: str = "to-satisfy-only",
    +        use_pep517: Optional[bool] = None,
    +        py_version_info: Optional[Tuple[int, ...]] = None,
    +    ) -> BaseResolver:
    +        """
    +        Create a Resolver instance for the given parameters.
    +        """
    +        make_install_req = partial(
    +            install_req_from_req_string,
    +            isolated=options.isolated_mode,
    +            use_pep517=use_pep517,
    +        )
    +        resolver_variant = cls.determine_resolver_variant(options)
    +        # The long import name and duplicated invocation is needed to convince
    +        # Mypy into correctly typechecking. Otherwise it would complain the
    +        # "Resolver" class being redefined.
    +        if resolver_variant == "resolvelib":
    +            import pip._internal.resolution.resolvelib.resolver
    +
    +            return pip._internal.resolution.resolvelib.resolver.Resolver(
    +                preparer=preparer,
    +                finder=finder,
    +                wheel_cache=wheel_cache,
    +                make_install_req=make_install_req,
    +                use_user_site=use_user_site,
    +                ignore_dependencies=options.ignore_dependencies,
    +                ignore_installed=ignore_installed,
    +                ignore_requires_python=ignore_requires_python,
    +                force_reinstall=force_reinstall,
    +                upgrade_strategy=upgrade_strategy,
    +                py_version_info=py_version_info,
    +            )
    +        import pip._internal.resolution.legacy.resolver
    +
    +        return pip._internal.resolution.legacy.resolver.Resolver(
    +            preparer=preparer,
    +            finder=finder,
    +            wheel_cache=wheel_cache,
    +            make_install_req=make_install_req,
    +            use_user_site=use_user_site,
    +            ignore_dependencies=options.ignore_dependencies,
    +            ignore_installed=ignore_installed,
    +            ignore_requires_python=ignore_requires_python,
    +            force_reinstall=force_reinstall,
    +            upgrade_strategy=upgrade_strategy,
    +            py_version_info=py_version_info,
    +        )
    +
    +    def get_requirements(
    +        self,
    +        args: List[str],
    +        options: Values,
    +        finder: PackageFinder,
    +        session: PipSession,
    +    ) -> List[InstallRequirement]:
    +        """
    +        Parse command-line arguments into the corresponding requirements.
    +        """
    +        requirements: List[InstallRequirement] = []
    +        for filename in options.constraints:
    +            for parsed_req in parse_requirements(
    +                filename,
    +                constraint=True,
    +                finder=finder,
    +                options=options,
    +                session=session,
    +            ):
    +                req_to_add = install_req_from_parsed_requirement(
    +                    parsed_req,
    +                    isolated=options.isolated_mode,
    +                    user_supplied=False,
    +                )
    +                requirements.append(req_to_add)
    +
    +        for req in args:
    +            req_to_add = install_req_from_line(
    +                req,
    +                comes_from=None,
    +                isolated=options.isolated_mode,
    +                use_pep517=options.use_pep517,
    +                user_supplied=True,
    +                config_settings=getattr(options, "config_settings", None),
    +            )
    +            requirements.append(req_to_add)
    +
    +        for req in options.editables:
    +            req_to_add = install_req_from_editable(
    +                req,
    +                user_supplied=True,
    +                isolated=options.isolated_mode,
    +                use_pep517=options.use_pep517,
    +                config_settings=getattr(options, "config_settings", None),
    +            )
    +            requirements.append(req_to_add)
    +
    +        # NOTE: options.require_hashes may be set if --require-hashes is True
    +        for filename in options.requirements:
    +            for parsed_req in parse_requirements(
    +                filename, finder=finder, options=options, session=session
    +            ):
    +                req_to_add = install_req_from_parsed_requirement(
    +                    parsed_req,
    +                    isolated=options.isolated_mode,
    +                    use_pep517=options.use_pep517,
    +                    user_supplied=True,
    +                    config_settings=(
    +                        parsed_req.options.get("config_settings")
    +                        if parsed_req.options
    +                        else None
    +                    ),
    +                )
    +                requirements.append(req_to_add)
    +
    +        # If any requirement has hash options, enable hash checking.
    +        if any(req.has_hash_options for req in requirements):
    +            options.require_hashes = True
    +
    +        if not (args or options.editables or options.requirements):
    +            opts = {"name": self.name}
    +            if options.find_links:
    +                raise CommandError(
    +                    "You must give at least one requirement to {name} "
    +                    '(maybe you meant "pip {name} {links}"?)'.format(
    +                        **dict(opts, links=" ".join(options.find_links))
    +                    )
    +                )
    +            else:
    +                raise CommandError(
    +                    "You must give at least one requirement to {name} "
    +                    '(see "pip help {name}")'.format(**opts)
    +                )
    +
    +        return requirements
    +
    +    @staticmethod
    +    def trace_basic_info(finder: PackageFinder) -> None:
    +        """
    +        Trace basic information about the provided objects.
    +        """
    +        # Display where finder is looking for packages
    +        search_scope = finder.search_scope
    +        locations = search_scope.get_formatted_locations()
    +        if locations:
    +            logger.info(locations)
    +
    +    def _build_package_finder(
    +        self,
    +        options: Values,
    +        session: PipSession,
    +        target_python: Optional[TargetPython] = None,
    +        ignore_requires_python: Optional[bool] = None,
    +    ) -> PackageFinder:
    +        """
    +        Create a package finder appropriate to this requirement command.
    +
    +        :param ignore_requires_python: Whether to ignore incompatible
    +            "Requires-Python" values in links. Defaults to False.
    +        """
    +        link_collector = LinkCollector.create(session, options=options)
    +        selection_prefs = SelectionPreferences(
    +            allow_yanked=True,
    +            format_control=options.format_control,
    +            allow_all_prereleases=options.pre,
    +            prefer_binary=options.prefer_binary,
    +            ignore_requires_python=ignore_requires_python,
    +        )
    +
    +        return PackageFinder.create(
    +            link_collector=link_collector,
    +            selection_prefs=selection_prefs,
    +            target_python=target_python,
    +        )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/spinners.py b/env/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
    new file mode 100644
    index 0000000..cf2b976
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
    @@ -0,0 +1,159 @@
    +import contextlib
    +import itertools
    +import logging
    +import sys
    +import time
    +from typing import IO, Generator, Optional
    +
    +from pip._internal.utils.compat import WINDOWS
    +from pip._internal.utils.logging import get_indentation
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class SpinnerInterface:
    +    def spin(self) -> None:
    +        raise NotImplementedError()
    +
    +    def finish(self, final_status: str) -> None:
    +        raise NotImplementedError()
    +
    +
    +class InteractiveSpinner(SpinnerInterface):
    +    def __init__(
    +        self,
    +        message: str,
    +        file: Optional[IO[str]] = None,
    +        spin_chars: str = "-\\|/",
    +        # Empirically, 8 updates/second looks nice
    +        min_update_interval_seconds: float = 0.125,
    +    ):
    +        self._message = message
    +        if file is None:
    +            file = sys.stdout
    +        self._file = file
    +        self._rate_limiter = RateLimiter(min_update_interval_seconds)
    +        self._finished = False
    +
    +        self._spin_cycle = itertools.cycle(spin_chars)
    +
    +        self._file.write(" " * get_indentation() + self._message + " ... ")
    +        self._width = 0
    +
    +    def _write(self, status: str) -> None:
    +        assert not self._finished
    +        # Erase what we wrote before by backspacing to the beginning, writing
    +        # spaces to overwrite the old text, and then backspacing again
    +        backup = "\b" * self._width
    +        self._file.write(backup + " " * self._width + backup)
    +        # Now we have a blank slate to add our status
    +        self._file.write(status)
    +        self._width = len(status)
    +        self._file.flush()
    +        self._rate_limiter.reset()
    +
    +    def spin(self) -> None:
    +        if self._finished:
    +            return
    +        if not self._rate_limiter.ready():
    +            return
    +        self._write(next(self._spin_cycle))
    +
    +    def finish(self, final_status: str) -> None:
    +        if self._finished:
    +            return
    +        self._write(final_status)
    +        self._file.write("\n")
    +        self._file.flush()
    +        self._finished = True
    +
    +
    +# Used for dumb terminals, non-interactive installs (no tty), etc.
    +# We still print updates occasionally (once every 60 seconds by default) to
    +# act as a keep-alive for systems like Travis-CI that take lack-of-output as
    +# an indication that a task has frozen.
    +class NonInteractiveSpinner(SpinnerInterface):
    +    def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None:
    +        self._message = message
    +        self._finished = False
    +        self._rate_limiter = RateLimiter(min_update_interval_seconds)
    +        self._update("started")
    +
    +    def _update(self, status: str) -> None:
    +        assert not self._finished
    +        self._rate_limiter.reset()
    +        logger.info("%s: %s", self._message, status)
    +
    +    def spin(self) -> None:
    +        if self._finished:
    +            return
    +        if not self._rate_limiter.ready():
    +            return
    +        self._update("still running...")
    +
    +    def finish(self, final_status: str) -> None:
    +        if self._finished:
    +            return
    +        self._update(f"finished with status '{final_status}'")
    +        self._finished = True
    +
    +
    +class RateLimiter:
    +    def __init__(self, min_update_interval_seconds: float) -> None:
    +        self._min_update_interval_seconds = min_update_interval_seconds
    +        self._last_update: float = 0
    +
    +    def ready(self) -> bool:
    +        now = time.time()
    +        delta = now - self._last_update
    +        return delta >= self._min_update_interval_seconds
    +
    +    def reset(self) -> None:
    +        self._last_update = time.time()
    +
    +
    +@contextlib.contextmanager
    +def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
    +    # Interactive spinner goes directly to sys.stdout rather than being routed
    +    # through the logging system, but it acts like it has level INFO,
    +    # i.e. it's only displayed if we're at level INFO or better.
    +    # Non-interactive spinner goes through the logging system, so it is always
    +    # in sync with logging configuration.
    +    if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
    +        spinner: SpinnerInterface = InteractiveSpinner(message)
    +    else:
    +        spinner = NonInteractiveSpinner(message)
    +    try:
    +        with hidden_cursor(sys.stdout):
    +            yield spinner
    +    except KeyboardInterrupt:
    +        spinner.finish("canceled")
    +        raise
    +    except Exception:
    +        spinner.finish("error")
    +        raise
    +    else:
    +        spinner.finish("done")
    +
    +
    +HIDE_CURSOR = "\x1b[?25l"
    +SHOW_CURSOR = "\x1b[?25h"
    +
    +
    +@contextlib.contextmanager
    +def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:
    +    # The Windows terminal does not support the hide/show cursor ANSI codes,
    +    # even via colorama. So don't even try.
    +    if WINDOWS:
    +        yield
    +    # We don't want to clutter the output with control characters if we're
    +    # writing to a file, or if the user is running with --quiet.
    +    # See https://github.com/pypa/pip/issues/3418
    +    elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
    +        yield
    +    else:
    +        file.write(HIDE_CURSOR)
    +        try:
    +            yield
    +        finally:
    +            file.write(SHOW_CURSOR)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py b/env/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py
    new file mode 100644
    index 0000000..5e29502
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py
    @@ -0,0 +1,6 @@
    +SUCCESS = 0
    +ERROR = 1
    +UNKNOWN_ERROR = 2
    +VIRTUALENV_NOT_FOUND = 3
    +PREVIOUS_BUILD_DIR_ERROR = 4
    +NO_MATCHES_FOUND = 23
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/commands/__init__.py
    new file mode 100644
    index 0000000..858a410
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/__init__.py
    @@ -0,0 +1,132 @@
    +"""
    +Package containing all pip commands
    +"""
    +
    +import importlib
    +from collections import namedtuple
    +from typing import Any, Dict, Optional
    +
    +from pip._internal.cli.base_command import Command
    +
    +CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary")
    +
    +# This dictionary does a bunch of heavy lifting for help output:
    +# - Enables avoiding additional (costly) imports for presenting `--help`.
    +# - The ordering matters for help display.
    +#
    +# Even though the module path starts with the same "pip._internal.commands"
    +# prefix, the full path makes testing easier (specifically when modifying
    +# `commands_dict` in test setup / teardown).
    +commands_dict: Dict[str, CommandInfo] = {
    +    "install": CommandInfo(
    +        "pip._internal.commands.install",
    +        "InstallCommand",
    +        "Install packages.",
    +    ),
    +    "download": CommandInfo(
    +        "pip._internal.commands.download",
    +        "DownloadCommand",
    +        "Download packages.",
    +    ),
    +    "uninstall": CommandInfo(
    +        "pip._internal.commands.uninstall",
    +        "UninstallCommand",
    +        "Uninstall packages.",
    +    ),
    +    "freeze": CommandInfo(
    +        "pip._internal.commands.freeze",
    +        "FreezeCommand",
    +        "Output installed packages in requirements format.",
    +    ),
    +    "inspect": CommandInfo(
    +        "pip._internal.commands.inspect",
    +        "InspectCommand",
    +        "Inspect the python environment.",
    +    ),
    +    "list": CommandInfo(
    +        "pip._internal.commands.list",
    +        "ListCommand",
    +        "List installed packages.",
    +    ),
    +    "show": CommandInfo(
    +        "pip._internal.commands.show",
    +        "ShowCommand",
    +        "Show information about installed packages.",
    +    ),
    +    "check": CommandInfo(
    +        "pip._internal.commands.check",
    +        "CheckCommand",
    +        "Verify installed packages have compatible dependencies.",
    +    ),
    +    "config": CommandInfo(
    +        "pip._internal.commands.configuration",
    +        "ConfigurationCommand",
    +        "Manage local and global configuration.",
    +    ),
    +    "search": CommandInfo(
    +        "pip._internal.commands.search",
    +        "SearchCommand",
    +        "Search PyPI for packages.",
    +    ),
    +    "cache": CommandInfo(
    +        "pip._internal.commands.cache",
    +        "CacheCommand",
    +        "Inspect and manage pip's wheel cache.",
    +    ),
    +    "index": CommandInfo(
    +        "pip._internal.commands.index",
    +        "IndexCommand",
    +        "Inspect information available from package indexes.",
    +    ),
    +    "wheel": CommandInfo(
    +        "pip._internal.commands.wheel",
    +        "WheelCommand",
    +        "Build wheels from your requirements.",
    +    ),
    +    "hash": CommandInfo(
    +        "pip._internal.commands.hash",
    +        "HashCommand",
    +        "Compute hashes of package archives.",
    +    ),
    +    "completion": CommandInfo(
    +        "pip._internal.commands.completion",
    +        "CompletionCommand",
    +        "A helper command used for command completion.",
    +    ),
    +    "debug": CommandInfo(
    +        "pip._internal.commands.debug",
    +        "DebugCommand",
    +        "Show information useful for debugging.",
    +    ),
    +    "help": CommandInfo(
    +        "pip._internal.commands.help",
    +        "HelpCommand",
    +        "Show help for commands.",
    +    ),
    +}
    +
    +
    +def create_command(name: str, **kwargs: Any) -> Command:
    +    """
    +    Create an instance of the Command class with the given name.
    +    """
    +    module_path, class_name, summary = commands_dict[name]
    +    module = importlib.import_module(module_path)
    +    command_class = getattr(module, class_name)
    +    command = command_class(name=name, summary=summary, **kwargs)
    +
    +    return command
    +
    +
    +def get_similar_commands(name: str) -> Optional[str]:
    +    """Command name auto-correct."""
    +    from difflib import get_close_matches
    +
    +    name = name.lower()
    +
    +    close_commands = get_close_matches(name, commands_dict.keys())
    +
    +    if close_commands:
    +        return close_commands[0]
    +    else:
    +        return None
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..07fdb4c8e342eba1bb00207a819c8bd0ec88bf5f
    GIT binary patch
    literal 4020
    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
    C_orw8
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..f4a1b14fe10b7d2beb85e3816ab5f2bb79a45f3b
    GIT binary patch
    literal 2610
    zcma(TOK%&;d6xU)Ta=|xFH7DuR&1sgS9Xdz?h6fMTRON7V6{1HV=Pv?Lvp2k(6h5P
    zC{Tb8KJbu(j2`TxdrP28np6KnFA-$G?3P9Yv_14DgHa3g)NgjVlv4Q60WtG^-+ZtA
    zUc*0?N_hn9mi}3DkVWWk3`v(b0)}4$@C;eV;vA&0Gvjb>M$2#v<{jP@G$DosM|34k
    zieb@_-K>^%b6PIOB`5C|v_cHaPSGuCCAX}V-3e_Xre&RqJE={^aLzgBPH9sd${>uk
    zFQ*Qjp7@;uF2S^F2CXA2{{&eDEFJJ8>P&~L75~YQyEQJ7J~f;W2LK6o?0~{4ulcTP
    zcvdYFiMQ_E`{Z6EZ~kU&?bhZdT+TEx)h*mGLWkN%`?nm+niUfl+gGeHnhQu>R>4@EDg~ssVzaVwb5FI5Dp@aAuq0cf1?eTj89ZPlj
    zG|lmyxF^xHC=r!MVu0|zw=ygp2SP&U(C6<6=<~XOx)R8!|Az%>Y@rGf
    zg2?O@_KJI@GnT+ZuvF?6y2XQ0p@5xPuyYmc$YAF^kSd>%5W3~I~BxC=EaKta`0TSP>CcTanuzaj4XFn{I?#>ebcNm77KcEne*1=~v%`yEG>4pCE((?yTe|3@*C(pg%(S;u!iy%FmMvIr}Q|<@I?@7
    zT1z#}^ru1bg_DvT>ryv3rtI>tie}&Itq+Q`{mPAgW#&~yIjkrEJeznraUu()@-Yt_
    zZ;Gfm^>pX=_y4dnn40a~`FnBpo4Jo(7H);D{~#7w|Q*uK)l5
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..36ecdce4199c21e6c0003f84265296342ec6555c
    GIT binary patch
    literal 5211
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..fb0e2d8cd2168b20720bc5a7c5d265cf34857cfe
    GIT binary patch
    literal 13181
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..22ac30b9c9cee123e4994a8b60853824319f47e8
    GIT binary patch
    literal 10086
    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
    E0BbERXaE2J
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..bdaa8347ff405eb61ed312306fae618705ad0fb0
    GIT binary patch
    literal 7521
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..b007dae82b5375077fd3ec0e82c7341265b37aea
    GIT binary patch
    literal 4403
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..2ec5c473683c7f95bd7949cd16c389405cf33db2
    GIT binary patch
    literal 6689
    zcmb_gUr-y@xj!purClKjArOc^!3)O0GPY#EnAi}vj=_Hthd2hi*Sa^O5!wZWceTpd
    zl`&M@dNO{%X*#ysPEDuHgv_*4JV~eNL#KXh(mrISeLw>lseA2-J8fs$H@VPhlfLvj
    z`$tHa_TD?~g3g{l-}&}@=X~e){m%KN*Xu^`jK=?K`pW@?eoG40Lz|gRCxy^G#3P;(
    zQH;E8A|=^kHj3o!qFr*t91GN5HDa^W5^K@(9u4#W+1*D|Seou}%uvkbq`STSjibg|7F&PV&U|+0Yrp`)?w?
    zPVl~GH*24rr^10hlEPS+(wvtQVpdSX4$XctJ+Cq6Q~@U@ML~0%PbsR#ypmBi&*QXRA9$3d(u
    zgHvfW&V$}~Dy^sqQA`l!P?(a#cFkjU9>rM3TEhs);nZZ7h>XeVX*rwbHReJpqql=T
    z@A*{v>M2-eAG9Jj)n$rF$H}Abk$Lh*@
    z0!9l@gB~B~sh_9Ab(%+?dUN6yo_BNboJ%Viu$m*&iY0xDxx}?ZN+j#bO<`H$GR8!K
    z2rQhSMD%_W3(x9rqGMkM%hTL7W5E?}*z9mZ7towoP_sBamNY$0pB4wC#K$(@w2{eC
    z%Wbnz-udLvERo;wyl3{I(C+QCt{okqSn(a^>DKqms((?ljxN>O|4o`b)mlmE-=x|1
    zf6-hqd;X{8)pFG=pz6*C)~I1;9gN;w?L}($_SvSV`|wnbvij+3zl+{~&~JA?GRHun
    zc@(ydVNwixFbglOIl=RBRp0;dj1B;C6Uj6NP>mE6%}s=iYOOIfotCi>$HME`6c!Y-
    zmuAmkL1WW$d@_|z;CZb^PK)zap-xI%1qjh0GCoa^QLE86n^|yX5?B$iRu4cZV6{pT
    zz|)}!;*{n#dXNz*!~~A}{PpOJED2F5JCgvQ<)b5VGAjvbRf(QSsb{m3(cZ&{4~-<|
    zl|!#g9XciRLR3g!i;Ahqs9|e=q_;1s0K6SCceE1Cq%u)}V8DHV`DoGra3!jLJCXsr
    zw&y}w2%RH{Vd71sqJ@L;DZhf`271T@3e3Sgb8vOyN3Y#~ZG#zl%y@2lZ+Qz0muI-|
    zwG=vD$alQ3-Z8Slj25e#e$f7I`+7(32Gh5rq0ljq?-*F`7~Eiu>y;~UIT
    zqOh{=$d8`C|NJM+u}!cCX)a?K70m%&qa@8ZN}3Qs93At>J_2q*d|q#;PEypOT{V3Y
    zp;?QOR0#353WTy@SI)-U3E=1K*C>3XqVFyU$UAs?miYFLN43HgXtA`H-{l>mmJw(i
    zSzldru)r^J_MAf>0|oU?9<`MBHigtO9*m>CNG)Sc7s7pu^gkbOj-K5GYYcm>@xd3$
    z<4W4D07F}(|C=5+-*eO)x^BOM=BTi1Ok=DtwV;A88!?SbDO@s(A>ymzJeNpw!u5=R
    zQ)H_oM9y^b2zO59q{KWoDR5Yjunv
    z95;7j+%iLRit_X{fP>5YghmTGC34KlskG))WULB2Caa6dMB;-aA=4Fh;%7;|$EwvB
    zFozc*jB8F~U>YSTPG}}Up5yR-$ZB?+O)vPXb~e-;h9>1Fkla9zJ&ntbLTD%-8Yxypy=wwB#%~9c**a)3$W>&gHzPZTU+p{A%xN
    z-^$E}C%WZE{-!10U$x?zTLdx+550Q^tJPUE78#WxzY|J
    z|FFCE{
    zn-8r{KbYHSKC|T8a-!B~vAMn28U8`fyFJCd$F^LKR`*ivmIwKtDb()G*X}L0hKp@I
    z#g=Yp^1Dk2_5nTs8mpoN8M5v^WI-$4Cs#&&p1L{+7S^alPJgx|!W-1K3+?JYl!cm$
    z_H6`*NK|$tODDvWvg`mLD#(;$M5RoQ2JEM1%Lu&P299U)_C+U8-$Xg*Z0&ZdmCHG-
    z5sj4D?4k=a61dv&C@dV9P|j5;sS?M~pPb9m1pQr#PYqfvyesGU4tl#hgD^{FW|@Pd
    z*ZZu+C`Zt3CTW{SN!x2)gccc<1U3E1F_!kbwzp~>XpvoHa;y=F7Ts_w0DqPih)AvF
    ze(+`9{S`N)HE)+~t(4$Bv(H%4+i%`GOT2x@^A*+_#m+Zq?68D$j+}dYEc0Lu1;0gR
    z4&rYwQm8p7UqKZ7y>-cqjlMBVKzw2U6*PtJy^sd)&95D*|X%4vWLJgu`x
    zgD5+U_))zBtB!hvJoLkF^9Up_!6)y*f$cR|Tp<0_ZUpFC)IACY7H|L||Dk=3x=)e2
    z2bUS~fbiNPhcz|{u`0y_M44>Y*x&5%w2+4IjZZ9`sM^#2Jc>q!MLC%el@pP2|7$Q>
    zg)HJ9&|hz$60-I9e%(K@lDfkd{2ib8JM#S#pDDz>-)Ia`yBmDG(qQn?e`GMG-ty-t
    z)9j#SHYWEqq8g5dFK9epDBdLzERgoebd!SE$khWffcFA8DKXYxvjBoVYn%B2LmbQCdl$(fh?e~
    zVB_{{RCuBBWciZ8qB6(1FE8RKD2J;GyC|eFA&SO1ETEr|ssgX(Ghy0{%lH(LCec`{
    zC#W7Lv1i*!^vI#v6+y)WgYZ!zXounAMv`+Hw;y}fxGMP>@ljPF*lC6$^3vTE_d?}D&;P?wr=f##5~v}ZoN9ba
    z>Q|2~Q*WMl7-(PHb8bEG;+p5h--S90p@Dp8;DhP)(1|54@Tohm-gPa}kG*vTFPHan
    zD@_~T@amU}!RA6Rnh!>cp*`fky{Fh6DRhtKyGKhbYCOD&=tket=_fw${9^yHLjTM8
    z{+B-%Hu@(v?NGIJwgjB4_1@6ehn_fWx}!jSTi^}@p)l0C{MqkiKYPTrMdtRy20lk{Kv=YCr2mNJ1*sqPOK{5+q;td{{FS26KkIKwT?^0
    zARM{!!2?UD|I&|q2eytPHn>dRnOmM*X*UF{U)1NT?pZ%!@bzY|a(hI8Ayy4Fk0>owQ413qfXU5<=9rXa
    zQRh5{ixbSz9p^sM*@NLpAyP{c;?BxDklaL1Y&M#KRchU{=4c|^o4GN%$@u8wC9aKb
    zT0UAr@LFwHP2O+TvmYp%q^2}Nq27UF@4%CqCffbDuBk-ByW~WHwvvnF7!=}GJo%
    z>%JnA6jKJC7=0`2BXDB_j8wmn#%|KL{i(hYxQ14<3W)K7VjQUm>oG^Nt
    zCuejx(L&YQgzHJcxDq!|PRArdcy=ly5OY0Jrpg8-?yOd3$XF*s6O{-_*1D<%!Dj_g
    zfpJx{Z9<^59Xd_XD#$hbamU=H1$9owS3#+MC9Zq#PHW*>9zH9jl%#>SEJWk;`mq)N
    zCwv?Ckwo|4B*_s@Y=m=W*w|(#unKkLM66taq-3Wk>VJ^$5o-Mu9bQL=e~)^9kM=)8
    zL!Y8!kI?B)(W`m%>LWDx2n|0%qfq|{9eIR$AG0k>O$D|k&$cW-x6XFmaBexX6m?{+
    MzU$A3Wb{w}9b~vXxc~qF
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..926a11eba30b7e9f4566be636389442df950e085
    GIT binary patch
    literal 3998
    zcmb7HO>7&-6`o!0E|-5I^)FGjwN&g_G)&T#?ItN=r?zA#b`80OoEBgjY**YBMR}LY
    z%q|^BkPHX#K`8>*1_H02+B|DW718oky(Up5>Pkl4o6(vQN
    z42YRG@4b2RcIJKW4gV60g%Pxi>d%VRC_?|B6TgWbvGrFVR*;T#&O~`S@+N2Td7h(m
    zzzkSIUa-WxXi0gA@dPty$$6R4q8YNn`7om;Gh#*aQAP*NnAMT*V6<$;twcV-=#bfI
    zb>+Jl9X7kIo_vqho9|`wh}mcL=ldBQH3zK0{2+&TWT3gzzSHf|7+T|6v-|-by^HkN
    z9i(>{iM4>oJvh&$lWS3Qy3JaEQS6rAnFbj^`mZg<-N>05$K7Mg(
    zD$SF`1e^}*n}yb=w0g;#Y+VOp
    z1x_W;=_t?ZTt1-lc|i~4MLnuZcZ9s82aTXE8?q4^1YKP)!ZVT{0!c&<8&R0YjF8bW
    z!&B*uphrLwpBK|H(s8-$RE&b_ea%8XtU&XaiaTp41-tCR=_vM$qA5R`cW3Rgvg6bg
    zI0L1EZM|ABKmi*S8@o!WtX!G8HmS_m*wWlAGkSfYkBy3Q1oVr_2i{?RNF;2yRa~Ad
    zc=yY`I|x0!*{xCFuAoIU$Jo2OIjXUz>735%0bO`3t_dv>_gz-QS+e!=2{a@Q!eDlX>;Smv+=1>kYRJ*Mu}@=lS*giNBih^O9&YpuHU+LT
    z*NmW0>J^eh;bs>K#dfOoG&=iRnvKqPJUt2YI(F&(CRtCNsin?rq~7>Sev|GL`7~0O
    zkJjX)tK918-=BSS_L=wdf=h3B)T*Yv$iNc-d@KcH|g`I
    zU_Hlde2miKBp@x!K&{#UB@&`=X_10+qf{Z>Nq|kzt5#4^N)^9!kZ3uag!5!cc5g4crK#*gIYY(=nzN5}LL}dP9`eh{G7%rw~jp>Dv
    z7*nMsPKP3lX=cYXRxrJyw1gE(AEwCWgNV{xqMo;+Sl9$&rw
    zEIIbHS{uB$Ih5TPI`J|jb%mFuR{*T;2huZncr)I&-0|OkM^N$-$GrdZ=)eU<#&3Xc
    zg`Ieyh+(M7GSooi0%LCj?#?xySmz${OFYPgz4{QRfyKZlJ&S=kdfa=OAB~H=&c6+^
    zatdthQ-&bcg-^QO?PAo9aav$YoGw1(eH&n5AH*$*`}485D8fpK?hYC>%JwuI2mUrn
    z+d^0sWUKfol$Iyq(Is1ktI=2{oj#?~U}S|Utd}q(UHZ5pvZ0q;ZQ3-h!>Rz|fD|Hn
    z#%{v|lMpsOf|sLf=;;uNZJVUAOJY=c+d4iAevzOT*ksVRufhXoj_&Haf$4|f^Hh7F
    z4WN%p@bIHi&RoD3KcEo)kAOi;!G>u*fjs465`apL-=e%2?dbarQ#`SweT0}VEazZa6Ie(6a^8pT4tmM+
    zqTH0x(D1s@-{iU2;O&cBQkVGs=4f2(fAGB~f?>61weV<=kx!g0%4v=aiQVfXV@(9(
    z6Zh%(pSqvE_lH}r=(M#X-7I~G1WmhGER~ByhPvB&)lmP5Kwi6J#GHC>U*17>!a+13>;LnulWMLzyM69xqf&CN!(+UfTZzD6T8
    zH1Z8P`y3tp1`Rz&qtDS8{JusLj5zTklw9twhmy5W^1+)Mp~JVOSJGvU>%RBX{~$WD
    G-Tn`3SmihX
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..efba9d13b0b167551423ef11f7e45de7648ab0eb
    GIT binary patch
    literal 29132
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..fb49afd45742235854ba9808946ab9603ebc7de1
    GIT binary patch
    literal 15775
    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
    ALjV8(
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..95fd60ed8d8eca71c02a87a0bd0e36be72f0d699
    GIT binary patch
    literal 7536
    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
    av2I7`B7E;YT>XP+i2%4fuz?LzqW=X0iVxQS
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..77b1309375fd06c16ac27257e701c526de376050
    GIT binary patch
    literal 10495
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..db1db7b984566bf0ad9b72ceb6796d3b5ad34577
    GIT binary patch
    literal 4727
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/cache.py b/env/lib/python3.12/site-packages/pip/_internal/commands/cache.py
    new file mode 100644
    index 0000000..3283361
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/cache.py
    @@ -0,0 +1,225 @@
    +import os
    +import textwrap
    +from optparse import Values
    +from typing import Any, List
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.exceptions import CommandError, PipError
    +from pip._internal.utils import filesystem
    +from pip._internal.utils.logging import getLogger
    +
    +logger = getLogger(__name__)
    +
    +
    +class CacheCommand(Command):
    +    """
    +    Inspect and manage pip's wheel cache.
    +
    +    Subcommands:
    +
    +    - dir: Show the cache directory.
    +    - info: Show information about the cache.
    +    - list: List filenames of packages stored in the cache.
    +    - remove: Remove one or more package from the cache.
    +    - purge: Remove all items from the cache.
    +
    +    ```` can be a glob expression or a package name.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +        %prog dir
    +        %prog info
    +        %prog list [] [--format=[human, abspath]]
    +        %prog remove 
    +        %prog purge
    +    """
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "--format",
    +            action="store",
    +            dest="list_format",
    +            default="human",
    +            choices=("human", "abspath"),
    +            help="Select the output format among: human (default) or abspath",
    +        )
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        handlers = {
    +            "dir": self.get_cache_dir,
    +            "info": self.get_cache_info,
    +            "list": self.list_cache_items,
    +            "remove": self.remove_cache_items,
    +            "purge": self.purge_cache,
    +        }
    +
    +        if not options.cache_dir:
    +            logger.error("pip cache commands can not function since cache is disabled.")
    +            return ERROR
    +
    +        # Determine action
    +        if not args or args[0] not in handlers:
    +            logger.error(
    +                "Need an action (%s) to perform.",
    +                ", ".join(sorted(handlers)),
    +            )
    +            return ERROR
    +
    +        action = args[0]
    +
    +        # Error handling happens here, not in the action-handlers.
    +        try:
    +            handlers[action](options, args[1:])
    +        except PipError as e:
    +            logger.error(e.args[0])
    +            return ERROR
    +
    +        return SUCCESS
    +
    +    def get_cache_dir(self, options: Values, args: List[Any]) -> None:
    +        if args:
    +            raise CommandError("Too many arguments")
    +
    +        logger.info(options.cache_dir)
    +
    +    def get_cache_info(self, options: Values, args: List[Any]) -> None:
    +        if args:
    +            raise CommandError("Too many arguments")
    +
    +        num_http_files = len(self._find_http_files(options))
    +        num_packages = len(self._find_wheels(options, "*"))
    +
    +        http_cache_location = self._cache_dir(options, "http-v2")
    +        old_http_cache_location = self._cache_dir(options, "http")
    +        wheels_cache_location = self._cache_dir(options, "wheels")
    +        http_cache_size = filesystem.format_size(
    +            filesystem.directory_size(http_cache_location)
    +            + filesystem.directory_size(old_http_cache_location)
    +        )
    +        wheels_cache_size = filesystem.format_directory_size(wheels_cache_location)
    +
    +        message = (
    +            textwrap.dedent(
    +                """
    +                    Package index page cache location (pip v23.3+): {http_cache_location}
    +                    Package index page cache location (older pips): {old_http_cache_location}
    +                    Package index page cache size: {http_cache_size}
    +                    Number of HTTP files: {num_http_files}
    +                    Locally built wheels location: {wheels_cache_location}
    +                    Locally built wheels size: {wheels_cache_size}
    +                    Number of locally built wheels: {package_count}
    +                """  # noqa: E501
    +            )
    +            .format(
    +                http_cache_location=http_cache_location,
    +                old_http_cache_location=old_http_cache_location,
    +                http_cache_size=http_cache_size,
    +                num_http_files=num_http_files,
    +                wheels_cache_location=wheels_cache_location,
    +                package_count=num_packages,
    +                wheels_cache_size=wheels_cache_size,
    +            )
    +            .strip()
    +        )
    +
    +        logger.info(message)
    +
    +    def list_cache_items(self, options: Values, args: List[Any]) -> None:
    +        if len(args) > 1:
    +            raise CommandError("Too many arguments")
    +
    +        if args:
    +            pattern = args[0]
    +        else:
    +            pattern = "*"
    +
    +        files = self._find_wheels(options, pattern)
    +        if options.list_format == "human":
    +            self.format_for_human(files)
    +        else:
    +            self.format_for_abspath(files)
    +
    +    def format_for_human(self, files: List[str]) -> None:
    +        if not files:
    +            logger.info("No locally built wheels cached.")
    +            return
    +
    +        results = []
    +        for filename in files:
    +            wheel = os.path.basename(filename)
    +            size = filesystem.format_file_size(filename)
    +            results.append(f" - {wheel} ({size})")
    +        logger.info("Cache contents:\n")
    +        logger.info("\n".join(sorted(results)))
    +
    +    def format_for_abspath(self, files: List[str]) -> None:
    +        if files:
    +            logger.info("\n".join(sorted(files)))
    +
    +    def remove_cache_items(self, options: Values, args: List[Any]) -> None:
    +        if len(args) > 1:
    +            raise CommandError("Too many arguments")
    +
    +        if not args:
    +            raise CommandError("Please provide a pattern")
    +
    +        files = self._find_wheels(options, args[0])
    +
    +        no_matching_msg = "No matching packages"
    +        if args[0] == "*":
    +            # Only fetch http files if no specific pattern given
    +            files += self._find_http_files(options)
    +        else:
    +            # Add the pattern to the log message
    +            no_matching_msg += f' for pattern "{args[0]}"'
    +
    +        if not files:
    +            logger.warning(no_matching_msg)
    +
    +        for filename in files:
    +            os.unlink(filename)
    +            logger.verbose("Removed %s", filename)
    +        logger.info("Files removed: %s", len(files))
    +
    +    def purge_cache(self, options: Values, args: List[Any]) -> None:
    +        if args:
    +            raise CommandError("Too many arguments")
    +
    +        return self.remove_cache_items(options, ["*"])
    +
    +    def _cache_dir(self, options: Values, subdir: str) -> str:
    +        return os.path.join(options.cache_dir, subdir)
    +
    +    def _find_http_files(self, options: Values) -> List[str]:
    +        old_http_dir = self._cache_dir(options, "http")
    +        new_http_dir = self._cache_dir(options, "http-v2")
    +        return filesystem.find_files(old_http_dir, "*") + filesystem.find_files(
    +            new_http_dir, "*"
    +        )
    +
    +    def _find_wheels(self, options: Values, pattern: str) -> List[str]:
    +        wheel_dir = self._cache_dir(options, "wheels")
    +
    +        # The wheel filename format, as specified in PEP 427, is:
    +        #     {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
    +        #
    +        # Additionally, non-alphanumeric values in the distribution are
    +        # normalized to underscores (_), meaning hyphens can never occur
    +        # before `-{version}`.
    +        #
    +        # Given that information:
    +        # - If the pattern we're given contains a hyphen (-), the user is
    +        #   providing at least the version. Thus, we can just append `*.whl`
    +        #   to match the rest of it.
    +        # - If the pattern we're given doesn't contain a hyphen (-), the
    +        #   user is only providing the name. Thus, we append `-*.whl` to
    +        #   match the hyphen before the version, followed by anything else.
    +        #
    +        # PEP 427: https://www.python.org/dev/peps/pep-0427/
    +        pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
    +
    +        return filesystem.find_files(wheel_dir, pattern)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/check.py b/env/lib/python3.12/site-packages/pip/_internal/commands/check.py
    new file mode 100644
    index 0000000..f54a16d
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/check.py
    @@ -0,0 +1,67 @@
    +import logging
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.metadata import get_default_environment
    +from pip._internal.operations.check import (
    +    check_package_set,
    +    check_unsupported,
    +    create_package_set_from_installed,
    +)
    +from pip._internal.utils.compatibility_tags import get_supported
    +from pip._internal.utils.misc import write_output
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class CheckCommand(Command):
    +    """Verify installed packages have compatible dependencies."""
    +
    +    ignore_require_venv = True
    +    usage = """
    +      %prog [options]"""
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        package_set, parsing_probs = create_package_set_from_installed()
    +        missing, conflicting = check_package_set(package_set)
    +        unsupported = list(
    +            check_unsupported(
    +                get_default_environment().iter_installed_distributions(),
    +                get_supported(),
    +            )
    +        )
    +
    +        for project_name in missing:
    +            version = package_set[project_name].version
    +            for dependency in missing[project_name]:
    +                write_output(
    +                    "%s %s requires %s, which is not installed.",
    +                    project_name,
    +                    version,
    +                    dependency[0],
    +                )
    +
    +        for project_name in conflicting:
    +            version = package_set[project_name].version
    +            for dep_name, dep_version, req in conflicting[project_name]:
    +                write_output(
    +                    "%s %s has requirement %s, but you have %s %s.",
    +                    project_name,
    +                    version,
    +                    req,
    +                    dep_name,
    +                    dep_version,
    +                )
    +        for package in unsupported:
    +            write_output(
    +                "%s %s is not supported on this platform",
    +                package.raw_name,
    +                package.version,
    +            )
    +        if missing or conflicting or parsing_probs or unsupported:
    +            return ERROR
    +        else:
    +            write_output("No broken requirements found.")
    +            return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/completion.py b/env/lib/python3.12/site-packages/pip/_internal/commands/completion.py
    new file mode 100644
    index 0000000..9e89e27
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/completion.py
    @@ -0,0 +1,130 @@
    +import sys
    +import textwrap
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.utils.misc import get_prog
    +
    +BASE_COMPLETION = """
    +# pip {shell} completion start{script}# pip {shell} completion end
    +"""
    +
    +COMPLETION_SCRIPTS = {
    +    "bash": """
    +        _pip_completion()
    +        {{
    +            COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\
    +                           COMP_CWORD=$COMP_CWORD \\
    +                           PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
    +        }}
    +        complete -o default -F _pip_completion {prog}
    +    """,
    +    "zsh": """
    +        #compdef -P pip[0-9.]#
    +        __pip() {{
    +          compadd $( COMP_WORDS="$words[*]" \\
    +                     COMP_CWORD=$((CURRENT-1)) \\
    +                     PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )
    +        }}
    +        if [[ $zsh_eval_context[-1] == loadautofunc ]]; then
    +          # autoload from fpath, call function directly
    +          __pip "$@"
    +        else
    +          # eval/source/. command, register function for later
    +          compdef __pip -P 'pip[0-9.]#'
    +        fi
    +    """,
    +    "fish": """
    +        function __fish_complete_pip
    +            set -lx COMP_WORDS (commandline -o) ""
    +            set -lx COMP_CWORD ( \\
    +                math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
    +            )
    +            set -lx PIP_AUTO_COMPLETE 1
    +            string split \\  -- (eval $COMP_WORDS[1])
    +        end
    +        complete -fa "(__fish_complete_pip)" -c {prog}
    +    """,
    +    "powershell": """
    +        if ((Test-Path Function:\\TabExpansion) -and -not `
    +            (Test-Path Function:\\_pip_completeBackup)) {{
    +            Rename-Item Function:\\TabExpansion _pip_completeBackup
    +        }}
    +        function TabExpansion($line, $lastWord) {{
    +            $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
    +            if ($lastBlock.StartsWith("{prog} ")) {{
    +                $Env:COMP_WORDS=$lastBlock
    +                $Env:COMP_CWORD=$lastBlock.Split().Length - 1
    +                $Env:PIP_AUTO_COMPLETE=1
    +                (& {prog}).Split()
    +                Remove-Item Env:COMP_WORDS
    +                Remove-Item Env:COMP_CWORD
    +                Remove-Item Env:PIP_AUTO_COMPLETE
    +            }}
    +            elseif (Test-Path Function:\\_pip_completeBackup) {{
    +                # Fall back on existing tab expansion
    +                _pip_completeBackup $line $lastWord
    +            }}
    +        }}
    +    """,
    +}
    +
    +
    +class CompletionCommand(Command):
    +    """A helper command to be used for command completion."""
    +
    +    ignore_require_venv = True
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "--bash",
    +            "-b",
    +            action="store_const",
    +            const="bash",
    +            dest="shell",
    +            help="Emit completion code for bash",
    +        )
    +        self.cmd_opts.add_option(
    +            "--zsh",
    +            "-z",
    +            action="store_const",
    +            const="zsh",
    +            dest="shell",
    +            help="Emit completion code for zsh",
    +        )
    +        self.cmd_opts.add_option(
    +            "--fish",
    +            "-f",
    +            action="store_const",
    +            const="fish",
    +            dest="shell",
    +            help="Emit completion code for fish",
    +        )
    +        self.cmd_opts.add_option(
    +            "--powershell",
    +            "-p",
    +            action="store_const",
    +            const="powershell",
    +            dest="shell",
    +            help="Emit completion code for powershell",
    +        )
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        """Prints the completion code of the given shell"""
    +        shells = COMPLETION_SCRIPTS.keys()
    +        shell_options = ["--" + shell for shell in sorted(shells)]
    +        if options.shell in shells:
    +            script = textwrap.dedent(
    +                COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog())
    +            )
    +            print(BASE_COMPLETION.format(script=script, shell=options.shell))
    +            return SUCCESS
    +        else:
    +            sys.stderr.write(
    +                "ERROR: You must pass {}\n".format(" or ".join(shell_options))
    +            )
    +            return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/configuration.py b/env/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
    new file mode 100644
    index 0000000..1a1dc6b
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
    @@ -0,0 +1,280 @@
    +import logging
    +import os
    +import subprocess
    +from optparse import Values
    +from typing import Any, List, Optional
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.configuration import (
    +    Configuration,
    +    Kind,
    +    get_configuration_files,
    +    kinds,
    +)
    +from pip._internal.exceptions import PipError
    +from pip._internal.utils.logging import indent_log
    +from pip._internal.utils.misc import get_prog, write_output
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class ConfigurationCommand(Command):
    +    """
    +    Manage local and global configuration.
    +
    +    Subcommands:
    +
    +    - list: List the active configuration (or from the file specified)
    +    - edit: Edit the configuration file in an editor
    +    - get: Get the value associated with command.option
    +    - set: Set the command.option=value
    +    - unset: Unset the value associated with command.option
    +    - debug: List the configuration files and values defined under them
    +
    +    Configuration keys should be dot separated command and option name,
    +    with the special prefix "global" affecting any command. For example,
    +    "pip config set global.index-url https://example.org/" would configure
    +    the index url for all commands, but "pip config set download.timeout 10"
    +    would configure a 10 second timeout only for "pip download" commands.
    +
    +    If none of --user, --global and --site are passed, a virtual
    +    environment configuration file is used if one is active and the file
    +    exists. Otherwise, all modifications happen to the user file by
    +    default.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +        %prog [] list
    +        %prog [] [--editor ] edit
    +
    +        %prog [] get command.option
    +        %prog [] set command.option value
    +        %prog [] unset command.option
    +        %prog [] debug
    +    """
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "--editor",
    +            dest="editor",
    +            action="store",
    +            default=None,
    +            help=(
    +                "Editor to use to edit the file. Uses VISUAL or EDITOR "
    +                "environment variables if not provided."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--global",
    +            dest="global_file",
    +            action="store_true",
    +            default=False,
    +            help="Use the system-wide configuration file only",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--user",
    +            dest="user_file",
    +            action="store_true",
    +            default=False,
    +            help="Use the user configuration file only",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--site",
    +            dest="site_file",
    +            action="store_true",
    +            default=False,
    +            help="Use the current environment configuration file only",
    +        )
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        handlers = {
    +            "list": self.list_values,
    +            "edit": self.open_in_editor,
    +            "get": self.get_name,
    +            "set": self.set_name_value,
    +            "unset": self.unset_name,
    +            "debug": self.list_config_values,
    +        }
    +
    +        # Determine action
    +        if not args or args[0] not in handlers:
    +            logger.error(
    +                "Need an action (%s) to perform.",
    +                ", ".join(sorted(handlers)),
    +            )
    +            return ERROR
    +
    +        action = args[0]
    +
    +        # Determine which configuration files are to be loaded
    +        #    Depends on whether the command is modifying.
    +        try:
    +            load_only = self._determine_file(
    +                options, need_value=(action in ["get", "set", "unset", "edit"])
    +            )
    +        except PipError as e:
    +            logger.error(e.args[0])
    +            return ERROR
    +
    +        # Load a new configuration
    +        self.configuration = Configuration(
    +            isolated=options.isolated_mode, load_only=load_only
    +        )
    +        self.configuration.load()
    +
    +        # Error handling happens here, not in the action-handlers.
    +        try:
    +            handlers[action](options, args[1:])
    +        except PipError as e:
    +            logger.error(e.args[0])
    +            return ERROR
    +
    +        return SUCCESS
    +
    +    def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]:
    +        file_options = [
    +            key
    +            for key, value in (
    +                (kinds.USER, options.user_file),
    +                (kinds.GLOBAL, options.global_file),
    +                (kinds.SITE, options.site_file),
    +            )
    +            if value
    +        ]
    +
    +        if not file_options:
    +            if not need_value:
    +                return None
    +            # Default to user, unless there's a site file.
    +            elif any(
    +                os.path.exists(site_config_file)
    +                for site_config_file in get_configuration_files()[kinds.SITE]
    +            ):
    +                return kinds.SITE
    +            else:
    +                return kinds.USER
    +        elif len(file_options) == 1:
    +            return file_options[0]
    +
    +        raise PipError(
    +            "Need exactly one file to operate upon "
    +            "(--user, --site, --global) to perform."
    +        )
    +
    +    def list_values(self, options: Values, args: List[str]) -> None:
    +        self._get_n_args(args, "list", n=0)
    +
    +        for key, value in sorted(self.configuration.items()):
    +            write_output("%s=%r", key, value)
    +
    +    def get_name(self, options: Values, args: List[str]) -> None:
    +        key = self._get_n_args(args, "get [name]", n=1)
    +        value = self.configuration.get_value(key)
    +
    +        write_output("%s", value)
    +
    +    def set_name_value(self, options: Values, args: List[str]) -> None:
    +        key, value = self._get_n_args(args, "set [name] [value]", n=2)
    +        self.configuration.set_value(key, value)
    +
    +        self._save_configuration()
    +
    +    def unset_name(self, options: Values, args: List[str]) -> None:
    +        key = self._get_n_args(args, "unset [name]", n=1)
    +        self.configuration.unset_value(key)
    +
    +        self._save_configuration()
    +
    +    def list_config_values(self, options: Values, args: List[str]) -> None:
    +        """List config key-value pairs across different config files"""
    +        self._get_n_args(args, "debug", n=0)
    +
    +        self.print_env_var_values()
    +        # Iterate over config files and print if they exist, and the
    +        # key-value pairs present in them if they do
    +        for variant, files in sorted(self.configuration.iter_config_files()):
    +            write_output("%s:", variant)
    +            for fname in files:
    +                with indent_log():
    +                    file_exists = os.path.exists(fname)
    +                    write_output("%s, exists: %r", fname, file_exists)
    +                    if file_exists:
    +                        self.print_config_file_values(variant)
    +
    +    def print_config_file_values(self, variant: Kind) -> None:
    +        """Get key-value pairs from the file of a variant"""
    +        for name, value in self.configuration.get_values_in_config(variant).items():
    +            with indent_log():
    +                write_output("%s: %s", name, value)
    +
    +    def print_env_var_values(self) -> None:
    +        """Get key-values pairs present as environment variables"""
    +        write_output("%s:", "env_var")
    +        with indent_log():
    +            for key, value in sorted(self.configuration.get_environ_vars()):
    +                env_var = f"PIP_{key.upper()}"
    +                write_output("%s=%r", env_var, value)
    +
    +    def open_in_editor(self, options: Values, args: List[str]) -> None:
    +        editor = self._determine_editor(options)
    +
    +        fname = self.configuration.get_file_to_edit()
    +        if fname is None:
    +            raise PipError("Could not determine appropriate file.")
    +        elif '"' in fname:
    +            # This shouldn't happen, unless we see a username like that.
    +            # If that happens, we'd appreciate a pull request fixing this.
    +            raise PipError(
    +                f'Can not open an editor for a file name containing "\n{fname}'
    +            )
    +
    +        try:
    +            subprocess.check_call(f'{editor} "{fname}"', shell=True)
    +        except FileNotFoundError as e:
    +            if not e.filename:
    +                e.filename = editor
    +            raise
    +        except subprocess.CalledProcessError as e:
    +            raise PipError(f"Editor Subprocess exited with exit code {e.returncode}")
    +
    +    def _get_n_args(self, args: List[str], example: str, n: int) -> Any:
    +        """Helper to make sure the command got the right number of arguments"""
    +        if len(args) != n:
    +            msg = (
    +                f"Got unexpected number of arguments, expected {n}. "
    +                f'(example: "{get_prog()} config {example}")'
    +            )
    +            raise PipError(msg)
    +
    +        if n == 1:
    +            return args[0]
    +        else:
    +            return args
    +
    +    def _save_configuration(self) -> None:
    +        # We successfully ran a modifying command. Need to save the
    +        # configuration.
    +        try:
    +            self.configuration.save()
    +        except Exception:
    +            logger.exception(
    +                "Unable to save configuration. Please report this as a bug."
    +            )
    +            raise PipError("Internal Error.")
    +
    +    def _determine_editor(self, options: Values) -> str:
    +        if options.editor is not None:
    +            return options.editor
    +        elif "VISUAL" in os.environ:
    +            return os.environ["VISUAL"]
    +        elif "EDITOR" in os.environ:
    +            return os.environ["EDITOR"]
    +        else:
    +            raise PipError("Could not determine editor to use.")
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py b/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py
    new file mode 100644
    index 0000000..567ca96
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/debug.py
    @@ -0,0 +1,201 @@
    +import locale
    +import logging
    +import os
    +import sys
    +from optparse import Values
    +from types import ModuleType
    +from typing import Any, Dict, List, Optional
    +
    +import pip._vendor
    +from pip._vendor.certifi import where
    +from pip._vendor.packaging.version import parse as parse_version
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.cmdoptions import make_target_python
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.configuration import Configuration
    +from pip._internal.metadata import get_environment
    +from pip._internal.utils.compat import open_text_resource
    +from pip._internal.utils.logging import indent_log
    +from pip._internal.utils.misc import get_pip_version
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def show_value(name: str, value: Any) -> None:
    +    logger.info("%s: %s", name, value)
    +
    +
    +def show_sys_implementation() -> None:
    +    logger.info("sys.implementation:")
    +    implementation_name = sys.implementation.name
    +    with indent_log():
    +        show_value("name", implementation_name)
    +
    +
    +def create_vendor_txt_map() -> Dict[str, str]:
    +    with open_text_resource("pip._vendor", "vendor.txt") as f:
    +        # Purge non version specifying lines.
    +        # Also, remove any space prefix or suffixes (including comments).
    +        lines = [
    +            line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line
    +        ]
    +
    +    # Transform into "module" -> version dict.
    +    return dict(line.split("==", 1) for line in lines)
    +
    +
    +def get_module_from_module_name(module_name: str) -> Optional[ModuleType]:
    +    # Module name can be uppercase in vendor.txt for some reason...
    +    module_name = module_name.lower().replace("-", "_")
    +    # PATCH: setuptools is actually only pkg_resources.
    +    if module_name == "setuptools":
    +        module_name = "pkg_resources"
    +
    +    try:
    +        __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0)
    +        return getattr(pip._vendor, module_name)
    +    except ImportError:
    +        # We allow 'truststore' to fail to import due
    +        # to being unavailable on Python 3.9 and earlier.
    +        if module_name == "truststore" and sys.version_info < (3, 10):
    +            return None
    +        raise
    +
    +
    +def get_vendor_version_from_module(module_name: str) -> Optional[str]:
    +    module = get_module_from_module_name(module_name)
    +    version = getattr(module, "__version__", None)
    +
    +    if module and not version:
    +        # Try to find version in debundled module info.
    +        assert module.__file__ is not None
    +        env = get_environment([os.path.dirname(module.__file__)])
    +        dist = env.get_distribution(module_name)
    +        if dist:
    +            version = str(dist.version)
    +
    +    return version
    +
    +
    +def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None:
    +    """Log the actual version and print extra info if there is
    +    a conflict or if the actual version could not be imported.
    +    """
    +    for module_name, expected_version in vendor_txt_versions.items():
    +        extra_message = ""
    +        actual_version = get_vendor_version_from_module(module_name)
    +        if not actual_version:
    +            extra_message = (
    +                " (Unable to locate actual module version, using"
    +                " vendor.txt specified version)"
    +            )
    +            actual_version = expected_version
    +        elif parse_version(actual_version) != parse_version(expected_version):
    +            extra_message = (
    +                " (CONFLICT: vendor.txt suggests version should"
    +                f" be {expected_version})"
    +            )
    +        logger.info("%s==%s%s", module_name, actual_version, extra_message)
    +
    +
    +def show_vendor_versions() -> None:
    +    logger.info("vendored library versions:")
    +
    +    vendor_txt_versions = create_vendor_txt_map()
    +    with indent_log():
    +        show_actual_vendor_versions(vendor_txt_versions)
    +
    +
    +def show_tags(options: Values) -> None:
    +    tag_limit = 10
    +
    +    target_python = make_target_python(options)
    +    tags = target_python.get_sorted_tags()
    +
    +    # Display the target options that were explicitly provided.
    +    formatted_target = target_python.format_given()
    +    suffix = ""
    +    if formatted_target:
    +        suffix = f" (target: {formatted_target})"
    +
    +    msg = f"Compatible tags: {len(tags)}{suffix}"
    +    logger.info(msg)
    +
    +    if options.verbose < 1 and len(tags) > tag_limit:
    +        tags_limited = True
    +        tags = tags[:tag_limit]
    +    else:
    +        tags_limited = False
    +
    +    with indent_log():
    +        for tag in tags:
    +            logger.info(str(tag))
    +
    +        if tags_limited:
    +            msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]"
    +            logger.info(msg)
    +
    +
    +def ca_bundle_info(config: Configuration) -> str:
    +    levels = {key.split(".", 1)[0] for key, _ in config.items()}
    +    if not levels:
    +        return "Not specified"
    +
    +    levels_that_override_global = ["install", "wheel", "download"]
    +    global_overriding_level = [
    +        level for level in levels if level in levels_that_override_global
    +    ]
    +    if not global_overriding_level:
    +        return "global"
    +
    +    if "global" in levels:
    +        levels.remove("global")
    +    return ", ".join(levels)
    +
    +
    +class DebugCommand(Command):
    +    """
    +    Display debug information.
    +    """
    +
    +    usage = """
    +      %prog """
    +    ignore_require_venv = True
    +
    +    def add_options(self) -> None:
    +        cmdoptions.add_target_python_options(self.cmd_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +        self.parser.config.load()
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        logger.warning(
    +            "This command is only meant for debugging. "
    +            "Do not use this with automation for parsing and getting these "
    +            "details, since the output and options of this command may "
    +            "change without notice."
    +        )
    +        show_value("pip version", get_pip_version())
    +        show_value("sys.version", sys.version)
    +        show_value("sys.executable", sys.executable)
    +        show_value("sys.getdefaultencoding", sys.getdefaultencoding())
    +        show_value("sys.getfilesystemencoding", sys.getfilesystemencoding())
    +        show_value(
    +            "locale.getpreferredencoding",
    +            locale.getpreferredencoding(),
    +        )
    +        show_value("sys.platform", sys.platform)
    +        show_sys_implementation()
    +
    +        show_value("'cert' config value", ca_bundle_info(self.parser.config))
    +        show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE"))
    +        show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE"))
    +        show_value("pip._vendor.certifi.where()", where())
    +        show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
    +
    +        show_vendor_versions()
    +
    +        show_tags(options)
    +
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/download.py b/env/lib/python3.12/site-packages/pip/_internal/commands/download.py
    new file mode 100644
    index 0000000..917bbb9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/download.py
    @@ -0,0 +1,146 @@
    +import logging
    +import os
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.cmdoptions import make_target_python
    +from pip._internal.cli.req_command import RequirementCommand, with_cleanup
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.operations.build.build_tracker import get_build_tracker
    +from pip._internal.req.req_install import check_legacy_setup_py_options
    +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output
    +from pip._internal.utils.temp_dir import TempDirectory
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class DownloadCommand(RequirementCommand):
    +    """
    +    Download packages from:
    +
    +    - PyPI (and other indexes) using requirement specifiers.
    +    - VCS project urls.
    +    - Local project directories.
    +    - Local or remote source archives.
    +
    +    pip also supports downloading from "requirements files", which provide
    +    an easy way to specify a whole environment to be downloaded.
    +    """
    +
    +    usage = """
    +      %prog [options]  [package-index-options] ...
    +      %prog [options] -r  [package-index-options] ...
    +      %prog [options]  ...
    +      %prog [options]  ...
    +      %prog [options]  ..."""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(cmdoptions.constraints())
    +        self.cmd_opts.add_option(cmdoptions.requirements())
    +        self.cmd_opts.add_option(cmdoptions.no_deps())
    +        self.cmd_opts.add_option(cmdoptions.global_options())
    +        self.cmd_opts.add_option(cmdoptions.no_binary())
    +        self.cmd_opts.add_option(cmdoptions.only_binary())
    +        self.cmd_opts.add_option(cmdoptions.prefer_binary())
    +        self.cmd_opts.add_option(cmdoptions.src())
    +        self.cmd_opts.add_option(cmdoptions.pre())
    +        self.cmd_opts.add_option(cmdoptions.require_hashes())
    +        self.cmd_opts.add_option(cmdoptions.progress_bar())
    +        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
    +        self.cmd_opts.add_option(cmdoptions.use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.check_build_deps())
    +        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
    +
    +        self.cmd_opts.add_option(
    +            "-d",
    +            "--dest",
    +            "--destination-dir",
    +            "--destination-directory",
    +            dest="download_dir",
    +            metavar="dir",
    +            default=os.curdir,
    +            help="Download packages into .",
    +        )
    +
    +        cmdoptions.add_target_python_options(self.cmd_opts)
    +
    +        index_opts = cmdoptions.make_option_group(
    +            cmdoptions.index_group,
    +            self.parser,
    +        )
    +
    +        self.parser.insert_option_group(0, index_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    @with_cleanup
    +    def run(self, options: Values, args: List[str]) -> int:
    +        options.ignore_installed = True
    +        # editable doesn't really make sense for `pip download`, but the bowels
    +        # of the RequirementSet code require that property.
    +        options.editables = []
    +
    +        cmdoptions.check_dist_restriction(options)
    +
    +        options.download_dir = normalize_path(options.download_dir)
    +        ensure_dir(options.download_dir)
    +
    +        session = self.get_default_session(options)
    +
    +        target_python = make_target_python(options)
    +        finder = self._build_package_finder(
    +            options=options,
    +            session=session,
    +            target_python=target_python,
    +            ignore_requires_python=options.ignore_requires_python,
    +        )
    +
    +        build_tracker = self.enter_context(get_build_tracker())
    +
    +        directory = TempDirectory(
    +            delete=not options.no_clean,
    +            kind="download",
    +            globally_managed=True,
    +        )
    +
    +        reqs = self.get_requirements(args, options, finder, session)
    +        check_legacy_setup_py_options(options, reqs)
    +
    +        preparer = self.make_requirement_preparer(
    +            temp_build_dir=directory,
    +            options=options,
    +            build_tracker=build_tracker,
    +            session=session,
    +            finder=finder,
    +            download_dir=options.download_dir,
    +            use_user_site=False,
    +            verbosity=self.verbosity,
    +        )
    +
    +        resolver = self.make_resolver(
    +            preparer=preparer,
    +            finder=finder,
    +            options=options,
    +            ignore_requires_python=options.ignore_requires_python,
    +            use_pep517=options.use_pep517,
    +            py_version_info=options.python_version,
    +        )
    +
    +        self.trace_basic_info(finder)
    +
    +        requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
    +
    +        downloaded: List[str] = []
    +        for req in requirement_set.requirements.values():
    +            if req.satisfied_by is None:
    +                assert req.name is not None
    +                preparer.save_linked_requirement(req)
    +                downloaded.append(req.name)
    +
    +        preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
    +
    +        if downloaded:
    +            write_output("Successfully downloaded %s", " ".join(downloaded))
    +
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py b/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py
    new file mode 100644
    index 0000000..885fdfe
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/freeze.py
    @@ -0,0 +1,109 @@
    +import sys
    +from optparse import Values
    +from typing import AbstractSet, List
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.operations.freeze import freeze
    +from pip._internal.utils.compat import stdlib_pkgs
    +
    +
    +def _should_suppress_build_backends() -> bool:
    +    return sys.version_info < (3, 12)
    +
    +
    +def _dev_pkgs() -> AbstractSet[str]:
    +    pkgs = {"pip"}
    +
    +    if _should_suppress_build_backends():
    +        pkgs |= {"setuptools", "distribute", "wheel"}
    +
    +    return pkgs
    +
    +
    +class FreezeCommand(Command):
    +    """
    +    Output installed packages in requirements format.
    +
    +    packages are listed in a case-insensitive sorted order.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +      %prog [options]"""
    +    log_streams = ("ext://sys.stderr", "ext://sys.stderr")
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-r",
    +            "--requirement",
    +            dest="requirements",
    +            action="append",
    +            default=[],
    +            metavar="file",
    +            help=(
    +                "Use the order in the given requirements file and its "
    +                "comments when generating output. This option can be "
    +                "used multiple times."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "-l",
    +            "--local",
    +            dest="local",
    +            action="store_true",
    +            default=False,
    +            help=(
    +                "If in a virtualenv that has global access, do not output "
    +                "globally-installed packages."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "--user",
    +            dest="user",
    +            action="store_true",
    +            default=False,
    +            help="Only output packages installed in user-site.",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.list_path())
    +        self.cmd_opts.add_option(
    +            "--all",
    +            dest="freeze_all",
    +            action="store_true",
    +            help=(
    +                "Do not skip these packages in the output:"
    +                " {}".format(", ".join(_dev_pkgs()))
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "--exclude-editable",
    +            dest="exclude_editable",
    +            action="store_true",
    +            help="Exclude editable package from output.",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.list_exclude())
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        skip = set(stdlib_pkgs)
    +        if not options.freeze_all:
    +            skip.update(_dev_pkgs())
    +
    +        if options.excludes:
    +            skip.update(options.excludes)
    +
    +        cmdoptions.check_list_path_option(options)
    +
    +        for line in freeze(
    +            requirement=options.requirements,
    +            local_only=options.local,
    +            user_only=options.user,
    +            paths=options.path,
    +            isolated=options.isolated_mode,
    +            skip=skip,
    +            exclude_editable=options.exclude_editable,
    +        ):
    +            sys.stdout.write(line + "\n")
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/hash.py b/env/lib/python3.12/site-packages/pip/_internal/commands/hash.py
    new file mode 100644
    index 0000000..042dac8
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/hash.py
    @@ -0,0 +1,59 @@
    +import hashlib
    +import logging
    +import sys
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES
    +from pip._internal.utils.misc import read_chunks, write_output
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class HashCommand(Command):
    +    """
    +    Compute a hash of a local package archive.
    +
    +    These can be used with --hash in a requirements file to do repeatable
    +    installs.
    +    """
    +
    +    usage = "%prog [options]  ..."
    +    ignore_require_venv = True
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-a",
    +            "--algorithm",
    +            dest="algorithm",
    +            choices=STRONG_HASHES,
    +            action="store",
    +            default=FAVORITE_HASH,
    +            help="The hash algorithm to use: one of {}".format(
    +                ", ".join(STRONG_HASHES)
    +            ),
    +        )
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        if not args:
    +            self.parser.print_usage(sys.stderr)
    +            return ERROR
    +
    +        algorithm = options.algorithm
    +        for path in args:
    +            write_output(
    +                "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm)
    +            )
    +        return SUCCESS
    +
    +
    +def _hash_of_file(path: str, algorithm: str) -> str:
    +    """Return the hash digest of a file."""
    +    with open(path, "rb") as archive:
    +        hash = hashlib.new(algorithm)
    +        for chunk in read_chunks(archive):
    +            hash.update(chunk)
    +    return hash.hexdigest()
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/help.py b/env/lib/python3.12/site-packages/pip/_internal/commands/help.py
    new file mode 100644
    index 0000000..6206631
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/help.py
    @@ -0,0 +1,41 @@
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.exceptions import CommandError
    +
    +
    +class HelpCommand(Command):
    +    """Show help for commands"""
    +
    +    usage = """
    +      %prog """
    +    ignore_require_venv = True
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        from pip._internal.commands import (
    +            commands_dict,
    +            create_command,
    +            get_similar_commands,
    +        )
    +
    +        try:
    +            # 'pip help' with no args is handled by pip.__init__.parseopt()
    +            cmd_name = args[0]  # the command we need help for
    +        except IndexError:
    +            return SUCCESS
    +
    +        if cmd_name not in commands_dict:
    +            guess = get_similar_commands(cmd_name)
    +
    +            msg = [f'unknown command "{cmd_name}"']
    +            if guess:
    +                msg.append(f'maybe you meant "{guess}"')
    +
    +            raise CommandError(" - ".join(msg))
    +
    +        command = create_command(cmd_name)
    +        command.parser.print_help()
    +
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/index.py b/env/lib/python3.12/site-packages/pip/_internal/commands/index.py
    new file mode 100644
    index 0000000..2e2661b
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/index.py
    @@ -0,0 +1,139 @@
    +import logging
    +from optparse import Values
    +from typing import Any, Iterable, List, Optional
    +
    +from pip._vendor.packaging.version import Version
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.req_command import IndexGroupCommand
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.commands.search import print_dist_installation_info
    +from pip._internal.exceptions import CommandError, DistributionNotFound, PipError
    +from pip._internal.index.collector import LinkCollector
    +from pip._internal.index.package_finder import PackageFinder
    +from pip._internal.models.selection_prefs import SelectionPreferences
    +from pip._internal.models.target_python import TargetPython
    +from pip._internal.network.session import PipSession
    +from pip._internal.utils.misc import write_output
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class IndexCommand(IndexGroupCommand):
    +    """
    +    Inspect information available from package indexes.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +        %prog versions 
    +    """
    +
    +    def add_options(self) -> None:
    +        cmdoptions.add_target_python_options(self.cmd_opts)
    +
    +        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
    +        self.cmd_opts.add_option(cmdoptions.pre())
    +        self.cmd_opts.add_option(cmdoptions.no_binary())
    +        self.cmd_opts.add_option(cmdoptions.only_binary())
    +
    +        index_opts = cmdoptions.make_option_group(
    +            cmdoptions.index_group,
    +            self.parser,
    +        )
    +
    +        self.parser.insert_option_group(0, index_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        handlers = {
    +            "versions": self.get_available_package_versions,
    +        }
    +
    +        logger.warning(
    +            "pip index is currently an experimental command. "
    +            "It may be removed/changed in a future release "
    +            "without prior warning."
    +        )
    +
    +        # Determine action
    +        if not args or args[0] not in handlers:
    +            logger.error(
    +                "Need an action (%s) to perform.",
    +                ", ".join(sorted(handlers)),
    +            )
    +            return ERROR
    +
    +        action = args[0]
    +
    +        # Error handling happens here, not in the action-handlers.
    +        try:
    +            handlers[action](options, args[1:])
    +        except PipError as e:
    +            logger.error(e.args[0])
    +            return ERROR
    +
    +        return SUCCESS
    +
    +    def _build_package_finder(
    +        self,
    +        options: Values,
    +        session: PipSession,
    +        target_python: Optional[TargetPython] = None,
    +        ignore_requires_python: Optional[bool] = None,
    +    ) -> PackageFinder:
    +        """
    +        Create a package finder appropriate to the index command.
    +        """
    +        link_collector = LinkCollector.create(session, options=options)
    +
    +        # Pass allow_yanked=False to ignore yanked versions.
    +        selection_prefs = SelectionPreferences(
    +            allow_yanked=False,
    +            allow_all_prereleases=options.pre,
    +            ignore_requires_python=ignore_requires_python,
    +        )
    +
    +        return PackageFinder.create(
    +            link_collector=link_collector,
    +            selection_prefs=selection_prefs,
    +            target_python=target_python,
    +        )
    +
    +    def get_available_package_versions(self, options: Values, args: List[Any]) -> None:
    +        if len(args) != 1:
    +            raise CommandError("You need to specify exactly one argument")
    +
    +        target_python = cmdoptions.make_target_python(options)
    +        query = args[0]
    +
    +        with self._build_session(options) as session:
    +            finder = self._build_package_finder(
    +                options=options,
    +                session=session,
    +                target_python=target_python,
    +                ignore_requires_python=options.ignore_requires_python,
    +            )
    +
    +            versions: Iterable[Version] = (
    +                candidate.version for candidate in finder.find_all_candidates(query)
    +            )
    +
    +            if not options.pre:
    +                # Remove prereleases
    +                versions = (
    +                    version for version in versions if not version.is_prerelease
    +                )
    +            versions = set(versions)
    +
    +            if not versions:
    +                raise DistributionNotFound(
    +                    f"No matching distribution found for {query}"
    +                )
    +
    +            formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)]
    +            latest = formatted_versions[0]
    +
    +        write_output(f"{query} ({latest})")
    +        write_output("Available versions: {}".format(", ".join(formatted_versions)))
    +        print_dist_installation_info(query, latest)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py b/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py
    new file mode 100644
    index 0000000..e810c13
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/inspect.py
    @@ -0,0 +1,92 @@
    +import logging
    +from optparse import Values
    +from typing import Any, Dict, List
    +
    +from pip._vendor.packaging.markers import default_environment
    +from pip._vendor.rich import print_json
    +
    +from pip import __version__
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.metadata import BaseDistribution, get_environment
    +from pip._internal.utils.compat import stdlib_pkgs
    +from pip._internal.utils.urls import path_to_url
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class InspectCommand(Command):
    +    """
    +    Inspect the content of a Python environment and produce a report in JSON format.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +      %prog [options]"""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "--local",
    +            action="store_true",
    +            default=False,
    +            help=(
    +                "If in a virtualenv that has global access, do not list "
    +                "globally-installed packages."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "--user",
    +            dest="user",
    +            action="store_true",
    +            default=False,
    +            help="Only output packages installed in user-site.",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.list_path())
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        cmdoptions.check_list_path_option(options)
    +        dists = get_environment(options.path).iter_installed_distributions(
    +            local_only=options.local,
    +            user_only=options.user,
    +            skip=set(stdlib_pkgs),
    +        )
    +        output = {
    +            "version": "1",
    +            "pip_version": __version__,
    +            "installed": [self._dist_to_dict(dist) for dist in dists],
    +            "environment": default_environment(),
    +            # TODO tags? scheme?
    +        }
    +        print_json(data=output)
    +        return SUCCESS
    +
    +    def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]:
    +        res: Dict[str, Any] = {
    +            "metadata": dist.metadata_dict,
    +            "metadata_location": dist.info_location,
    +        }
    +        # direct_url. Note that we don't have download_info (as in the installation
    +        # report) since it is not recorded in installed metadata.
    +        direct_url = dist.direct_url
    +        if direct_url is not None:
    +            res["direct_url"] = direct_url.to_dict()
    +        else:
    +            # Emulate direct_url for legacy editable installs.
    +            editable_project_location = dist.editable_project_location
    +            if editable_project_location is not None:
    +                res["direct_url"] = {
    +                    "url": path_to_url(editable_project_location),
    +                    "dir_info": {
    +                        "editable": True,
    +                    },
    +                }
    +        # installer
    +        installer = dist.installer
    +        if dist.installer:
    +            res["installer"] = installer
    +        # requested
    +        if dist.installed_with_dist_info:
    +            res["requested"] = dist.requested
    +        return res
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/install.py b/env/lib/python3.12/site-packages/pip/_internal/commands/install.py
    new file mode 100644
    index 0000000..ad45a2f
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/install.py
    @@ -0,0 +1,783 @@
    +import errno
    +import json
    +import operator
    +import os
    +import shutil
    +import site
    +from optparse import SUPPRESS_HELP, Values
    +from typing import List, Optional
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +from pip._vendor.rich import print_json
    +
    +from pip._internal.cache import WheelCache
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.cmdoptions import make_target_python
    +from pip._internal.cli.req_command import (
    +    RequirementCommand,
    +    with_cleanup,
    +)
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.exceptions import CommandError, InstallationError
    +from pip._internal.locations import get_scheme
    +from pip._internal.metadata import get_environment
    +from pip._internal.models.installation_report import InstallationReport
    +from pip._internal.operations.build.build_tracker import get_build_tracker
    +from pip._internal.operations.check import ConflictDetails, check_install_conflicts
    +from pip._internal.req import install_given_reqs
    +from pip._internal.req.req_install import (
    +    InstallRequirement,
    +    check_legacy_setup_py_options,
    +)
    +from pip._internal.utils.compat import WINDOWS
    +from pip._internal.utils.filesystem import test_writable_dir
    +from pip._internal.utils.logging import getLogger
    +from pip._internal.utils.misc import (
    +    check_externally_managed,
    +    ensure_dir,
    +    get_pip_version,
    +    protect_pip_from_modification_on_windows,
    +    warn_if_run_as_root,
    +    write_output,
    +)
    +from pip._internal.utils.temp_dir import TempDirectory
    +from pip._internal.utils.virtualenv import (
    +    running_under_virtualenv,
    +    virtualenv_no_global,
    +)
    +from pip._internal.wheel_builder import build, should_build_for_install_command
    +
    +logger = getLogger(__name__)
    +
    +
    +class InstallCommand(RequirementCommand):
    +    """
    +    Install packages from:
    +
    +    - PyPI (and other indexes) using requirement specifiers.
    +    - VCS project urls.
    +    - Local project directories.
    +    - Local or remote source archives.
    +
    +    pip also supports installing from "requirements files", which provide
    +    an easy way to specify a whole environment to be installed.
    +    """
    +
    +    usage = """
    +      %prog [options]  [package-index-options] ...
    +      %prog [options] -r  [package-index-options] ...
    +      %prog [options] [-e]  ...
    +      %prog [options] [-e]  ...
    +      %prog [options]  ..."""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(cmdoptions.requirements())
    +        self.cmd_opts.add_option(cmdoptions.constraints())
    +        self.cmd_opts.add_option(cmdoptions.no_deps())
    +        self.cmd_opts.add_option(cmdoptions.pre())
    +
    +        self.cmd_opts.add_option(cmdoptions.editable())
    +        self.cmd_opts.add_option(
    +            "--dry-run",
    +            action="store_true",
    +            dest="dry_run",
    +            default=False,
    +            help=(
    +                "Don't actually install anything, just print what would be. "
    +                "Can be used in combination with --ignore-installed "
    +                "to 'resolve' the requirements."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "-t",
    +            "--target",
    +            dest="target_dir",
    +            metavar="dir",
    +            default=None,
    +            help=(
    +                "Install packages into . "
    +                "By default this will not replace existing files/folders in "
    +                ". Use --upgrade to replace existing packages in  "
    +                "with new versions."
    +            ),
    +        )
    +        cmdoptions.add_target_python_options(self.cmd_opts)
    +
    +        self.cmd_opts.add_option(
    +            "--user",
    +            dest="use_user_site",
    +            action="store_true",
    +            help=(
    +                "Install to the Python user install directory for your "
    +                "platform. Typically ~/.local/, or %APPDATA%\\Python on "
    +                "Windows. (See the Python documentation for site.USER_BASE "
    +                "for full details.)"
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "--no-user",
    +            dest="use_user_site",
    +            action="store_false",
    +            help=SUPPRESS_HELP,
    +        )
    +        self.cmd_opts.add_option(
    +            "--root",
    +            dest="root_path",
    +            metavar="dir",
    +            default=None,
    +            help="Install everything relative to this alternate root directory.",
    +        )
    +        self.cmd_opts.add_option(
    +            "--prefix",
    +            dest="prefix_path",
    +            metavar="dir",
    +            default=None,
    +            help=(
    +                "Installation prefix where lib, bin and other top-level "
    +                "folders are placed. Note that the resulting installation may "
    +                "contain scripts and other resources which reference the "
    +                "Python interpreter of pip, and not that of ``--prefix``. "
    +                "See also the ``--python`` option if the intention is to "
    +                "install packages into another (possibly pip-free) "
    +                "environment."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(cmdoptions.src())
    +
    +        self.cmd_opts.add_option(
    +            "-U",
    +            "--upgrade",
    +            dest="upgrade",
    +            action="store_true",
    +            help=(
    +                "Upgrade all specified packages to the newest available "
    +                "version. The handling of dependencies depends on the "
    +                "upgrade-strategy used."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--upgrade-strategy",
    +            dest="upgrade_strategy",
    +            default="only-if-needed",
    +            choices=["only-if-needed", "eager"],
    +            help=(
    +                "Determines how dependency upgrading should be handled "
    +                "[default: %default]. "
    +                '"eager" - dependencies are upgraded regardless of '
    +                "whether the currently installed version satisfies the "
    +                "requirements of the upgraded package(s). "
    +                '"only-if-needed" -  are upgraded only when they do not '
    +                "satisfy the requirements of the upgraded package(s)."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--force-reinstall",
    +            dest="force_reinstall",
    +            action="store_true",
    +            help="Reinstall all packages even if they are already up-to-date.",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "-I",
    +            "--ignore-installed",
    +            dest="ignore_installed",
    +            action="store_true",
    +            help=(
    +                "Ignore the installed packages, overwriting them. "
    +                "This can break your system if the existing package "
    +                "is of a different version or was installed "
    +                "with a different package manager!"
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
    +        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
    +        self.cmd_opts.add_option(cmdoptions.use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.check_build_deps())
    +        self.cmd_opts.add_option(cmdoptions.override_externally_managed())
    +
    +        self.cmd_opts.add_option(cmdoptions.config_settings())
    +        self.cmd_opts.add_option(cmdoptions.global_options())
    +
    +        self.cmd_opts.add_option(
    +            "--compile",
    +            action="store_true",
    +            dest="compile",
    +            default=True,
    +            help="Compile Python source files to bytecode",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--no-compile",
    +            action="store_false",
    +            dest="compile",
    +            help="Do not compile Python source files to bytecode",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--no-warn-script-location",
    +            action="store_false",
    +            dest="warn_script_location",
    +            default=True,
    +            help="Do not warn when installing scripts outside PATH",
    +        )
    +        self.cmd_opts.add_option(
    +            "--no-warn-conflicts",
    +            action="store_false",
    +            dest="warn_about_conflicts",
    +            default=True,
    +            help="Do not warn about broken dependencies",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.no_binary())
    +        self.cmd_opts.add_option(cmdoptions.only_binary())
    +        self.cmd_opts.add_option(cmdoptions.prefer_binary())
    +        self.cmd_opts.add_option(cmdoptions.require_hashes())
    +        self.cmd_opts.add_option(cmdoptions.progress_bar())
    +        self.cmd_opts.add_option(cmdoptions.root_user_action())
    +
    +        index_opts = cmdoptions.make_option_group(
    +            cmdoptions.index_group,
    +            self.parser,
    +        )
    +
    +        self.parser.insert_option_group(0, index_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +        self.cmd_opts.add_option(
    +            "--report",
    +            dest="json_report_file",
    +            metavar="file",
    +            default=None,
    +            help=(
    +                "Generate a JSON file describing what pip did to install "
    +                "the provided requirements. "
    +                "Can be used in combination with --dry-run and --ignore-installed "
    +                "to 'resolve' the requirements. "
    +                "When - is used as file name it writes to stdout. "
    +                "When writing to stdout, please combine with the --quiet option "
    +                "to avoid mixing pip logging output with JSON output."
    +            ),
    +        )
    +
    +    @with_cleanup
    +    def run(self, options: Values, args: List[str]) -> int:
    +        if options.use_user_site and options.target_dir is not None:
    +            raise CommandError("Can not combine '--user' and '--target'")
    +
    +        # Check whether the environment we're installing into is externally
    +        # managed, as specified in PEP 668. Specifying --root, --target, or
    +        # --prefix disables the check, since there's no reliable way to locate
    +        # the EXTERNALLY-MANAGED file for those cases. An exception is also
    +        # made specifically for "--dry-run --report" for convenience.
    +        installing_into_current_environment = (
    +            not (options.dry_run and options.json_report_file)
    +            and options.root_path is None
    +            and options.target_dir is None
    +            and options.prefix_path is None
    +        )
    +        if (
    +            installing_into_current_environment
    +            and not options.override_externally_managed
    +        ):
    +            check_externally_managed()
    +
    +        upgrade_strategy = "to-satisfy-only"
    +        if options.upgrade:
    +            upgrade_strategy = options.upgrade_strategy
    +
    +        cmdoptions.check_dist_restriction(options, check_target=True)
    +
    +        logger.verbose("Using %s", get_pip_version())
    +        options.use_user_site = decide_user_install(
    +            options.use_user_site,
    +            prefix_path=options.prefix_path,
    +            target_dir=options.target_dir,
    +            root_path=options.root_path,
    +            isolated_mode=options.isolated_mode,
    +        )
    +
    +        target_temp_dir: Optional[TempDirectory] = None
    +        target_temp_dir_path: Optional[str] = None
    +        if options.target_dir:
    +            options.ignore_installed = True
    +            options.target_dir = os.path.abspath(options.target_dir)
    +            if (
    +                # fmt: off
    +                os.path.exists(options.target_dir) and
    +                not os.path.isdir(options.target_dir)
    +                # fmt: on
    +            ):
    +                raise CommandError(
    +                    "Target path exists but is not a directory, will not continue."
    +                )
    +
    +            # Create a target directory for using with the target option
    +            target_temp_dir = TempDirectory(kind="target")
    +            target_temp_dir_path = target_temp_dir.path
    +            self.enter_context(target_temp_dir)
    +
    +        global_options = options.global_options or []
    +
    +        session = self.get_default_session(options)
    +
    +        target_python = make_target_python(options)
    +        finder = self._build_package_finder(
    +            options=options,
    +            session=session,
    +            target_python=target_python,
    +            ignore_requires_python=options.ignore_requires_python,
    +        )
    +        build_tracker = self.enter_context(get_build_tracker())
    +
    +        directory = TempDirectory(
    +            delete=not options.no_clean,
    +            kind="install",
    +            globally_managed=True,
    +        )
    +
    +        try:
    +            reqs = self.get_requirements(args, options, finder, session)
    +            check_legacy_setup_py_options(options, reqs)
    +
    +            wheel_cache = WheelCache(options.cache_dir)
    +
    +            # Only when installing is it permitted to use PEP 660.
    +            # In other circumstances (pip wheel, pip download) we generate
    +            # regular (i.e. non editable) metadata and wheels.
    +            for req in reqs:
    +                req.permit_editable_wheels = True
    +
    +            preparer = self.make_requirement_preparer(
    +                temp_build_dir=directory,
    +                options=options,
    +                build_tracker=build_tracker,
    +                session=session,
    +                finder=finder,
    +                use_user_site=options.use_user_site,
    +                verbosity=self.verbosity,
    +            )
    +            resolver = self.make_resolver(
    +                preparer=preparer,
    +                finder=finder,
    +                options=options,
    +                wheel_cache=wheel_cache,
    +                use_user_site=options.use_user_site,
    +                ignore_installed=options.ignore_installed,
    +                ignore_requires_python=options.ignore_requires_python,
    +                force_reinstall=options.force_reinstall,
    +                upgrade_strategy=upgrade_strategy,
    +                use_pep517=options.use_pep517,
    +                py_version_info=options.python_version,
    +            )
    +
    +            self.trace_basic_info(finder)
    +
    +            requirement_set = resolver.resolve(
    +                reqs, check_supported_wheels=not options.target_dir
    +            )
    +
    +            if options.json_report_file:
    +                report = InstallationReport(requirement_set.requirements_to_install)
    +                if options.json_report_file == "-":
    +                    print_json(data=report.to_dict())
    +                else:
    +                    with open(options.json_report_file, "w", encoding="utf-8") as f:
    +                        json.dump(report.to_dict(), f, indent=2, ensure_ascii=False)
    +
    +            if options.dry_run:
    +                would_install_items = sorted(
    +                    (r.metadata["name"], r.metadata["version"])
    +                    for r in requirement_set.requirements_to_install
    +                )
    +                if would_install_items:
    +                    write_output(
    +                        "Would install %s",
    +                        " ".join("-".join(item) for item in would_install_items),
    +                    )
    +                return SUCCESS
    +
    +            try:
    +                pip_req = requirement_set.get_requirement("pip")
    +            except KeyError:
    +                modifying_pip = False
    +            else:
    +                # If we're not replacing an already installed pip,
    +                # we're not modifying it.
    +                modifying_pip = pip_req.satisfied_by is None
    +                if modifying_pip:
    +                    # Eagerly import this module to avoid crashes. Otherwise, this
    +                    # module would be imported *after* pip was replaced, resulting in
    +                    # crashes if the new self_outdated_check module was incompatible
    +                    # with the rest of pip that's already imported.
    +                    import pip._internal.self_outdated_check  # noqa: F401
    +            protect_pip_from_modification_on_windows(modifying_pip=modifying_pip)
    +
    +            reqs_to_build = [
    +                r
    +                for r in requirement_set.requirements.values()
    +                if should_build_for_install_command(r)
    +            ]
    +
    +            _, build_failures = build(
    +                reqs_to_build,
    +                wheel_cache=wheel_cache,
    +                verify=True,
    +                build_options=[],
    +                global_options=global_options,
    +            )
    +
    +            if build_failures:
    +                raise InstallationError(
    +                    "ERROR: Failed to build installable wheels for some "
    +                    "pyproject.toml based projects ({})".format(
    +                        ", ".join(r.name for r in build_failures)  # type: ignore
    +                    )
    +                )
    +
    +            to_install = resolver.get_installation_order(requirement_set)
    +
    +            # Check for conflicts in the package set we're installing.
    +            conflicts: Optional[ConflictDetails] = None
    +            should_warn_about_conflicts = (
    +                not options.ignore_dependencies and options.warn_about_conflicts
    +            )
    +            if should_warn_about_conflicts:
    +                conflicts = self._determine_conflicts(to_install)
    +
    +            # Don't warn about script install locations if
    +            # --target or --prefix has been specified
    +            warn_script_location = options.warn_script_location
    +            if options.target_dir or options.prefix_path:
    +                warn_script_location = False
    +
    +            installed = install_given_reqs(
    +                to_install,
    +                global_options,
    +                root=options.root_path,
    +                home=target_temp_dir_path,
    +                prefix=options.prefix_path,
    +                warn_script_location=warn_script_location,
    +                use_user_site=options.use_user_site,
    +                pycompile=options.compile,
    +            )
    +
    +            lib_locations = get_lib_location_guesses(
    +                user=options.use_user_site,
    +                home=target_temp_dir_path,
    +                root=options.root_path,
    +                prefix=options.prefix_path,
    +                isolated=options.isolated_mode,
    +            )
    +            env = get_environment(lib_locations)
    +
    +            # Display a summary of installed packages, with extra care to
    +            # display a package name as it was requested by the user.
    +            installed.sort(key=operator.attrgetter("name"))
    +            summary = []
    +            installed_versions = {}
    +            for distribution in env.iter_all_distributions():
    +                installed_versions[distribution.canonical_name] = distribution.version
    +            for package in installed:
    +                display_name = package.name
    +                version = installed_versions.get(canonicalize_name(display_name), None)
    +                if version:
    +                    text = f"{display_name}-{version}"
    +                else:
    +                    text = display_name
    +                summary.append(text)
    +
    +            if conflicts is not None:
    +                self._warn_about_conflicts(
    +                    conflicts,
    +                    resolver_variant=self.determine_resolver_variant(options),
    +                )
    +
    +            installed_desc = " ".join(summary)
    +            if installed_desc:
    +                write_output(
    +                    "Successfully installed %s",
    +                    installed_desc,
    +                )
    +        except OSError as error:
    +            show_traceback = self.verbosity >= 1
    +
    +            message = create_os_error_message(
    +                error,
    +                show_traceback,
    +                options.use_user_site,
    +            )
    +            logger.error(message, exc_info=show_traceback)
    +
    +            return ERROR
    +
    +        if options.target_dir:
    +            assert target_temp_dir
    +            self._handle_target_dir(
    +                options.target_dir, target_temp_dir, options.upgrade
    +            )
    +        if options.root_user_action == "warn":
    +            warn_if_run_as_root()
    +        return SUCCESS
    +
    +    def _handle_target_dir(
    +        self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool
    +    ) -> None:
    +        ensure_dir(target_dir)
    +
    +        # Checking both purelib and platlib directories for installed
    +        # packages to be moved to target directory
    +        lib_dir_list = []
    +
    +        # Checking both purelib and platlib directories for installed
    +        # packages to be moved to target directory
    +        scheme = get_scheme("", home=target_temp_dir.path)
    +        purelib_dir = scheme.purelib
    +        platlib_dir = scheme.platlib
    +        data_dir = scheme.data
    +
    +        if os.path.exists(purelib_dir):
    +            lib_dir_list.append(purelib_dir)
    +        if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
    +            lib_dir_list.append(platlib_dir)
    +        if os.path.exists(data_dir):
    +            lib_dir_list.append(data_dir)
    +
    +        for lib_dir in lib_dir_list:
    +            for item in os.listdir(lib_dir):
    +                if lib_dir == data_dir:
    +                    ddir = os.path.join(data_dir, item)
    +                    if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
    +                        continue
    +                target_item_dir = os.path.join(target_dir, item)
    +                if os.path.exists(target_item_dir):
    +                    if not upgrade:
    +                        logger.warning(
    +                            "Target directory %s already exists. Specify "
    +                            "--upgrade to force replacement.",
    +                            target_item_dir,
    +                        )
    +                        continue
    +                    if os.path.islink(target_item_dir):
    +                        logger.warning(
    +                            "Target directory %s already exists and is "
    +                            "a link. pip will not automatically replace "
    +                            "links, please remove if replacement is "
    +                            "desired.",
    +                            target_item_dir,
    +                        )
    +                        continue
    +                    if os.path.isdir(target_item_dir):
    +                        shutil.rmtree(target_item_dir)
    +                    else:
    +                        os.remove(target_item_dir)
    +
    +                shutil.move(os.path.join(lib_dir, item), target_item_dir)
    +
    +    def _determine_conflicts(
    +        self, to_install: List[InstallRequirement]
    +    ) -> Optional[ConflictDetails]:
    +        try:
    +            return check_install_conflicts(to_install)
    +        except Exception:
    +            logger.exception(
    +                "Error while checking for conflicts. Please file an issue on "
    +                "pip's issue tracker: https://github.com/pypa/pip/issues/new"
    +            )
    +            return None
    +
    +    def _warn_about_conflicts(
    +        self, conflict_details: ConflictDetails, resolver_variant: str
    +    ) -> None:
    +        package_set, (missing, conflicting) = conflict_details
    +        if not missing and not conflicting:
    +            return
    +
    +        parts: List[str] = []
    +        if resolver_variant == "legacy":
    +            parts.append(
    +                "pip's legacy dependency resolver does not consider dependency "
    +                "conflicts when selecting packages. This behaviour is the "
    +                "source of the following dependency conflicts."
    +            )
    +        else:
    +            assert resolver_variant == "resolvelib"
    +            parts.append(
    +                "pip's dependency resolver does not currently take into account "
    +                "all the packages that are installed. This behaviour is the "
    +                "source of the following dependency conflicts."
    +            )
    +
    +        # NOTE: There is some duplication here, with commands/check.py
    +        for project_name in missing:
    +            version = package_set[project_name][0]
    +            for dependency in missing[project_name]:
    +                message = (
    +                    f"{project_name} {version} requires {dependency[1]}, "
    +                    "which is not installed."
    +                )
    +                parts.append(message)
    +
    +        for project_name in conflicting:
    +            version = package_set[project_name][0]
    +            for dep_name, dep_version, req in conflicting[project_name]:
    +                message = (
    +                    "{name} {version} requires {requirement}, but {you} have "
    +                    "{dep_name} {dep_version} which is incompatible."
    +                ).format(
    +                    name=project_name,
    +                    version=version,
    +                    requirement=req,
    +                    dep_name=dep_name,
    +                    dep_version=dep_version,
    +                    you=("you" if resolver_variant == "resolvelib" else "you'll"),
    +                )
    +                parts.append(message)
    +
    +        logger.critical("\n".join(parts))
    +
    +
    +def get_lib_location_guesses(
    +    user: bool = False,
    +    home: Optional[str] = None,
    +    root: Optional[str] = None,
    +    isolated: bool = False,
    +    prefix: Optional[str] = None,
    +) -> List[str]:
    +    scheme = get_scheme(
    +        "",
    +        user=user,
    +        home=home,
    +        root=root,
    +        isolated=isolated,
    +        prefix=prefix,
    +    )
    +    return [scheme.purelib, scheme.platlib]
    +
    +
    +def site_packages_writable(root: Optional[str], isolated: bool) -> bool:
    +    return all(
    +        test_writable_dir(d)
    +        for d in set(get_lib_location_guesses(root=root, isolated=isolated))
    +    )
    +
    +
    +def decide_user_install(
    +    use_user_site: Optional[bool],
    +    prefix_path: Optional[str] = None,
    +    target_dir: Optional[str] = None,
    +    root_path: Optional[str] = None,
    +    isolated_mode: bool = False,
    +) -> bool:
    +    """Determine whether to do a user install based on the input options.
    +
    +    If use_user_site is False, no additional checks are done.
    +    If use_user_site is True, it is checked for compatibility with other
    +    options.
    +    If use_user_site is None, the default behaviour depends on the environment,
    +    which is provided by the other arguments.
    +    """
    +    # In some cases (config from tox), use_user_site can be set to an integer
    +    # rather than a bool, which 'use_user_site is False' wouldn't catch.
    +    if (use_user_site is not None) and (not use_user_site):
    +        logger.debug("Non-user install by explicit request")
    +        return False
    +
    +    if use_user_site:
    +        if prefix_path:
    +            raise CommandError(
    +                "Can not combine '--user' and '--prefix' as they imply "
    +                "different installation locations"
    +            )
    +        if virtualenv_no_global():
    +            raise InstallationError(
    +                "Can not perform a '--user' install. User site-packages "
    +                "are not visible in this virtualenv."
    +            )
    +        logger.debug("User install by explicit request")
    +        return True
    +
    +    # If we are here, user installs have not been explicitly requested/avoided
    +    assert use_user_site is None
    +
    +    # user install incompatible with --prefix/--target
    +    if prefix_path or target_dir:
    +        logger.debug("Non-user install due to --prefix or --target option")
    +        return False
    +
    +    # If user installs are not enabled, choose a non-user install
    +    if not site.ENABLE_USER_SITE:
    +        logger.debug("Non-user install because user site-packages disabled")
    +        return False
    +
    +    # If we have permission for a non-user install, do that,
    +    # otherwise do a user install.
    +    if site_packages_writable(root=root_path, isolated=isolated_mode):
    +        logger.debug("Non-user install because site-packages writeable")
    +        return False
    +
    +    logger.info(
    +        "Defaulting to user installation because normal site-packages "
    +        "is not writeable"
    +    )
    +    return True
    +
    +
    +def create_os_error_message(
    +    error: OSError, show_traceback: bool, using_user_site: bool
    +) -> str:
    +    """Format an error message for an OSError
    +
    +    It may occur anytime during the execution of the install command.
    +    """
    +    parts = []
    +
    +    # Mention the error if we are not going to show a traceback
    +    parts.append("Could not install packages due to an OSError")
    +    if not show_traceback:
    +        parts.append(": ")
    +        parts.append(str(error))
    +    else:
    +        parts.append(".")
    +
    +    # Spilt the error indication from a helper message (if any)
    +    parts[-1] += "\n"
    +
    +    # Suggest useful actions to the user:
    +    #  (1) using user site-packages or (2) verifying the permissions
    +    if error.errno == errno.EACCES:
    +        user_option_part = "Consider using the `--user` option"
    +        permissions_part = "Check the permissions"
    +
    +        if not running_under_virtualenv() and not using_user_site:
    +            parts.extend(
    +                [
    +                    user_option_part,
    +                    " or ",
    +                    permissions_part.lower(),
    +                ]
    +            )
    +        else:
    +            parts.append(permissions_part)
    +        parts.append(".\n")
    +
    +    # Suggest the user to enable Long Paths if path length is
    +    # more than 260
    +    if (
    +        WINDOWS
    +        and error.errno == errno.ENOENT
    +        and error.filename
    +        and len(error.filename) > 260
    +    ):
    +        parts.append(
    +            "HINT: This error might have occurred since "
    +            "this system does not have Windows Long Path "
    +            "support enabled. You can find information on "
    +            "how to enable this at "
    +            "https://pip.pypa.io/warnings/enable-long-paths\n"
    +        )
    +
    +    return "".join(parts).strip() + "\n"
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/list.py b/env/lib/python3.12/site-packages/pip/_internal/commands/list.py
    new file mode 100644
    index 0000000..8494370
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/list.py
    @@ -0,0 +1,375 @@
    +import json
    +import logging
    +from optparse import Values
    +from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +from pip._vendor.packaging.version import Version
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.index_command import IndexGroupCommand
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.exceptions import CommandError
    +from pip._internal.metadata import BaseDistribution, get_environment
    +from pip._internal.models.selection_prefs import SelectionPreferences
    +from pip._internal.utils.compat import stdlib_pkgs
    +from pip._internal.utils.misc import tabulate, write_output
    +
    +if TYPE_CHECKING:
    +    from pip._internal.index.package_finder import PackageFinder
    +    from pip._internal.network.session import PipSession
    +
    +    class _DistWithLatestInfo(BaseDistribution):
    +        """Give the distribution object a couple of extra fields.
    +
    +        These will be populated during ``get_outdated()``. This is dirty but
    +        makes the rest of the code much cleaner.
    +        """
    +
    +        latest_version: Version
    +        latest_filetype: str
    +
    +    _ProcessedDists = Sequence[_DistWithLatestInfo]
    +
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class ListCommand(IndexGroupCommand):
    +    """
    +    List installed packages, including editables.
    +
    +    Packages are listed in a case-insensitive sorted order.
    +    """
    +
    +    ignore_require_venv = True
    +    usage = """
    +      %prog [options]"""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-o",
    +            "--outdated",
    +            action="store_true",
    +            default=False,
    +            help="List outdated packages",
    +        )
    +        self.cmd_opts.add_option(
    +            "-u",
    +            "--uptodate",
    +            action="store_true",
    +            default=False,
    +            help="List uptodate packages",
    +        )
    +        self.cmd_opts.add_option(
    +            "-e",
    +            "--editable",
    +            action="store_true",
    +            default=False,
    +            help="List editable projects.",
    +        )
    +        self.cmd_opts.add_option(
    +            "-l",
    +            "--local",
    +            action="store_true",
    +            default=False,
    +            help=(
    +                "If in a virtualenv that has global access, do not list "
    +                "globally-installed packages."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "--user",
    +            dest="user",
    +            action="store_true",
    +            default=False,
    +            help="Only output packages installed in user-site.",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.list_path())
    +        self.cmd_opts.add_option(
    +            "--pre",
    +            action="store_true",
    +            default=False,
    +            help=(
    +                "Include pre-release and development versions. By default, "
    +                "pip only finds stable versions."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--format",
    +            action="store",
    +            dest="list_format",
    +            default="columns",
    +            choices=("columns", "freeze", "json"),
    +            help=(
    +                "Select the output format among: columns (default), freeze, or json. "
    +                "The 'freeze' format cannot be used with the --outdated option."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--not-required",
    +            action="store_true",
    +            dest="not_required",
    +            help="List packages that are not dependencies of installed packages.",
    +        )
    +
    +        self.cmd_opts.add_option(
    +            "--exclude-editable",
    +            action="store_false",
    +            dest="include_editable",
    +            help="Exclude editable package from output.",
    +        )
    +        self.cmd_opts.add_option(
    +            "--include-editable",
    +            action="store_true",
    +            dest="include_editable",
    +            help="Include editable package from output.",
    +            default=True,
    +        )
    +        self.cmd_opts.add_option(cmdoptions.list_exclude())
    +        index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser)
    +
    +        self.parser.insert_option_group(0, index_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def handle_pip_version_check(self, options: Values) -> None:
    +        if options.outdated or options.uptodate:
    +            super().handle_pip_version_check(options)
    +
    +    def _build_package_finder(
    +        self, options: Values, session: "PipSession"
    +    ) -> "PackageFinder":
    +        """
    +        Create a package finder appropriate to this list command.
    +        """
    +        # Lazy import the heavy index modules as most list invocations won't need 'em.
    +        from pip._internal.index.collector import LinkCollector
    +        from pip._internal.index.package_finder import PackageFinder
    +
    +        link_collector = LinkCollector.create(session, options=options)
    +
    +        # Pass allow_yanked=False to ignore yanked versions.
    +        selection_prefs = SelectionPreferences(
    +            allow_yanked=False,
    +            allow_all_prereleases=options.pre,
    +        )
    +
    +        return PackageFinder.create(
    +            link_collector=link_collector,
    +            selection_prefs=selection_prefs,
    +        )
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        if options.outdated and options.uptodate:
    +            raise CommandError("Options --outdated and --uptodate cannot be combined.")
    +
    +        if options.outdated and options.list_format == "freeze":
    +            raise CommandError(
    +                "List format 'freeze' cannot be used with the --outdated option."
    +            )
    +
    +        cmdoptions.check_list_path_option(options)
    +
    +        skip = set(stdlib_pkgs)
    +        if options.excludes:
    +            skip.update(canonicalize_name(n) for n in options.excludes)
    +
    +        packages: _ProcessedDists = [
    +            cast("_DistWithLatestInfo", d)
    +            for d in get_environment(options.path).iter_installed_distributions(
    +                local_only=options.local,
    +                user_only=options.user,
    +                editables_only=options.editable,
    +                include_editables=options.include_editable,
    +                skip=skip,
    +            )
    +        ]
    +
    +        # get_not_required must be called firstly in order to find and
    +        # filter out all dependencies correctly. Otherwise a package
    +        # can't be identified as requirement because some parent packages
    +        # could be filtered out before.
    +        if options.not_required:
    +            packages = self.get_not_required(packages, options)
    +
    +        if options.outdated:
    +            packages = self.get_outdated(packages, options)
    +        elif options.uptodate:
    +            packages = self.get_uptodate(packages, options)
    +
    +        self.output_package_listing(packages, options)
    +        return SUCCESS
    +
    +    def get_outdated(
    +        self, packages: "_ProcessedDists", options: Values
    +    ) -> "_ProcessedDists":
    +        return [
    +            dist
    +            for dist in self.iter_packages_latest_infos(packages, options)
    +            if dist.latest_version > dist.version
    +        ]
    +
    +    def get_uptodate(
    +        self, packages: "_ProcessedDists", options: Values
    +    ) -> "_ProcessedDists":
    +        return [
    +            dist
    +            for dist in self.iter_packages_latest_infos(packages, options)
    +            if dist.latest_version == dist.version
    +        ]
    +
    +    def get_not_required(
    +        self, packages: "_ProcessedDists", options: Values
    +    ) -> "_ProcessedDists":
    +        dep_keys = {
    +            canonicalize_name(dep.name)
    +            for dist in packages
    +            for dep in (dist.iter_dependencies() or ())
    +        }
    +
    +        # Create a set to remove duplicate packages, and cast it to a list
    +        # to keep the return type consistent with get_outdated and
    +        # get_uptodate
    +        return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys})
    +
    +    def iter_packages_latest_infos(
    +        self, packages: "_ProcessedDists", options: Values
    +    ) -> Generator["_DistWithLatestInfo", None, None]:
    +        with self._build_session(options) as session:
    +            finder = self._build_package_finder(options, session)
    +
    +            def latest_info(
    +                dist: "_DistWithLatestInfo",
    +            ) -> Optional["_DistWithLatestInfo"]:
    +                all_candidates = finder.find_all_candidates(dist.canonical_name)
    +                if not options.pre:
    +                    # Remove prereleases
    +                    all_candidates = [
    +                        candidate
    +                        for candidate in all_candidates
    +                        if not candidate.version.is_prerelease
    +                    ]
    +
    +                evaluator = finder.make_candidate_evaluator(
    +                    project_name=dist.canonical_name,
    +                )
    +                best_candidate = evaluator.sort_best_candidate(all_candidates)
    +                if best_candidate is None:
    +                    return None
    +
    +                remote_version = best_candidate.version
    +                if best_candidate.link.is_wheel:
    +                    typ = "wheel"
    +                else:
    +                    typ = "sdist"
    +                dist.latest_version = remote_version
    +                dist.latest_filetype = typ
    +                return dist
    +
    +            for dist in map(latest_info, packages):
    +                if dist is not None:
    +                    yield dist
    +
    +    def output_package_listing(
    +        self, packages: "_ProcessedDists", options: Values
    +    ) -> None:
    +        packages = sorted(
    +            packages,
    +            key=lambda dist: dist.canonical_name,
    +        )
    +        if options.list_format == "columns" and packages:
    +            data, header = format_for_columns(packages, options)
    +            self.output_package_listing_columns(data, header)
    +        elif options.list_format == "freeze":
    +            for dist in packages:
    +                if options.verbose >= 1:
    +                    write_output(
    +                        "%s==%s (%s)", dist.raw_name, dist.version, dist.location
    +                    )
    +                else:
    +                    write_output("%s==%s", dist.raw_name, dist.version)
    +        elif options.list_format == "json":
    +            write_output(format_for_json(packages, options))
    +
    +    def output_package_listing_columns(
    +        self, data: List[List[str]], header: List[str]
    +    ) -> None:
    +        # insert the header first: we need to know the size of column names
    +        if len(data) > 0:
    +            data.insert(0, header)
    +
    +        pkg_strings, sizes = tabulate(data)
    +
    +        # Create and add a separator.
    +        if len(data) > 0:
    +            pkg_strings.insert(1, " ".join("-" * x for x in sizes))
    +
    +        for val in pkg_strings:
    +            write_output(val)
    +
    +
    +def format_for_columns(
    +    pkgs: "_ProcessedDists", options: Values
    +) -> Tuple[List[List[str]], List[str]]:
    +    """
    +    Convert the package data into something usable
    +    by output_package_listing_columns.
    +    """
    +    header = ["Package", "Version"]
    +
    +    running_outdated = options.outdated
    +    if running_outdated:
    +        header.extend(["Latest", "Type"])
    +
    +    has_editables = any(x.editable for x in pkgs)
    +    if has_editables:
    +        header.append("Editable project location")
    +
    +    if options.verbose >= 1:
    +        header.append("Location")
    +    if options.verbose >= 1:
    +        header.append("Installer")
    +
    +    data = []
    +    for proj in pkgs:
    +        # if we're working on the 'outdated' list, separate out the
    +        # latest_version and type
    +        row = [proj.raw_name, proj.raw_version]
    +
    +        if running_outdated:
    +            row.append(str(proj.latest_version))
    +            row.append(proj.latest_filetype)
    +
    +        if has_editables:
    +            row.append(proj.editable_project_location or "")
    +
    +        if options.verbose >= 1:
    +            row.append(proj.location or "")
    +        if options.verbose >= 1:
    +            row.append(proj.installer)
    +
    +        data.append(row)
    +
    +    return data, header
    +
    +
    +def format_for_json(packages: "_ProcessedDists", options: Values) -> str:
    +    data = []
    +    for dist in packages:
    +        info = {
    +            "name": dist.raw_name,
    +            "version": str(dist.version),
    +        }
    +        if options.verbose >= 1:
    +            info["location"] = dist.location or ""
    +            info["installer"] = dist.installer
    +        if options.outdated:
    +            info["latest_version"] = str(dist.latest_version)
    +            info["latest_filetype"] = dist.latest_filetype
    +        editable_project_location = dist.editable_project_location
    +        if editable_project_location:
    +            info["editable_project_location"] = editable_project_location
    +        data.append(info)
    +    return json.dumps(data)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/search.py b/env/lib/python3.12/site-packages/pip/_internal/commands/search.py
    new file mode 100644
    index 0000000..74b8d65
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/search.py
    @@ -0,0 +1,172 @@
    +import logging
    +import shutil
    +import sys
    +import textwrap
    +import xmlrpc.client
    +from collections import OrderedDict
    +from optparse import Values
    +from typing import TYPE_CHECKING, Dict, List, Optional, TypedDict
    +
    +from pip._vendor.packaging.version import parse as parse_version
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.req_command import SessionCommandMixin
    +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
    +from pip._internal.exceptions import CommandError
    +from pip._internal.metadata import get_default_environment
    +from pip._internal.models.index import PyPI
    +from pip._internal.network.xmlrpc import PipXmlrpcTransport
    +from pip._internal.utils.logging import indent_log
    +from pip._internal.utils.misc import write_output
    +
    +if TYPE_CHECKING:
    +
    +    class TransformedHit(TypedDict):
    +        name: str
    +        summary: str
    +        versions: List[str]
    +
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class SearchCommand(Command, SessionCommandMixin):
    +    """Search for PyPI packages whose name or summary contains ."""
    +
    +    usage = """
    +      %prog [options] """
    +    ignore_require_venv = True
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-i",
    +            "--index",
    +            dest="index",
    +            metavar="URL",
    +            default=PyPI.pypi_url,
    +            help="Base URL of Python Package Index (default %default)",
    +        )
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        if not args:
    +            raise CommandError("Missing required argument (search query).")
    +        query = args
    +        pypi_hits = self.search(query, options)
    +        hits = transform_hits(pypi_hits)
    +
    +        terminal_width = None
    +        if sys.stdout.isatty():
    +            terminal_width = shutil.get_terminal_size()[0]
    +
    +        print_results(hits, terminal_width=terminal_width)
    +        if pypi_hits:
    +            return SUCCESS
    +        return NO_MATCHES_FOUND
    +
    +    def search(self, query: List[str], options: Values) -> List[Dict[str, str]]:
    +        index_url = options.index
    +
    +        session = self.get_default_session(options)
    +
    +        transport = PipXmlrpcTransport(index_url, session)
    +        pypi = xmlrpc.client.ServerProxy(index_url, transport)
    +        try:
    +            hits = pypi.search({"name": query, "summary": query}, "or")
    +        except xmlrpc.client.Fault as fault:
    +            message = (
    +                f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}"
    +            )
    +            raise CommandError(message)
    +        assert isinstance(hits, list)
    +        return hits
    +
    +
    +def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
    +    """
    +    The list from pypi is really a list of versions. We want a list of
    +    packages with the list of versions stored inline. This converts the
    +    list from pypi into one we can use.
    +    """
    +    packages: Dict[str, TransformedHit] = OrderedDict()
    +    for hit in hits:
    +        name = hit["name"]
    +        summary = hit["summary"]
    +        version = hit["version"]
    +
    +        if name not in packages.keys():
    +            packages[name] = {
    +                "name": name,
    +                "summary": summary,
    +                "versions": [version],
    +            }
    +        else:
    +            packages[name]["versions"].append(version)
    +
    +            # if this is the highest version, replace summary and score
    +            if version == highest_version(packages[name]["versions"]):
    +                packages[name]["summary"] = summary
    +
    +    return list(packages.values())
    +
    +
    +def print_dist_installation_info(name: str, latest: str) -> None:
    +    env = get_default_environment()
    +    dist = env.get_distribution(name)
    +    if dist is not None:
    +        with indent_log():
    +            if dist.version == latest:
    +                write_output("INSTALLED: %s (latest)", dist.version)
    +            else:
    +                write_output("INSTALLED: %s", dist.version)
    +                if parse_version(latest).pre:
    +                    write_output(
    +                        "LATEST:    %s (pre-release; install"
    +                        " with `pip install --pre`)",
    +                        latest,
    +                    )
    +                else:
    +                    write_output("LATEST:    %s", latest)
    +
    +
    +def print_results(
    +    hits: List["TransformedHit"],
    +    name_column_width: Optional[int] = None,
    +    terminal_width: Optional[int] = None,
    +) -> None:
    +    if not hits:
    +        return
    +    if name_column_width is None:
    +        name_column_width = (
    +            max(
    +                [
    +                    len(hit["name"]) + len(highest_version(hit.get("versions", ["-"])))
    +                    for hit in hits
    +                ]
    +            )
    +            + 4
    +        )
    +
    +    for hit in hits:
    +        name = hit["name"]
    +        summary = hit["summary"] or ""
    +        latest = highest_version(hit.get("versions", ["-"]))
    +        if terminal_width is not None:
    +            target_width = terminal_width - name_column_width - 5
    +            if target_width > 10:
    +                # wrap and indent summary to fit terminal
    +                summary_lines = textwrap.wrap(summary, target_width)
    +                summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines)
    +
    +        name_latest = f"{name} ({latest})"
    +        line = f"{name_latest:{name_column_width}} - {summary}"
    +        try:
    +            write_output(line)
    +            print_dist_installation_info(name, latest)
    +        except UnicodeEncodeError:
    +            pass
    +
    +
    +def highest_version(versions: List[str]) -> str:
    +    return max(versions, key=parse_version)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/show.py b/env/lib/python3.12/site-packages/pip/_internal/commands/show.py
    new file mode 100644
    index 0000000..c54d548
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/show.py
    @@ -0,0 +1,217 @@
    +import logging
    +from optparse import Values
    +from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional
    +
    +from pip._vendor.packaging.requirements import InvalidRequirement
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.status_codes import ERROR, SUCCESS
    +from pip._internal.metadata import BaseDistribution, get_default_environment
    +from pip._internal.utils.misc import write_output
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class ShowCommand(Command):
    +    """
    +    Show information about one or more installed packages.
    +
    +    The output is in RFC-compliant mail header format.
    +    """
    +
    +    usage = """
    +      %prog [options]  ..."""
    +    ignore_require_venv = True
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-f",
    +            "--files",
    +            dest="files",
    +            action="store_true",
    +            default=False,
    +            help="Show the full list of installed files for each package.",
    +        )
    +
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        if not args:
    +            logger.warning("ERROR: Please provide a package name or names.")
    +            return ERROR
    +        query = args
    +
    +        results = search_packages_info(query)
    +        if not print_results(
    +            results, list_files=options.files, verbose=options.verbose
    +        ):
    +            return ERROR
    +        return SUCCESS
    +
    +
    +class _PackageInfo(NamedTuple):
    +    name: str
    +    version: str
    +    location: str
    +    editable_project_location: Optional[str]
    +    requires: List[str]
    +    required_by: List[str]
    +    installer: str
    +    metadata_version: str
    +    classifiers: List[str]
    +    summary: str
    +    homepage: str
    +    project_urls: List[str]
    +    author: str
    +    author_email: str
    +    license: str
    +    entry_points: List[str]
    +    files: Optional[List[str]]
    +
    +
    +def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]:
    +    """
    +    Gather details from installed distributions. Print distribution name,
    +    version, location, and installed files. Installed files requires a
    +    pip generated 'installed-files.txt' in the distributions '.egg-info'
    +    directory.
    +    """
    +    env = get_default_environment()
    +
    +    installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()}
    +    query_names = [canonicalize_name(name) for name in query]
    +    missing = sorted(
    +        [name for name, pkg in zip(query, query_names) if pkg not in installed]
    +    )
    +    if missing:
    +        logger.warning("Package(s) not found: %s", ", ".join(missing))
    +
    +    def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]:
    +        return (
    +            dist.metadata["Name"] or "UNKNOWN"
    +            for dist in installed.values()
    +            if current_dist.canonical_name
    +            in {canonicalize_name(d.name) for d in dist.iter_dependencies()}
    +        )
    +
    +    for query_name in query_names:
    +        try:
    +            dist = installed[query_name]
    +        except KeyError:
    +            continue
    +
    +        try:
    +            requires = sorted(
    +                # Avoid duplicates in requirements (e.g. due to environment markers).
    +                {req.name for req in dist.iter_dependencies()},
    +                key=str.lower,
    +            )
    +        except InvalidRequirement:
    +            requires = sorted(dist.iter_raw_dependencies(), key=str.lower)
    +
    +        try:
    +            required_by = sorted(_get_requiring_packages(dist), key=str.lower)
    +        except InvalidRequirement:
    +            required_by = ["#N/A"]
    +
    +        try:
    +            entry_points_text = dist.read_text("entry_points.txt")
    +            entry_points = entry_points_text.splitlines(keepends=False)
    +        except FileNotFoundError:
    +            entry_points = []
    +
    +        files_iter = dist.iter_declared_entries()
    +        if files_iter is None:
    +            files: Optional[List[str]] = None
    +        else:
    +            files = sorted(files_iter)
    +
    +        metadata = dist.metadata
    +
    +        project_urls = metadata.get_all("Project-URL", [])
    +        homepage = metadata.get("Home-page", "")
    +        if not homepage:
    +            # It's common that there is a "homepage" Project-URL, but Home-page
    +            # remains unset (especially as PEP 621 doesn't surface the field).
    +            #
    +            # This logic was taken from PyPI's codebase.
    +            for url in project_urls:
    +                url_label, url = url.split(",", maxsplit=1)
    +                normalized_label = (
    +                    url_label.casefold().replace("-", "").replace("_", "").strip()
    +                )
    +                if normalized_label == "homepage":
    +                    homepage = url.strip()
    +                    break
    +
    +        yield _PackageInfo(
    +            name=dist.raw_name,
    +            version=dist.raw_version,
    +            location=dist.location or "",
    +            editable_project_location=dist.editable_project_location,
    +            requires=requires,
    +            required_by=required_by,
    +            installer=dist.installer,
    +            metadata_version=dist.metadata_version or "",
    +            classifiers=metadata.get_all("Classifier", []),
    +            summary=metadata.get("Summary", ""),
    +            homepage=homepage,
    +            project_urls=project_urls,
    +            author=metadata.get("Author", ""),
    +            author_email=metadata.get("Author-email", ""),
    +            license=metadata.get("License", ""),
    +            entry_points=entry_points,
    +            files=files,
    +        )
    +
    +
    +def print_results(
    +    distributions: Iterable[_PackageInfo],
    +    list_files: bool,
    +    verbose: bool,
    +) -> bool:
    +    """
    +    Print the information from installed distributions found.
    +    """
    +    results_printed = False
    +    for i, dist in enumerate(distributions):
    +        results_printed = True
    +        if i > 0:
    +            write_output("---")
    +
    +        write_output("Name: %s", dist.name)
    +        write_output("Version: %s", dist.version)
    +        write_output("Summary: %s", dist.summary)
    +        write_output("Home-page: %s", dist.homepage)
    +        write_output("Author: %s", dist.author)
    +        write_output("Author-email: %s", dist.author_email)
    +        write_output("License: %s", dist.license)
    +        write_output("Location: %s", dist.location)
    +        if dist.editable_project_location is not None:
    +            write_output(
    +                "Editable project location: %s", dist.editable_project_location
    +            )
    +        write_output("Requires: %s", ", ".join(dist.requires))
    +        write_output("Required-by: %s", ", ".join(dist.required_by))
    +
    +        if verbose:
    +            write_output("Metadata-Version: %s", dist.metadata_version)
    +            write_output("Installer: %s", dist.installer)
    +            write_output("Classifiers:")
    +            for classifier in dist.classifiers:
    +                write_output("  %s", classifier)
    +            write_output("Entry-points:")
    +            for entry in dist.entry_points:
    +                write_output("  %s", entry.strip())
    +            write_output("Project-URLs:")
    +            for project_url in dist.project_urls:
    +                write_output("  %s", project_url)
    +        if list_files:
    +            write_output("Files:")
    +            if dist.files is None:
    +                write_output("Cannot locate RECORD or installed-files.txt")
    +            else:
    +                for line in dist.files:
    +                    write_output("  %s", line.strip())
    +    return results_printed
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py b/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py
    new file mode 100644
    index 0000000..bc0edea
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py
    @@ -0,0 +1,114 @@
    +import logging
    +from optparse import Values
    +from typing import List
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.base_command import Command
    +from pip._internal.cli.index_command import SessionCommandMixin
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.exceptions import InstallationError
    +from pip._internal.req import parse_requirements
    +from pip._internal.req.constructors import (
    +    install_req_from_line,
    +    install_req_from_parsed_requirement,
    +)
    +from pip._internal.utils.misc import (
    +    check_externally_managed,
    +    protect_pip_from_modification_on_windows,
    +    warn_if_run_as_root,
    +)
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class UninstallCommand(Command, SessionCommandMixin):
    +    """
    +    Uninstall packages.
    +
    +    pip is able to uninstall most installed packages. Known exceptions are:
    +
    +    - Pure distutils packages installed with ``python setup.py install``, which
    +      leave behind no metadata to determine what files were installed.
    +    - Script wrappers installed by ``python setup.py develop``.
    +    """
    +
    +    usage = """
    +      %prog [options]  ...
    +      %prog [options] -r  ..."""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-r",
    +            "--requirement",
    +            dest="requirements",
    +            action="append",
    +            default=[],
    +            metavar="file",
    +            help=(
    +                "Uninstall all the packages listed in the given requirements "
    +                "file.  This option can be used multiple times."
    +            ),
    +        )
    +        self.cmd_opts.add_option(
    +            "-y",
    +            "--yes",
    +            dest="yes",
    +            action="store_true",
    +            help="Don't ask for confirmation of uninstall deletions.",
    +        )
    +        self.cmd_opts.add_option(cmdoptions.root_user_action())
    +        self.cmd_opts.add_option(cmdoptions.override_externally_managed())
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    def run(self, options: Values, args: List[str]) -> int:
    +        session = self.get_default_session(options)
    +
    +        reqs_to_uninstall = {}
    +        for name in args:
    +            req = install_req_from_line(
    +                name,
    +                isolated=options.isolated_mode,
    +            )
    +            if req.name:
    +                reqs_to_uninstall[canonicalize_name(req.name)] = req
    +            else:
    +                logger.warning(
    +                    "Invalid requirement: %r ignored -"
    +                    " the uninstall command expects named"
    +                    " requirements.",
    +                    name,
    +                )
    +        for filename in options.requirements:
    +            for parsed_req in parse_requirements(
    +                filename, options=options, session=session
    +            ):
    +                req = install_req_from_parsed_requirement(
    +                    parsed_req, isolated=options.isolated_mode
    +                )
    +                if req.name:
    +                    reqs_to_uninstall[canonicalize_name(req.name)] = req
    +        if not reqs_to_uninstall:
    +            raise InstallationError(
    +                f"You must give at least one requirement to {self.name} (see "
    +                f'"pip help {self.name}")'
    +            )
    +
    +        if not options.override_externally_managed:
    +            check_externally_managed()
    +
    +        protect_pip_from_modification_on_windows(
    +            modifying_pip="pip" in reqs_to_uninstall
    +        )
    +
    +        for req in reqs_to_uninstall.values():
    +            uninstall_pathset = req.uninstall(
    +                auto_confirm=options.yes,
    +                verbose=self.verbosity > 0,
    +            )
    +            if uninstall_pathset:
    +                uninstall_pathset.commit()
    +        if options.root_user_action == "warn":
    +            warn_if_run_as_root()
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
    new file mode 100644
    index 0000000..278719f
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
    @@ -0,0 +1,182 @@
    +import logging
    +import os
    +import shutil
    +from optparse import Values
    +from typing import List
    +
    +from pip._internal.cache import WheelCache
    +from pip._internal.cli import cmdoptions
    +from pip._internal.cli.req_command import RequirementCommand, with_cleanup
    +from pip._internal.cli.status_codes import SUCCESS
    +from pip._internal.exceptions import CommandError
    +from pip._internal.operations.build.build_tracker import get_build_tracker
    +from pip._internal.req.req_install import (
    +    InstallRequirement,
    +    check_legacy_setup_py_options,
    +)
    +from pip._internal.utils.misc import ensure_dir, normalize_path
    +from pip._internal.utils.temp_dir import TempDirectory
    +from pip._internal.wheel_builder import build, should_build_for_wheel_command
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class WheelCommand(RequirementCommand):
    +    """
    +    Build Wheel archives for your requirements and dependencies.
    +
    +    Wheel is a built-package format, and offers the advantage of not
    +    recompiling your software during every install. For more details, see the
    +    wheel docs: https://wheel.readthedocs.io/en/latest/
    +
    +    'pip wheel' uses the build system interface as described here:
    +    https://pip.pypa.io/en/stable/reference/build-system/
    +
    +    """
    +
    +    usage = """
    +      %prog [options]  ...
    +      %prog [options] -r  ...
    +      %prog [options] [-e]  ...
    +      %prog [options] [-e]  ...
    +      %prog [options]  ..."""
    +
    +    def add_options(self) -> None:
    +        self.cmd_opts.add_option(
    +            "-w",
    +            "--wheel-dir",
    +            dest="wheel_dir",
    +            metavar="dir",
    +            default=os.curdir,
    +            help=(
    +                "Build wheels into , where the default is the "
    +                "current working directory."
    +            ),
    +        )
    +        self.cmd_opts.add_option(cmdoptions.no_binary())
    +        self.cmd_opts.add_option(cmdoptions.only_binary())
    +        self.cmd_opts.add_option(cmdoptions.prefer_binary())
    +        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
    +        self.cmd_opts.add_option(cmdoptions.use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
    +        self.cmd_opts.add_option(cmdoptions.check_build_deps())
    +        self.cmd_opts.add_option(cmdoptions.constraints())
    +        self.cmd_opts.add_option(cmdoptions.editable())
    +        self.cmd_opts.add_option(cmdoptions.requirements())
    +        self.cmd_opts.add_option(cmdoptions.src())
    +        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
    +        self.cmd_opts.add_option(cmdoptions.no_deps())
    +        self.cmd_opts.add_option(cmdoptions.progress_bar())
    +
    +        self.cmd_opts.add_option(
    +            "--no-verify",
    +            dest="no_verify",
    +            action="store_true",
    +            default=False,
    +            help="Don't verify if built wheel is valid.",
    +        )
    +
    +        self.cmd_opts.add_option(cmdoptions.config_settings())
    +        self.cmd_opts.add_option(cmdoptions.build_options())
    +        self.cmd_opts.add_option(cmdoptions.global_options())
    +
    +        self.cmd_opts.add_option(
    +            "--pre",
    +            action="store_true",
    +            default=False,
    +            help=(
    +                "Include pre-release and development versions. By default, "
    +                "pip only finds stable versions."
    +            ),
    +        )
    +
    +        self.cmd_opts.add_option(cmdoptions.require_hashes())
    +
    +        index_opts = cmdoptions.make_option_group(
    +            cmdoptions.index_group,
    +            self.parser,
    +        )
    +
    +        self.parser.insert_option_group(0, index_opts)
    +        self.parser.insert_option_group(0, self.cmd_opts)
    +
    +    @with_cleanup
    +    def run(self, options: Values, args: List[str]) -> int:
    +        session = self.get_default_session(options)
    +
    +        finder = self._build_package_finder(options, session)
    +
    +        options.wheel_dir = normalize_path(options.wheel_dir)
    +        ensure_dir(options.wheel_dir)
    +
    +        build_tracker = self.enter_context(get_build_tracker())
    +
    +        directory = TempDirectory(
    +            delete=not options.no_clean,
    +            kind="wheel",
    +            globally_managed=True,
    +        )
    +
    +        reqs = self.get_requirements(args, options, finder, session)
    +        check_legacy_setup_py_options(options, reqs)
    +
    +        wheel_cache = WheelCache(options.cache_dir)
    +
    +        preparer = self.make_requirement_preparer(
    +            temp_build_dir=directory,
    +            options=options,
    +            build_tracker=build_tracker,
    +            session=session,
    +            finder=finder,
    +            download_dir=options.wheel_dir,
    +            use_user_site=False,
    +            verbosity=self.verbosity,
    +        )
    +
    +        resolver = self.make_resolver(
    +            preparer=preparer,
    +            finder=finder,
    +            options=options,
    +            wheel_cache=wheel_cache,
    +            ignore_requires_python=options.ignore_requires_python,
    +            use_pep517=options.use_pep517,
    +        )
    +
    +        self.trace_basic_info(finder)
    +
    +        requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
    +
    +        reqs_to_build: List[InstallRequirement] = []
    +        for req in requirement_set.requirements.values():
    +            if req.is_wheel:
    +                preparer.save_linked_requirement(req)
    +            elif should_build_for_wheel_command(req):
    +                reqs_to_build.append(req)
    +
    +        preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
    +
    +        # build wheels
    +        build_successes, build_failures = build(
    +            reqs_to_build,
    +            wheel_cache=wheel_cache,
    +            verify=(not options.no_verify),
    +            build_options=options.build_options or [],
    +            global_options=options.global_options or [],
    +        )
    +        for req in build_successes:
    +            assert req.link and req.link.is_wheel
    +            assert req.local_file_path
    +            # copy from cache to target directory
    +            try:
    +                shutil.copy(req.local_file_path, options.wheel_dir)
    +            except OSError as e:
    +                logger.warning(
    +                    "Building wheel for %s failed: %s",
    +                    req.name,
    +                    e,
    +                )
    +                build_failures.append(req)
    +        if len(build_failures) != 0:
    +            raise CommandError("Failed to build one or more wheels")
    +
    +        return SUCCESS
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/configuration.py b/env/lib/python3.12/site-packages/pip/_internal/configuration.py
    new file mode 100644
    index 0000000..c25273d
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/configuration.py
    @@ -0,0 +1,383 @@
    +"""Configuration management setup
    +
    +Some terminology:
    +- name
    +  As written in config files.
    +- value
    +  Value associated with a name
    +- key
    +  Name combined with it's section (section.name)
    +- variant
    +  A single word describing where the configuration key-value pair came from
    +"""
    +
    +import configparser
    +import locale
    +import os
    +import sys
    +from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple
    +
    +from pip._internal.exceptions import (
    +    ConfigurationError,
    +    ConfigurationFileCouldNotBeLoaded,
    +)
    +from pip._internal.utils import appdirs
    +from pip._internal.utils.compat import WINDOWS
    +from pip._internal.utils.logging import getLogger
    +from pip._internal.utils.misc import ensure_dir, enum
    +
    +RawConfigParser = configparser.RawConfigParser  # Shorthand
    +Kind = NewType("Kind", str)
    +
    +CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf"
    +ENV_NAMES_IGNORED = "version", "help"
    +
    +# The kinds of configurations there are.
    +kinds = enum(
    +    USER="user",  # User Specific
    +    GLOBAL="global",  # System Wide
    +    SITE="site",  # [Virtual] Environment Specific
    +    ENV="env",  # from PIP_CONFIG_FILE
    +    ENV_VAR="env-var",  # from Environment Variables
    +)
    +OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR
    +VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE
    +
    +logger = getLogger(__name__)
    +
    +
    +# NOTE: Maybe use the optionx attribute to normalize keynames.
    +def _normalize_name(name: str) -> str:
    +    """Make a name consistent regardless of source (environment or file)"""
    +    name = name.lower().replace("_", "-")
    +    if name.startswith("--"):
    +        name = name[2:]  # only prefer long opts
    +    return name
    +
    +
    +def _disassemble_key(name: str) -> List[str]:
    +    if "." not in name:
    +        error_message = (
    +            "Key does not contain dot separated section and key. "
    +            f"Perhaps you wanted to use 'global.{name}' instead?"
    +        )
    +        raise ConfigurationError(error_message)
    +    return name.split(".", 1)
    +
    +
    +def get_configuration_files() -> Dict[Kind, List[str]]:
    +    global_config_files = [
    +        os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip")
    +    ]
    +
    +    site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME)
    +    legacy_config_file = os.path.join(
    +        os.path.expanduser("~"),
    +        "pip" if WINDOWS else ".pip",
    +        CONFIG_BASENAME,
    +    )
    +    new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME)
    +    return {
    +        kinds.GLOBAL: global_config_files,
    +        kinds.SITE: [site_config_file],
    +        kinds.USER: [legacy_config_file, new_config_file],
    +    }
    +
    +
    +class Configuration:
    +    """Handles management of configuration.
    +
    +    Provides an interface to accessing and managing configuration files.
    +
    +    This class converts provides an API that takes "section.key-name" style
    +    keys and stores the value associated with it as "key-name" under the
    +    section "section".
    +
    +    This allows for a clean interface wherein the both the section and the
    +    key-name are preserved in an easy to manage form in the configuration files
    +    and the data stored is also nice.
    +    """
    +
    +    def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None:
    +        super().__init__()
    +
    +        if load_only is not None and load_only not in VALID_LOAD_ONLY:
    +            raise ConfigurationError(
    +                "Got invalid value for load_only - should be one of {}".format(
    +                    ", ".join(map(repr, VALID_LOAD_ONLY))
    +                )
    +            )
    +        self.isolated = isolated
    +        self.load_only = load_only
    +
    +        # Because we keep track of where we got the data from
    +        self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = {
    +            variant: [] for variant in OVERRIDE_ORDER
    +        }
    +        self._config: Dict[Kind, Dict[str, Any]] = {
    +            variant: {} for variant in OVERRIDE_ORDER
    +        }
    +        self._modified_parsers: List[Tuple[str, RawConfigParser]] = []
    +
    +    def load(self) -> None:
    +        """Loads configuration from configuration files and environment"""
    +        self._load_config_files()
    +        if not self.isolated:
    +            self._load_environment_vars()
    +
    +    def get_file_to_edit(self) -> Optional[str]:
    +        """Returns the file with highest priority in configuration"""
    +        assert self.load_only is not None, "Need to be specified a file to be editing"
    +
    +        try:
    +            return self._get_parser_to_modify()[0]
    +        except IndexError:
    +            return None
    +
    +    def items(self) -> Iterable[Tuple[str, Any]]:
    +        """Returns key-value pairs like dict.items() representing the loaded
    +        configuration
    +        """
    +        return self._dictionary.items()
    +
    +    def get_value(self, key: str) -> Any:
    +        """Get a value from the configuration."""
    +        orig_key = key
    +        key = _normalize_name(key)
    +        try:
    +            return self._dictionary[key]
    +        except KeyError:
    +            # disassembling triggers a more useful error message than simply
    +            # "No such key" in the case that the key isn't in the form command.option
    +            _disassemble_key(key)
    +            raise ConfigurationError(f"No such key - {orig_key}")
    +
    +    def set_value(self, key: str, value: Any) -> None:
    +        """Modify a value in the configuration."""
    +        key = _normalize_name(key)
    +        self._ensure_have_load_only()
    +
    +        assert self.load_only
    +        fname, parser = self._get_parser_to_modify()
    +
    +        if parser is not None:
    +            section, name = _disassemble_key(key)
    +
    +            # Modify the parser and the configuration
    +            if not parser.has_section(section):
    +                parser.add_section(section)
    +            parser.set(section, name, value)
    +
    +        self._config[self.load_only][key] = value
    +        self._mark_as_modified(fname, parser)
    +
    +    def unset_value(self, key: str) -> None:
    +        """Unset a value in the configuration."""
    +        orig_key = key
    +        key = _normalize_name(key)
    +        self._ensure_have_load_only()
    +
    +        assert self.load_only
    +        if key not in self._config[self.load_only]:
    +            raise ConfigurationError(f"No such key - {orig_key}")
    +
    +        fname, parser = self._get_parser_to_modify()
    +
    +        if parser is not None:
    +            section, name = _disassemble_key(key)
    +            if not (
    +                parser.has_section(section) and parser.remove_option(section, name)
    +            ):
    +                # The option was not removed.
    +                raise ConfigurationError(
    +                    "Fatal Internal error [id=1]. Please report as a bug."
    +                )
    +
    +            # The section may be empty after the option was removed.
    +            if not parser.items(section):
    +                parser.remove_section(section)
    +            self._mark_as_modified(fname, parser)
    +
    +        del self._config[self.load_only][key]
    +
    +    def save(self) -> None:
    +        """Save the current in-memory state."""
    +        self._ensure_have_load_only()
    +
    +        for fname, parser in self._modified_parsers:
    +            logger.info("Writing to %s", fname)
    +
    +            # Ensure directory exists.
    +            ensure_dir(os.path.dirname(fname))
    +
    +            # Ensure directory's permission(need to be writeable)
    +            try:
    +                with open(fname, "w") as f:
    +                    parser.write(f)
    +            except OSError as error:
    +                raise ConfigurationError(
    +                    f"An error occurred while writing to the configuration file "
    +                    f"{fname}: {error}"
    +                )
    +
    +    #
    +    # Private routines
    +    #
    +
    +    def _ensure_have_load_only(self) -> None:
    +        if self.load_only is None:
    +            raise ConfigurationError("Needed a specific file to be modifying.")
    +        logger.debug("Will be working with %s variant only", self.load_only)
    +
    +    @property
    +    def _dictionary(self) -> Dict[str, Any]:
    +        """A dictionary representing the loaded configuration."""
    +        # NOTE: Dictionaries are not populated if not loaded. So, conditionals
    +        #       are not needed here.
    +        retval = {}
    +
    +        for variant in OVERRIDE_ORDER:
    +            retval.update(self._config[variant])
    +
    +        return retval
    +
    +    def _load_config_files(self) -> None:
    +        """Loads configuration from configuration files"""
    +        config_files = dict(self.iter_config_files())
    +        if config_files[kinds.ENV][0:1] == [os.devnull]:
    +            logger.debug(
    +                "Skipping loading configuration files due to "
    +                "environment's PIP_CONFIG_FILE being os.devnull"
    +            )
    +            return
    +
    +        for variant, files in config_files.items():
    +            for fname in files:
    +                # If there's specific variant set in `load_only`, load only
    +                # that variant, not the others.
    +                if self.load_only is not None and variant != self.load_only:
    +                    logger.debug("Skipping file '%s' (variant: %s)", fname, variant)
    +                    continue
    +
    +                parser = self._load_file(variant, fname)
    +
    +                # Keeping track of the parsers used
    +                self._parsers[variant].append((fname, parser))
    +
    +    def _load_file(self, variant: Kind, fname: str) -> RawConfigParser:
    +        logger.verbose("For variant '%s', will try loading '%s'", variant, fname)
    +        parser = self._construct_parser(fname)
    +
    +        for section in parser.sections():
    +            items = parser.items(section)
    +            self._config[variant].update(self._normalized_keys(section, items))
    +
    +        return parser
    +
    +    def _construct_parser(self, fname: str) -> RawConfigParser:
    +        parser = configparser.RawConfigParser()
    +        # If there is no such file, don't bother reading it but create the
    +        # parser anyway, to hold the data.
    +        # Doing this is useful when modifying and saving files, where we don't
    +        # need to construct a parser.
    +        if os.path.exists(fname):
    +            locale_encoding = locale.getpreferredencoding(False)
    +            try:
    +                parser.read(fname, encoding=locale_encoding)
    +            except UnicodeDecodeError:
    +                # See https://github.com/pypa/pip/issues/4963
    +                raise ConfigurationFileCouldNotBeLoaded(
    +                    reason=f"contains invalid {locale_encoding} characters",
    +                    fname=fname,
    +                )
    +            except configparser.Error as error:
    +                # See https://github.com/pypa/pip/issues/4893
    +                raise ConfigurationFileCouldNotBeLoaded(error=error)
    +        return parser
    +
    +    def _load_environment_vars(self) -> None:
    +        """Loads configuration from environment variables"""
    +        self._config[kinds.ENV_VAR].update(
    +            self._normalized_keys(":env:", self.get_environ_vars())
    +        )
    +
    +    def _normalized_keys(
    +        self, section: str, items: Iterable[Tuple[str, Any]]
    +    ) -> Dict[str, Any]:
    +        """Normalizes items to construct a dictionary with normalized keys.
    +
    +        This routine is where the names become keys and are made the same
    +        regardless of source - configuration files or environment.
    +        """
    +        normalized = {}
    +        for name, val in items:
    +            key = section + "." + _normalize_name(name)
    +            normalized[key] = val
    +        return normalized
    +
    +    def get_environ_vars(self) -> Iterable[Tuple[str, str]]:
    +        """Returns a generator with all environmental vars with prefix PIP_"""
    +        for key, val in os.environ.items():
    +            if key.startswith("PIP_"):
    +                name = key[4:].lower()
    +                if name not in ENV_NAMES_IGNORED:
    +                    yield name, val
    +
    +    # XXX: This is patched in the tests.
    +    def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]:
    +        """Yields variant and configuration files associated with it.
    +
    +        This should be treated like items of a dictionary. The order
    +        here doesn't affect what gets overridden. That is controlled
    +        by OVERRIDE_ORDER. However this does control the order they are
    +        displayed to the user. It's probably most ergononmic to display
    +        things in the same order as OVERRIDE_ORDER
    +        """
    +        # SMELL: Move the conditions out of this function
    +
    +        env_config_file = os.environ.get("PIP_CONFIG_FILE", None)
    +        config_files = get_configuration_files()
    +
    +        yield kinds.GLOBAL, config_files[kinds.GLOBAL]
    +
    +        # per-user config is not loaded when env_config_file exists
    +        should_load_user_config = not self.isolated and not (
    +            env_config_file and os.path.exists(env_config_file)
    +        )
    +        if should_load_user_config:
    +            # The legacy config file is overridden by the new config file
    +            yield kinds.USER, config_files[kinds.USER]
    +
    +        # virtualenv config
    +        yield kinds.SITE, config_files[kinds.SITE]
    +
    +        if env_config_file is not None:
    +            yield kinds.ENV, [env_config_file]
    +        else:
    +            yield kinds.ENV, []
    +
    +    def get_values_in_config(self, variant: Kind) -> Dict[str, Any]:
    +        """Get values present in a config file"""
    +        return self._config[variant]
    +
    +    def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]:
    +        # Determine which parser to modify
    +        assert self.load_only
    +        parsers = self._parsers[self.load_only]
    +        if not parsers:
    +            # This should not happen if everything works correctly.
    +            raise ConfigurationError(
    +                "Fatal Internal error [id=2]. Please report as a bug."
    +            )
    +
    +        # Use the highest priority parser.
    +        return parsers[-1]
    +
    +    # XXX: This is patched in the tests.
    +    def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None:
    +        file_parser_tuple = (fname, parser)
    +        if file_parser_tuple not in self._modified_parsers:
    +            self._modified_parsers.append(file_parser_tuple)
    +
    +    def __repr__(self) -> str:
    +        return f"{self.__class__.__name__}({self._dictionary!r})"
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py
    new file mode 100644
    index 0000000..9a89a83
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py
    @@ -0,0 +1,21 @@
    +from pip._internal.distributions.base import AbstractDistribution
    +from pip._internal.distributions.sdist import SourceDistribution
    +from pip._internal.distributions.wheel import WheelDistribution
    +from pip._internal.req.req_install import InstallRequirement
    +
    +
    +def make_distribution_for_install_requirement(
    +    install_req: InstallRequirement,
    +) -> AbstractDistribution:
    +    """Returns a Distribution for the given InstallRequirement"""
    +    # Editable requirements will always be source distributions. They use the
    +    # legacy logic until we create a modern standard for them.
    +    if install_req.editable:
    +        return SourceDistribution(install_req)
    +
    +    # If it's a wheel, it's a WheelDistribution
    +    if install_req.is_wheel:
    +        return WheelDistribution(install_req)
    +
    +    # Otherwise, a SourceDistribution
    +    return SourceDistribution(install_req)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..a02cde9c83609bad6225db888ab71523469f1ad2
    GIT binary patch
    literal 959
    zcmaJ;&ubGw6rO1|yIYeqwDuxF*&+zrlATr$9xQ4xqFxl*gAjyeHakhC*&pf5Y$eiz
    z2mgn9>{a|zyaaPl76XDOZ-MmW$(c3LHA)}MzVE$x^Y;7R`%tM|0@5D3FFMTv0N+$F
    zH*E%{4GB(x4}2Ja5H=xHcqv#43(Z1?3xO6Eo5c)kfgT!7L*gPae4W6y<{NLcra3U}
    z=Q(yV-!#i^#`IG
    zN4K1vn}}0E>V4em;SS-bPy5KFksvI>0rGR3I_Y1qUW;KS#4CU56$|y4$9Zw_C}@6
    zp|&}d&%slBIkhB7=Ql|wPl7uh=7g!$rW+TP@$6ML;S1~jj6S{kcRwl7k!LQM>GGeM
    z)^~udC|p(~%-t~dlYrc1>oQbp<2U4IQh*SS!QL3$AA@^iushLL;MV8W>yv`?UyE1H
    Ji_&L(egeuF`2!cd%GQWzPNXW
    zr5heLhD3Pa(eMf}Q8)PDAHaX$3q+%4l&Dc3e5))f@yT;%I^7l)qLcK_x#ym9&)4sq
    z>6e8<9>FuCzrXNz2BBZXCV7-DvE~7B6A?rt3)RJ2wj^7w%XX@slEgk`rER6IM0DE9
    z*x7nkLR4lMI8!Xu&ed}glF>;-GFK7FQgmT!Vr2dOxq2rR@9INsshs;=Z05>xSUC6I
    znHhch)XenTvvVgy^|a@ku7js@*=Fd4O};{&&F
    z1{;fbfxcxrgfe5@EJC^NX6-HzA3~%Q)g^-JGLh;jBGWWUk#sYC4K*dATpg|}G;^WY
    ze?d%>6jf<%6gEv6;!NM^iq!KUzimVLVUW!BNfw?VsgfMY(;^vypYTN`!+lyK*U)9D
    zUOJ1)g>dUs1CoIazdtGX6B(f?tpT~x3=4CvHC?8)utO}W)XcEEkD0ms6E?`nkll-Z^Oo5AZf
    z2ir8V3#KQ)M^HAfbHLXOmoaMiRy%e()^uE_5_k&?6CuWFx$87o6#;s2#ksa*`Ynx9
    zKkx=(In?tFTii_?Ow2#&r^yDCqf6buPqHV{feA5VXeO8RT$m6JiD)@Q2p3`QIwD;x
    za4NnDEJ8gB$aD;o^78YNXMnN~xzzeAthtQ~kRFX*_FOJp0aJ+&xZz%c8c-h-?Bn$m
    znN1PDLn(=B;%ZASTZC{THyeRz0UwaGNZER#`ii(f9m--)0>``<^z4ad6dt&m3Go1&
    z+E0~vBO}$w-!KJe3o{Ig#hf_NmxFTZX&;TbX~rJZos%oT24Y&q$^18
    zX}8g;G*?cA3J*NWLRHsI$MkibiQxzQG^bWG+Jre>k6J|6xiF?_EB^$wmTS|R9kj4*
    zV^TZe8iAN9ymr#`PX&$I;mOI$3EbwD)6L4XOK6Qcmui;TsCm#Qu5+|{_(+YLKCL8h
    zsClMW10SFbV2;&D-vHw^(WX_e%|^id^6riLxtjRD2SoS_usmKtKd6Q4+575_uhp^d
    zwrsnWzM-zc0Wu`9b{~~YcN#Z_`%F^;TQ(98P7WTEcy3l#uasoi1peA5<
    zeJ+S<3v>^_CV?9C@@!L^a~*m}2nm3Jwg?)UnQKlLd7|L}GaKR$MpXi5ZGOJ$G3sGP
    z_5Q@^3Bo7J^YhT1mIXIQW5Di=4K8w_vCXiC
    zr6>%&i+!-XV!VYVqeYEHJ!Zq;
    z;zkS=2L9NdPF7GV+PSxr6I34M
    ziw}o@iu51JKt-Jpc@2Naa-v_OQCl8n;}AfY@!KAJIhdGGan^RioUHcdWHssVsu+<`
    z;=)aX5-^gYf`t19`2x+CtKIRd_k%k-b$t3A@Fa3;6~!(_Q$T$qF8!PAFgPT}13v&u
    rCnZVJ_bC4(I`|uU^#PjvIaPX)KK3YcP#V8=_S5sX&;Nyhj4t{Y4wNSa
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..cbf1e3ff5c43a5448bdd8fb130402e8a9665c9d5
    GIT binary patch
    literal 1718
    zcma)6&2Jl35P$pWwPVLdX##C&S)ov2A$#5CNQG1g6mm!_;Iu-l)_%|NHv850c2U;i
    z5TP94#4%U6QT0#ZV#EQoQlv_V12==qg%dNocCe#>7-{GIc4pqkZ)V>6zR{==kawL=
    z4)zp6e!-uGXmc>z18_i7?&J^cF#8T%NvLtC=7l
    zk33=0hzT={5;J6sLUd-r)Y#=NGB#adCL?BY_Bi!8_`Pr#@u2jL!0Gy&xil-5>oXRb
    zgD8m8gwbwc%5~0?l!pUp&TTPZ0cI+wQ<9M<(*6@rxhj}H6c}p$HMT}kz^ou0xk2Dk
    zYd0FC0TQzAd&&E0-@4uFb#~oMbRG;l??jYYEd0#!y}lJ^$tVhUy0`CG!b@0Z&RJNo
    z7h8@OCX7RkExJ@#VV$R_8)tc|pL#xZu>OaPJ02b1x-`$-i*Zdjy1+g?CeNB1GXP|T
    zxeSJa`3S%%`J6n$kPGq%qb|sCWe?hY(I8()|9|F3q%H4{x3Iv_%_;Os_D?^wmTC7yF
    zU~4VQO26?naPc~*w#wHLZ=re-)k~lR&c+K;^1o4D2)07~JR#$q%X9FblW;3h0d-8K
    zby95<1lx_=aGcN$nB(L%#|a{u`iSd}^B5{O_f#B*MguS#F^^)#lZ+#~T!Dv*w*YY+
    z)g~(J#a!)2k{4T4S0f*Apr?RA7`R4WScE0WWK>*H_
    zg>kCO+G~?H-kcE_r-rUIp0#dFH5jKlxps3}L1d8YuS~0mYNWRQd<{^!HEy=wuI74@
    z#a?(&p5BDp**(9V-Q_M5-9Egr9E*~_x*CQJanzmPaHs5#lJwSU;G%uY+!VZ5bCDZ&
    s%Y47ZZ^1_R2#K4Zrivszh(z@^bG_0%JkwZ#=xq=Kufz
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..c14b5583d2578302284a4ce0a2c01ff9ba6cb4e1
    GIT binary patch
    literal 8445
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..7344ed409507c28272268736c8495562995d4835
    GIT binary patch
    literal 2299
    zcmaJ?&2JM&6rWwM*J~%nPKgj7g{)8!HDE84OHeCR%4fdWIiVXcU{0T?3(4JvJmtaa)jKF&$;9RN
    zT){?pap{cbGtm{21)sJU^W$yvOgh(*bm-_|B`#iY8&}|gc(NC3>l-Q8+J`N+IG2%
    zX)#@q9v3F0(yTL3!&yW6U9%ImA!J5tiKL3!XGVXY^
    zxA%oa);7y*1D6G&{RVkb+PVe=8H-p4MiMcg8zTOaTtSgd>?AmUvBA~jP;0fZBXA!0{S4yRpdb_BrJlZO%r
    zbLMxwaNY#qqOlRx5#P|k*|iRU7%`S&7ZvvoTx1f_4#<~g)Ev76w8K#=jjo42MAF-y
    z00sQw3~tQ=<8T?UxzLIpXFz>i@+0Uu4hH44UD=8?{LQfwa7-{q2vt-*1xuVw+!UBF
    z)8wxqYX|n3VXDSjP48f0do&NVR|@Y0U7`-t4KgT@^7O66uNNPc_WxAc-#0GzE01la$7wfA0#9S{(xmN9`xYC^*G3k5){BYz-ve);1-wg;yh)NT
    zCJ|O9W5Y=v632-PjuS+*12uNyNyoX?aeXW^>~fAnqXrO0n@4TNWtXF`aRwe7z7;5r
    ziaFLN*6LB@^BLS@sEL^*AU=s(oRBZRfN7aLQ!`luim7iIs7iMF&YRyKy<7d00J)YK
    zG6%YmJ+Jf+zP(0}7)Jf8q6HI63dDqCV*
    zcH4k^jzvlR-vynu<}9#~M!c4`TM($h3+jsm)3KRI40~^FtoPRH@W66xk@2>1u_4sc
    zv}|0Hc<;Cvf@^WzE`!^JPi=y=G*#p2i;Z{E>Kx~Xz$A7!QH5!cQ55Aja^NXB_LQ9X
    fTh$cx8Nq3iXj8vx?>^UeD#iZxLw^xilZ5;Ws$pMp
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py
    new file mode 100644
    index 0000000..6e4d0c9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/base.py
    @@ -0,0 +1,53 @@
    +import abc
    +from typing import TYPE_CHECKING, Optional
    +
    +from pip._internal.metadata.base import BaseDistribution
    +from pip._internal.req import InstallRequirement
    +
    +if TYPE_CHECKING:
    +    from pip._internal.index.package_finder import PackageFinder
    +
    +
    +class AbstractDistribution(metaclass=abc.ABCMeta):
    +    """A base class for handling installable artifacts.
    +
    +    The requirements for anything installable are as follows:
    +
    +     - we must be able to determine the requirement name
    +       (or we can't correctly handle the non-upgrade case).
    +
    +     - for packages with setup requirements, we must also be able
    +       to determine their requirements without installing additional
    +       packages (for the same reason as run-time dependencies)
    +
    +     - we must be able to create a Distribution object exposing the
    +       above metadata.
    +
    +     - if we need to do work in the build tracker, we must be able to generate a unique
    +       string to identify the requirement in the build tracker.
    +    """
    +
    +    def __init__(self, req: InstallRequirement) -> None:
    +        super().__init__()
    +        self.req = req
    +
    +    @abc.abstractproperty
    +    def build_tracker_id(self) -> Optional[str]:
    +        """A string that uniquely identifies this requirement to the build tracker.
    +
    +        If None, then this dist has no work to do in the build tracker, and
    +        ``.prepare_distribution_metadata()`` will not be called."""
    +        raise NotImplementedError()
    +
    +    @abc.abstractmethod
    +    def get_metadata_distribution(self) -> BaseDistribution:
    +        raise NotImplementedError()
    +
    +    @abc.abstractmethod
    +    def prepare_distribution_metadata(
    +        self,
    +        finder: "PackageFinder",
    +        build_isolation: bool,
    +        check_build_deps: bool,
    +    ) -> None:
    +        raise NotImplementedError()
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/installed.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
    new file mode 100644
    index 0000000..ab8d53b
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
    @@ -0,0 +1,29 @@
    +from typing import Optional
    +
    +from pip._internal.distributions.base import AbstractDistribution
    +from pip._internal.index.package_finder import PackageFinder
    +from pip._internal.metadata import BaseDistribution
    +
    +
    +class InstalledDistribution(AbstractDistribution):
    +    """Represents an installed package.
    +
    +    This does not need any preparation as the required information has already
    +    been computed.
    +    """
    +
    +    @property
    +    def build_tracker_id(self) -> Optional[str]:
    +        return None
    +
    +    def get_metadata_distribution(self) -> BaseDistribution:
    +        assert self.req.satisfied_by is not None, "not actually installed"
    +        return self.req.satisfied_by
    +
    +    def prepare_distribution_metadata(
    +        self,
    +        finder: PackageFinder,
    +        build_isolation: bool,
    +        check_build_deps: bool,
    +    ) -> None:
    +        pass
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
    new file mode 100644
    index 0000000..28ea5ce
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
    @@ -0,0 +1,158 @@
    +import logging
    +from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple
    +
    +from pip._internal.build_env import BuildEnvironment
    +from pip._internal.distributions.base import AbstractDistribution
    +from pip._internal.exceptions import InstallationError
    +from pip._internal.metadata import BaseDistribution
    +from pip._internal.utils.subprocess import runner_with_spinner_message
    +
    +if TYPE_CHECKING:
    +    from pip._internal.index.package_finder import PackageFinder
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class SourceDistribution(AbstractDistribution):
    +    """Represents a source distribution.
    +
    +    The preparation step for these needs metadata for the packages to be
    +    generated, either using PEP 517 or using the legacy `setup.py egg_info`.
    +    """
    +
    +    @property
    +    def build_tracker_id(self) -> Optional[str]:
    +        """Identify this requirement uniquely by its link."""
    +        assert self.req.link
    +        return self.req.link.url_without_fragment
    +
    +    def get_metadata_distribution(self) -> BaseDistribution:
    +        return self.req.get_dist()
    +
    +    def prepare_distribution_metadata(
    +        self,
    +        finder: "PackageFinder",
    +        build_isolation: bool,
    +        check_build_deps: bool,
    +    ) -> None:
    +        # Load pyproject.toml, to determine whether PEP 517 is to be used
    +        self.req.load_pyproject_toml()
    +
    +        # Set up the build isolation, if this requirement should be isolated
    +        should_isolate = self.req.use_pep517 and build_isolation
    +        if should_isolate:
    +            # Setup an isolated environment and install the build backend static
    +            # requirements in it.
    +            self._prepare_build_backend(finder)
    +            # Check that if the requirement is editable, it either supports PEP 660 or
    +            # has a setup.py or a setup.cfg. This cannot be done earlier because we need
    +            # to setup the build backend to verify it supports build_editable, nor can
    +            # it be done later, because we want to avoid installing build requirements
    +            # needlessly. Doing it here also works around setuptools generating
    +            # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory
    +            # without setup.py nor setup.cfg.
    +            self.req.isolated_editable_sanity_check()
    +            # Install the dynamic build requirements.
    +            self._install_build_reqs(finder)
    +        # Check if the current environment provides build dependencies
    +        should_check_deps = self.req.use_pep517 and check_build_deps
    +        if should_check_deps:
    +            pyproject_requires = self.req.pyproject_requires
    +            assert pyproject_requires is not None
    +            conflicting, missing = self.req.build_env.check_requirements(
    +                pyproject_requires
    +            )
    +            if conflicting:
    +                self._raise_conflicts("the backend dependencies", conflicting)
    +            if missing:
    +                self._raise_missing_reqs(missing)
    +        self.req.prepare_metadata()
    +
    +    def _prepare_build_backend(self, finder: "PackageFinder") -> None:
    +        # Isolate in a BuildEnvironment and install the build-time
    +        # requirements.
    +        pyproject_requires = self.req.pyproject_requires
    +        assert pyproject_requires is not None
    +
    +        self.req.build_env = BuildEnvironment()
    +        self.req.build_env.install_requirements(
    +            finder, pyproject_requires, "overlay", kind="build dependencies"
    +        )
    +        conflicting, missing = self.req.build_env.check_requirements(
    +            self.req.requirements_to_check
    +        )
    +        if conflicting:
    +            self._raise_conflicts("PEP 517/518 supported requirements", conflicting)
    +        if missing:
    +            logger.warning(
    +                "Missing build requirements in pyproject.toml for %s.",
    +                self.req,
    +            )
    +            logger.warning(
    +                "The project does not specify a build backend, and "
    +                "pip cannot fall back to setuptools without %s.",
    +                " and ".join(map(repr, sorted(missing))),
    +            )
    +
    +    def _get_build_requires_wheel(self) -> Iterable[str]:
    +        with self.req.build_env:
    +            runner = runner_with_spinner_message("Getting requirements to build wheel")
    +            backend = self.req.pep517_backend
    +            assert backend is not None
    +            with backend.subprocess_runner(runner):
    +                return backend.get_requires_for_build_wheel()
    +
    +    def _get_build_requires_editable(self) -> Iterable[str]:
    +        with self.req.build_env:
    +            runner = runner_with_spinner_message(
    +                "Getting requirements to build editable"
    +            )
    +            backend = self.req.pep517_backend
    +            assert backend is not None
    +            with backend.subprocess_runner(runner):
    +                return backend.get_requires_for_build_editable()
    +
    +    def _install_build_reqs(self, finder: "PackageFinder") -> None:
    +        # Install any extra build dependencies that the backend requests.
    +        # This must be done in a second pass, as the pyproject.toml
    +        # dependencies must be installed before we can call the backend.
    +        if (
    +            self.req.editable
    +            and self.req.permit_editable_wheels
    +            and self.req.supports_pyproject_editable
    +        ):
    +            build_reqs = self._get_build_requires_editable()
    +        else:
    +            build_reqs = self._get_build_requires_wheel()
    +        conflicting, missing = self.req.build_env.check_requirements(build_reqs)
    +        if conflicting:
    +            self._raise_conflicts("the backend dependencies", conflicting)
    +        self.req.build_env.install_requirements(
    +            finder, missing, "normal", kind="backend dependencies"
    +        )
    +
    +    def _raise_conflicts(
    +        self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]]
    +    ) -> None:
    +        format_string = (
    +            "Some build dependencies for {requirement} "
    +            "conflict with {conflicting_with}: {description}."
    +        )
    +        error_message = format_string.format(
    +            requirement=self.req,
    +            conflicting_with=conflicting_with,
    +            description=", ".join(
    +                f"{installed} is incompatible with {wanted}"
    +                for installed, wanted in sorted(conflicting_reqs)
    +            ),
    +        )
    +        raise InstallationError(error_message)
    +
    +    def _raise_missing_reqs(self, missing: Set[str]) -> None:
    +        format_string = (
    +            "Some build dependencies for {requirement} are missing: {missing}."
    +        )
    +        error_message = format_string.format(
    +            requirement=self.req, missing=", ".join(map(repr, sorted(missing)))
    +        )
    +        raise InstallationError(error_message)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
    new file mode 100644
    index 0000000..bfadd39
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
    @@ -0,0 +1,42 @@
    +from typing import TYPE_CHECKING, Optional
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.distributions.base import AbstractDistribution
    +from pip._internal.metadata import (
    +    BaseDistribution,
    +    FilesystemWheel,
    +    get_wheel_distribution,
    +)
    +
    +if TYPE_CHECKING:
    +    from pip._internal.index.package_finder import PackageFinder
    +
    +
    +class WheelDistribution(AbstractDistribution):
    +    """Represents a wheel distribution.
    +
    +    This does not need any preparation as wheels can be directly unpacked.
    +    """
    +
    +    @property
    +    def build_tracker_id(self) -> Optional[str]:
    +        return None
    +
    +    def get_metadata_distribution(self) -> BaseDistribution:
    +        """Loads the metadata from the wheel file into memory and returns a
    +        Distribution that uses it, not relying on the wheel file or
    +        requirement.
    +        """
    +        assert self.req.local_file_path, "Set as part of preparation during download"
    +        assert self.req.name, "Wheels are never unnamed"
    +        wheel = FilesystemWheel(self.req.local_file_path)
    +        return get_wheel_distribution(wheel, canonicalize_name(self.req.name))
    +
    +    def prepare_distribution_metadata(
    +        self,
    +        finder: "PackageFinder",
    +        build_isolation: bool,
    +        check_build_deps: bool,
    +    ) -> None:
    +        pass
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/exceptions.py b/env/lib/python3.12/site-packages/pip/_internal/exceptions.py
    new file mode 100644
    index 0000000..45a876a
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/exceptions.py
    @@ -0,0 +1,809 @@
    +"""Exceptions used throughout package.
    +
    +This module MUST NOT try to import from anything within `pip._internal` to
    +operate. This is expected to be importable from any/all files within the
    +subpackage and, thus, should not depend on them.
    +"""
    +
    +import configparser
    +import contextlib
    +import locale
    +import logging
    +import pathlib
    +import re
    +import sys
    +from itertools import chain, groupby, repeat
    +from typing import TYPE_CHECKING, Dict, Iterator, List, Literal, Optional, Union
    +
    +from pip._vendor.packaging.requirements import InvalidRequirement
    +from pip._vendor.packaging.version import InvalidVersion
    +from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
    +from pip._vendor.rich.markup import escape
    +from pip._vendor.rich.text import Text
    +
    +if TYPE_CHECKING:
    +    from hashlib import _Hash
    +
    +    from pip._vendor.requests.models import Request, Response
    +
    +    from pip._internal.metadata import BaseDistribution
    +    from pip._internal.req.req_install import InstallRequirement
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +#
    +# Scaffolding
    +#
    +def _is_kebab_case(s: str) -> bool:
    +    return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None
    +
    +
    +def _prefix_with_indent(
    +    s: Union[Text, str],
    +    console: Console,
    +    *,
    +    prefix: str,
    +    indent: str,
    +) -> Text:
    +    if isinstance(s, Text):
    +        text = s
    +    else:
    +        text = console.render_str(s)
    +
    +    return console.render_str(prefix, overflow="ignore") + console.render_str(
    +        f"\n{indent}", overflow="ignore"
    +    ).join(text.split(allow_blank=True))
    +
    +
    +class PipError(Exception):
    +    """The base pip error."""
    +
    +
    +class DiagnosticPipError(PipError):
    +    """An error, that presents diagnostic information to the user.
    +
    +    This contains a bunch of logic, to enable pretty presentation of our error
    +    messages. Each error gets a unique reference. Each error can also include
    +    additional context, a hint and/or a note -- which are presented with the
    +    main error message in a consistent style.
    +
    +    This is adapted from the error output styling in `sphinx-theme-builder`.
    +    """
    +
    +    reference: str
    +
    +    def __init__(
    +        self,
    +        *,
    +        kind: 'Literal["error", "warning"]' = "error",
    +        reference: Optional[str] = None,
    +        message: Union[str, Text],
    +        context: Optional[Union[str, Text]],
    +        hint_stmt: Optional[Union[str, Text]],
    +        note_stmt: Optional[Union[str, Text]] = None,
    +        link: Optional[str] = None,
    +    ) -> None:
    +        # Ensure a proper reference is provided.
    +        if reference is None:
    +            assert hasattr(self, "reference"), "error reference not provided!"
    +            reference = self.reference
    +        assert _is_kebab_case(reference), "error reference must be kebab-case!"
    +
    +        self.kind = kind
    +        self.reference = reference
    +
    +        self.message = message
    +        self.context = context
    +
    +        self.note_stmt = note_stmt
    +        self.hint_stmt = hint_stmt
    +
    +        self.link = link
    +
    +        super().__init__(f"<{self.__class__.__name__}: {self.reference}>")
    +
    +    def __repr__(self) -> str:
    +        return (
    +            f"<{self.__class__.__name__}("
    +            f"reference={self.reference!r}, "
    +            f"message={self.message!r}, "
    +            f"context={self.context!r}, "
    +            f"note_stmt={self.note_stmt!r}, "
    +            f"hint_stmt={self.hint_stmt!r}"
    +            ")>"
    +        )
    +
    +    def __rich_console__(
    +        self,
    +        console: Console,
    +        options: ConsoleOptions,
    +    ) -> RenderResult:
    +        colour = "red" if self.kind == "error" else "yellow"
    +
    +        yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]"
    +        yield ""
    +
    +        if not options.ascii_only:
    +            # Present the main message, with relevant context indented.
    +            if self.context is not None:
    +                yield _prefix_with_indent(
    +                    self.message,
    +                    console,
    +                    prefix=f"[{colour}]×[/] ",
    +                    indent=f"[{colour}]│[/] ",
    +                )
    +                yield _prefix_with_indent(
    +                    self.context,
    +                    console,
    +                    prefix=f"[{colour}]╰─>[/] ",
    +                    indent=f"[{colour}]   [/] ",
    +                )
    +            else:
    +                yield _prefix_with_indent(
    +                    self.message,
    +                    console,
    +                    prefix="[red]×[/] ",
    +                    indent="  ",
    +                )
    +        else:
    +            yield self.message
    +            if self.context is not None:
    +                yield ""
    +                yield self.context
    +
    +        if self.note_stmt is not None or self.hint_stmt is not None:
    +            yield ""
    +
    +        if self.note_stmt is not None:
    +            yield _prefix_with_indent(
    +                self.note_stmt,
    +                console,
    +                prefix="[magenta bold]note[/]: ",
    +                indent="      ",
    +            )
    +        if self.hint_stmt is not None:
    +            yield _prefix_with_indent(
    +                self.hint_stmt,
    +                console,
    +                prefix="[cyan bold]hint[/]: ",
    +                indent="      ",
    +            )
    +
    +        if self.link is not None:
    +            yield ""
    +            yield f"Link: {self.link}"
    +
    +
    +#
    +# Actual Errors
    +#
    +class ConfigurationError(PipError):
    +    """General exception in configuration"""
    +
    +
    +class InstallationError(PipError):
    +    """General exception during installation"""
    +
    +
    +class MissingPyProjectBuildRequires(DiagnosticPipError):
    +    """Raised when pyproject.toml has `build-system`, but no `build-system.requires`."""
    +
    +    reference = "missing-pyproject-build-system-requires"
    +
    +    def __init__(self, *, package: str) -> None:
    +        super().__init__(
    +            message=f"Can not process {escape(package)}",
    +            context=Text(
    +                "This package has an invalid pyproject.toml file.\n"
    +                "The [build-system] table is missing the mandatory `requires` key."
    +            ),
    +            note_stmt="This is an issue with the package mentioned above, not pip.",
    +            hint_stmt=Text("See PEP 518 for the detailed specification."),
    +        )
    +
    +
    +class InvalidPyProjectBuildRequires(DiagnosticPipError):
    +    """Raised when pyproject.toml an invalid `build-system.requires`."""
    +
    +    reference = "invalid-pyproject-build-system-requires"
    +
    +    def __init__(self, *, package: str, reason: str) -> None:
    +        super().__init__(
    +            message=f"Can not process {escape(package)}",
    +            context=Text(
    +                "This package has an invalid `build-system.requires` key in "
    +                f"pyproject.toml.\n{reason}"
    +            ),
    +            note_stmt="This is an issue with the package mentioned above, not pip.",
    +            hint_stmt=Text("See PEP 518 for the detailed specification."),
    +        )
    +
    +
    +class NoneMetadataError(PipError):
    +    """Raised when accessing a Distribution's "METADATA" or "PKG-INFO".
    +
    +    This signifies an inconsistency, when the Distribution claims to have
    +    the metadata file (if not, raise ``FileNotFoundError`` instead), but is
    +    not actually able to produce its content. This may be due to permission
    +    errors.
    +    """
    +
    +    def __init__(
    +        self,
    +        dist: "BaseDistribution",
    +        metadata_name: str,
    +    ) -> None:
    +        """
    +        :param dist: A Distribution object.
    +        :param metadata_name: The name of the metadata being accessed
    +            (can be "METADATA" or "PKG-INFO").
    +        """
    +        self.dist = dist
    +        self.metadata_name = metadata_name
    +
    +    def __str__(self) -> str:
    +        # Use `dist` in the error message because its stringification
    +        # includes more information, like the version and location.
    +        return f"None {self.metadata_name} metadata found for distribution: {self.dist}"
    +
    +
    +class UserInstallationInvalid(InstallationError):
    +    """A --user install is requested on an environment without user site."""
    +
    +    def __str__(self) -> str:
    +        return "User base directory is not specified"
    +
    +
    +class InvalidSchemeCombination(InstallationError):
    +    def __str__(self) -> str:
    +        before = ", ".join(str(a) for a in self.args[:-1])
    +        return f"Cannot set {before} and {self.args[-1]} together"
    +
    +
    +class DistributionNotFound(InstallationError):
    +    """Raised when a distribution cannot be found to satisfy a requirement"""
    +
    +
    +class RequirementsFileParseError(InstallationError):
    +    """Raised when a general error occurs parsing a requirements file line."""
    +
    +
    +class BestVersionAlreadyInstalled(PipError):
    +    """Raised when the most up-to-date version of a package is already
    +    installed."""
    +
    +
    +class BadCommand(PipError):
    +    """Raised when virtualenv or a command is not found"""
    +
    +
    +class CommandError(PipError):
    +    """Raised when there is an error in command-line arguments"""
    +
    +
    +class PreviousBuildDirError(PipError):
    +    """Raised when there's a previous conflicting build directory"""
    +
    +
    +class NetworkConnectionError(PipError):
    +    """HTTP connection error"""
    +
    +    def __init__(
    +        self,
    +        error_msg: str,
    +        response: Optional["Response"] = None,
    +        request: Optional["Request"] = None,
    +    ) -> None:
    +        """
    +        Initialize NetworkConnectionError with  `request` and `response`
    +        objects.
    +        """
    +        self.response = response
    +        self.request = request
    +        self.error_msg = error_msg
    +        if (
    +            self.response is not None
    +            and not self.request
    +            and hasattr(response, "request")
    +        ):
    +            self.request = self.response.request
    +        super().__init__(error_msg, response, request)
    +
    +    def __str__(self) -> str:
    +        return str(self.error_msg)
    +
    +
    +class InvalidWheelFilename(InstallationError):
    +    """Invalid wheel filename."""
    +
    +
    +class UnsupportedWheel(InstallationError):
    +    """Unsupported wheel."""
    +
    +
    +class InvalidWheel(InstallationError):
    +    """Invalid (e.g. corrupt) wheel."""
    +
    +    def __init__(self, location: str, name: str):
    +        self.location = location
    +        self.name = name
    +
    +    def __str__(self) -> str:
    +        return f"Wheel '{self.name}' located at {self.location} is invalid."
    +
    +
    +class MetadataInconsistent(InstallationError):
    +    """Built metadata contains inconsistent information.
    +
    +    This is raised when the metadata contains values (e.g. name and version)
    +    that do not match the information previously obtained from sdist filename,
    +    user-supplied ``#egg=`` value, or an install requirement name.
    +    """
    +
    +    def __init__(
    +        self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str
    +    ) -> None:
    +        self.ireq = ireq
    +        self.field = field
    +        self.f_val = f_val
    +        self.m_val = m_val
    +
    +    def __str__(self) -> str:
    +        return (
    +            f"Requested {self.ireq} has inconsistent {self.field}: "
    +            f"expected {self.f_val!r}, but metadata has {self.m_val!r}"
    +        )
    +
    +
    +class MetadataInvalid(InstallationError):
    +    """Metadata is invalid."""
    +
    +    def __init__(self, ireq: "InstallRequirement", error: str) -> None:
    +        self.ireq = ireq
    +        self.error = error
    +
    +    def __str__(self) -> str:
    +        return f"Requested {self.ireq} has invalid metadata: {self.error}"
    +
    +
    +class InstallationSubprocessError(DiagnosticPipError, InstallationError):
    +    """A subprocess call failed."""
    +
    +    reference = "subprocess-exited-with-error"
    +
    +    def __init__(
    +        self,
    +        *,
    +        command_description: str,
    +        exit_code: int,
    +        output_lines: Optional[List[str]],
    +    ) -> None:
    +        if output_lines is None:
    +            output_prompt = Text("See above for output.")
    +        else:
    +            output_prompt = (
    +                Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n")
    +                + Text("".join(output_lines))
    +                + Text.from_markup(R"[red]\[end of output][/]")
    +            )
    +
    +        super().__init__(
    +            message=(
    +                f"[green]{escape(command_description)}[/] did not run successfully.\n"
    +                f"exit code: {exit_code}"
    +            ),
    +            context=output_prompt,
    +            hint_stmt=None,
    +            note_stmt=(
    +                "This error originates from a subprocess, and is likely not a "
    +                "problem with pip."
    +            ),
    +        )
    +
    +        self.command_description = command_description
    +        self.exit_code = exit_code
    +
    +    def __str__(self) -> str:
    +        return f"{self.command_description} exited with {self.exit_code}"
    +
    +
    +class MetadataGenerationFailed(InstallationSubprocessError, InstallationError):
    +    reference = "metadata-generation-failed"
    +
    +    def __init__(
    +        self,
    +        *,
    +        package_details: str,
    +    ) -> None:
    +        super(InstallationSubprocessError, self).__init__(
    +            message="Encountered error while generating package metadata.",
    +            context=escape(package_details),
    +            hint_stmt="See above for details.",
    +            note_stmt="This is an issue with the package mentioned above, not pip.",
    +        )
    +
    +    def __str__(self) -> str:
    +        return "metadata generation failed"
    +
    +
    +class HashErrors(InstallationError):
    +    """Multiple HashError instances rolled into one for reporting"""
    +
    +    def __init__(self) -> None:
    +        self.errors: List[HashError] = []
    +
    +    def append(self, error: "HashError") -> None:
    +        self.errors.append(error)
    +
    +    def __str__(self) -> str:
    +        lines = []
    +        self.errors.sort(key=lambda e: e.order)
    +        for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
    +            lines.append(cls.head)
    +            lines.extend(e.body() for e in errors_of_cls)
    +        if lines:
    +            return "\n".join(lines)
    +        return ""
    +
    +    def __bool__(self) -> bool:
    +        return bool(self.errors)
    +
    +
    +class HashError(InstallationError):
    +    """
    +    A failure to verify a package against known-good hashes
    +
    +    :cvar order: An int sorting hash exception classes by difficulty of
    +        recovery (lower being harder), so the user doesn't bother fretting
    +        about unpinned packages when he has deeper issues, like VCS
    +        dependencies, to deal with. Also keeps error reports in a
    +        deterministic order.
    +    :cvar head: A section heading for display above potentially many
    +        exceptions of this kind
    +    :ivar req: The InstallRequirement that triggered this error. This is
    +        pasted on after the exception is instantiated, because it's not
    +        typically available earlier.
    +
    +    """
    +
    +    req: Optional["InstallRequirement"] = None
    +    head = ""
    +    order: int = -1
    +
    +    def body(self) -> str:
    +        """Return a summary of me for display under the heading.
    +
    +        This default implementation simply prints a description of the
    +        triggering requirement.
    +
    +        :param req: The InstallRequirement that provoked this error, with
    +            its link already populated by the resolver's _populate_link().
    +
    +        """
    +        return f"    {self._requirement_name()}"
    +
    +    def __str__(self) -> str:
    +        return f"{self.head}\n{self.body()}"
    +
    +    def _requirement_name(self) -> str:
    +        """Return a description of the requirement that triggered me.
    +
    +        This default implementation returns long description of the req, with
    +        line numbers
    +
    +        """
    +        return str(self.req) if self.req else "unknown package"
    +
    +
    +class VcsHashUnsupported(HashError):
    +    """A hash was provided for a version-control-system-based requirement, but
    +    we don't have a method for hashing those."""
    +
    +    order = 0
    +    head = (
    +        "Can't verify hashes for these requirements because we don't "
    +        "have a way to hash version control repositories:"
    +    )
    +
    +
    +class DirectoryUrlHashUnsupported(HashError):
    +    """A hash was provided for a version-control-system-based requirement, but
    +    we don't have a method for hashing those."""
    +
    +    order = 1
    +    head = (
    +        "Can't verify hashes for these file:// requirements because they "
    +        "point to directories:"
    +    )
    +
    +
    +class HashMissing(HashError):
    +    """A hash was needed for a requirement but is absent."""
    +
    +    order = 2
    +    head = (
    +        "Hashes are required in --require-hashes mode, but they are "
    +        "missing from some requirements. Here is a list of those "
    +        "requirements along with the hashes their downloaded archives "
    +        "actually had. Add lines like these to your requirements files to "
    +        "prevent tampering. (If you did not enable --require-hashes "
    +        "manually, note that it turns on automatically when any package "
    +        "has a hash.)"
    +    )
    +
    +    def __init__(self, gotten_hash: str) -> None:
    +        """
    +        :param gotten_hash: The hash of the (possibly malicious) archive we
    +            just downloaded
    +        """
    +        self.gotten_hash = gotten_hash
    +
    +    def body(self) -> str:
    +        # Dodge circular import.
    +        from pip._internal.utils.hashes import FAVORITE_HASH
    +
    +        package = None
    +        if self.req:
    +            # In the case of URL-based requirements, display the original URL
    +            # seen in the requirements file rather than the package name,
    +            # so the output can be directly copied into the requirements file.
    +            package = (
    +                self.req.original_link
    +                if self.req.is_direct
    +                # In case someone feeds something downright stupid
    +                # to InstallRequirement's constructor.
    +                else getattr(self.req, "req", None)
    +            )
    +        return "    {} --hash={}:{}".format(
    +            package or "unknown package", FAVORITE_HASH, self.gotten_hash
    +        )
    +
    +
    +class HashUnpinned(HashError):
    +    """A requirement had a hash specified but was not pinned to a specific
    +    version."""
    +
    +    order = 3
    +    head = (
    +        "In --require-hashes mode, all requirements must have their "
    +        "versions pinned with ==. These do not:"
    +    )
    +
    +
    +class HashMismatch(HashError):
    +    """
    +    Distribution file hash values don't match.
    +
    +    :ivar package_name: The name of the package that triggered the hash
    +        mismatch. Feel free to write to this after the exception is raise to
    +        improve its error message.
    +
    +    """
    +
    +    order = 4
    +    head = (
    +        "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS "
    +        "FILE. If you have updated the package versions, please update "
    +        "the hashes. Otherwise, examine the package contents carefully; "
    +        "someone may have tampered with them."
    +    )
    +
    +    def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None:
    +        """
    +        :param allowed: A dict of algorithm names pointing to lists of allowed
    +            hex digests
    +        :param gots: A dict of algorithm names pointing to hashes we
    +            actually got from the files under suspicion
    +        """
    +        self.allowed = allowed
    +        self.gots = gots
    +
    +    def body(self) -> str:
    +        return f"    {self._requirement_name()}:\n{self._hash_comparison()}"
    +
    +    def _hash_comparison(self) -> str:
    +        """
    +        Return a comparison of actual and expected hash values.
    +
    +        Example::
    +
    +               Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
    +                            or 123451234512345123451234512345123451234512345
    +                    Got        bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef
    +
    +        """
    +
    +        def hash_then_or(hash_name: str) -> "chain[str]":
    +            # For now, all the decent hashes have 6-char names, so we can get
    +            # away with hard-coding space literals.
    +            return chain([hash_name], repeat("    or"))
    +
    +        lines: List[str] = []
    +        for hash_name, expecteds in self.allowed.items():
    +            prefix = hash_then_or(hash_name)
    +            lines.extend((f"        Expected {next(prefix)} {e}") for e in expecteds)
    +            lines.append(
    +                f"             Got        {self.gots[hash_name].hexdigest()}\n"
    +            )
    +        return "\n".join(lines)
    +
    +
    +class UnsupportedPythonVersion(InstallationError):
    +    """Unsupported python version according to Requires-Python package
    +    metadata."""
    +
    +
    +class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
    +    """When there are errors while loading a configuration file"""
    +
    +    def __init__(
    +        self,
    +        reason: str = "could not be loaded",
    +        fname: Optional[str] = None,
    +        error: Optional[configparser.Error] = None,
    +    ) -> None:
    +        super().__init__(error)
    +        self.reason = reason
    +        self.fname = fname
    +        self.error = error
    +
    +    def __str__(self) -> str:
    +        if self.fname is not None:
    +            message_part = f" in {self.fname}."
    +        else:
    +            assert self.error is not None
    +            message_part = f".\n{self.error}\n"
    +        return f"Configuration file {self.reason}{message_part}"
    +
    +
    +_DEFAULT_EXTERNALLY_MANAGED_ERROR = f"""\
    +The Python environment under {sys.prefix} is managed externally, and may not be
    +manipulated by the user. Please use specific tooling from the distributor of
    +the Python installation to interact with this environment instead.
    +"""
    +
    +
    +class ExternallyManagedEnvironment(DiagnosticPipError):
    +    """The current environment is externally managed.
    +
    +    This is raised when the current environment is externally managed, as
    +    defined by `PEP 668`_. The ``EXTERNALLY-MANAGED`` configuration is checked
    +    and displayed when the error is bubbled up to the user.
    +
    +    :param error: The error message read from ``EXTERNALLY-MANAGED``.
    +    """
    +
    +    reference = "externally-managed-environment"
    +
    +    def __init__(self, error: Optional[str]) -> None:
    +        if error is None:
    +            context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR)
    +        else:
    +            context = Text(error)
    +        super().__init__(
    +            message="This environment is externally managed",
    +            context=context,
    +            note_stmt=(
    +                "If you believe this is a mistake, please contact your "
    +                "Python installation or OS distribution provider. "
    +                "You can override this, at the risk of breaking your Python "
    +                "installation or OS, by passing --break-system-packages."
    +            ),
    +            hint_stmt=Text("See PEP 668 for the detailed specification."),
    +        )
    +
    +    @staticmethod
    +    def _iter_externally_managed_error_keys() -> Iterator[str]:
    +        # LC_MESSAGES is in POSIX, but not the C standard. The most common
    +        # platform that does not implement this category is Windows, where
    +        # using other categories for console message localization is equally
    +        # unreliable, so we fall back to the locale-less vendor message. This
    +        # can always be re-evaluated when a vendor proposes a new alternative.
    +        try:
    +            category = locale.LC_MESSAGES
    +        except AttributeError:
    +            lang: Optional[str] = None
    +        else:
    +            lang, _ = locale.getlocale(category)
    +        if lang is not None:
    +            yield f"Error-{lang}"
    +            for sep in ("-", "_"):
    +                before, found, _ = lang.partition(sep)
    +                if not found:
    +                    continue
    +                yield f"Error-{before}"
    +        yield "Error"
    +
    +    @classmethod
    +    def from_config(
    +        cls,
    +        config: Union[pathlib.Path, str],
    +    ) -> "ExternallyManagedEnvironment":
    +        parser = configparser.ConfigParser(interpolation=None)
    +        try:
    +            parser.read(config, encoding="utf-8")
    +            section = parser["externally-managed"]
    +            for key in cls._iter_externally_managed_error_keys():
    +                with contextlib.suppress(KeyError):
    +                    return cls(section[key])
    +        except KeyError:
    +            pass
    +        except (OSError, UnicodeDecodeError, configparser.ParsingError):
    +            from pip._internal.utils._log import VERBOSE
    +
    +            exc_info = logger.isEnabledFor(VERBOSE)
    +            logger.warning("Failed to read %s", config, exc_info=exc_info)
    +        return cls(None)
    +
    +
    +class UninstallMissingRecord(DiagnosticPipError):
    +    reference = "uninstall-no-record-file"
    +
    +    def __init__(self, *, distribution: "BaseDistribution") -> None:
    +        installer = distribution.installer
    +        if not installer or installer == "pip":
    +            dep = f"{distribution.raw_name}=={distribution.version}"
    +            hint = Text.assemble(
    +                "You might be able to recover from this via: ",
    +                (f"pip install --force-reinstall --no-deps {dep}", "green"),
    +            )
    +        else:
    +            hint = Text(
    +                f"The package was installed by {installer}. "
    +                "You should check if it can uninstall the package."
    +            )
    +
    +        super().__init__(
    +            message=Text(f"Cannot uninstall {distribution}"),
    +            context=(
    +                "The package's contents are unknown: "
    +                f"no RECORD file was found for {distribution.raw_name}."
    +            ),
    +            hint_stmt=hint,
    +        )
    +
    +
    +class LegacyDistutilsInstall(DiagnosticPipError):
    +    reference = "uninstall-distutils-installed-package"
    +
    +    def __init__(self, *, distribution: "BaseDistribution") -> None:
    +        super().__init__(
    +            message=Text(f"Cannot uninstall {distribution}"),
    +            context=(
    +                "It is a distutils installed project and thus we cannot accurately "
    +                "determine which files belong to it which would lead to only a partial "
    +                "uninstall."
    +            ),
    +            hint_stmt=None,
    +        )
    +
    +
    +class InvalidInstalledPackage(DiagnosticPipError):
    +    reference = "invalid-installed-package"
    +
    +    def __init__(
    +        self,
    +        *,
    +        dist: "BaseDistribution",
    +        invalid_exc: Union[InvalidRequirement, InvalidVersion],
    +    ) -> None:
    +        installed_location = dist.installed_location
    +
    +        if isinstance(invalid_exc, InvalidRequirement):
    +            invalid_type = "requirement"
    +        else:
    +            invalid_type = "version"
    +
    +        super().__init__(
    +            message=Text(
    +                f"Cannot process installed package {dist} "
    +                + (f"in {installed_location!r} " if installed_location else "")
    +                + f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}"
    +            ),
    +            context=(
    +                "Starting with pip 24.1, packages with invalid "
    +                f"{invalid_type}s can not be processed."
    +            ),
    +            hint_stmt="To proceed this package must be uninstalled.",
    +        )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/index/__init__.py
    new file mode 100644
    index 0000000..7a17b7b
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/index/__init__.py
    @@ -0,0 +1,2 @@
    +"""Index interaction code
    +"""
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..b66cef19a64cc926f1e134bf97327f4c727d9a87
    GIT binary patch
    literal 250
    zcmXv}yG{c!5VS)CQKZy#C~b<%CeR|91O*!CBczpMFFA|zgR?K<_z}K=Z{ZKp@&gg+
    zsIXBo&CaZ}J2PK{L7yeu;?w#f&F?IZ;0LnrCGx=(Te6mqI`8NAR?*u~+eo#LQ9C=7
    zPEr41#J6XN%1Ojew$InUuTVNeV46}GBNWV?Yz)~LV4>q(vx4blQp`mgipS?-mc9Vl
    z4ODsszKx}`SL5j=1RbgHLcWMK1@PJf{+nA-fzDX~(?UnYv2VA%YvWW?(M^4t666vg
    Qcif$D&VM?bck6DFe{Ky%I{*Lx
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..259bba3054c76caa9ba16c1f4f59ac39d006bf8b
    GIT binary patch
    literal 21635
    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
    YxAA>*6Kfo9?|FuK-t!JeDMPLQ1BGUsng9R*
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..40256811b6946621d02a8d566268d9a90f8a428b
    GIT binary patch
    literal 40666
    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
    Rimv&h1;^-iGYa`0{y(W**!BPb
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/collector.py b/env/lib/python3.12/site-packages/pip/_internal/index/collector.py
    new file mode 100644
    index 0000000..5f8fdee
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/index/collector.py
    @@ -0,0 +1,494 @@
    +"""
    +The main purpose of this module is to expose LinkCollector.collect_sources().
    +"""
    +
    +import collections
    +import email.message
    +import functools
    +import itertools
    +import json
    +import logging
    +import os
    +import urllib.parse
    +import urllib.request
    +from dataclasses import dataclass
    +from html.parser import HTMLParser
    +from optparse import Values
    +from typing import (
    +    Callable,
    +    Dict,
    +    Iterable,
    +    List,
    +    MutableMapping,
    +    NamedTuple,
    +    Optional,
    +    Protocol,
    +    Sequence,
    +    Tuple,
    +    Union,
    +)
    +
    +from pip._vendor import requests
    +from pip._vendor.requests import Response
    +from pip._vendor.requests.exceptions import RetryError, SSLError
    +
    +from pip._internal.exceptions import NetworkConnectionError
    +from pip._internal.models.link import Link
    +from pip._internal.models.search_scope import SearchScope
    +from pip._internal.network.session import PipSession
    +from pip._internal.network.utils import raise_for_status
    +from pip._internal.utils.filetypes import is_archive_file
    +from pip._internal.utils.misc import redact_auth_from_url
    +from pip._internal.vcs import vcs
    +
    +from .sources import CandidatesFromPage, LinkSource, build_source
    +
    +logger = logging.getLogger(__name__)
    +
    +ResponseHeaders = MutableMapping[str, str]
    +
    +
    +def _match_vcs_scheme(url: str) -> Optional[str]:
    +    """Look for VCS schemes in the URL.
    +
    +    Returns the matched VCS scheme, or None if there's no match.
    +    """
    +    for scheme in vcs.schemes:
    +        if url.lower().startswith(scheme) and url[len(scheme)] in "+:":
    +            return scheme
    +    return None
    +
    +
    +class _NotAPIContent(Exception):
    +    def __init__(self, content_type: str, request_desc: str) -> None:
    +        super().__init__(content_type, request_desc)
    +        self.content_type = content_type
    +        self.request_desc = request_desc
    +
    +
    +def _ensure_api_header(response: Response) -> None:
    +    """
    +    Check the Content-Type header to ensure the response contains a Simple
    +    API Response.
    +
    +    Raises `_NotAPIContent` if the content type is not a valid content-type.
    +    """
    +    content_type = response.headers.get("Content-Type", "Unknown")
    +
    +    content_type_l = content_type.lower()
    +    if content_type_l.startswith(
    +        (
    +            "text/html",
    +            "application/vnd.pypi.simple.v1+html",
    +            "application/vnd.pypi.simple.v1+json",
    +        )
    +    ):
    +        return
    +
    +    raise _NotAPIContent(content_type, response.request.method)
    +
    +
    +class _NotHTTP(Exception):
    +    pass
    +
    +
    +def _ensure_api_response(url: str, session: PipSession) -> None:
    +    """
    +    Send a HEAD request to the URL, and ensure the response contains a simple
    +    API Response.
    +
    +    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
    +    `_NotAPIContent` if the content type is not a valid content type.
    +    """
    +    scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)
    +    if scheme not in {"http", "https"}:
    +        raise _NotHTTP()
    +
    +    resp = session.head(url, allow_redirects=True)
    +    raise_for_status(resp)
    +
    +    _ensure_api_header(resp)
    +
    +
    +def _get_simple_response(url: str, session: PipSession) -> Response:
    +    """Access an Simple API response with GET, and return the response.
    +
    +    This consists of three parts:
    +
    +    1. If the URL looks suspiciously like an archive, send a HEAD first to
    +       check the Content-Type is HTML or Simple API, to avoid downloading a
    +       large file. Raise `_NotHTTP` if the content type cannot be determined, or
    +       `_NotAPIContent` if it is not HTML or a Simple API.
    +    2. Actually perform the request. Raise HTTP exceptions on network failures.
    +    3. Check the Content-Type header to make sure we got a Simple API response,
    +       and raise `_NotAPIContent` otherwise.
    +    """
    +    if is_archive_file(Link(url).filename):
    +        _ensure_api_response(url, session=session)
    +
    +    logger.debug("Getting page %s", redact_auth_from_url(url))
    +
    +    resp = session.get(
    +        url,
    +        headers={
    +            "Accept": ", ".join(
    +                [
    +                    "application/vnd.pypi.simple.v1+json",
    +                    "application/vnd.pypi.simple.v1+html; q=0.1",
    +                    "text/html; q=0.01",
    +                ]
    +            ),
    +            # We don't want to blindly returned cached data for
    +            # /simple/, because authors generally expecting that
    +            # twine upload && pip install will function, but if
    +            # they've done a pip install in the last ~10 minutes
    +            # it won't. Thus by setting this to zero we will not
    +            # blindly use any cached data, however the benefit of
    +            # using max-age=0 instead of no-cache, is that we will
    +            # still support conditional requests, so we will still
    +            # minimize traffic sent in cases where the page hasn't
    +            # changed at all, we will just always incur the round
    +            # trip for the conditional GET now instead of only
    +            # once per 10 minutes.
    +            # For more information, please see pypa/pip#5670.
    +            "Cache-Control": "max-age=0",
    +        },
    +    )
    +    raise_for_status(resp)
    +
    +    # The check for archives above only works if the url ends with
    +    # something that looks like an archive. However that is not a
    +    # requirement of an url. Unless we issue a HEAD request on every
    +    # url we cannot know ahead of time for sure if something is a
    +    # Simple API response or not. However we can check after we've
    +    # downloaded it.
    +    _ensure_api_header(resp)
    +
    +    logger.debug(
    +        "Fetched page %s as %s",
    +        redact_auth_from_url(url),
    +        resp.headers.get("Content-Type", "Unknown"),
    +    )
    +
    +    return resp
    +
    +
    +def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
    +    """Determine if we have any encoding information in our headers."""
    +    if headers and "Content-Type" in headers:
    +        m = email.message.Message()
    +        m["content-type"] = headers["Content-Type"]
    +        charset = m.get_param("charset")
    +        if charset:
    +            return str(charset)
    +    return None
    +
    +
    +class CacheablePageContent:
    +    def __init__(self, page: "IndexContent") -> None:
    +        assert page.cache_link_parsing
    +        self.page = page
    +
    +    def __eq__(self, other: object) -> bool:
    +        return isinstance(other, type(self)) and self.page.url == other.page.url
    +
    +    def __hash__(self) -> int:
    +        return hash(self.page.url)
    +
    +
    +class ParseLinks(Protocol):
    +    def __call__(self, page: "IndexContent") -> Iterable[Link]: ...
    +
    +
    +def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
    +    """
    +    Given a function that parses an Iterable[Link] from an IndexContent, cache the
    +    function's result (keyed by CacheablePageContent), unless the IndexContent
    +    `page` has `page.cache_link_parsing == False`.
    +    """
    +
    +    @functools.lru_cache(maxsize=None)
    +    def wrapper(cacheable_page: CacheablePageContent) -> List[Link]:
    +        return list(fn(cacheable_page.page))
    +
    +    @functools.wraps(fn)
    +    def wrapper_wrapper(page: "IndexContent") -> List[Link]:
    +        if page.cache_link_parsing:
    +            return wrapper(CacheablePageContent(page))
    +        return list(fn(page))
    +
    +    return wrapper_wrapper
    +
    +
    +@with_cached_index_content
    +def parse_links(page: "IndexContent") -> Iterable[Link]:
    +    """
    +    Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
    +    """
    +
    +    content_type_l = page.content_type.lower()
    +    if content_type_l.startswith("application/vnd.pypi.simple.v1+json"):
    +        data = json.loads(page.content)
    +        for file in data.get("files", []):
    +            link = Link.from_json(file, page.url)
    +            if link is None:
    +                continue
    +            yield link
    +        return
    +
    +    parser = HTMLLinkParser(page.url)
    +    encoding = page.encoding or "utf-8"
    +    parser.feed(page.content.decode(encoding))
    +
    +    url = page.url
    +    base_url = parser.base_url or url
    +    for anchor in parser.anchors:
    +        link = Link.from_element(anchor, page_url=url, base_url=base_url)
    +        if link is None:
    +            continue
    +        yield link
    +
    +
    +@dataclass(frozen=True)
    +class IndexContent:
    +    """Represents one response (or page), along with its URL.
    +
    +    :param encoding: the encoding to decode the given content.
    +    :param url: the URL from which the HTML was downloaded.
    +    :param cache_link_parsing: whether links parsed from this page's url
    +                               should be cached. PyPI index urls should
    +                               have this set to False, for example.
    +    """
    +
    +    content: bytes
    +    content_type: str
    +    encoding: Optional[str]
    +    url: str
    +    cache_link_parsing: bool = True
    +
    +    def __str__(self) -> str:
    +        return redact_auth_from_url(self.url)
    +
    +
    +class HTMLLinkParser(HTMLParser):
    +    """
    +    HTMLParser that keeps the first base HREF and a list of all anchor
    +    elements' attributes.
    +    """
    +
    +    def __init__(self, url: str) -> None:
    +        super().__init__(convert_charrefs=True)
    +
    +        self.url: str = url
    +        self.base_url: Optional[str] = None
    +        self.anchors: List[Dict[str, Optional[str]]] = []
    +
    +    def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None:
    +        if tag == "base" and self.base_url is None:
    +            href = self.get_href(attrs)
    +            if href is not None:
    +                self.base_url = href
    +        elif tag == "a":
    +            self.anchors.append(dict(attrs))
    +
    +    def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]:
    +        for name, value in attrs:
    +            if name == "href":
    +                return value
    +        return None
    +
    +
    +def _handle_get_simple_fail(
    +    link: Link,
    +    reason: Union[str, Exception],
    +    meth: Optional[Callable[..., None]] = None,
    +) -> None:
    +    if meth is None:
    +        meth = logger.debug
    +    meth("Could not fetch URL %s: %s - skipping", link, reason)
    +
    +
    +def _make_index_content(
    +    response: Response, cache_link_parsing: bool = True
    +) -> IndexContent:
    +    encoding = _get_encoding_from_headers(response.headers)
    +    return IndexContent(
    +        response.content,
    +        response.headers["Content-Type"],
    +        encoding=encoding,
    +        url=response.url,
    +        cache_link_parsing=cache_link_parsing,
    +    )
    +
    +
    +def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
    +    url = link.url.split("#", 1)[0]
    +
    +    # Check for VCS schemes that do not support lookup as web pages.
    +    vcs_scheme = _match_vcs_scheme(url)
    +    if vcs_scheme:
    +        logger.warning(
    +            "Cannot look at %s URL %s because it does not support lookup as web pages.",
    +            vcs_scheme,
    +            link,
    +        )
    +        return None
    +
    +    # Tack index.html onto file:// URLs that point to directories
    +    scheme, _, path, _, _, _ = urllib.parse.urlparse(url)
    +    if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)):
    +        # add trailing slash if not present so urljoin doesn't trim
    +        # final segment
    +        if not url.endswith("/"):
    +            url += "/"
    +        # TODO: In the future, it would be nice if pip supported PEP 691
    +        #       style responses in the file:// URLs, however there's no
    +        #       standard file extension for application/vnd.pypi.simple.v1+json
    +        #       so we'll need to come up with something on our own.
    +        url = urllib.parse.urljoin(url, "index.html")
    +        logger.debug(" file: URL is directory, getting %s", url)
    +
    +    try:
    +        resp = _get_simple_response(url, session=session)
    +    except _NotHTTP:
    +        logger.warning(
    +            "Skipping page %s because it looks like an archive, and cannot "
    +            "be checked by a HTTP HEAD request.",
    +            link,
    +        )
    +    except _NotAPIContent as exc:
    +        logger.warning(
    +            "Skipping page %s because the %s request got Content-Type: %s. "
    +            "The only supported Content-Types are application/vnd.pypi.simple.v1+json, "
    +            "application/vnd.pypi.simple.v1+html, and text/html",
    +            link,
    +            exc.request_desc,
    +            exc.content_type,
    +        )
    +    except NetworkConnectionError as exc:
    +        _handle_get_simple_fail(link, exc)
    +    except RetryError as exc:
    +        _handle_get_simple_fail(link, exc)
    +    except SSLError as exc:
    +        reason = "There was a problem confirming the ssl certificate: "
    +        reason += str(exc)
    +        _handle_get_simple_fail(link, reason, meth=logger.info)
    +    except requests.ConnectionError as exc:
    +        _handle_get_simple_fail(link, f"connection error: {exc}")
    +    except requests.Timeout:
    +        _handle_get_simple_fail(link, "timed out")
    +    else:
    +        return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing)
    +    return None
    +
    +
    +class CollectedSources(NamedTuple):
    +    find_links: Sequence[Optional[LinkSource]]
    +    index_urls: Sequence[Optional[LinkSource]]
    +
    +
    +class LinkCollector:
    +    """
    +    Responsible for collecting Link objects from all configured locations,
    +    making network requests as needed.
    +
    +    The class's main method is its collect_sources() method.
    +    """
    +
    +    def __init__(
    +        self,
    +        session: PipSession,
    +        search_scope: SearchScope,
    +    ) -> None:
    +        self.search_scope = search_scope
    +        self.session = session
    +
    +    @classmethod
    +    def create(
    +        cls,
    +        session: PipSession,
    +        options: Values,
    +        suppress_no_index: bool = False,
    +    ) -> "LinkCollector":
    +        """
    +        :param session: The Session to use to make requests.
    +        :param suppress_no_index: Whether to ignore the --no-index option
    +            when constructing the SearchScope object.
    +        """
    +        index_urls = [options.index_url] + options.extra_index_urls
    +        if options.no_index and not suppress_no_index:
    +            logger.debug(
    +                "Ignoring indexes: %s",
    +                ",".join(redact_auth_from_url(url) for url in index_urls),
    +            )
    +            index_urls = []
    +
    +        # Make sure find_links is a list before passing to create().
    +        find_links = options.find_links or []
    +
    +        search_scope = SearchScope.create(
    +            find_links=find_links,
    +            index_urls=index_urls,
    +            no_index=options.no_index,
    +        )
    +        link_collector = LinkCollector(
    +            session=session,
    +            search_scope=search_scope,
    +        )
    +        return link_collector
    +
    +    @property
    +    def find_links(self) -> List[str]:
    +        return self.search_scope.find_links
    +
    +    def fetch_response(self, location: Link) -> Optional[IndexContent]:
    +        """
    +        Fetch an HTML page containing package links.
    +        """
    +        return _get_index_content(location, session=self.session)
    +
    +    def collect_sources(
    +        self,
    +        project_name: str,
    +        candidates_from_page: CandidatesFromPage,
    +    ) -> CollectedSources:
    +        # The OrderedDict calls deduplicate sources by URL.
    +        index_url_sources = collections.OrderedDict(
    +            build_source(
    +                loc,
    +                candidates_from_page=candidates_from_page,
    +                page_validator=self.session.is_secure_origin,
    +                expand_dir=False,
    +                cache_link_parsing=False,
    +                project_name=project_name,
    +            )
    +            for loc in self.search_scope.get_index_urls_locations(project_name)
    +        ).values()
    +        find_links_sources = collections.OrderedDict(
    +            build_source(
    +                loc,
    +                candidates_from_page=candidates_from_page,
    +                page_validator=self.session.is_secure_origin,
    +                expand_dir=True,
    +                cache_link_parsing=True,
    +                project_name=project_name,
    +            )
    +            for loc in self.find_links
    +        ).values()
    +
    +        if logger.isEnabledFor(logging.DEBUG):
    +            lines = [
    +                f"* {s.link}"
    +                for s in itertools.chain(find_links_sources, index_url_sources)
    +                if s is not None and s.link is not None
    +            ]
    +            lines = [
    +                f"{len(lines)} location(s) to search "
    +                f"for versions of {project_name}:"
    +            ] + lines
    +            logger.debug("\n".join(lines))
    +
    +        return CollectedSources(
    +            find_links=list(find_links_sources),
    +            index_urls=list(index_url_sources),
    +        )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py b/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
    new file mode 100644
    index 0000000..0d65ce3
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
    @@ -0,0 +1,1020 @@
    +"""Routines related to PyPI, indexes"""
    +
    +import enum
    +import functools
    +import itertools
    +import logging
    +import re
    +from dataclasses import dataclass
    +from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union
    +
    +from pip._vendor.packaging import specifiers
    +from pip._vendor.packaging.tags import Tag
    +from pip._vendor.packaging.utils import canonicalize_name
    +from pip._vendor.packaging.version import InvalidVersion, _BaseVersion
    +from pip._vendor.packaging.version import parse as parse_version
    +
    +from pip._internal.exceptions import (
    +    BestVersionAlreadyInstalled,
    +    DistributionNotFound,
    +    InvalidWheelFilename,
    +    UnsupportedWheel,
    +)
    +from pip._internal.index.collector import LinkCollector, parse_links
    +from pip._internal.models.candidate import InstallationCandidate
    +from pip._internal.models.format_control import FormatControl
    +from pip._internal.models.link import Link
    +from pip._internal.models.search_scope import SearchScope
    +from pip._internal.models.selection_prefs import SelectionPreferences
    +from pip._internal.models.target_python import TargetPython
    +from pip._internal.models.wheel import Wheel
    +from pip._internal.req import InstallRequirement
    +from pip._internal.utils._log import getLogger
    +from pip._internal.utils.filetypes import WHEEL_EXTENSION
    +from pip._internal.utils.hashes import Hashes
    +from pip._internal.utils.logging import indent_log
    +from pip._internal.utils.misc import build_netloc
    +from pip._internal.utils.packaging import check_requires_python
    +from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS
    +
    +if TYPE_CHECKING:
    +    from pip._vendor.typing_extensions import TypeGuard
    +
    +__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"]
    +
    +
    +logger = getLogger(__name__)
    +
    +BuildTag = Union[Tuple[()], Tuple[int, str]]
    +CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag]
    +
    +
    +def _check_link_requires_python(
    +    link: Link,
    +    version_info: Tuple[int, int, int],
    +    ignore_requires_python: bool = False,
    +) -> bool:
    +    """
    +    Return whether the given Python version is compatible with a link's
    +    "Requires-Python" value.
    +
    +    :param version_info: A 3-tuple of ints representing the Python
    +        major-minor-micro version to check.
    +    :param ignore_requires_python: Whether to ignore the "Requires-Python"
    +        value if the given Python version isn't compatible.
    +    """
    +    try:
    +        is_compatible = check_requires_python(
    +            link.requires_python,
    +            version_info=version_info,
    +        )
    +    except specifiers.InvalidSpecifier:
    +        logger.debug(
    +            "Ignoring invalid Requires-Python (%r) for link: %s",
    +            link.requires_python,
    +            link,
    +        )
    +    else:
    +        if not is_compatible:
    +            version = ".".join(map(str, version_info))
    +            if not ignore_requires_python:
    +                logger.verbose(
    +                    "Link requires a different Python (%s not in: %r): %s",
    +                    version,
    +                    link.requires_python,
    +                    link,
    +                )
    +                return False
    +
    +            logger.debug(
    +                "Ignoring failed Requires-Python check (%s not in: %r) for link: %s",
    +                version,
    +                link.requires_python,
    +                link,
    +            )
    +
    +    return True
    +
    +
    +class LinkType(enum.Enum):
    +    candidate = enum.auto()
    +    different_project = enum.auto()
    +    yanked = enum.auto()
    +    format_unsupported = enum.auto()
    +    format_invalid = enum.auto()
    +    platform_mismatch = enum.auto()
    +    requires_python_mismatch = enum.auto()
    +
    +
    +class LinkEvaluator:
    +    """
    +    Responsible for evaluating links for a particular project.
    +    """
    +
    +    _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$")
    +
    +    # Don't include an allow_yanked default value to make sure each call
    +    # site considers whether yanked releases are allowed. This also causes
    +    # that decision to be made explicit in the calling code, which helps
    +    # people when reading the code.
    +    def __init__(
    +        self,
    +        project_name: str,
    +        canonical_name: str,
    +        formats: FrozenSet[str],
    +        target_python: TargetPython,
    +        allow_yanked: bool,
    +        ignore_requires_python: Optional[bool] = None,
    +    ) -> None:
    +        """
    +        :param project_name: The user supplied package name.
    +        :param canonical_name: The canonical package name.
    +        :param formats: The formats allowed for this package. Should be a set
    +            with 'binary' or 'source' or both in it.
    +        :param target_python: The target Python interpreter to use when
    +            evaluating link compatibility. This is used, for example, to
    +            check wheel compatibility, as well as when checking the Python
    +            version, e.g. the Python version embedded in a link filename
    +            (or egg fragment) and against an HTML link's optional PEP 503
    +            "data-requires-python" attribute.
    +        :param allow_yanked: Whether files marked as yanked (in the sense
    +            of PEP 592) are permitted to be candidates for install.
    +        :param ignore_requires_python: Whether to ignore incompatible
    +            PEP 503 "data-requires-python" values in HTML links. Defaults
    +            to False.
    +        """
    +        if ignore_requires_python is None:
    +            ignore_requires_python = False
    +
    +        self._allow_yanked = allow_yanked
    +        self._canonical_name = canonical_name
    +        self._ignore_requires_python = ignore_requires_python
    +        self._formats = formats
    +        self._target_python = target_python
    +
    +        self.project_name = project_name
    +
    +    def evaluate_link(self, link: Link) -> Tuple[LinkType, str]:
    +        """
    +        Determine whether a link is a candidate for installation.
    +
    +        :return: A tuple (result, detail), where *result* is an enum
    +            representing whether the evaluation found a candidate, or the reason
    +            why one is not found. If a candidate is found, *detail* will be the
    +            candidate's version string; if one is not found, it contains the
    +            reason the link fails to qualify.
    +        """
    +        version = None
    +        if link.is_yanked and not self._allow_yanked:
    +            reason = link.yanked_reason or ""
    +            return (LinkType.yanked, f"yanked for reason: {reason}")
    +
    +        if link.egg_fragment:
    +            egg_info = link.egg_fragment
    +            ext = link.ext
    +        else:
    +            egg_info, ext = link.splitext()
    +            if not ext:
    +                return (LinkType.format_unsupported, "not a file")
    +            if ext not in SUPPORTED_EXTENSIONS:
    +                return (
    +                    LinkType.format_unsupported,
    +                    f"unsupported archive format: {ext}",
    +                )
    +            if "binary" not in self._formats and ext == WHEEL_EXTENSION:
    +                reason = f"No binaries permitted for {self.project_name}"
    +                return (LinkType.format_unsupported, reason)
    +            if "macosx10" in link.path and ext == ".zip":
    +                return (LinkType.format_unsupported, "macosx10 one")
    +            if ext == WHEEL_EXTENSION:
    +                try:
    +                    wheel = Wheel(link.filename)
    +                except InvalidWheelFilename:
    +                    return (
    +                        LinkType.format_invalid,
    +                        "invalid wheel filename",
    +                    )
    +                if canonicalize_name(wheel.name) != self._canonical_name:
    +                    reason = f"wrong project name (not {self.project_name})"
    +                    return (LinkType.different_project, reason)
    +
    +                supported_tags = self._target_python.get_unsorted_tags()
    +                if not wheel.supported(supported_tags):
    +                    # Include the wheel's tags in the reason string to
    +                    # simplify troubleshooting compatibility issues.
    +                    file_tags = ", ".join(wheel.get_formatted_file_tags())
    +                    reason = (
    +                        f"none of the wheel's tags ({file_tags}) are compatible "
    +                        f"(run pip debug --verbose to show compatible tags)"
    +                    )
    +                    return (LinkType.platform_mismatch, reason)
    +
    +                version = wheel.version
    +
    +        # This should be up by the self.ok_binary check, but see issue 2700.
    +        if "source" not in self._formats and ext != WHEEL_EXTENSION:
    +            reason = f"No sources permitted for {self.project_name}"
    +            return (LinkType.format_unsupported, reason)
    +
    +        if not version:
    +            version = _extract_version_from_fragment(
    +                egg_info,
    +                self._canonical_name,
    +            )
    +        if not version:
    +            reason = f"Missing project version for {self.project_name}"
    +            return (LinkType.format_invalid, reason)
    +
    +        match = self._py_version_re.search(version)
    +        if match:
    +            version = version[: match.start()]
    +            py_version = match.group(1)
    +            if py_version != self._target_python.py_version:
    +                return (
    +                    LinkType.platform_mismatch,
    +                    "Python version is incorrect",
    +                )
    +
    +        supports_python = _check_link_requires_python(
    +            link,
    +            version_info=self._target_python.py_version_info,
    +            ignore_requires_python=self._ignore_requires_python,
    +        )
    +        if not supports_python:
    +            reason = f"{version} Requires-Python {link.requires_python}"
    +            return (LinkType.requires_python_mismatch, reason)
    +
    +        logger.debug("Found link %s, version: %s", link, version)
    +
    +        return (LinkType.candidate, version)
    +
    +
    +def filter_unallowed_hashes(
    +    candidates: List[InstallationCandidate],
    +    hashes: Optional[Hashes],
    +    project_name: str,
    +) -> List[InstallationCandidate]:
    +    """
    +    Filter out candidates whose hashes aren't allowed, and return a new
    +    list of candidates.
    +
    +    If at least one candidate has an allowed hash, then all candidates with
    +    either an allowed hash or no hash specified are returned.  Otherwise,
    +    the given candidates are returned.
    +
    +    Including the candidates with no hash specified when there is a match
    +    allows a warning to be logged if there is a more preferred candidate
    +    with no hash specified.  Returning all candidates in the case of no
    +    matches lets pip report the hash of the candidate that would otherwise
    +    have been installed (e.g. permitting the user to more easily update
    +    their requirements file with the desired hash).
    +    """
    +    if not hashes:
    +        logger.debug(
    +            "Given no hashes to check %s links for project %r: "
    +            "discarding no candidates",
    +            len(candidates),
    +            project_name,
    +        )
    +        # Make sure we're not returning back the given value.
    +        return list(candidates)
    +
    +    matches_or_no_digest = []
    +    # Collect the non-matches for logging purposes.
    +    non_matches = []
    +    match_count = 0
    +    for candidate in candidates:
    +        link = candidate.link
    +        if not link.has_hash:
    +            pass
    +        elif link.is_hash_allowed(hashes=hashes):
    +            match_count += 1
    +        else:
    +            non_matches.append(candidate)
    +            continue
    +
    +        matches_or_no_digest.append(candidate)
    +
    +    if match_count:
    +        filtered = matches_or_no_digest
    +    else:
    +        # Make sure we're not returning back the given value.
    +        filtered = list(candidates)
    +
    +    if len(filtered) == len(candidates):
    +        discard_message = "discarding no candidates"
    +    else:
    +        discard_message = "discarding {} non-matches:\n  {}".format(
    +            len(non_matches),
    +            "\n  ".join(str(candidate.link) for candidate in non_matches),
    +        )
    +
    +    logger.debug(
    +        "Checked %s links for project %r against %s hashes "
    +        "(%s matches, %s no digest): %s",
    +        len(candidates),
    +        project_name,
    +        hashes.digest_count,
    +        match_count,
    +        len(matches_or_no_digest) - match_count,
    +        discard_message,
    +    )
    +
    +    return filtered
    +
    +
    +@dataclass
    +class CandidatePreferences:
    +    """
    +    Encapsulates some of the preferences for filtering and sorting
    +    InstallationCandidate objects.
    +    """
    +
    +    prefer_binary: bool = False
    +    allow_all_prereleases: bool = False
    +
    +
    +class BestCandidateResult:
    +    """A collection of candidates, returned by `PackageFinder.find_best_candidate`.
    +
    +    This class is only intended to be instantiated by CandidateEvaluator's
    +    `compute_best_candidate()` method.
    +    """
    +
    +    def __init__(
    +        self,
    +        candidates: List[InstallationCandidate],
    +        applicable_candidates: List[InstallationCandidate],
    +        best_candidate: Optional[InstallationCandidate],
    +    ) -> None:
    +        """
    +        :param candidates: A sequence of all available candidates found.
    +        :param applicable_candidates: The applicable candidates.
    +        :param best_candidate: The most preferred candidate found, or None
    +            if no applicable candidates were found.
    +        """
    +        assert set(applicable_candidates) <= set(candidates)
    +
    +        if best_candidate is None:
    +            assert not applicable_candidates
    +        else:
    +            assert best_candidate in applicable_candidates
    +
    +        self._applicable_candidates = applicable_candidates
    +        self._candidates = candidates
    +
    +        self.best_candidate = best_candidate
    +
    +    def iter_all(self) -> Iterable[InstallationCandidate]:
    +        """Iterate through all candidates."""
    +        return iter(self._candidates)
    +
    +    def iter_applicable(self) -> Iterable[InstallationCandidate]:
    +        """Iterate through the applicable candidates."""
    +        return iter(self._applicable_candidates)
    +
    +
    +class CandidateEvaluator:
    +    """
    +    Responsible for filtering and sorting candidates for installation based
    +    on what tags are valid.
    +    """
    +
    +    @classmethod
    +    def create(
    +        cls,
    +        project_name: str,
    +        target_python: Optional[TargetPython] = None,
    +        prefer_binary: bool = False,
    +        allow_all_prereleases: bool = False,
    +        specifier: Optional[specifiers.BaseSpecifier] = None,
    +        hashes: Optional[Hashes] = None,
    +    ) -> "CandidateEvaluator":
    +        """Create a CandidateEvaluator object.
    +
    +        :param target_python: The target Python interpreter to use when
    +            checking compatibility. If None (the default), a TargetPython
    +            object will be constructed from the running Python.
    +        :param specifier: An optional object implementing `filter`
    +            (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable
    +            versions.
    +        :param hashes: An optional collection of allowed hashes.
    +        """
    +        if target_python is None:
    +            target_python = TargetPython()
    +        if specifier is None:
    +            specifier = specifiers.SpecifierSet()
    +
    +        supported_tags = target_python.get_sorted_tags()
    +
    +        return cls(
    +            project_name=project_name,
    +            supported_tags=supported_tags,
    +            specifier=specifier,
    +            prefer_binary=prefer_binary,
    +            allow_all_prereleases=allow_all_prereleases,
    +            hashes=hashes,
    +        )
    +
    +    def __init__(
    +        self,
    +        project_name: str,
    +        supported_tags: List[Tag],
    +        specifier: specifiers.BaseSpecifier,
    +        prefer_binary: bool = False,
    +        allow_all_prereleases: bool = False,
    +        hashes: Optional[Hashes] = None,
    +    ) -> None:
    +        """
    +        :param supported_tags: The PEP 425 tags supported by the target
    +            Python in order of preference (most preferred first).
    +        """
    +        self._allow_all_prereleases = allow_all_prereleases
    +        self._hashes = hashes
    +        self._prefer_binary = prefer_binary
    +        self._project_name = project_name
    +        self._specifier = specifier
    +        self._supported_tags = supported_tags
    +        # Since the index of the tag in the _supported_tags list is used
    +        # as a priority, precompute a map from tag to index/priority to be
    +        # used in wheel.find_most_preferred_tag.
    +        self._wheel_tag_preferences = {
    +            tag: idx for idx, tag in enumerate(supported_tags)
    +        }
    +
    +    def get_applicable_candidates(
    +        self,
    +        candidates: List[InstallationCandidate],
    +    ) -> List[InstallationCandidate]:
    +        """
    +        Return the applicable candidates from a list of candidates.
    +        """
    +        # Using None infers from the specifier instead.
    +        allow_prereleases = self._allow_all_prereleases or None
    +        specifier = self._specifier
    +
    +        # We turn the version object into a str here because otherwise
    +        # when we're debundled but setuptools isn't, Python will see
    +        # packaging.version.Version and
    +        # pkg_resources._vendor.packaging.version.Version as different
    +        # types. This way we'll use a str as a common data interchange
    +        # format. If we stop using the pkg_resources provided specifier
    +        # and start using our own, we can drop the cast to str().
    +        candidates_and_versions = [(c, str(c.version)) for c in candidates]
    +        versions = set(
    +            specifier.filter(
    +                (v for _, v in candidates_and_versions),
    +                prereleases=allow_prereleases,
    +            )
    +        )
    +
    +        applicable_candidates = [c for c, v in candidates_and_versions if v in versions]
    +        filtered_applicable_candidates = filter_unallowed_hashes(
    +            candidates=applicable_candidates,
    +            hashes=self._hashes,
    +            project_name=self._project_name,
    +        )
    +
    +        return sorted(filtered_applicable_candidates, key=self._sort_key)
    +
    +    def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey:
    +        """
    +        Function to pass as the `key` argument to a call to sorted() to sort
    +        InstallationCandidates by preference.
    +
    +        Returns a tuple such that tuples sorting as greater using Python's
    +        default comparison operator are more preferred.
    +
    +        The preference is as follows:
    +
    +        First and foremost, candidates with allowed (matching) hashes are
    +        always preferred over candidates without matching hashes. This is
    +        because e.g. if the only candidate with an allowed hash is yanked,
    +        we still want to use that candidate.
    +
    +        Second, excepting hash considerations, candidates that have been
    +        yanked (in the sense of PEP 592) are always less preferred than
    +        candidates that haven't been yanked. Then:
    +
    +        If not finding wheels, they are sorted by version only.
    +        If finding wheels, then the sort order is by version, then:
    +          1. existing installs
    +          2. wheels ordered via Wheel.support_index_min(self._supported_tags)
    +          3. source archives
    +        If prefer_binary was set, then all wheels are sorted above sources.
    +
    +        Note: it was considered to embed this logic into the Link
    +              comparison operators, but then different sdist links
    +              with the same version, would have to be considered equal
    +        """
    +        valid_tags = self._supported_tags
    +        support_num = len(valid_tags)
    +        build_tag: BuildTag = ()
    +        binary_preference = 0
    +        link = candidate.link
    +        if link.is_wheel:
    +            # can raise InvalidWheelFilename
    +            wheel = Wheel(link.filename)
    +            try:
    +                pri = -(
    +                    wheel.find_most_preferred_tag(
    +                        valid_tags, self._wheel_tag_preferences
    +                    )
    +                )
    +            except ValueError:
    +                raise UnsupportedWheel(
    +                    f"{wheel.filename} is not a supported wheel for this platform. It "
    +                    "can't be sorted."
    +                )
    +            if self._prefer_binary:
    +                binary_preference = 1
    +            if wheel.build_tag is not None:
    +                match = re.match(r"^(\d+)(.*)$", wheel.build_tag)
    +                assert match is not None, "guaranteed by filename validation"
    +                build_tag_groups = match.groups()
    +                build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
    +        else:  # sdist
    +            pri = -(support_num)
    +        has_allowed_hash = int(link.is_hash_allowed(self._hashes))
    +        yank_value = -1 * int(link.is_yanked)  # -1 for yanked.
    +        return (
    +            has_allowed_hash,
    +            yank_value,
    +            binary_preference,
    +            candidate.version,
    +            pri,
    +            build_tag,
    +        )
    +
    +    def sort_best_candidate(
    +        self,
    +        candidates: List[InstallationCandidate],
    +    ) -> Optional[InstallationCandidate]:
    +        """
    +        Return the best candidate per the instance's sort order, or None if
    +        no candidate is acceptable.
    +        """
    +        if not candidates:
    +            return None
    +        best_candidate = max(candidates, key=self._sort_key)
    +        return best_candidate
    +
    +    def compute_best_candidate(
    +        self,
    +        candidates: List[InstallationCandidate],
    +    ) -> BestCandidateResult:
    +        """
    +        Compute and return a `BestCandidateResult` instance.
    +        """
    +        applicable_candidates = self.get_applicable_candidates(candidates)
    +
    +        best_candidate = self.sort_best_candidate(applicable_candidates)
    +
    +        return BestCandidateResult(
    +            candidates,
    +            applicable_candidates=applicable_candidates,
    +            best_candidate=best_candidate,
    +        )
    +
    +
    +class PackageFinder:
    +    """This finds packages.
    +
    +    This is meant to match easy_install's technique for looking for
    +    packages, by reading pages and looking for appropriate links.
    +    """
    +
    +    def __init__(
    +        self,
    +        link_collector: LinkCollector,
    +        target_python: TargetPython,
    +        allow_yanked: bool,
    +        format_control: Optional[FormatControl] = None,
    +        candidate_prefs: Optional[CandidatePreferences] = None,
    +        ignore_requires_python: Optional[bool] = None,
    +    ) -> None:
    +        """
    +        This constructor is primarily meant to be used by the create() class
    +        method and from tests.
    +
    +        :param format_control: A FormatControl object, used to control
    +            the selection of source packages / binary packages when consulting
    +            the index and links.
    +        :param candidate_prefs: Options to use when creating a
    +            CandidateEvaluator object.
    +        """
    +        if candidate_prefs is None:
    +            candidate_prefs = CandidatePreferences()
    +
    +        format_control = format_control or FormatControl(set(), set())
    +
    +        self._allow_yanked = allow_yanked
    +        self._candidate_prefs = candidate_prefs
    +        self._ignore_requires_python = ignore_requires_python
    +        self._link_collector = link_collector
    +        self._target_python = target_python
    +
    +        self.format_control = format_control
    +
    +        # These are boring links that have already been logged somehow.
    +        self._logged_links: Set[Tuple[Link, LinkType, str]] = set()
    +
    +    # Don't include an allow_yanked default value to make sure each call
    +    # site considers whether yanked releases are allowed. This also causes
    +    # that decision to be made explicit in the calling code, which helps
    +    # people when reading the code.
    +    @classmethod
    +    def create(
    +        cls,
    +        link_collector: LinkCollector,
    +        selection_prefs: SelectionPreferences,
    +        target_python: Optional[TargetPython] = None,
    +    ) -> "PackageFinder":
    +        """Create a PackageFinder.
    +
    +        :param selection_prefs: The candidate selection preferences, as a
    +            SelectionPreferences object.
    +        :param target_python: The target Python interpreter to use when
    +            checking compatibility. If None (the default), a TargetPython
    +            object will be constructed from the running Python.
    +        """
    +        if target_python is None:
    +            target_python = TargetPython()
    +
    +        candidate_prefs = CandidatePreferences(
    +            prefer_binary=selection_prefs.prefer_binary,
    +            allow_all_prereleases=selection_prefs.allow_all_prereleases,
    +        )
    +
    +        return cls(
    +            candidate_prefs=candidate_prefs,
    +            link_collector=link_collector,
    +            target_python=target_python,
    +            allow_yanked=selection_prefs.allow_yanked,
    +            format_control=selection_prefs.format_control,
    +            ignore_requires_python=selection_prefs.ignore_requires_python,
    +        )
    +
    +    @property
    +    def target_python(self) -> TargetPython:
    +        return self._target_python
    +
    +    @property
    +    def search_scope(self) -> SearchScope:
    +        return self._link_collector.search_scope
    +
    +    @search_scope.setter
    +    def search_scope(self, search_scope: SearchScope) -> None:
    +        self._link_collector.search_scope = search_scope
    +
    +    @property
    +    def find_links(self) -> List[str]:
    +        return self._link_collector.find_links
    +
    +    @property
    +    def index_urls(self) -> List[str]:
    +        return self.search_scope.index_urls
    +
    +    @property
    +    def trusted_hosts(self) -> Iterable[str]:
    +        for host_port in self._link_collector.session.pip_trusted_origins:
    +            yield build_netloc(*host_port)
    +
    +    @property
    +    def allow_all_prereleases(self) -> bool:
    +        return self._candidate_prefs.allow_all_prereleases
    +
    +    def set_allow_all_prereleases(self) -> None:
    +        self._candidate_prefs.allow_all_prereleases = True
    +
    +    @property
    +    def prefer_binary(self) -> bool:
    +        return self._candidate_prefs.prefer_binary
    +
    +    def set_prefer_binary(self) -> None:
    +        self._candidate_prefs.prefer_binary = True
    +
    +    def requires_python_skipped_reasons(self) -> List[str]:
    +        reasons = {
    +            detail
    +            for _, result, detail in self._logged_links
    +            if result == LinkType.requires_python_mismatch
    +        }
    +        return sorted(reasons)
    +
    +    def make_link_evaluator(self, project_name: str) -> LinkEvaluator:
    +        canonical_name = canonicalize_name(project_name)
    +        formats = self.format_control.get_allowed_formats(canonical_name)
    +
    +        return LinkEvaluator(
    +            project_name=project_name,
    +            canonical_name=canonical_name,
    +            formats=formats,
    +            target_python=self._target_python,
    +            allow_yanked=self._allow_yanked,
    +            ignore_requires_python=self._ignore_requires_python,
    +        )
    +
    +    def _sort_links(self, links: Iterable[Link]) -> List[Link]:
    +        """
    +        Returns elements of links in order, non-egg links first, egg links
    +        second, while eliminating duplicates
    +        """
    +        eggs, no_eggs = [], []
    +        seen: Set[Link] = set()
    +        for link in links:
    +            if link not in seen:
    +                seen.add(link)
    +                if link.egg_fragment:
    +                    eggs.append(link)
    +                else:
    +                    no_eggs.append(link)
    +        return no_eggs + eggs
    +
    +    def _log_skipped_link(self, link: Link, result: LinkType, detail: str) -> None:
    +        entry = (link, result, detail)
    +        if entry not in self._logged_links:
    +            # Put the link at the end so the reason is more visible and because
    +            # the link string is usually very long.
    +            logger.debug("Skipping link: %s: %s", detail, link)
    +            self._logged_links.add(entry)
    +
    +    def get_install_candidate(
    +        self, link_evaluator: LinkEvaluator, link: Link
    +    ) -> Optional[InstallationCandidate]:
    +        """
    +        If the link is a candidate for install, convert it to an
    +        InstallationCandidate and return it. Otherwise, return None.
    +        """
    +        result, detail = link_evaluator.evaluate_link(link)
    +        if result != LinkType.candidate:
    +            self._log_skipped_link(link, result, detail)
    +            return None
    +
    +        try:
    +            return InstallationCandidate(
    +                name=link_evaluator.project_name,
    +                link=link,
    +                version=detail,
    +            )
    +        except InvalidVersion:
    +            return None
    +
    +    def evaluate_links(
    +        self, link_evaluator: LinkEvaluator, links: Iterable[Link]
    +    ) -> List[InstallationCandidate]:
    +        """
    +        Convert links that are candidates to InstallationCandidate objects.
    +        """
    +        candidates = []
    +        for link in self._sort_links(links):
    +            candidate = self.get_install_candidate(link_evaluator, link)
    +            if candidate is not None:
    +                candidates.append(candidate)
    +
    +        return candidates
    +
    +    def process_project_url(
    +        self, project_url: Link, link_evaluator: LinkEvaluator
    +    ) -> List[InstallationCandidate]:
    +        logger.debug(
    +            "Fetching project page and analyzing links: %s",
    +            project_url,
    +        )
    +        index_response = self._link_collector.fetch_response(project_url)
    +        if index_response is None:
    +            return []
    +
    +        page_links = list(parse_links(index_response))
    +
    +        with indent_log():
    +            package_links = self.evaluate_links(
    +                link_evaluator,
    +                links=page_links,
    +            )
    +
    +        return package_links
    +
    +    @functools.lru_cache(maxsize=None)
    +    def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]:
    +        """Find all available InstallationCandidate for project_name
    +
    +        This checks index_urls and find_links.
    +        All versions found are returned as an InstallationCandidate list.
    +
    +        See LinkEvaluator.evaluate_link() for details on which files
    +        are accepted.
    +        """
    +        link_evaluator = self.make_link_evaluator(project_name)
    +
    +        collected_sources = self._link_collector.collect_sources(
    +            project_name=project_name,
    +            candidates_from_page=functools.partial(
    +                self.process_project_url,
    +                link_evaluator=link_evaluator,
    +            ),
    +        )
    +
    +        page_candidates_it = itertools.chain.from_iterable(
    +            source.page_candidates()
    +            for sources in collected_sources
    +            for source in sources
    +            if source is not None
    +        )
    +        page_candidates = list(page_candidates_it)
    +
    +        file_links_it = itertools.chain.from_iterable(
    +            source.file_links()
    +            for sources in collected_sources
    +            for source in sources
    +            if source is not None
    +        )
    +        file_candidates = self.evaluate_links(
    +            link_evaluator,
    +            sorted(file_links_it, reverse=True),
    +        )
    +
    +        if logger.isEnabledFor(logging.DEBUG) and file_candidates:
    +            paths = []
    +            for candidate in file_candidates:
    +                assert candidate.link.url  # we need to have a URL
    +                try:
    +                    paths.append(candidate.link.file_path)
    +                except Exception:
    +                    paths.append(candidate.link.url)  # it's not a local file
    +
    +            logger.debug("Local files found: %s", ", ".join(paths))
    +
    +        # This is an intentional priority ordering
    +        return file_candidates + page_candidates
    +
    +    def make_candidate_evaluator(
    +        self,
    +        project_name: str,
    +        specifier: Optional[specifiers.BaseSpecifier] = None,
    +        hashes: Optional[Hashes] = None,
    +    ) -> CandidateEvaluator:
    +        """Create a CandidateEvaluator object to use."""
    +        candidate_prefs = self._candidate_prefs
    +        return CandidateEvaluator.create(
    +            project_name=project_name,
    +            target_python=self._target_python,
    +            prefer_binary=candidate_prefs.prefer_binary,
    +            allow_all_prereleases=candidate_prefs.allow_all_prereleases,
    +            specifier=specifier,
    +            hashes=hashes,
    +        )
    +
    +    @functools.lru_cache(maxsize=None)
    +    def find_best_candidate(
    +        self,
    +        project_name: str,
    +        specifier: Optional[specifiers.BaseSpecifier] = None,
    +        hashes: Optional[Hashes] = None,
    +    ) -> BestCandidateResult:
    +        """Find matches for the given project and specifier.
    +
    +        :param specifier: An optional object implementing `filter`
    +            (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable
    +            versions.
    +
    +        :return: A `BestCandidateResult` instance.
    +        """
    +        candidates = self.find_all_candidates(project_name)
    +        candidate_evaluator = self.make_candidate_evaluator(
    +            project_name=project_name,
    +            specifier=specifier,
    +            hashes=hashes,
    +        )
    +        return candidate_evaluator.compute_best_candidate(candidates)
    +
    +    def find_requirement(
    +        self, req: InstallRequirement, upgrade: bool
    +    ) -> Optional[InstallationCandidate]:
    +        """Try to find a Link matching req
    +
    +        Expects req, an InstallRequirement and upgrade, a boolean
    +        Returns a InstallationCandidate if found,
    +        Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
    +        """
    +        hashes = req.hashes(trust_internet=False)
    +        best_candidate_result = self.find_best_candidate(
    +            req.name,
    +            specifier=req.specifier,
    +            hashes=hashes,
    +        )
    +        best_candidate = best_candidate_result.best_candidate
    +
    +        installed_version: Optional[_BaseVersion] = None
    +        if req.satisfied_by is not None:
    +            installed_version = req.satisfied_by.version
    +
    +        def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str:
    +            # This repeated parse_version and str() conversion is needed to
    +            # handle different vendoring sources from pip and pkg_resources.
    +            # If we stop using the pkg_resources provided specifier and start
    +            # using our own, we can drop the cast to str().
    +            return (
    +                ", ".join(
    +                    sorted(
    +                        {str(c.version) for c in cand_iter},
    +                        key=parse_version,
    +                    )
    +                )
    +                or "none"
    +            )
    +
    +        if installed_version is None and best_candidate is None:
    +            logger.critical(
    +                "Could not find a version that satisfies the requirement %s "
    +                "(from versions: %s)",
    +                req,
    +                _format_versions(best_candidate_result.iter_all()),
    +            )
    +
    +            raise DistributionNotFound(f"No matching distribution found for {req}")
    +
    +        def _should_install_candidate(
    +            candidate: Optional[InstallationCandidate],
    +        ) -> "TypeGuard[InstallationCandidate]":
    +            if installed_version is None:
    +                return True
    +            if best_candidate is None:
    +                return False
    +            return best_candidate.version > installed_version
    +
    +        if not upgrade and installed_version is not None:
    +            if _should_install_candidate(best_candidate):
    +                logger.debug(
    +                    "Existing installed version (%s) satisfies requirement "
    +                    "(most up-to-date version is %s)",
    +                    installed_version,
    +                    best_candidate.version,
    +                )
    +            else:
    +                logger.debug(
    +                    "Existing installed version (%s) is most up-to-date and "
    +                    "satisfies requirement",
    +                    installed_version,
    +                )
    +            return None
    +
    +        if _should_install_candidate(best_candidate):
    +            logger.debug(
    +                "Using version %s (newest of versions: %s)",
    +                best_candidate.version,
    +                _format_versions(best_candidate_result.iter_applicable()),
    +            )
    +            return best_candidate
    +
    +        # We have an existing version, and its the best version
    +        logger.debug(
    +            "Installed version (%s) is most up-to-date (past versions: %s)",
    +            installed_version,
    +            _format_versions(best_candidate_result.iter_applicable()),
    +        )
    +        raise BestVersionAlreadyInstalled
    +
    +
    +def _find_name_version_sep(fragment: str, canonical_name: str) -> int:
    +    """Find the separator's index based on the package's canonical name.
    +
    +    :param fragment: A + filename "fragment" (stem) or
    +        egg fragment.
    +    :param canonical_name: The package's canonical name.
    +
    +    This function is needed since the canonicalized name does not necessarily
    +    have the same length as the egg info's name part. An example::
    +
    +    >>> fragment = 'foo__bar-1.0'
    +    >>> canonical_name = 'foo-bar'
    +    >>> _find_name_version_sep(fragment, canonical_name)
    +    8
    +    """
    +    # Project name and version must be separated by one single dash. Find all
    +    # occurrences of dashes; if the string in front of it matches the canonical
    +    # name, this is the one separating the name and version parts.
    +    for i, c in enumerate(fragment):
    +        if c != "-":
    +            continue
    +        if canonicalize_name(fragment[:i]) == canonical_name:
    +            return i
    +    raise ValueError(f"{fragment} does not match {canonical_name}")
    +
    +
    +def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]:
    +    """Parse the version string from a + filename
    +    "fragment" (stem) or egg fragment.
    +
    +    :param fragment: The string to parse. E.g. foo-2.1
    +    :param canonical_name: The canonicalized name of the package this
    +        belongs to.
    +    """
    +    try:
    +        version_start = _find_name_version_sep(fragment, canonical_name) + 1
    +    except ValueError:
    +        return None
    +    version = fragment[version_start:]
    +    if not version:
    +        return None
    +    return version
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/index/sources.py b/env/lib/python3.12/site-packages/pip/_internal/index/sources.py
    new file mode 100644
    index 0000000..3dafb30
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/index/sources.py
    @@ -0,0 +1,284 @@
    +import logging
    +import mimetypes
    +import os
    +from collections import defaultdict
    +from typing import Callable, Dict, Iterable, List, Optional, Tuple
    +
    +from pip._vendor.packaging.utils import (
    +    InvalidSdistFilename,
    +    InvalidWheelFilename,
    +    canonicalize_name,
    +    parse_sdist_filename,
    +    parse_wheel_filename,
    +)
    +
    +from pip._internal.models.candidate import InstallationCandidate
    +from pip._internal.models.link import Link
    +from pip._internal.utils.urls import path_to_url, url_to_path
    +from pip._internal.vcs import is_url
    +
    +logger = logging.getLogger(__name__)
    +
    +FoundCandidates = Iterable[InstallationCandidate]
    +FoundLinks = Iterable[Link]
    +CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]]
    +PageValidator = Callable[[Link], bool]
    +
    +
    +class LinkSource:
    +    @property
    +    def link(self) -> Optional[Link]:
    +        """Returns the underlying link, if there's one."""
    +        raise NotImplementedError()
    +
    +    def page_candidates(self) -> FoundCandidates:
    +        """Candidates found by parsing an archive listing HTML file."""
    +        raise NotImplementedError()
    +
    +    def file_links(self) -> FoundLinks:
    +        """Links found by specifying archives directly."""
    +        raise NotImplementedError()
    +
    +
    +def _is_html_file(file_url: str) -> bool:
    +    return mimetypes.guess_type(file_url, strict=False)[0] == "text/html"
    +
    +
    +class _FlatDirectoryToUrls:
    +    """Scans directory and caches results"""
    +
    +    def __init__(self, path: str) -> None:
    +        self._path = path
    +        self._page_candidates: List[str] = []
    +        self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list)
    +        self._scanned_directory = False
    +
    +    def _scan_directory(self) -> None:
    +        """Scans directory once and populates both page_candidates
    +        and project_name_to_urls at the same time
    +        """
    +        for entry in os.scandir(self._path):
    +            url = path_to_url(entry.path)
    +            if _is_html_file(url):
    +                self._page_candidates.append(url)
    +                continue
    +
    +            # File must have a valid wheel or sdist name,
    +            # otherwise not worth considering as a package
    +            try:
    +                project_filename = parse_wheel_filename(entry.name)[0]
    +            except InvalidWheelFilename:
    +                try:
    +                    project_filename = parse_sdist_filename(entry.name)[0]
    +                except InvalidSdistFilename:
    +                    continue
    +
    +            self._project_name_to_urls[project_filename].append(url)
    +        self._scanned_directory = True
    +
    +    @property
    +    def page_candidates(self) -> List[str]:
    +        if not self._scanned_directory:
    +            self._scan_directory()
    +
    +        return self._page_candidates
    +
    +    @property
    +    def project_name_to_urls(self) -> Dict[str, List[str]]:
    +        if not self._scanned_directory:
    +            self._scan_directory()
    +
    +        return self._project_name_to_urls
    +
    +
    +class _FlatDirectorySource(LinkSource):
    +    """Link source specified by ``--find-links=``.
    +
    +    This looks the content of the directory, and returns:
    +
    +    * ``page_candidates``: Links listed on each HTML file in the directory.
    +    * ``file_candidates``: Archives in the directory.
    +    """
    +
    +    _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {}
    +
    +    def __init__(
    +        self,
    +        candidates_from_page: CandidatesFromPage,
    +        path: str,
    +        project_name: str,
    +    ) -> None:
    +        self._candidates_from_page = candidates_from_page
    +        self._project_name = canonicalize_name(project_name)
    +
    +        # Get existing instance of _FlatDirectoryToUrls if it exists
    +        if path in self._paths_to_urls:
    +            self._path_to_urls = self._paths_to_urls[path]
    +        else:
    +            self._path_to_urls = _FlatDirectoryToUrls(path=path)
    +            self._paths_to_urls[path] = self._path_to_urls
    +
    +    @property
    +    def link(self) -> Optional[Link]:
    +        return None
    +
    +    def page_candidates(self) -> FoundCandidates:
    +        for url in self._path_to_urls.page_candidates:
    +            yield from self._candidates_from_page(Link(url))
    +
    +    def file_links(self) -> FoundLinks:
    +        for url in self._path_to_urls.project_name_to_urls[self._project_name]:
    +            yield Link(url)
    +
    +
    +class _LocalFileSource(LinkSource):
    +    """``--find-links=`` or ``--[extra-]index-url=``.
    +
    +    If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to
    +    the option, it is converted to a URL first. This returns:
    +
    +    * ``page_candidates``: Links listed on an HTML file.
    +    * ``file_candidates``: The non-HTML file.
    +    """
    +
    +    def __init__(
    +        self,
    +        candidates_from_page: CandidatesFromPage,
    +        link: Link,
    +    ) -> None:
    +        self._candidates_from_page = candidates_from_page
    +        self._link = link
    +
    +    @property
    +    def link(self) -> Optional[Link]:
    +        return self._link
    +
    +    def page_candidates(self) -> FoundCandidates:
    +        if not _is_html_file(self._link.url):
    +            return
    +        yield from self._candidates_from_page(self._link)
    +
    +    def file_links(self) -> FoundLinks:
    +        if _is_html_file(self._link.url):
    +            return
    +        yield self._link
    +
    +
    +class _RemoteFileSource(LinkSource):
    +    """``--find-links=`` or ``--[extra-]index-url=``.
    +
    +    This returns:
    +
    +    * ``page_candidates``: Links listed on an HTML file.
    +    * ``file_candidates``: The non-HTML file.
    +    """
    +
    +    def __init__(
    +        self,
    +        candidates_from_page: CandidatesFromPage,
    +        page_validator: PageValidator,
    +        link: Link,
    +    ) -> None:
    +        self._candidates_from_page = candidates_from_page
    +        self._page_validator = page_validator
    +        self._link = link
    +
    +    @property
    +    def link(self) -> Optional[Link]:
    +        return self._link
    +
    +    def page_candidates(self) -> FoundCandidates:
    +        if not self._page_validator(self._link):
    +            return
    +        yield from self._candidates_from_page(self._link)
    +
    +    def file_links(self) -> FoundLinks:
    +        yield self._link
    +
    +
    +class _IndexDirectorySource(LinkSource):
    +    """``--[extra-]index-url=``.
    +
    +    This is treated like a remote URL; ``candidates_from_page`` contains logic
    +    for this by appending ``index.html`` to the link.
    +    """
    +
    +    def __init__(
    +        self,
    +        candidates_from_page: CandidatesFromPage,
    +        link: Link,
    +    ) -> None:
    +        self._candidates_from_page = candidates_from_page
    +        self._link = link
    +
    +    @property
    +    def link(self) -> Optional[Link]:
    +        return self._link
    +
    +    def page_candidates(self) -> FoundCandidates:
    +        yield from self._candidates_from_page(self._link)
    +
    +    def file_links(self) -> FoundLinks:
    +        return ()
    +
    +
    +def build_source(
    +    location: str,
    +    *,
    +    candidates_from_page: CandidatesFromPage,
    +    page_validator: PageValidator,
    +    expand_dir: bool,
    +    cache_link_parsing: bool,
    +    project_name: str,
    +) -> Tuple[Optional[str], Optional[LinkSource]]:
    +    path: Optional[str] = None
    +    url: Optional[str] = None
    +    if os.path.exists(location):  # Is a local path.
    +        url = path_to_url(location)
    +        path = location
    +    elif location.startswith("file:"):  # A file: URL.
    +        url = location
    +        path = url_to_path(location)
    +    elif is_url(location):
    +        url = location
    +
    +    if url is None:
    +        msg = (
    +            "Location '%s' is ignored: "
    +            "it is either a non-existing path or lacks a specific scheme."
    +        )
    +        logger.warning(msg, location)
    +        return (None, None)
    +
    +    if path is None:
    +        source: LinkSource = _RemoteFileSource(
    +            candidates_from_page=candidates_from_page,
    +            page_validator=page_validator,
    +            link=Link(url, cache_link_parsing=cache_link_parsing),
    +        )
    +        return (url, source)
    +
    +    if os.path.isdir(path):
    +        if expand_dir:
    +            source = _FlatDirectorySource(
    +                candidates_from_page=candidates_from_page,
    +                path=path,
    +                project_name=project_name,
    +            )
    +        else:
    +            source = _IndexDirectorySource(
    +                candidates_from_page=candidates_from_page,
    +                link=Link(url, cache_link_parsing=cache_link_parsing),
    +            )
    +        return (url, source)
    +    elif os.path.isfile(path):
    +        source = _LocalFileSource(
    +            candidates_from_page=candidates_from_page,
    +            link=Link(url, cache_link_parsing=cache_link_parsing),
    +        )
    +        return (url, source)
    +    logger.warning(
    +        "Location '%s' is ignored: it is neither a file nor a directory.",
    +        location,
    +    )
    +    return (url, None)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py
    new file mode 100644
    index 0000000..32382be
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/__init__.py
    @@ -0,0 +1,456 @@
    +import functools
    +import logging
    +import os
    +import pathlib
    +import sys
    +import sysconfig
    +from typing import Any, Dict, Generator, Optional, Tuple
    +
    +from pip._internal.models.scheme import SCHEME_KEYS, Scheme
    +from pip._internal.utils.compat import WINDOWS
    +from pip._internal.utils.deprecation import deprecated
    +from pip._internal.utils.virtualenv import running_under_virtualenv
    +
    +from . import _sysconfig
    +from .base import (
    +    USER_CACHE_DIR,
    +    get_major_minor_version,
    +    get_src_prefix,
    +    is_osx_framework,
    +    site_packages,
    +    user_site,
    +)
    +
    +__all__ = [
    +    "USER_CACHE_DIR",
    +    "get_bin_prefix",
    +    "get_bin_user",
    +    "get_major_minor_version",
    +    "get_platlib",
    +    "get_purelib",
    +    "get_scheme",
    +    "get_src_prefix",
    +    "site_packages",
    +    "user_site",
    +]
    +
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib")
    +
    +_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10)
    +
    +
    +def _should_use_sysconfig() -> bool:
    +    """This function determines the value of _USE_SYSCONFIG.
    +
    +    By default, pip uses sysconfig on Python 3.10+.
    +    But Python distributors can override this decision by setting:
    +        sysconfig._PIP_USE_SYSCONFIG = True / False
    +    Rationale in https://github.com/pypa/pip/issues/10647
    +
    +    This is a function for testability, but should be constant during any one
    +    run.
    +    """
    +    return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT))
    +
    +
    +_USE_SYSCONFIG = _should_use_sysconfig()
    +
    +if not _USE_SYSCONFIG:
    +    # Import distutils lazily to avoid deprecation warnings,
    +    # but import it soon enough that it is in memory and available during
    +    # a pip reinstall.
    +    from . import _distutils
    +
    +# Be noisy about incompatibilities if this platforms "should" be using
    +# sysconfig, but is explicitly opting out and using distutils instead.
    +if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG:
    +    _MISMATCH_LEVEL = logging.WARNING
    +else:
    +    _MISMATCH_LEVEL = logging.DEBUG
    +
    +
    +def _looks_like_bpo_44860() -> bool:
    +    """The resolution to bpo-44860 will change this incorrect platlib.
    +
    +    See .
    +    """
    +    from distutils.command.install import INSTALL_SCHEMES
    +
    +    try:
    +        unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"]
    +    except KeyError:
    +        return False
    +    return unix_user_platlib == "$usersite"
    +
    +
    +def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool:
    +    platlib = scheme["platlib"]
    +    if "/$platlibdir/" in platlib:
    +        platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/")
    +    if "/lib64/" not in platlib:
    +        return False
    +    unpatched = platlib.replace("/lib64/", "/lib/")
    +    return unpatched.replace("$platbase/", "$base/") == scheme["purelib"]
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _looks_like_red_hat_lib() -> bool:
    +    """Red Hat patches platlib in unix_prefix and unix_home, but not purelib.
    +
    +    This is the only way I can see to tell a Red Hat-patched Python.
    +    """
    +    from distutils.command.install import INSTALL_SCHEMES
    +
    +    return all(
    +        k in INSTALL_SCHEMES
    +        and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k])
    +        for k in ("unix_prefix", "unix_home")
    +    )
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _looks_like_debian_scheme() -> bool:
    +    """Debian adds two additional schemes."""
    +    from distutils.command.install import INSTALL_SCHEMES
    +
    +    return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _looks_like_red_hat_scheme() -> bool:
    +    """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``.
    +
    +    Red Hat's ``00251-change-user-install-location.patch`` changes the install
    +    command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is
    +    (fortunately?) done quite unconditionally, so we create a default command
    +    object without any configuration to detect this.
    +    """
    +    from distutils.command.install import install
    +    from distutils.dist import Distribution
    +
    +    cmd: Any = install(Distribution())
    +    cmd.finalize_options()
    +    return (
    +        cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local"
    +        and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local"
    +    )
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _looks_like_slackware_scheme() -> bool:
    +    """Slackware patches sysconfig but fails to patch distutils and site.
    +
    +    Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib
    +    path, but does not do the same to the site module.
    +    """
    +    if user_site is None:  # User-site not available.
    +        return False
    +    try:
    +        paths = sysconfig.get_paths(scheme="posix_user", expand=False)
    +    except KeyError:  # User-site not available.
    +        return False
    +    return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _looks_like_msys2_mingw_scheme() -> bool:
    +    """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme.
    +
    +    However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is
    +    likely going to be included in their 3.10 release, so we ignore the warning.
    +    See msys2/MINGW-packages#9319.
    +
    +    MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase,
    +    and is missing the final ``"site-packages"``.
    +    """
    +    paths = sysconfig.get_paths("nt", expand=False)
    +    return all(
    +        "Lib" not in p and "lib" in p and not p.endswith("site-packages")
    +        for p in (paths[key] for key in ("platlib", "purelib"))
    +    )
    +
    +
    +def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]:
    +    ldversion = sysconfig.get_config_var("LDVERSION")
    +    abiflags = getattr(sys, "abiflags", None)
    +
    +    # LDVERSION does not end with sys.abiflags. Just return the path unchanged.
    +    if not ldversion or not abiflags or not ldversion.endswith(abiflags):
    +        yield from parts
    +        return
    +
    +    # Strip sys.abiflags from LDVERSION-based path components.
    +    for part in parts:
    +        if part.endswith(ldversion):
    +            part = part[: (0 - len(abiflags))]
    +        yield part
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None:
    +    issue_url = "https://github.com/pypa/pip/issues/10151"
    +    message = (
    +        "Value for %s does not match. Please report this to <%s>"
    +        "\ndistutils: %s"
    +        "\nsysconfig: %s"
    +    )
    +    logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new)
    +
    +
    +def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool:
    +    if old == new:
    +        return False
    +    _warn_mismatched(old, new, key=key)
    +    return True
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _log_context(
    +    *,
    +    user: bool = False,
    +    home: Optional[str] = None,
    +    root: Optional[str] = None,
    +    prefix: Optional[str] = None,
    +) -> None:
    +    parts = [
    +        "Additional context:",
    +        "user = %r",
    +        "home = %r",
    +        "root = %r",
    +        "prefix = %r",
    +    ]
    +
    +    logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix)
    +
    +
    +def get_scheme(
    +    dist_name: str,
    +    user: bool = False,
    +    home: Optional[str] = None,
    +    root: Optional[str] = None,
    +    isolated: bool = False,
    +    prefix: Optional[str] = None,
    +) -> Scheme:
    +    new = _sysconfig.get_scheme(
    +        dist_name,
    +        user=user,
    +        home=home,
    +        root=root,
    +        isolated=isolated,
    +        prefix=prefix,
    +    )
    +    if _USE_SYSCONFIG:
    +        return new
    +
    +    old = _distutils.get_scheme(
    +        dist_name,
    +        user=user,
    +        home=home,
    +        root=root,
    +        isolated=isolated,
    +        prefix=prefix,
    +    )
    +
    +    warning_contexts = []
    +    for k in SCHEME_KEYS:
    +        old_v = pathlib.Path(getattr(old, k))
    +        new_v = pathlib.Path(getattr(new, k))
    +
    +        if old_v == new_v:
    +            continue
    +
    +        # distutils incorrectly put PyPy packages under ``site-packages/python``
    +        # in the ``posix_home`` scheme, but PyPy devs said they expect the
    +        # directory name to be ``pypy`` instead. So we treat this as a bug fix
    +        # and not warn about it. See bpo-43307 and python/cpython#24628.
    +        skip_pypy_special_case = (
    +            sys.implementation.name == "pypy"
    +            and home is not None
    +            and k in ("platlib", "purelib")
    +            and old_v.parent == new_v.parent
    +            and old_v.name.startswith("python")
    +            and new_v.name.startswith("pypy")
    +        )
    +        if skip_pypy_special_case:
    +            continue
    +
    +        # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in
    +        # the ``include`` value, but distutils's ``headers`` does. We'll let
    +        # CPython decide whether this is a bug or feature. See bpo-43948.
    +        skip_osx_framework_user_special_case = (
    +            user
    +            and is_osx_framework()
    +            and k == "headers"
    +            and old_v.parent.parent == new_v.parent
    +            and old_v.parent.name.startswith("python")
    +        )
    +        if skip_osx_framework_user_special_case:
    +            continue
    +
    +        # On Red Hat and derived Linux distributions, distutils is patched to
    +        # use "lib64" instead of "lib" for platlib.
    +        if k == "platlib" and _looks_like_red_hat_lib():
    +            continue
    +
    +        # On Python 3.9+, sysconfig's posix_user scheme sets platlib against
    +        # sys.platlibdir, but distutils's unix_user incorrectly coninutes
    +        # using the same $usersite for both platlib and purelib. This creates a
    +        # mismatch when sys.platlibdir is not "lib".
    +        skip_bpo_44860 = (
    +            user
    +            and k == "platlib"
    +            and not WINDOWS
    +            and sys.version_info >= (3, 9)
    +            and _PLATLIBDIR != "lib"
    +            and _looks_like_bpo_44860()
    +        )
    +        if skip_bpo_44860:
    +            continue
    +
    +        # Slackware incorrectly patches posix_user to use lib64 instead of lib,
    +        # but not usersite to match the location.
    +        skip_slackware_user_scheme = (
    +            user
    +            and k in ("platlib", "purelib")
    +            and not WINDOWS
    +            and _looks_like_slackware_scheme()
    +        )
    +        if skip_slackware_user_scheme:
    +            continue
    +
    +        # Both Debian and Red Hat patch Python to place the system site under
    +        # /usr/local instead of /usr. Debian also places lib in dist-packages
    +        # instead of site-packages, but the /usr/local check should cover it.
    +        skip_linux_system_special_case = (
    +            not (user or home or prefix or running_under_virtualenv())
    +            and old_v.parts[1:3] == ("usr", "local")
    +            and len(new_v.parts) > 1
    +            and new_v.parts[1] == "usr"
    +            and (len(new_v.parts) < 3 or new_v.parts[2] != "local")
    +            and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme())
    +        )
    +        if skip_linux_system_special_case:
    +            continue
    +
    +        # MSYS2 MINGW's sysconfig patch does not include the "site-packages"
    +        # part of the path. This is incorrect and will be fixed in MSYS.
    +        skip_msys2_mingw_bug = (
    +            WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme()
    +        )
    +        if skip_msys2_mingw_bug:
    +            continue
    +
    +        # CPython's POSIX install script invokes pip (via ensurepip) against the
    +        # interpreter located in the source tree, not the install site. This
    +        # triggers special logic in sysconfig that's not present in distutils.
    +        # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194
    +        skip_cpython_build = (
    +            sysconfig.is_python_build(check_home=True)
    +            and not WINDOWS
    +            and k in ("headers", "include", "platinclude")
    +        )
    +        if skip_cpython_build:
    +            continue
    +
    +        warning_contexts.append((old_v, new_v, f"scheme.{k}"))
    +
    +    if not warning_contexts:
    +        return old
    +
    +    # Check if this path mismatch is caused by distutils config files. Those
    +    # files will no longer work once we switch to sysconfig, so this raises a
    +    # deprecation message for them.
    +    default_old = _distutils.distutils_scheme(
    +        dist_name,
    +        user,
    +        home,
    +        root,
    +        isolated,
    +        prefix,
    +        ignore_config_files=True,
    +    )
    +    if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS):
    +        deprecated(
    +            reason=(
    +                "Configuring installation scheme with distutils config files "
    +                "is deprecated and will no longer work in the near future. If you "
    +                "are using a Homebrew or Linuxbrew Python, please see discussion "
    +                "at https://github.com/Homebrew/homebrew-core/issues/76621"
    +            ),
    +            replacement=None,
    +            gone_in=None,
    +        )
    +        return old
    +
    +    # Post warnings about this mismatch so user can report them back.
    +    for old_v, new_v, key in warning_contexts:
    +        _warn_mismatched(old_v, new_v, key=key)
    +    _log_context(user=user, home=home, root=root, prefix=prefix)
    +
    +    return old
    +
    +
    +def get_bin_prefix() -> str:
    +    new = _sysconfig.get_bin_prefix()
    +    if _USE_SYSCONFIG:
    +        return new
    +
    +    old = _distutils.get_bin_prefix()
    +    if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"):
    +        _log_context()
    +    return old
    +
    +
    +def get_bin_user() -> str:
    +    return _sysconfig.get_scheme("", user=True).scripts
    +
    +
    +def _looks_like_deb_system_dist_packages(value: str) -> bool:
    +    """Check if the value is Debian's APT-controlled dist-packages.
    +
    +    Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the
    +    default package path controlled by APT, but does not patch ``sysconfig`` to
    +    do the same. This is similar to the bug worked around in ``get_scheme()``,
    +    but here the default is ``deb_system`` instead of ``unix_local``. Ultimately
    +    we can't do anything about this Debian bug, and this detection allows us to
    +    skip the warning when needed.
    +    """
    +    if not _looks_like_debian_scheme():
    +        return False
    +    if value == "/usr/lib/python3/dist-packages":
    +        return True
    +    return False
    +
    +
    +def get_purelib() -> str:
    +    """Return the default pure-Python lib location."""
    +    new = _sysconfig.get_purelib()
    +    if _USE_SYSCONFIG:
    +        return new
    +
    +    old = _distutils.get_purelib()
    +    if _looks_like_deb_system_dist_packages(old):
    +        return old
    +    if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"):
    +        _log_context()
    +    return old
    +
    +
    +def get_platlib() -> str:
    +    """Return the default platform-shared lib location."""
    +    new = _sysconfig.get_platlib()
    +    if _USE_SYSCONFIG:
    +        return new
    +
    +    from . import _distutils
    +
    +    old = _distutils.get_platlib()
    +    if _looks_like_deb_system_dist_packages(old):
    +        return old
    +    if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"):
    +        _log_context()
    +    return old
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..046220714a8162c70d1434b4ed63b1dab81f1db8
    GIT binary patch
    literal 16458
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..95472f3a44eb75f7eb14ee288820d0e468c57fdf
    GIT binary patch
    literal 6809
    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
    V_~nk%ZRpo+{OLaXuX`Ct{~xtujtBq%
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..a201fbb94699e84958aef06fb8493bde791eb4c8
    GIT binary patch
    literal 8046
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py b/env/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
    new file mode 100644
    index 0000000..3d85625
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
    @@ -0,0 +1,172 @@
    +"""Locations where we look for configs, install stuff, etc"""
    +
    +# The following comment should be removed at some point in the future.
    +# mypy: strict-optional=False
    +
    +# If pip's going to use distutils, it should not be using the copy that setuptools
    +# might have injected into the environment. This is done by removing the injected
    +# shim, if it's injected.
    +#
    +# See https://github.com/pypa/pip/issues/8761 for the original discussion and
    +# rationale for why this is done within pip.
    +try:
    +    __import__("_distutils_hack").remove_shim()
    +except (ImportError, AttributeError):
    +    pass
    +
    +import logging
    +import os
    +import sys
    +from distutils.cmd import Command as DistutilsCommand
    +from distutils.command.install import SCHEME_KEYS
    +from distutils.command.install import install as distutils_install_command
    +from distutils.sysconfig import get_python_lib
    +from typing import Dict, List, Optional, Union
    +
    +from pip._internal.models.scheme import Scheme
    +from pip._internal.utils.compat import WINDOWS
    +from pip._internal.utils.virtualenv import running_under_virtualenv
    +
    +from .base import get_major_minor_version
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def distutils_scheme(
    +    dist_name: str,
    +    user: bool = False,
    +    home: Optional[str] = None,
    +    root: Optional[str] = None,
    +    isolated: bool = False,
    +    prefix: Optional[str] = None,
    +    *,
    +    ignore_config_files: bool = False,
    +) -> Dict[str, str]:
    +    """
    +    Return a distutils install scheme
    +    """
    +    from distutils.dist import Distribution
    +
    +    dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name}
    +    if isolated:
    +        dist_args["script_args"] = ["--no-user-cfg"]
    +
    +    d = Distribution(dist_args)
    +    if not ignore_config_files:
    +        try:
    +            d.parse_config_files()
    +        except UnicodeDecodeError:
    +            paths = d.find_config_files()
    +            logger.warning(
    +                "Ignore distutils configs in %s due to encoding errors.",
    +                ", ".join(os.path.basename(p) for p in paths),
    +            )
    +    obj: Optional[DistutilsCommand] = None
    +    obj = d.get_command_obj("install", create=True)
    +    assert obj is not None
    +    i: distutils_install_command = obj
    +    # NOTE: setting user or home has the side-effect of creating the home dir
    +    # or user base for installations during finalize_options()
    +    # ideally, we'd prefer a scheme class that has no side-effects.
    +    assert not (user and prefix), f"user={user} prefix={prefix}"
    +    assert not (home and prefix), f"home={home} prefix={prefix}"
    +    i.user = user or i.user
    +    if user or home:
    +        i.prefix = ""
    +    i.prefix = prefix or i.prefix
    +    i.home = home or i.home
    +    i.root = root or i.root
    +    i.finalize_options()
    +
    +    scheme: Dict[str, str] = {}
    +    for key in SCHEME_KEYS:
    +        scheme[key] = getattr(i, "install_" + key)
    +
    +    # install_lib specified in setup.cfg should install *everything*
    +    # into there (i.e. it takes precedence over both purelib and
    +    # platlib).  Note, i.install_lib is *always* set after
    +    # finalize_options(); we only want to override here if the user
    +    # has explicitly requested it hence going back to the config
    +    if "install_lib" in d.get_option_dict("install"):
    +        scheme.update({"purelib": i.install_lib, "platlib": i.install_lib})
    +
    +    if running_under_virtualenv():
    +        if home:
    +            prefix = home
    +        elif user:
    +            prefix = i.install_userbase
    +        else:
    +            prefix = i.prefix
    +        scheme["headers"] = os.path.join(
    +            prefix,
    +            "include",
    +            "site",
    +            f"python{get_major_minor_version()}",
    +            dist_name,
    +        )
    +
    +        if root is not None:
    +            path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1]
    +            scheme["headers"] = os.path.join(root, path_no_drive[1:])
    +
    +    return scheme
    +
    +
    +def get_scheme(
    +    dist_name: str,
    +    user: bool = False,
    +    home: Optional[str] = None,
    +    root: Optional[str] = None,
    +    isolated: bool = False,
    +    prefix: Optional[str] = None,
    +) -> Scheme:
    +    """
    +    Get the "scheme" corresponding to the input parameters. The distutils
    +    documentation provides the context for the available schemes:
    +    https://docs.python.org/3/install/index.html#alternate-installation
    +
    +    :param dist_name: the name of the package to retrieve the scheme for, used
    +        in the headers scheme path
    +    :param user: indicates to use the "user" scheme
    +    :param home: indicates to use the "home" scheme and provides the base
    +        directory for the same
    +    :param root: root under which other directories are re-based
    +    :param isolated: equivalent to --no-user-cfg, i.e. do not consider
    +        ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for
    +        scheme paths
    +    :param prefix: indicates to use the "prefix" scheme and provides the
    +        base directory for the same
    +    """
    +    scheme = distutils_scheme(dist_name, user, home, root, isolated, prefix)
    +    return Scheme(
    +        platlib=scheme["platlib"],
    +        purelib=scheme["purelib"],
    +        headers=scheme["headers"],
    +        scripts=scheme["scripts"],
    +        data=scheme["data"],
    +    )
    +
    +
    +def get_bin_prefix() -> str:
    +    # XXX: In old virtualenv versions, sys.prefix can contain '..' components,
    +    # so we need to call normpath to eliminate them.
    +    prefix = os.path.normpath(sys.prefix)
    +    if WINDOWS:
    +        bin_py = os.path.join(prefix, "Scripts")
    +        # buildout uses 'bin' on Windows too?
    +        if not os.path.exists(bin_py):
    +            bin_py = os.path.join(prefix, "bin")
    +        return bin_py
    +    # Forcing to use /usr/local/bin for standard macOS framework installs
    +    # Also log to ~/Library/Logs/ for use with the Console.app log viewer
    +    if sys.platform[:6] == "darwin" and prefix[:16] == "/System/Library/":
    +        return "/usr/local/bin"
    +    return os.path.join(prefix, "bin")
    +
    +
    +def get_purelib() -> str:
    +    return get_python_lib(plat_specific=False)
    +
    +
    +def get_platlib() -> str:
    +    return get_python_lib(plat_specific=True)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py b/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py
    new file mode 100644
    index 0000000..ca860ea
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py
    @@ -0,0 +1,214 @@
    +import logging
    +import os
    +import sys
    +import sysconfig
    +import typing
    +
    +from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid
    +from pip._internal.models.scheme import SCHEME_KEYS, Scheme
    +from pip._internal.utils.virtualenv import running_under_virtualenv
    +
    +from .base import change_root, get_major_minor_version, is_osx_framework
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +# Notes on _infer_* functions.
    +# Unfortunately ``get_default_scheme()`` didn't exist before 3.10, so there's no
    +# way to ask things like "what is the '_prefix' scheme on this platform". These
    +# functions try to answer that with some heuristics while accounting for ad-hoc
    +# platforms not covered by CPython's default sysconfig implementation. If the
    +# ad-hoc implementation does not fully implement sysconfig, we'll fall back to
    +# a POSIX scheme.
    +
    +_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names())
    +
    +_PREFERRED_SCHEME_API = getattr(sysconfig, "get_preferred_scheme", None)
    +
    +
    +def _should_use_osx_framework_prefix() -> bool:
    +    """Check for Apple's ``osx_framework_library`` scheme.
    +
    +    Python distributed by Apple's Command Line Tools has this special scheme
    +    that's used when:
    +
    +    * This is a framework build.
    +    * We are installing into the system prefix.
    +
    +    This does not account for ``pip install --prefix`` (also means we're not
    +    installing to the system prefix), which should use ``posix_prefix``, but
    +    logic here means ``_infer_prefix()`` outputs ``osx_framework_library``. But
    +    since ``prefix`` is not available for ``sysconfig.get_default_scheme()``,
    +    which is the stdlib replacement for ``_infer_prefix()``, presumably Apple
    +    wouldn't be able to magically switch between ``osx_framework_library`` and
    +    ``posix_prefix``. ``_infer_prefix()`` returning ``osx_framework_library``
    +    means its behavior is consistent whether we use the stdlib implementation
    +    or our own, and we deal with this special case in ``get_scheme()`` instead.
    +    """
    +    return (
    +        "osx_framework_library" in _AVAILABLE_SCHEMES
    +        and not running_under_virtualenv()
    +        and is_osx_framework()
    +    )
    +
    +
    +def _infer_prefix() -> str:
    +    """Try to find a prefix scheme for the current platform.
    +
    +    This tries:
    +
    +    * A special ``osx_framework_library`` for Python distributed by Apple's
    +      Command Line Tools, when not running in a virtual environment.
    +    * Implementation + OS, used by PyPy on Windows (``pypy_nt``).
    +    * Implementation without OS, used by PyPy on POSIX (``pypy``).
    +    * OS + "prefix", used by CPython on POSIX (``posix_prefix``).
    +    * Just the OS name, used by CPython on Windows (``nt``).
    +
    +    If none of the above works, fall back to ``posix_prefix``.
    +    """
    +    if _PREFERRED_SCHEME_API:
    +        return _PREFERRED_SCHEME_API("prefix")
    +    if _should_use_osx_framework_prefix():
    +        return "osx_framework_library"
    +    implementation_suffixed = f"{sys.implementation.name}_{os.name}"
    +    if implementation_suffixed in _AVAILABLE_SCHEMES:
    +        return implementation_suffixed
    +    if sys.implementation.name in _AVAILABLE_SCHEMES:
    +        return sys.implementation.name
    +    suffixed = f"{os.name}_prefix"
    +    if suffixed in _AVAILABLE_SCHEMES:
    +        return suffixed
    +    if os.name in _AVAILABLE_SCHEMES:  # On Windows, prefx is just called "nt".
    +        return os.name
    +    return "posix_prefix"
    +
    +
    +def _infer_user() -> str:
    +    """Try to find a user scheme for the current platform."""
    +    if _PREFERRED_SCHEME_API:
    +        return _PREFERRED_SCHEME_API("user")
    +    if is_osx_framework() and not running_under_virtualenv():
    +        suffixed = "osx_framework_user"
    +    else:
    +        suffixed = f"{os.name}_user"
    +    if suffixed in _AVAILABLE_SCHEMES:
    +        return suffixed
    +    if "posix_user" not in _AVAILABLE_SCHEMES:  # User scheme unavailable.
    +        raise UserInstallationInvalid()
    +    return "posix_user"
    +
    +
    +def _infer_home() -> str:
    +    """Try to find a home for the current platform."""
    +    if _PREFERRED_SCHEME_API:
    +        return _PREFERRED_SCHEME_API("home")
    +    suffixed = f"{os.name}_home"
    +    if suffixed in _AVAILABLE_SCHEMES:
    +        return suffixed
    +    return "posix_home"
    +
    +
    +# Update these keys if the user sets a custom home.
    +_HOME_KEYS = [
    +    "installed_base",
    +    "base",
    +    "installed_platbase",
    +    "platbase",
    +    "prefix",
    +    "exec_prefix",
    +]
    +if sysconfig.get_config_var("userbase") is not None:
    +    _HOME_KEYS.append("userbase")
    +
    +
    +def get_scheme(
    +    dist_name: str,
    +    user: bool = False,
    +    home: typing.Optional[str] = None,
    +    root: typing.Optional[str] = None,
    +    isolated: bool = False,
    +    prefix: typing.Optional[str] = None,
    +) -> Scheme:
    +    """
    +    Get the "scheme" corresponding to the input parameters.
    +
    +    :param dist_name: the name of the package to retrieve the scheme for, used
    +        in the headers scheme path
    +    :param user: indicates to use the "user" scheme
    +    :param home: indicates to use the "home" scheme
    +    :param root: root under which other directories are re-based
    +    :param isolated: ignored, but kept for distutils compatibility (where
    +        this controls whether the user-site pydistutils.cfg is honored)
    +    :param prefix: indicates to use the "prefix" scheme and provides the
    +        base directory for the same
    +    """
    +    if user and prefix:
    +        raise InvalidSchemeCombination("--user", "--prefix")
    +    if home and prefix:
    +        raise InvalidSchemeCombination("--home", "--prefix")
    +
    +    if home is not None:
    +        scheme_name = _infer_home()
    +    elif user:
    +        scheme_name = _infer_user()
    +    else:
    +        scheme_name = _infer_prefix()
    +
    +    # Special case: When installing into a custom prefix, use posix_prefix
    +    # instead of osx_framework_library. See _should_use_osx_framework_prefix()
    +    # docstring for details.
    +    if prefix is not None and scheme_name == "osx_framework_library":
    +        scheme_name = "posix_prefix"
    +
    +    if home is not None:
    +        variables = {k: home for k in _HOME_KEYS}
    +    elif prefix is not None:
    +        variables = {k: prefix for k in _HOME_KEYS}
    +    else:
    +        variables = {}
    +
    +    paths = sysconfig.get_paths(scheme=scheme_name, vars=variables)
    +
    +    # Logic here is very arbitrary, we're doing it for compatibility, don't ask.
    +    # 1. Pip historically uses a special header path in virtual environments.
    +    # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We
    +    #    only do the same when not running in a virtual environment because
    +    #    pip's historical header path logic (see point 1) did not do this.
    +    if running_under_virtualenv():
    +        if user:
    +            base = variables.get("userbase", sys.prefix)
    +        else:
    +            base = variables.get("base", sys.prefix)
    +        python_xy = f"python{get_major_minor_version()}"
    +        paths["include"] = os.path.join(base, "include", "site", python_xy)
    +    elif not dist_name:
    +        dist_name = "UNKNOWN"
    +
    +    scheme = Scheme(
    +        platlib=paths["platlib"],
    +        purelib=paths["purelib"],
    +        headers=os.path.join(paths["include"], dist_name),
    +        scripts=paths["scripts"],
    +        data=paths["data"],
    +    )
    +    if root is not None:
    +        converted_keys = {}
    +        for key in SCHEME_KEYS:
    +            converted_keys[key] = change_root(root, getattr(scheme, key))
    +        scheme = Scheme(**converted_keys)
    +    return scheme
    +
    +
    +def get_bin_prefix() -> str:
    +    # Forcing to use /usr/local/bin for standard macOS framework installs.
    +    if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/":
    +        return "/usr/local/bin"
    +    return sysconfig.get_paths()["scripts"]
    +
    +
    +def get_purelib() -> str:
    +    return sysconfig.get_paths()["purelib"]
    +
    +
    +def get_platlib() -> str:
    +    return sysconfig.get_paths()["platlib"]
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/locations/base.py b/env/lib/python3.12/site-packages/pip/_internal/locations/base.py
    new file mode 100644
    index 0000000..3f9f896
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/locations/base.py
    @@ -0,0 +1,81 @@
    +import functools
    +import os
    +import site
    +import sys
    +import sysconfig
    +import typing
    +
    +from pip._internal.exceptions import InstallationError
    +from pip._internal.utils import appdirs
    +from pip._internal.utils.virtualenv import running_under_virtualenv
    +
    +# Application Directories
    +USER_CACHE_DIR = appdirs.user_cache_dir("pip")
    +
    +# FIXME doesn't account for venv linked to global site-packages
    +site_packages: str = sysconfig.get_path("purelib")
    +
    +
    +def get_major_minor_version() -> str:
    +    """
    +    Return the major-minor version of the current Python as a string, e.g.
    +    "3.7" or "3.10".
    +    """
    +    return "{}.{}".format(*sys.version_info)
    +
    +
    +def change_root(new_root: str, pathname: str) -> str:
    +    """Return 'pathname' with 'new_root' prepended.
    +
    +    If 'pathname' is relative, this is equivalent to os.path.join(new_root, pathname).
    +    Otherwise, it requires making 'pathname' relative and then joining the
    +    two, which is tricky on DOS/Windows and Mac OS.
    +
    +    This is borrowed from Python's standard library's distutils module.
    +    """
    +    if os.name == "posix":
    +        if not os.path.isabs(pathname):
    +            return os.path.join(new_root, pathname)
    +        else:
    +            return os.path.join(new_root, pathname[1:])
    +
    +    elif os.name == "nt":
    +        (drive, path) = os.path.splitdrive(pathname)
    +        if path[0] == "\\":
    +            path = path[1:]
    +        return os.path.join(new_root, path)
    +
    +    else:
    +        raise InstallationError(
    +            f"Unknown platform: {os.name}\n"
    +            "Can not change root path prefix on unknown platform."
    +        )
    +
    +
    +def get_src_prefix() -> str:
    +    if running_under_virtualenv():
    +        src_prefix = os.path.join(sys.prefix, "src")
    +    else:
    +        # FIXME: keep src in cwd for now (it is not a temporary folder)
    +        try:
    +            src_prefix = os.path.join(os.getcwd(), "src")
    +        except OSError:
    +            # In case the current working directory has been renamed or deleted
    +            sys.exit("The folder you are executing pip from can no longer be found.")
    +
    +    # under macOS + virtualenv sys.prefix is not properly resolved
    +    # it is something like /path/to/python/bin/..
    +    return os.path.abspath(src_prefix)
    +
    +
    +try:
    +    # Use getusersitepackages if this is present, as it ensures that the
    +    # value is initialised properly.
    +    user_site: typing.Optional[str] = site.getusersitepackages()
    +except AttributeError:
    +    user_site = site.USER_SITE
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def is_osx_framework() -> bool:
    +    return bool(sysconfig.get_config_var("PYTHONFRAMEWORK"))
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/main.py b/env/lib/python3.12/site-packages/pip/_internal/main.py
    new file mode 100644
    index 0000000..33c6d24
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/main.py
    @@ -0,0 +1,12 @@
    +from typing import List, Optional
    +
    +
    +def main(args: Optional[List[str]] = None) -> int:
    +    """This is preserved for old console scripts that may still be referencing
    +    it.
    +
    +    For additional details, see https://github.com/pypa/pip/issues/7498.
    +    """
    +    from pip._internal.utils.entrypoints import _wrapper
    +
    +    return _wrapper(args)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py
    new file mode 100644
    index 0000000..aa232b6
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py
    @@ -0,0 +1,128 @@
    +import contextlib
    +import functools
    +import os
    +import sys
    +from typing import TYPE_CHECKING, List, Optional, Type, cast
    +
    +from pip._internal.utils.misc import strtobool
    +
    +from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel
    +
    +if TYPE_CHECKING:
    +    from typing import Literal, Protocol
    +else:
    +    Protocol = object
    +
    +__all__ = [
    +    "BaseDistribution",
    +    "BaseEnvironment",
    +    "FilesystemWheel",
    +    "MemoryWheel",
    +    "Wheel",
    +    "get_default_environment",
    +    "get_environment",
    +    "get_wheel_distribution",
    +    "select_backend",
    +]
    +
    +
    +def _should_use_importlib_metadata() -> bool:
    +    """Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend.
    +
    +    By default, pip uses ``importlib.metadata`` on Python 3.11+, and
    +    ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways:
    +
    +    * If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it
    +      dictates whether ``importlib.metadata`` is used, regardless of Python
    +      version.
    +    * On Python 3.11+, Python distributors can patch ``importlib.metadata``
    +      to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This
    +      makes pip use ``pkg_resources`` (unless the user set the aforementioned
    +      environment variable to *True*).
    +    """
    +    with contextlib.suppress(KeyError, ValueError):
    +        return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"]))
    +    if sys.version_info < (3, 11):
    +        return False
    +    import importlib.metadata
    +
    +    return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True))
    +
    +
    +class Backend(Protocol):
    +    NAME: 'Literal["importlib", "pkg_resources"]'
    +    Distribution: Type[BaseDistribution]
    +    Environment: Type[BaseEnvironment]
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def select_backend() -> Backend:
    +    if _should_use_importlib_metadata():
    +        from . import importlib
    +
    +        return cast(Backend, importlib)
    +    from . import pkg_resources
    +
    +    return cast(Backend, pkg_resources)
    +
    +
    +def get_default_environment() -> BaseEnvironment:
    +    """Get the default representation for the current environment.
    +
    +    This returns an Environment instance from the chosen backend. The default
    +    Environment instance should be built from ``sys.path`` and may use caching
    +    to share instance state accorss calls.
    +    """
    +    return select_backend().Environment.default()
    +
    +
    +def get_environment(paths: Optional[List[str]]) -> BaseEnvironment:
    +    """Get a representation of the environment specified by ``paths``.
    +
    +    This returns an Environment instance from the chosen backend based on the
    +    given import paths. The backend must build a fresh instance representing
    +    the state of installed distributions when this function is called.
    +    """
    +    return select_backend().Environment.from_paths(paths)
    +
    +
    +def get_directory_distribution(directory: str) -> BaseDistribution:
    +    """Get the distribution metadata representation in the specified directory.
    +
    +    This returns a Distribution instance from the chosen backend based on
    +    the given on-disk ``.dist-info`` directory.
    +    """
    +    return select_backend().Distribution.from_directory(directory)
    +
    +
    +def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution:
    +    """Get the representation of the specified wheel's distribution metadata.
    +
    +    This returns a Distribution instance from the chosen backend based on
    +    the given wheel's ``.dist-info`` directory.
    +
    +    :param canonical_name: Normalized project name of the given wheel.
    +    """
    +    return select_backend().Distribution.from_wheel(wheel, canonical_name)
    +
    +
    +def get_metadata_distribution(
    +    metadata_contents: bytes,
    +    filename: str,
    +    canonical_name: str,
    +) -> BaseDistribution:
    +    """Get the dist representation of the specified METADATA file contents.
    +
    +    This returns a Distribution instance from the chosen backend sourced from the data
    +    in `metadata_contents`.
    +
    +    :param metadata_contents: Contents of a METADATA file within a dist, or one served
    +                              via PEP 658.
    +    :param filename: Filename for the dist this metadata represents.
    +    :param canonical_name: Normalized project name of the given dist.
    +    """
    +    return select_backend().Distribution.from_metadata_file_contents(
    +        metadata_contents,
    +        filename,
    +        canonical_name,
    +    )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..e8c85fac27b6af4ec0aa46be7ccb6cc42ae3b956
    GIT binary patch
    literal 5887
    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
    B7;XRn
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..81537d19464bf4d56028c0b7e5eadb3dd21576a4
    GIT binary patch
    literal 2944
    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
    b`xQ=p|CDr}!|T4ch~GQ4{zn{MY`p$IcxcB5
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..22af2f215027fcde0c6994cc24ab59b07fd4453b
    GIT binary patch
    literal 16102
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/_json.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/_json.py
    new file mode 100644
    index 0000000..9097dd5
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/_json.py
    @@ -0,0 +1,84 @@
    +# Extracted from https://github.com/pfmoore/pkg_metadata
    +
    +from email.header import Header, decode_header, make_header
    +from email.message import Message
    +from typing import Any, Dict, List, Union, cast
    +
    +METADATA_FIELDS = [
    +    # Name, Multiple-Use
    +    ("Metadata-Version", False),
    +    ("Name", False),
    +    ("Version", False),
    +    ("Dynamic", True),
    +    ("Platform", True),
    +    ("Supported-Platform", True),
    +    ("Summary", False),
    +    ("Description", False),
    +    ("Description-Content-Type", False),
    +    ("Keywords", False),
    +    ("Home-page", False),
    +    ("Download-URL", False),
    +    ("Author", False),
    +    ("Author-email", False),
    +    ("Maintainer", False),
    +    ("Maintainer-email", False),
    +    ("License", False),
    +    ("Classifier", True),
    +    ("Requires-Dist", True),
    +    ("Requires-Python", False),
    +    ("Requires-External", True),
    +    ("Project-URL", True),
    +    ("Provides-Extra", True),
    +    ("Provides-Dist", True),
    +    ("Obsoletes-Dist", True),
    +]
    +
    +
    +def json_name(field: str) -> str:
    +    return field.lower().replace("-", "_")
    +
    +
    +def msg_to_json(msg: Message) -> Dict[str, Any]:
    +    """Convert a Message object into a JSON-compatible dictionary."""
    +
    +    def sanitise_header(h: Union[Header, str]) -> str:
    +        if isinstance(h, Header):
    +            chunks = []
    +            for bytes, encoding in decode_header(h):
    +                if encoding == "unknown-8bit":
    +                    try:
    +                        # See if UTF-8 works
    +                        bytes.decode("utf-8")
    +                        encoding = "utf-8"
    +                    except UnicodeDecodeError:
    +                        # If not, latin1 at least won't fail
    +                        encoding = "latin1"
    +                chunks.append((bytes, encoding))
    +            return str(make_header(chunks))
    +        return str(h)
    +
    +    result = {}
    +    for field, multi in METADATA_FIELDS:
    +        if field not in msg:
    +            continue
    +        key = json_name(field)
    +        if multi:
    +            value: Union[str, List[str]] = [
    +                sanitise_header(v) for v in msg.get_all(field)  # type: ignore
    +            ]
    +        else:
    +            value = sanitise_header(msg.get(field))  # type: ignore
    +            if key == "keywords":
    +                # Accept both comma-separated and space-separated
    +                # forms, for better compatibility with old data.
    +                if "," in value:
    +                    value = [v.strip() for v in value.split(",")]
    +                else:
    +                    value = value.split()
    +        result[key] = value
    +
    +    payload = cast(str, msg.get_payload())
    +    if payload:
    +        result["description"] = payload
    +
    +    return result
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py
    new file mode 100644
    index 0000000..9eabcdb
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/base.py
    @@ -0,0 +1,688 @@
    +import csv
    +import email.message
    +import functools
    +import json
    +import logging
    +import pathlib
    +import re
    +import zipfile
    +from typing import (
    +    IO,
    +    Any,
    +    Collection,
    +    Container,
    +    Dict,
    +    Iterable,
    +    Iterator,
    +    List,
    +    NamedTuple,
    +    Optional,
    +    Protocol,
    +    Tuple,
    +    Union,
    +)
    +
    +from pip._vendor.packaging.requirements import Requirement
    +from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
    +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
    +from pip._vendor.packaging.version import Version
    +
    +from pip._internal.exceptions import NoneMetadataError
    +from pip._internal.locations import site_packages, user_site
    +from pip._internal.models.direct_url import (
    +    DIRECT_URL_METADATA_NAME,
    +    DirectUrl,
    +    DirectUrlValidationError,
    +)
    +from pip._internal.utils.compat import stdlib_pkgs  # TODO: Move definition here.
    +from pip._internal.utils.egg_link import egg_link_path_from_sys_path
    +from pip._internal.utils.misc import is_local, normalize_path
    +from pip._internal.utils.urls import url_to_path
    +
    +from ._json import msg_to_json
    +
    +InfoPath = Union[str, pathlib.PurePath]
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class BaseEntryPoint(Protocol):
    +    @property
    +    def name(self) -> str:
    +        raise NotImplementedError()
    +
    +    @property
    +    def value(self) -> str:
    +        raise NotImplementedError()
    +
    +    @property
    +    def group(self) -> str:
    +        raise NotImplementedError()
    +
    +
    +def _convert_installed_files_path(
    +    entry: Tuple[str, ...],
    +    info: Tuple[str, ...],
    +) -> str:
    +    """Convert a legacy installed-files.txt path into modern RECORD path.
    +
    +    The legacy format stores paths relative to the info directory, while the
    +    modern format stores paths relative to the package root, e.g. the
    +    site-packages directory.
    +
    +    :param entry: Path parts of the installed-files.txt entry.
    +    :param info: Path parts of the egg-info directory relative to package root.
    +    :returns: The converted entry.
    +
    +    For best compatibility with symlinks, this does not use ``abspath()`` or
    +    ``Path.resolve()``, but tries to work with path parts:
    +
    +    1. While ``entry`` starts with ``..``, remove the equal amounts of parts
    +       from ``info``; if ``info`` is empty, start appending ``..`` instead.
    +    2. Join the two directly.
    +    """
    +    while entry and entry[0] == "..":
    +        if not info or info[-1] == "..":
    +            info += ("..",)
    +        else:
    +            info = info[:-1]
    +        entry = entry[1:]
    +    return str(pathlib.Path(*info, *entry))
    +
    +
    +class RequiresEntry(NamedTuple):
    +    requirement: str
    +    extra: str
    +    marker: str
    +
    +
    +class BaseDistribution(Protocol):
    +    @classmethod
    +    def from_directory(cls, directory: str) -> "BaseDistribution":
    +        """Load the distribution from a metadata directory.
    +
    +        :param directory: Path to a metadata directory, e.g. ``.dist-info``.
    +        """
    +        raise NotImplementedError()
    +
    +    @classmethod
    +    def from_metadata_file_contents(
    +        cls,
    +        metadata_contents: bytes,
    +        filename: str,
    +        project_name: str,
    +    ) -> "BaseDistribution":
    +        """Load the distribution from the contents of a METADATA file.
    +
    +        This is used to implement PEP 658 by generating a "shallow" dist object that can
    +        be used for resolution without downloading or building the actual dist yet.
    +
    +        :param metadata_contents: The contents of a METADATA file.
    +        :param filename: File name for the dist with this metadata.
    +        :param project_name: Name of the project this dist represents.
    +        """
    +        raise NotImplementedError()
    +
    +    @classmethod
    +    def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution":
    +        """Load the distribution from a given wheel.
    +
    +        :param wheel: A concrete wheel definition.
    +        :param name: File name of the wheel.
    +
    +        :raises InvalidWheel: Whenever loading of the wheel causes a
    +            :py:exc:`zipfile.BadZipFile` exception to be thrown.
    +        :raises UnsupportedWheel: If the wheel is a valid zip, but malformed
    +            internally.
    +        """
    +        raise NotImplementedError()
    +
    +    def __repr__(self) -> str:
    +        return f"{self.raw_name} {self.raw_version} ({self.location})"
    +
    +    def __str__(self) -> str:
    +        return f"{self.raw_name} {self.raw_version}"
    +
    +    @property
    +    def location(self) -> Optional[str]:
    +        """Where the distribution is loaded from.
    +
    +        A string value is not necessarily a filesystem path, since distributions
    +        can be loaded from other sources, e.g. arbitrary zip archives. ``None``
    +        means the distribution is created in-memory.
    +
    +        Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If
    +        this is a symbolic link, we want to preserve the relative path between
    +        it and files in the distribution.
    +        """
    +        raise NotImplementedError()
    +
    +    @property
    +    def editable_project_location(self) -> Optional[str]:
    +        """The project location for editable distributions.
    +
    +        This is the directory where pyproject.toml or setup.py is located.
    +        None if the distribution is not installed in editable mode.
    +        """
    +        # TODO: this property is relatively costly to compute, memoize it ?
    +        direct_url = self.direct_url
    +        if direct_url:
    +            if direct_url.is_local_editable():
    +                return url_to_path(direct_url.url)
    +        else:
    +            # Search for an .egg-link file by walking sys.path, as it was
    +            # done before by dist_is_editable().
    +            egg_link_path = egg_link_path_from_sys_path(self.raw_name)
    +            if egg_link_path:
    +                # TODO: get project location from second line of egg_link file
    +                #       (https://github.com/pypa/pip/issues/10243)
    +                return self.location
    +        return None
    +
    +    @property
    +    def installed_location(self) -> Optional[str]:
    +        """The distribution's "installed" location.
    +
    +        This should generally be a ``site-packages`` directory. This is
    +        usually ``dist.location``, except for legacy develop-installed packages,
    +        where ``dist.location`` is the source code location, and this is where
    +        the ``.egg-link`` file is.
    +
    +        The returned location is normalized (in particular, with symlinks removed).
    +        """
    +        raise NotImplementedError()
    +
    +    @property
    +    def info_location(self) -> Optional[str]:
    +        """Location of the .[egg|dist]-info directory or file.
    +
    +        Similarly to ``location``, a string value is not necessarily a
    +        filesystem path. ``None`` means the distribution is created in-memory.
    +
    +        For a modern .dist-info installation on disk, this should be something
    +        like ``{location}/{raw_name}-{version}.dist-info``.
    +
    +        Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If
    +        this is a symbolic link, we want to preserve the relative path between
    +        it and other files in the distribution.
    +        """
    +        raise NotImplementedError()
    +
    +    @property
    +    def installed_by_distutils(self) -> bool:
    +        """Whether this distribution is installed with legacy distutils format.
    +
    +        A distribution installed with "raw" distutils not patched by setuptools
    +        uses one single file at ``info_location`` to store metadata. We need to
    +        treat this specially on uninstallation.
    +        """
    +        info_location = self.info_location
    +        if not info_location:
    +            return False
    +        return pathlib.Path(info_location).is_file()
    +
    +    @property
    +    def installed_as_egg(self) -> bool:
    +        """Whether this distribution is installed as an egg.
    +
    +        This usually indicates the distribution was installed by (older versions
    +        of) easy_install.
    +        """
    +        location = self.location
    +        if not location:
    +            return False
    +        return location.endswith(".egg")
    +
    +    @property
    +    def installed_with_setuptools_egg_info(self) -> bool:
    +        """Whether this distribution is installed with the ``.egg-info`` format.
    +
    +        This usually indicates the distribution was installed with setuptools
    +        with an old pip version or with ``single-version-externally-managed``.
    +
    +        Note that this ensure the metadata store is a directory. distutils can
    +        also installs an ``.egg-info``, but as a file, not a directory. This
    +        property is *False* for that case. Also see ``installed_by_distutils``.
    +        """
    +        info_location = self.info_location
    +        if not info_location:
    +            return False
    +        if not info_location.endswith(".egg-info"):
    +            return False
    +        return pathlib.Path(info_location).is_dir()
    +
    +    @property
    +    def installed_with_dist_info(self) -> bool:
    +        """Whether this distribution is installed with the "modern format".
    +
    +        This indicates a "modern" installation, e.g. storing metadata in the
    +        ``.dist-info`` directory. This applies to installations made by
    +        setuptools (but through pip, not directly), or anything using the
    +        standardized build backend interface (PEP 517).
    +        """
    +        info_location = self.info_location
    +        if not info_location:
    +            return False
    +        if not info_location.endswith(".dist-info"):
    +            return False
    +        return pathlib.Path(info_location).is_dir()
    +
    +    @property
    +    def canonical_name(self) -> NormalizedName:
    +        raise NotImplementedError()
    +
    +    @property
    +    def version(self) -> Version:
    +        raise NotImplementedError()
    +
    +    @property
    +    def raw_version(self) -> str:
    +        raise NotImplementedError()
    +
    +    @property
    +    def setuptools_filename(self) -> str:
    +        """Convert a project name to its setuptools-compatible filename.
    +
    +        This is a copy of ``pkg_resources.to_filename()`` for compatibility.
    +        """
    +        return self.raw_name.replace("-", "_")
    +
    +    @property
    +    def direct_url(self) -> Optional[DirectUrl]:
    +        """Obtain a DirectUrl from this distribution.
    +
    +        Returns None if the distribution has no `direct_url.json` metadata,
    +        or if `direct_url.json` is invalid.
    +        """
    +        try:
    +            content = self.read_text(DIRECT_URL_METADATA_NAME)
    +        except FileNotFoundError:
    +            return None
    +        try:
    +            return DirectUrl.from_json(content)
    +        except (
    +            UnicodeDecodeError,
    +            json.JSONDecodeError,
    +            DirectUrlValidationError,
    +        ) as e:
    +            logger.warning(
    +                "Error parsing %s for %s: %s",
    +                DIRECT_URL_METADATA_NAME,
    +                self.canonical_name,
    +                e,
    +            )
    +            return None
    +
    +    @property
    +    def installer(self) -> str:
    +        try:
    +            installer_text = self.read_text("INSTALLER")
    +        except (OSError, ValueError, NoneMetadataError):
    +            return ""  # Fail silently if the installer file cannot be read.
    +        for line in installer_text.splitlines():
    +            cleaned_line = line.strip()
    +            if cleaned_line:
    +                return cleaned_line
    +        return ""
    +
    +    @property
    +    def requested(self) -> bool:
    +        return self.is_file("REQUESTED")
    +
    +    @property
    +    def editable(self) -> bool:
    +        return bool(self.editable_project_location)
    +
    +    @property
    +    def local(self) -> bool:
    +        """If distribution is installed in the current virtual environment.
    +
    +        Always True if we're not in a virtualenv.
    +        """
    +        if self.installed_location is None:
    +            return False
    +        return is_local(self.installed_location)
    +
    +    @property
    +    def in_usersite(self) -> bool:
    +        if self.installed_location is None or user_site is None:
    +            return False
    +        return self.installed_location.startswith(normalize_path(user_site))
    +
    +    @property
    +    def in_site_packages(self) -> bool:
    +        if self.installed_location is None or site_packages is None:
    +            return False
    +        return self.installed_location.startswith(normalize_path(site_packages))
    +
    +    def is_file(self, path: InfoPath) -> bool:
    +        """Check whether an entry in the info directory is a file."""
    +        raise NotImplementedError()
    +
    +    def iter_distutils_script_names(self) -> Iterator[str]:
    +        """Find distutils 'scripts' entries metadata.
    +
    +        If 'scripts' is supplied in ``setup.py``, distutils records those in the
    +        installed distribution's ``scripts`` directory, a file for each script.
    +        """
    +        raise NotImplementedError()
    +
    +    def read_text(self, path: InfoPath) -> str:
    +        """Read a file in the info directory.
    +
    +        :raise FileNotFoundError: If ``path`` does not exist in the directory.
    +        :raise NoneMetadataError: If ``path`` exists in the info directory, but
    +            cannot be read.
    +        """
    +        raise NotImplementedError()
    +
    +    def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    +        raise NotImplementedError()
    +
    +    def _metadata_impl(self) -> email.message.Message:
    +        raise NotImplementedError()
    +
    +    @functools.cached_property
    +    def metadata(self) -> email.message.Message:
    +        """Metadata of distribution parsed from e.g. METADATA or PKG-INFO.
    +
    +        This should return an empty message if the metadata file is unavailable.
    +
    +        :raises NoneMetadataError: If the metadata file is available, but does
    +            not contain valid metadata.
    +        """
    +        metadata = self._metadata_impl()
    +        self._add_egg_info_requires(metadata)
    +        return metadata
    +
    +    @property
    +    def metadata_dict(self) -> Dict[str, Any]:
    +        """PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO.
    +
    +        This should return an empty dict if the metadata file is unavailable.
    +
    +        :raises NoneMetadataError: If the metadata file is available, but does
    +            not contain valid metadata.
    +        """
    +        return msg_to_json(self.metadata)
    +
    +    @property
    +    def metadata_version(self) -> Optional[str]:
    +        """Value of "Metadata-Version:" in distribution metadata, if available."""
    +        return self.metadata.get("Metadata-Version")
    +
    +    @property
    +    def raw_name(self) -> str:
    +        """Value of "Name:" in distribution metadata."""
    +        # The metadata should NEVER be missing the Name: key, but if it somehow
    +        # does, fall back to the known canonical name.
    +        return self.metadata.get("Name", self.canonical_name)
    +
    +    @property
    +    def requires_python(self) -> SpecifierSet:
    +        """Value of "Requires-Python:" in distribution metadata.
    +
    +        If the key does not exist or contains an invalid value, an empty
    +        SpecifierSet should be returned.
    +        """
    +        value = self.metadata.get("Requires-Python")
    +        if value is None:
    +            return SpecifierSet()
    +        try:
    +            # Convert to str to satisfy the type checker; this can be a Header object.
    +            spec = SpecifierSet(str(value))
    +        except InvalidSpecifier as e:
    +            message = "Package %r has an invalid Requires-Python: %s"
    +            logger.warning(message, self.raw_name, e)
    +            return SpecifierSet()
    +        return spec
    +
    +    def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
    +        """Dependencies of this distribution.
    +
    +        For modern .dist-info distributions, this is the collection of
    +        "Requires-Dist:" entries in distribution metadata.
    +        """
    +        raise NotImplementedError()
    +
    +    def iter_raw_dependencies(self) -> Iterable[str]:
    +        """Raw Requires-Dist metadata."""
    +        return self.metadata.get_all("Requires-Dist", [])
    +
    +    def iter_provided_extras(self) -> Iterable[NormalizedName]:
    +        """Extras provided by this distribution.
    +
    +        For modern .dist-info distributions, this is the collection of
    +        "Provides-Extra:" entries in distribution metadata.
    +
    +        The return value of this function is expected to be normalised names,
    +        per PEP 685, with the returned value being handled appropriately by
    +        `iter_dependencies`.
    +        """
    +        raise NotImplementedError()
    +
    +    def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]:
    +        try:
    +            text = self.read_text("RECORD")
    +        except FileNotFoundError:
    +            return None
    +        # This extra Path-str cast normalizes entries.
    +        return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines()))
    +
    +    def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]:
    +        try:
    +            text = self.read_text("installed-files.txt")
    +        except FileNotFoundError:
    +            return None
    +        paths = (p for p in text.splitlines(keepends=False) if p)
    +        root = self.location
    +        info = self.info_location
    +        if root is None or info is None:
    +            return paths
    +        try:
    +            info_rel = pathlib.Path(info).relative_to(root)
    +        except ValueError:  # info is not relative to root.
    +            return paths
    +        if not info_rel.parts:  # info *is* root.
    +            return paths
    +        return (
    +            _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts)
    +            for p in paths
    +        )
    +
    +    def iter_declared_entries(self) -> Optional[Iterator[str]]:
    +        """Iterate through file entries declared in this distribution.
    +
    +        For modern .dist-info distributions, this is the files listed in the
    +        ``RECORD`` metadata file. For legacy setuptools distributions, this
    +        comes from ``installed-files.txt``, with entries normalized to be
    +        compatible with the format used by ``RECORD``.
    +
    +        :return: An iterator for listed entries, or None if the distribution
    +            contains neither ``RECORD`` nor ``installed-files.txt``.
    +        """
    +        return (
    +            self._iter_declared_entries_from_record()
    +            or self._iter_declared_entries_from_legacy()
    +        )
    +
    +    def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]:
    +        """Parse a ``requires.txt`` in an egg-info directory.
    +
    +        This is an INI-ish format where an egg-info stores dependencies. A
    +        section name describes extra other environment markers, while each entry
    +        is an arbitrary string (not a key-value pair) representing a dependency
    +        as a requirement string (no markers).
    +
    +        There is a construct in ``importlib.metadata`` called ``Sectioned`` that
    +        does mostly the same, but the format is currently considered private.
    +        """
    +        try:
    +            content = self.read_text("requires.txt")
    +        except FileNotFoundError:
    +            return
    +        extra = marker = ""  # Section-less entries don't have markers.
    +        for line in content.splitlines():
    +            line = line.strip()
    +            if not line or line.startswith("#"):  # Comment; ignored.
    +                continue
    +            if line.startswith("[") and line.endswith("]"):  # A section header.
    +                extra, _, marker = line.strip("[]").partition(":")
    +                continue
    +            yield RequiresEntry(requirement=line, extra=extra, marker=marker)
    +
    +    def _iter_egg_info_extras(self) -> Iterable[str]:
    +        """Get extras from the egg-info directory."""
    +        known_extras = {""}
    +        for entry in self._iter_requires_txt_entries():
    +            extra = canonicalize_name(entry.extra)
    +            if extra in known_extras:
    +                continue
    +            known_extras.add(extra)
    +            yield extra
    +
    +    def _iter_egg_info_dependencies(self) -> Iterable[str]:
    +        """Get distribution dependencies from the egg-info directory.
    +
    +        To ease parsing, this converts a legacy dependency entry into a PEP 508
    +        requirement string. Like ``_iter_requires_txt_entries()``, there is code
    +        in ``importlib.metadata`` that does mostly the same, but not do exactly
    +        what we need.
    +
    +        Namely, ``importlib.metadata`` does not normalize the extra name before
    +        putting it into the requirement string, which causes marker comparison
    +        to fail because the dist-info format do normalize. This is consistent in
    +        all currently available PEP 517 backends, although not standardized.
    +        """
    +        for entry in self._iter_requires_txt_entries():
    +            extra = canonicalize_name(entry.extra)
    +            if extra and entry.marker:
    +                marker = f'({entry.marker}) and extra == "{extra}"'
    +            elif extra:
    +                marker = f'extra == "{extra}"'
    +            elif entry.marker:
    +                marker = entry.marker
    +            else:
    +                marker = ""
    +            if marker:
    +                yield f"{entry.requirement} ; {marker}"
    +            else:
    +                yield entry.requirement
    +
    +    def _add_egg_info_requires(self, metadata: email.message.Message) -> None:
    +        """Add egg-info requires.txt information to the metadata."""
    +        if not metadata.get_all("Requires-Dist"):
    +            for dep in self._iter_egg_info_dependencies():
    +                metadata["Requires-Dist"] = dep
    +        if not metadata.get_all("Provides-Extra"):
    +            for extra in self._iter_egg_info_extras():
    +                metadata["Provides-Extra"] = extra
    +
    +
    +class BaseEnvironment:
    +    """An environment containing distributions to introspect."""
    +
    +    @classmethod
    +    def default(cls) -> "BaseEnvironment":
    +        raise NotImplementedError()
    +
    +    @classmethod
    +    def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment":
    +        raise NotImplementedError()
    +
    +    def get_distribution(self, name: str) -> Optional["BaseDistribution"]:
    +        """Given a requirement name, return the installed distributions.
    +
    +        The name may not be normalized. The implementation must canonicalize
    +        it for lookup.
    +        """
    +        raise NotImplementedError()
    +
    +    def _iter_distributions(self) -> Iterator["BaseDistribution"]:
    +        """Iterate through installed distributions.
    +
    +        This function should be implemented by subclass, but never called
    +        directly. Use the public ``iter_distribution()`` instead, which
    +        implements additional logic to make sure the distributions are valid.
    +        """
    +        raise NotImplementedError()
    +
    +    def iter_all_distributions(self) -> Iterator[BaseDistribution]:
    +        """Iterate through all installed distributions without any filtering."""
    +        for dist in self._iter_distributions():
    +            # Make sure the distribution actually comes from a valid Python
    +            # packaging distribution. Pip's AdjacentTempDirectory leaves folders
    +            # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The
    +            # valid project name pattern is taken from PEP 508.
    +            project_name_valid = re.match(
    +                r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$",
    +                dist.canonical_name,
    +                flags=re.IGNORECASE,
    +            )
    +            if not project_name_valid:
    +                logger.warning(
    +                    "Ignoring invalid distribution %s (%s)",
    +                    dist.canonical_name,
    +                    dist.location,
    +                )
    +                continue
    +            yield dist
    +
    +    def iter_installed_distributions(
    +        self,
    +        local_only: bool = True,
    +        skip: Container[str] = stdlib_pkgs,
    +        include_editables: bool = True,
    +        editables_only: bool = False,
    +        user_only: bool = False,
    +    ) -> Iterator[BaseDistribution]:
    +        """Return a list of installed distributions.
    +
    +        This is based on ``iter_all_distributions()`` with additional filtering
    +        options. Note that ``iter_installed_distributions()`` without arguments
    +        is *not* equal to ``iter_all_distributions()``, since some of the
    +        configurations exclude packages by default.
    +
    +        :param local_only: If True (default), only return installations
    +        local to the current virtualenv, if in a virtualenv.
    +        :param skip: An iterable of canonicalized project names to ignore;
    +            defaults to ``stdlib_pkgs``.
    +        :param include_editables: If False, don't report editables.
    +        :param editables_only: If True, only report editables.
    +        :param user_only: If True, only report installations in the user
    +        site directory.
    +        """
    +        it = self.iter_all_distributions()
    +        if local_only:
    +            it = (d for d in it if d.local)
    +        if not include_editables:
    +            it = (d for d in it if not d.editable)
    +        if editables_only:
    +            it = (d for d in it if d.editable)
    +        if user_only:
    +            it = (d for d in it if d.in_usersite)
    +        return (d for d in it if d.canonical_name not in skip)
    +
    +
    +class Wheel(Protocol):
    +    location: str
    +
    +    def as_zipfile(self) -> zipfile.ZipFile:
    +        raise NotImplementedError()
    +
    +
    +class FilesystemWheel(Wheel):
    +    def __init__(self, location: str) -> None:
    +        self.location = location
    +
    +    def as_zipfile(self) -> zipfile.ZipFile:
    +        return zipfile.ZipFile(self.location, allowZip64=True)
    +
    +
    +class MemoryWheel(Wheel):
    +    def __init__(self, location: str, stream: IO[bytes]) -> None:
    +        self.location = location
    +        self.stream = stream
    +
    +    def as_zipfile(self) -> zipfile.ZipFile:
    +        return zipfile.ZipFile(self.stream, allowZip64=True)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py
    new file mode 100644
    index 0000000..a779138
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py
    @@ -0,0 +1,6 @@
    +from ._dists import Distribution
    +from ._envs import Environment
    +
    +__all__ = ["NAME", "Distribution", "Environment"]
    +
    +NAME = "importlib"
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..f70c38a922733009753a4afa9271cb409f284f8a
    GIT binary patch
    literal 376
    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
    LBWIf)($fC}pN&~z
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..0674fb36de91d4234567d4f7178ab531c7e6ee30
    GIT binary patch
    literal 12583
    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 None:
    +        self.dist = dist
    +        self.reason = reason
    +
    +    def __str__(self) -> str:
    +        return f"Bad metadata in {self.dist} ({self.reason})"
    +
    +
    +class BasePath(Protocol):
    +    """A protocol that various path objects conform.
    +
    +    This exists because importlib.metadata uses both ``pathlib.Path`` and
    +    ``zipfile.Path``, and we need a common base for type hints (Union does not
    +    work well since ``zipfile.Path`` is too new for our linter setup).
    +
    +    This does not mean to be exhaustive, but only contains things that present
    +    in both classes *that we need*.
    +    """
    +
    +    @property
    +    def name(self) -> str:
    +        raise NotImplementedError()
    +
    +    @property
    +    def parent(self) -> "BasePath":
    +        raise NotImplementedError()
    +
    +
    +def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]:
    +    """Find the path to the distribution's metadata directory.
    +
    +    HACK: This relies on importlib.metadata's private ``_path`` attribute. Not
    +    all distributions exist on disk, so importlib.metadata is correct to not
    +    expose the attribute as public. But pip's code base is old and not as clean,
    +    so we do this to avoid having to rewrite too many things. Hopefully we can
    +    eliminate this some day.
    +    """
    +    return getattr(d, "_path", None)
    +
    +
    +def parse_name_and_version_from_info_directory(
    +    dist: importlib.metadata.Distribution,
    +) -> Tuple[Optional[str], Optional[str]]:
    +    """Get a name and version from the metadata directory name.
    +
    +    This is much faster than reading distribution metadata.
    +    """
    +    info_location = get_info_location(dist)
    +    if info_location is None:
    +        return None, None
    +
    +    stem, suffix = os.path.splitext(info_location.name)
    +    if suffix == ".dist-info":
    +        name, sep, version = stem.partition("-")
    +        if sep:
    +            return name, version
    +
    +    if suffix == ".egg-info":
    +        name = stem.split("-", 1)[0]
    +        return name, None
    +
    +    return None, None
    +
    +
    +def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> NormalizedName:
    +    """Get the distribution's normalized name.
    +
    +    The ``name`` attribute is only available in Python 3.10 or later. We are
    +    targeting exactly that, but Mypy does not know this.
    +    """
    +    if name := parse_name_and_version_from_info_directory(dist)[0]:
    +        return canonicalize_name(name)
    +
    +    name = cast(Any, dist).name
    +    if not isinstance(name, str):
    +        raise BadMetadata(dist, reason="invalid metadata entry 'name'")
    +    return canonicalize_name(name)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py
    new file mode 100644
    index 0000000..36cd326
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py
    @@ -0,0 +1,221 @@
    +import email.message
    +import importlib.metadata
    +import pathlib
    +import zipfile
    +from typing import (
    +    Collection,
    +    Dict,
    +    Iterable,
    +    Iterator,
    +    Mapping,
    +    Optional,
    +    Sequence,
    +    cast,
    +)
    +
    +from pip._vendor.packaging.requirements import Requirement
    +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
    +from pip._vendor.packaging.version import Version
    +from pip._vendor.packaging.version import parse as parse_version
    +
    +from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
    +from pip._internal.metadata.base import (
    +    BaseDistribution,
    +    BaseEntryPoint,
    +    InfoPath,
    +    Wheel,
    +)
    +from pip._internal.utils.misc import normalize_path
    +from pip._internal.utils.packaging import get_requirement
    +from pip._internal.utils.temp_dir import TempDirectory
    +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
    +
    +from ._compat import (
    +    BasePath,
    +    get_dist_canonical_name,
    +    parse_name_and_version_from_info_directory,
    +)
    +
    +
    +class WheelDistribution(importlib.metadata.Distribution):
    +    """An ``importlib.metadata.Distribution`` read from a wheel.
    +
    +    Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``,
    +    its implementation is too "lazy" for pip's needs (we can't keep the ZipFile
    +    handle open for the entire lifetime of the distribution object).
    +
    +    This implementation eagerly reads the entire metadata directory into the
    +    memory instead, and operates from that.
    +    """
    +
    +    def __init__(
    +        self,
    +        files: Mapping[pathlib.PurePosixPath, bytes],
    +        info_location: pathlib.PurePosixPath,
    +    ) -> None:
    +        self._files = files
    +        self.info_location = info_location
    +
    +    @classmethod
    +    def from_zipfile(
    +        cls,
    +        zf: zipfile.ZipFile,
    +        name: str,
    +        location: str,
    +    ) -> "WheelDistribution":
    +        info_dir, _ = parse_wheel(zf, name)
    +        paths = (
    +            (name, pathlib.PurePosixPath(name.split("/", 1)[-1]))
    +            for name in zf.namelist()
    +            if name.startswith(f"{info_dir}/")
    +        )
    +        files = {
    +            relpath: read_wheel_metadata_file(zf, fullpath)
    +            for fullpath, relpath in paths
    +        }
    +        info_location = pathlib.PurePosixPath(location, info_dir)
    +        return cls(files, info_location)
    +
    +    def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]:
    +        # Only allow iterating through the metadata directory.
    +        if pathlib.PurePosixPath(str(path)) in self._files:
    +            return iter(self._files)
    +        raise FileNotFoundError(path)
    +
    +    def read_text(self, filename: str) -> Optional[str]:
    +        try:
    +            data = self._files[pathlib.PurePosixPath(filename)]
    +        except KeyError:
    +            return None
    +        try:
    +            text = data.decode("utf-8")
    +        except UnicodeDecodeError as e:
    +            wheel = self.info_location.parent
    +            error = f"Error decoding metadata for {wheel}: {e} in {filename} file"
    +            raise UnsupportedWheel(error)
    +        return text
    +
    +
    +class Distribution(BaseDistribution):
    +    def __init__(
    +        self,
    +        dist: importlib.metadata.Distribution,
    +        info_location: Optional[BasePath],
    +        installed_location: Optional[BasePath],
    +    ) -> None:
    +        self._dist = dist
    +        self._info_location = info_location
    +        self._installed_location = installed_location
    +
    +    @classmethod
    +    def from_directory(cls, directory: str) -> BaseDistribution:
    +        info_location = pathlib.Path(directory)
    +        dist = importlib.metadata.Distribution.at(info_location)
    +        return cls(dist, info_location, info_location.parent)
    +
    +    @classmethod
    +    def from_metadata_file_contents(
    +        cls,
    +        metadata_contents: bytes,
    +        filename: str,
    +        project_name: str,
    +    ) -> BaseDistribution:
    +        # Generate temp dir to contain the metadata file, and write the file contents.
    +        temp_dir = pathlib.Path(
    +            TempDirectory(kind="metadata", globally_managed=True).path
    +        )
    +        metadata_path = temp_dir / "METADATA"
    +        metadata_path.write_bytes(metadata_contents)
    +        # Construct dist pointing to the newly created directory.
    +        dist = importlib.metadata.Distribution.at(metadata_path.parent)
    +        return cls(dist, metadata_path.parent, None)
    +
    +    @classmethod
    +    def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
    +        try:
    +            with wheel.as_zipfile() as zf:
    +                dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
    +        except zipfile.BadZipFile as e:
    +            raise InvalidWheel(wheel.location, name) from e
    +        return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
    +
    +    @property
    +    def location(self) -> Optional[str]:
    +        if self._info_location is None:
    +            return None
    +        return str(self._info_location.parent)
    +
    +    @property
    +    def info_location(self) -> Optional[str]:
    +        if self._info_location is None:
    +            return None
    +        return str(self._info_location)
    +
    +    @property
    +    def installed_location(self) -> Optional[str]:
    +        if self._installed_location is None:
    +            return None
    +        return normalize_path(str(self._installed_location))
    +
    +    @property
    +    def canonical_name(self) -> NormalizedName:
    +        return get_dist_canonical_name(self._dist)
    +
    +    @property
    +    def version(self) -> Version:
    +        if version := parse_name_and_version_from_info_directory(self._dist)[1]:
    +            return parse_version(version)
    +        return parse_version(self._dist.version)
    +
    +    @property
    +    def raw_version(self) -> str:
    +        return self._dist.version
    +
    +    def is_file(self, path: InfoPath) -> bool:
    +        return self._dist.read_text(str(path)) is not None
    +
    +    def iter_distutils_script_names(self) -> Iterator[str]:
    +        # A distutils installation is always "flat" (not in e.g. egg form), so
    +        # if this distribution's info location is NOT a pathlib.Path (but e.g.
    +        # zipfile.Path), it can never contain any distutils scripts.
    +        if not isinstance(self._info_location, pathlib.Path):
    +            return
    +        for child in self._info_location.joinpath("scripts").iterdir():
    +            yield child.name
    +
    +    def read_text(self, path: InfoPath) -> str:
    +        content = self._dist.read_text(str(path))
    +        if content is None:
    +            raise FileNotFoundError(path)
    +        return content
    +
    +    def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    +        # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint.
    +        return self._dist.entry_points
    +
    +    def _metadata_impl(self) -> email.message.Message:
    +        # From Python 3.10+, importlib.metadata declares PackageMetadata as the
    +        # return type. This protocol is unfortunately a disaster now and misses
    +        # a ton of fields that we need, including get() and get_payload(). We
    +        # rely on the implementation that the object is actually a Message now,
    +        # until upstream can improve the protocol. (python/cpython#94952)
    +        return cast(email.message.Message, self._dist.metadata)
    +
    +    def iter_provided_extras(self) -> Iterable[NormalizedName]:
    +        return [
    +            canonicalize_name(extra)
    +            for extra in self.metadata.get_all("Provides-Extra", [])
    +        ]
    +
    +    def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
    +        contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras]
    +        for req_string in self.metadata.get_all("Requires-Dist", []):
    +            # strip() because email.message.Message.get_all() may return a leading \n
    +            # in case a long header was wrapped.
    +            req = get_requirement(req_string.strip())
    +            if not req.marker:
    +                yield req
    +            elif not extras and req.marker.evaluate({"extra": ""}):
    +                yield req
    +            elif any(req.marker.evaluate(context) for context in contexts):
    +                yield req
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py
    new file mode 100644
    index 0000000..4d906fd
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py
    @@ -0,0 +1,189 @@
    +import functools
    +import importlib.metadata
    +import logging
    +import os
    +import pathlib
    +import sys
    +import zipfile
    +import zipimport
    +from typing import Iterator, List, Optional, Sequence, Set, Tuple
    +
    +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
    +
    +from pip._internal.metadata.base import BaseDistribution, BaseEnvironment
    +from pip._internal.models.wheel import Wheel
    +from pip._internal.utils.deprecation import deprecated
    +from pip._internal.utils.filetypes import WHEEL_EXTENSION
    +
    +from ._compat import BadMetadata, BasePath, get_dist_canonical_name, get_info_location
    +from ._dists import Distribution
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def _looks_like_wheel(location: str) -> bool:
    +    if not location.endswith(WHEEL_EXTENSION):
    +        return False
    +    if not os.path.isfile(location):
    +        return False
    +    if not Wheel.wheel_file_re.match(os.path.basename(location)):
    +        return False
    +    return zipfile.is_zipfile(location)
    +
    +
    +class _DistributionFinder:
    +    """Finder to locate distributions.
    +
    +    The main purpose of this class is to memoize found distributions' names, so
    +    only one distribution is returned for each package name. At lot of pip code
    +    assumes this (because it is setuptools's behavior), and not doing the same
    +    can potentially cause a distribution in lower precedence path to override a
    +    higher precedence one if the caller is not careful.
    +
    +    Eventually we probably want to make it possible to see lower precedence
    +    installations as well. It's useful feature, after all.
    +    """
    +
    +    FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]]
    +
    +    def __init__(self) -> None:
    +        self._found_names: Set[NormalizedName] = set()
    +
    +    def _find_impl(self, location: str) -> Iterator[FoundResult]:
    +        """Find distributions in a location."""
    +        # Skip looking inside a wheel. Since a package inside a wheel is not
    +        # always valid (due to .data directories etc.), its .dist-info entry
    +        # should not be considered an installed distribution.
    +        if _looks_like_wheel(location):
    +            return
    +        # To know exactly where we find a distribution, we have to feed in the
    +        # paths one by one, instead of dumping the list to importlib.metadata.
    +        for dist in importlib.metadata.distributions(path=[location]):
    +            info_location = get_info_location(dist)
    +            try:
    +                name = get_dist_canonical_name(dist)
    +            except BadMetadata as e:
    +                logger.warning("Skipping %s due to %s", info_location, e.reason)
    +                continue
    +            if name in self._found_names:
    +                continue
    +            self._found_names.add(name)
    +            yield dist, info_location
    +
    +    def find(self, location: str) -> Iterator[BaseDistribution]:
    +        """Find distributions in a location.
    +
    +        The path can be either a directory, or a ZIP archive.
    +        """
    +        for dist, info_location in self._find_impl(location):
    +            if info_location is None:
    +                installed_location: Optional[BasePath] = None
    +            else:
    +                installed_location = info_location.parent
    +            yield Distribution(dist, info_location, installed_location)
    +
    +    def find_linked(self, location: str) -> Iterator[BaseDistribution]:
    +        """Read location in egg-link files and return distributions in there.
    +
    +        The path should be a directory; otherwise this returns nothing. This
    +        follows how setuptools does this for compatibility. The first non-empty
    +        line in the egg-link is read as a path (resolved against the egg-link's
    +        containing directory if relative). Distributions found at that linked
    +        location are returned.
    +        """
    +        path = pathlib.Path(location)
    +        if not path.is_dir():
    +            return
    +        for child in path.iterdir():
    +            if child.suffix != ".egg-link":
    +                continue
    +            with child.open() as f:
    +                lines = (line.strip() for line in f)
    +                target_rel = next((line for line in lines if line), "")
    +            if not target_rel:
    +                continue
    +            target_location = str(path.joinpath(target_rel))
    +            for dist, info_location in self._find_impl(target_location):
    +                yield Distribution(dist, info_location, path)
    +
    +    def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]:
    +        from pip._vendor.pkg_resources import find_distributions
    +
    +        from pip._internal.metadata import pkg_resources as legacy
    +
    +        with os.scandir(location) as it:
    +            for entry in it:
    +                if not entry.name.endswith(".egg"):
    +                    continue
    +                for dist in find_distributions(entry.path):
    +                    yield legacy.Distribution(dist)
    +
    +    def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]:
    +        from pip._vendor.pkg_resources import find_eggs_in_zip
    +
    +        from pip._internal.metadata import pkg_resources as legacy
    +
    +        try:
    +            importer = zipimport.zipimporter(location)
    +        except zipimport.ZipImportError:
    +            return
    +        for dist in find_eggs_in_zip(importer, location):
    +            yield legacy.Distribution(dist)
    +
    +    def find_eggs(self, location: str) -> Iterator[BaseDistribution]:
    +        """Find eggs in a location.
    +
    +        This actually uses the old *pkg_resources* backend. We likely want to
    +        deprecate this so we can eventually remove the *pkg_resources*
    +        dependency entirely. Before that, this should first emit a deprecation
    +        warning for some versions when using the fallback since importing
    +        *pkg_resources* is slow for those who don't need it.
    +        """
    +        if os.path.isdir(location):
    +            yield from self._find_eggs_in_dir(location)
    +        if zipfile.is_zipfile(location):
    +            yield from self._find_eggs_in_zip(location)
    +
    +
    +@functools.lru_cache(maxsize=None)  # Warn a distribution exactly once.
    +def _emit_egg_deprecation(location: Optional[str]) -> None:
    +    deprecated(
    +        reason=f"Loading egg at {location} is deprecated.",
    +        replacement="to use pip for package installation",
    +        gone_in="25.1",
    +        issue=12330,
    +    )
    +
    +
    +class Environment(BaseEnvironment):
    +    def __init__(self, paths: Sequence[str]) -> None:
    +        self._paths = paths
    +
    +    @classmethod
    +    def default(cls) -> BaseEnvironment:
    +        return cls(sys.path)
    +
    +    @classmethod
    +    def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
    +        if paths is None:
    +            return cls(sys.path)
    +        return cls(paths)
    +
    +    def _iter_distributions(self) -> Iterator[BaseDistribution]:
    +        finder = _DistributionFinder()
    +        for location in self._paths:
    +            yield from finder.find(location)
    +            for dist in finder.find_eggs(location):
    +                _emit_egg_deprecation(dist.location)
    +                yield dist
    +            # This must go last because that's how pkg_resources tie-breaks.
    +            yield from finder.find_linked(location)
    +
    +    def get_distribution(self, name: str) -> Optional[BaseDistribution]:
    +        canonical_name = canonicalize_name(name)
    +        matches = (
    +            distribution
    +            for distribution in self.iter_all_distributions()
    +            if distribution.canonical_name == canonical_name
    +        )
    +        return next(matches, None)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py b/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
    new file mode 100644
    index 0000000..4ea84f9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
    @@ -0,0 +1,301 @@
    +import email.message
    +import email.parser
    +import logging
    +import os
    +import zipfile
    +from typing import (
    +    Collection,
    +    Iterable,
    +    Iterator,
    +    List,
    +    Mapping,
    +    NamedTuple,
    +    Optional,
    +)
    +
    +from pip._vendor import pkg_resources
    +from pip._vendor.packaging.requirements import Requirement
    +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
    +from pip._vendor.packaging.version import Version
    +from pip._vendor.packaging.version import parse as parse_version
    +
    +from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel
    +from pip._internal.utils.egg_link import egg_link_path_from_location
    +from pip._internal.utils.misc import display_path, normalize_path
    +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
    +
    +from .base import (
    +    BaseDistribution,
    +    BaseEntryPoint,
    +    BaseEnvironment,
    +    InfoPath,
    +    Wheel,
    +)
    +
    +__all__ = ["NAME", "Distribution", "Environment"]
    +
    +logger = logging.getLogger(__name__)
    +
    +NAME = "pkg_resources"
    +
    +
    +class EntryPoint(NamedTuple):
    +    name: str
    +    value: str
    +    group: str
    +
    +
    +class InMemoryMetadata:
    +    """IMetadataProvider that reads metadata files from a dictionary.
    +
    +    This also maps metadata decoding exceptions to our internal exception type.
    +    """
    +
    +    def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None:
    +        self._metadata = metadata
    +        self._wheel_name = wheel_name
    +
    +    def has_metadata(self, name: str) -> bool:
    +        return name in self._metadata
    +
    +    def get_metadata(self, name: str) -> str:
    +        try:
    +            return self._metadata[name].decode()
    +        except UnicodeDecodeError as e:
    +            # Augment the default error with the origin of the file.
    +            raise UnsupportedWheel(
    +                f"Error decoding metadata for {self._wheel_name}: {e} in {name} file"
    +            )
    +
    +    def get_metadata_lines(self, name: str) -> Iterable[str]:
    +        return pkg_resources.yield_lines(self.get_metadata(name))
    +
    +    def metadata_isdir(self, name: str) -> bool:
    +        return False
    +
    +    def metadata_listdir(self, name: str) -> List[str]:
    +        return []
    +
    +    def run_script(self, script_name: str, namespace: str) -> None:
    +        pass
    +
    +
    +class Distribution(BaseDistribution):
    +    def __init__(self, dist: pkg_resources.Distribution) -> None:
    +        self._dist = dist
    +        # This is populated lazily, to avoid loading metadata for all possible
    +        # distributions eagerly.
    +        self.__extra_mapping: Optional[Mapping[NormalizedName, str]] = None
    +
    +    @property
    +    def _extra_mapping(self) -> Mapping[NormalizedName, str]:
    +        if self.__extra_mapping is None:
    +            self.__extra_mapping = {
    +                canonicalize_name(extra): extra for extra in self._dist.extras
    +            }
    +
    +        return self.__extra_mapping
    +
    +    @classmethod
    +    def from_directory(cls, directory: str) -> BaseDistribution:
    +        dist_dir = directory.rstrip(os.sep)
    +
    +        # Build a PathMetadata object, from path to metadata. :wink:
    +        base_dir, dist_dir_name = os.path.split(dist_dir)
    +        metadata = pkg_resources.PathMetadata(base_dir, dist_dir)
    +
    +        # Determine the correct Distribution object type.
    +        if dist_dir.endswith(".egg-info"):
    +            dist_cls = pkg_resources.Distribution
    +            dist_name = os.path.splitext(dist_dir_name)[0]
    +        else:
    +            assert dist_dir.endswith(".dist-info")
    +            dist_cls = pkg_resources.DistInfoDistribution
    +            dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0]
    +
    +        dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata)
    +        return cls(dist)
    +
    +    @classmethod
    +    def from_metadata_file_contents(
    +        cls,
    +        metadata_contents: bytes,
    +        filename: str,
    +        project_name: str,
    +    ) -> BaseDistribution:
    +        metadata_dict = {
    +            "METADATA": metadata_contents,
    +        }
    +        dist = pkg_resources.DistInfoDistribution(
    +            location=filename,
    +            metadata=InMemoryMetadata(metadata_dict, filename),
    +            project_name=project_name,
    +        )
    +        return cls(dist)
    +
    +    @classmethod
    +    def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
    +        try:
    +            with wheel.as_zipfile() as zf:
    +                info_dir, _ = parse_wheel(zf, name)
    +                metadata_dict = {
    +                    path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path)
    +                    for path in zf.namelist()
    +                    if path.startswith(f"{info_dir}/")
    +                }
    +        except zipfile.BadZipFile as e:
    +            raise InvalidWheel(wheel.location, name) from e
    +        except UnsupportedWheel as e:
    +            raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
    +        dist = pkg_resources.DistInfoDistribution(
    +            location=wheel.location,
    +            metadata=InMemoryMetadata(metadata_dict, wheel.location),
    +            project_name=name,
    +        )
    +        return cls(dist)
    +
    +    @property
    +    def location(self) -> Optional[str]:
    +        return self._dist.location
    +
    +    @property
    +    def installed_location(self) -> Optional[str]:
    +        egg_link = egg_link_path_from_location(self.raw_name)
    +        if egg_link:
    +            location = egg_link
    +        elif self.location:
    +            location = self.location
    +        else:
    +            return None
    +        return normalize_path(location)
    +
    +    @property
    +    def info_location(self) -> Optional[str]:
    +        return self._dist.egg_info
    +
    +    @property
    +    def installed_by_distutils(self) -> bool:
    +        # A distutils-installed distribution is provided by FileMetadata. This
    +        # provider has a "path" attribute not present anywhere else. Not the
    +        # best introspection logic, but pip has been doing this for a long time.
    +        try:
    +            return bool(self._dist._provider.path)
    +        except AttributeError:
    +            return False
    +
    +    @property
    +    def canonical_name(self) -> NormalizedName:
    +        return canonicalize_name(self._dist.project_name)
    +
    +    @property
    +    def version(self) -> Version:
    +        return parse_version(self._dist.version)
    +
    +    @property
    +    def raw_version(self) -> str:
    +        return self._dist.version
    +
    +    def is_file(self, path: InfoPath) -> bool:
    +        return self._dist.has_metadata(str(path))
    +
    +    def iter_distutils_script_names(self) -> Iterator[str]:
    +        yield from self._dist.metadata_listdir("scripts")
    +
    +    def read_text(self, path: InfoPath) -> str:
    +        name = str(path)
    +        if not self._dist.has_metadata(name):
    +            raise FileNotFoundError(name)
    +        content = self._dist.get_metadata(name)
    +        if content is None:
    +            raise NoneMetadataError(self, name)
    +        return content
    +
    +    def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    +        for group, entries in self._dist.get_entry_map().items():
    +            for name, entry_point in entries.items():
    +                name, _, value = str(entry_point).partition("=")
    +                yield EntryPoint(name=name.strip(), value=value.strip(), group=group)
    +
    +    def _metadata_impl(self) -> email.message.Message:
    +        """
    +        :raises NoneMetadataError: if the distribution reports `has_metadata()`
    +            True but `get_metadata()` returns None.
    +        """
    +        if isinstance(self._dist, pkg_resources.DistInfoDistribution):
    +            metadata_name = "METADATA"
    +        else:
    +            metadata_name = "PKG-INFO"
    +        try:
    +            metadata = self.read_text(metadata_name)
    +        except FileNotFoundError:
    +            if self.location:
    +                displaying_path = display_path(self.location)
    +            else:
    +                displaying_path = repr(self.location)
    +            logger.warning("No metadata found in %s", displaying_path)
    +            metadata = ""
    +        feed_parser = email.parser.FeedParser()
    +        feed_parser.feed(metadata)
    +        return feed_parser.close()
    +
    +    def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
    +        if extras:
    +            relevant_extras = set(self._extra_mapping) & set(
    +                map(canonicalize_name, extras)
    +            )
    +            extras = [self._extra_mapping[extra] for extra in relevant_extras]
    +        return self._dist.requires(extras)
    +
    +    def iter_provided_extras(self) -> Iterable[NormalizedName]:
    +        return self._extra_mapping.keys()
    +
    +
    +class Environment(BaseEnvironment):
    +    def __init__(self, ws: pkg_resources.WorkingSet) -> None:
    +        self._ws = ws
    +
    +    @classmethod
    +    def default(cls) -> BaseEnvironment:
    +        return cls(pkg_resources.working_set)
    +
    +    @classmethod
    +    def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
    +        return cls(pkg_resources.WorkingSet(paths))
    +
    +    def _iter_distributions(self) -> Iterator[BaseDistribution]:
    +        for dist in self._ws:
    +            yield Distribution(dist)
    +
    +    def _search_distribution(self, name: str) -> Optional[BaseDistribution]:
    +        """Find a distribution matching the ``name`` in the environment.
    +
    +        This searches from *all* distributions available in the environment, to
    +        match the behavior of ``pkg_resources.get_distribution()``.
    +        """
    +        canonical_name = canonicalize_name(name)
    +        for dist in self.iter_all_distributions():
    +            if dist.canonical_name == canonical_name:
    +                return dist
    +        return None
    +
    +    def get_distribution(self, name: str) -> Optional[BaseDistribution]:
    +        # Search the distribution by looking through the working set.
    +        dist = self._search_distribution(name)
    +        if dist:
    +            return dist
    +
    +        # If distribution could not be found, call working_set.require to
    +        # update the working set, and try to find the distribution again.
    +        # This might happen for e.g. when you install a package twice, once
    +        # using setup.py develop and again using setup.py install. Now when
    +        # running pip uninstall twice, the package gets removed from the
    +        # working set in the first uninstall, so we have to populate the
    +        # working set again so that pip knows about it and the packages gets
    +        # picked up and is successfully uninstalled the second time too.
    +        try:
    +            # We didn't pass in any version specifiers, so this can never
    +            # raise pkg_resources.VersionConflict.
    +            self._ws.require(name)
    +        except pkg_resources.DistributionNotFound:
    +            return None
    +        return self._search_distribution(name)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/models/__init__.py
    new file mode 100644
    index 0000000..7855226
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/__init__.py
    @@ -0,0 +1,2 @@
    +"""A package that contains models that represent entities.
    +"""
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..b1421296d7126d3d799221a9a21c4b82c3df43df
    GIT binary patch
    literal 284
    zcmXv~%}N774BlyrmO|fQu08CgwHFVfh!s8Qy$Hi}H+BbiewfJ$>x=jdK8tVAt1lq-
    z=E*FrfspU}Ajy|}PN$QM<5oRwueg5ootO>Y&aY+A<%`~;q*{|K
    zy(4X0lGaz)q=OhSL`>*NavCz2ipj%F>`s-ce5uq&w(rOPMyS0-ux+ia)fKFK*;;N%
    zaA)Yg-N0f#&sVxj`Qvkb!wUf2D>P;Up`+TnWwAJeWC-)4rv$+SP{t8PryDq!0>z3U
    hrHat)#uqHM4PM3*w$PuM`Y(JBg%CdjAx3e;^bZJyQxpII
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..4be42f5df061c5b594b39f95ac969aa811e5b263
    GIT binary patch
    literal 1622
    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
    h=N2xOz$teP
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..aa32721e6ab98ca062d69d80a8fa8cec43866788
    GIT binary patch
    literal 2295
    zcmZ`4OKenC^uEvhJIv4zbXunwpcIGFzE-RVj>d*6#YHvLG-S}cJm%fD)4tDe?;CKM
    z))2#@3lnu=XalCijSv^cXwkM*70Bk(7IiekI0GAt1aqZ=cZdf=4Px^wAXgDa
    zc|k{cQ5Ud;IyihpsX+kA-1VI*~yAbrr4My
    zP&Gukp-krA1!dYcv0|2|HPh5|WyCI&c}l2qs_2ZC&ntri1AQY}h4#HW*>}>`u>#3e
    zjN*BvRB@(l>uCSrOA0MIxUZxYX0<6yl~S>!fCCODmS!j>>@ld)aL5f7qT|u_mntl*
    zf@aZC)w#|_S+=C3-xuY-$UA+7N5Jb#%;(hU-P0a=iL7|$_B>f
    z+Q#gRZeOwtThpP!lXhm(CYiUh0TzFT%_2pr>QF_v${ej|)-2Xpg!ezD4xnKZJDRRJ
    z8cRN5s`w*^XfzuoZEz+FIX2iRIAjl}WTR-!lD!;_mnkMHEtg70k(-*r4k%KG#eJjh
    zJ{I)su^@%E#5$ia1%ncP#h64erM&i;Ook*lr*-S?QX6N_9ongXw_HPCk(Z6G0Jx0q
    zCt7NWed~#RYvJLwgC|yBUhP>sFuVaoVqd)pb?vXEm1tWQ4Y>d1QP$ZFY@*HXRJR4-_x(kt=h__ai>eW=<#^zcw?BDyHm
    z52L1JEtX!7rEhe9)BAPrpFKxzzW?pHTjw@MJYh*PK_eh6)}0HbOq;O}_)pBMZl`a=A)O$O}+
    z!SRRila|)S>+(3r1Xq3uUV$+t3}$5(YRq;PgSq1mdKPMAp2fDl1v24w2`>TZ=78VN
    ztVsBEajV^!if)}rCvfLFb|`D3gYlW-T|do}1W|#P(gkq0v{a*a0S&xA#md6*|k?jt9_?85fIQ!!QFMSBha$;;)yzf|EhE6U#H?{$O0Pke)>V|V(Cf^`K
    mz~jwLy8zTBK@fgNJyq260KNVIb^eBOe+LyI`UnAV_x}egVJ6}L
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..541e6a6ef0acbfc8c5bf471b1d7114cf51613f8d
    GIT binary patch
    literal 26635
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..f46498a13d3795fab3b7f0fac53313eb0f845696
    GIT binary patch
    literal 1041
    zcmZWoOKTKC5bl|MX4g#=eB|JvQ9%~WwvU^LqDeI36QTzfq3KN5?ljI!kKMhAo0DL?
    zd-Lv1;xF(oc=aH259h#iGJiU}783H^2m4l=
    zg1r?4Z;2#*A_EyFK^peMfDDPOybJo3kU%J_A8OmdBtIm#h^%iB+1SPty=_kx(yxx2
    z-I>jgt()3VH_pLQVXcmoa3JZ1axqnzbs|ZGQ#zwIiXjEtYn26p4j}_05~|n1tSi`{
    zdO*dxP>EPeU_YCROi~wvGBnbegBR``wE(Tyx!hi6OzOz?^0A9`*3)LlF0tu1ah33*
    z7rQh$EfNPN!?qUwZm8G#;cwCniWw=Kh!X6+TPqql_M50R1S10_h(Sm&wrJSMsNC72
    z>I)uWWqn}uCS=i+l5(j`gDKHK`T>$1K1RCx6{z-WP=|&LuV7k
    zZ5H*_lE6)OolX#qbs{azg^MlSh*cC*VStV-(l4xMjjjm`R4N0J(?;Qh2HLbJnlMfc
    zMCAUTnV=6#I`Q1-nHWN^%r{kR!*~sux_1rln&|FhXHCvCkpkyMi}O^=QR49-&YzD&
    zGJVtF9A|~w?bXGV<$KHg&hnGhVuo{@XlHT1Vx1}GI2T!_U8xw{eNXoA8{~J+Vx0m@
    zN3lp#A=#3SMk!>@vRlfnjMmtN^XC_q#Mmx87%VJm2@JAzhQnhMZCvVIxX7$R1x#;c
    zS*~)%6-o+~kudBU63ZqUMM0Uizo2&=eC%0tugPvTtTlI<>MT-p?^dJt|9%`_$%@34d43Jcj-sv=`CsRDvMb4QoO5
    n=PU_MeVe`Uvb|d;Vf)RQ&%udbVLO=JA?WrhB%I&%VR_~sEFLD(
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..72e515215d9038f134b5104f0ef683ab75c0a5c9
    GIT binary patch
    literal 5005
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..5d6fe3c43abfa7d80363057c9c6c4f9349fca02f
    GIT binary patch
    literal 1869
    zcmZ`)&1)M+6rYu}vLs7xQ<4yWGLf6s8!WBulG2*EQ2deRqL`FY5QSy5GqSecol$01
    zb`@0c!H4_@zP3Fz^iSy}g%-p@X`uAbn-UiaJ@w75WLeZ5v2Wg+nK$$1_j_;jW2sa?
    z&~}|K4t|?L=yz?5T4t!6uYq!gD58ds0;6siT2J|@AYD%zD1{y%nm$D|^Fu1}sAsyS
    zmHks2mJ#J1wL?#E;)7n=6EYy-w&0-@zMCvhWNB!e*FZT#4Al*a>M3f}(+6=b$k*sg~JxZF5%RpU}81$!tJpeZVHL1IOe_})Z+*7Cg6fSu0rDbFoc_)
    z&r~&@d2U8U7!}7(m+(VIqZ^3@(t%wi96=OQ(F|-0*f?$iPE<;cbQ&HfvK!s>4!Dra
    zk?cvwlT117ZrBpMCUbCmnb$&7DW|n4f{3z`g&oP=EEuDv8A`)<{usm=>X|1gn)=%8
    z89n5T)}USrEMsK$(qIjlMW~knOYac3o(a|{Pf*ve(&QMHZcC=oBls%Rv1oh=R8$Kw
    zI+}pZHjyO2mqFUZpSKurArmBVKqNqiiNXnpc*Wx}SBi1PE_Twpi6-9P-N*Mn+^{f_
    z47ZsKyf6gsP~gTTc2!K|khFxWOVLcSv57y%6S+IQ1%_0p3C^ncGnJe$q;Dc5omAsg
    zf&i81NEbpQ?jbpVtg~^#@_6L9#W;q&ATPsFj_K%h)7yERvahhtI>@)fVXEoLA(#`%
    zGe#32NM^tl3!kpyMkmBa#P_rsXWB&M)KeiAN5BKYoE?t>*Tero?CJ!aI6GMa!Mh@8
    zlhAAUliZab53{?nA7^)2ht>grfbHa-c!xC!U;>pY@E-9M8^=-GlkkQiD;s41?dJbh
    zhSC+GvBLPDuH6y=vx82H1OcJ;j&M5x%
    zG(88=st-V%puq|%mS0R;{X2JG6w5CcR-R>k&dv7kZ0f$;Us~1ue1Gw-?&tdN+<%t&
    zCAWMIzR1e#)%I#uULVUzz#JzkI1WVD@wHxboF^UP4`-$vhYA;l^Nyo@5h_qK4IzA~
    zOJC}Wm)Af%NAfMLzo~^rH5U3sQWV4~dX-9>xz~m4wd~2m!4i6RwZHLxe`&eDe(zOj
    z-rRb5b8cWlKgc5d_FzhDIW&9wo5i1Q*@L_`3+UFuU|MTMbldv=`nNL!?Kqf0g_*zJ
    z04)hXpIx)eC>wU$P%d$p(K0Ymy?Bp(S==zUie4QwFKLO_>xd0RTIaD`5
    Y4AO>S{EFuPKwEzoD#q4p1R{3(7aRK#8UO$Q
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..cd39c73d5e9bf96acc4978771e16407019f07d9c
    GIT binary patch
    literal 4971
    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 None:
    +        object.__setattr__(self, "name", name)
    +        object.__setattr__(self, "version", parse_version(version))
    +        object.__setattr__(self, "link", link)
    +
    +    def __str__(self) -> str:
    +        return f"{self.name!r} candidate (version {self.version} at {self.link})"
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py b/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
    new file mode 100644
    index 0000000..fc5ec8d
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
    @@ -0,0 +1,224 @@
    +""" PEP 610 """
    +
    +import json
    +import re
    +import urllib.parse
    +from dataclasses import dataclass
    +from typing import Any, ClassVar, Dict, Iterable, Optional, Type, TypeVar, Union
    +
    +__all__ = [
    +    "DirectUrl",
    +    "DirectUrlValidationError",
    +    "DirInfo",
    +    "ArchiveInfo",
    +    "VcsInfo",
    +]
    +
    +T = TypeVar("T")
    +
    +DIRECT_URL_METADATA_NAME = "direct_url.json"
    +ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$")
    +
    +
    +class DirectUrlValidationError(Exception):
    +    pass
    +
    +
    +def _get(
    +    d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
    +) -> Optional[T]:
    +    """Get value from dictionary and verify expected type."""
    +    if key not in d:
    +        return default
    +    value = d[key]
    +    if not isinstance(value, expected_type):
    +        raise DirectUrlValidationError(
    +            f"{value!r} has unexpected type for {key} (expected {expected_type})"
    +        )
    +    return value
    +
    +
    +def _get_required(
    +    d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
    +) -> T:
    +    value = _get(d, expected_type, key, default)
    +    if value is None:
    +        raise DirectUrlValidationError(f"{key} must have a value")
    +    return value
    +
    +
    +def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType":
    +    infos = [info for info in infos if info is not None]
    +    if not infos:
    +        raise DirectUrlValidationError(
    +            "missing one of archive_info, dir_info, vcs_info"
    +        )
    +    if len(infos) > 1:
    +        raise DirectUrlValidationError(
    +            "more than one of archive_info, dir_info, vcs_info"
    +        )
    +    assert infos[0] is not None
    +    return infos[0]
    +
    +
    +def _filter_none(**kwargs: Any) -> Dict[str, Any]:
    +    """Make dict excluding None values."""
    +    return {k: v for k, v in kwargs.items() if v is not None}
    +
    +
    +@dataclass
    +class VcsInfo:
    +    name: ClassVar = "vcs_info"
    +
    +    vcs: str
    +    commit_id: str
    +    requested_revision: Optional[str] = None
    +
    +    @classmethod
    +    def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]:
    +        if d is None:
    +            return None
    +        return cls(
    +            vcs=_get_required(d, str, "vcs"),
    +            commit_id=_get_required(d, str, "commit_id"),
    +            requested_revision=_get(d, str, "requested_revision"),
    +        )
    +
    +    def _to_dict(self) -> Dict[str, Any]:
    +        return _filter_none(
    +            vcs=self.vcs,
    +            requested_revision=self.requested_revision,
    +            commit_id=self.commit_id,
    +        )
    +
    +
    +class ArchiveInfo:
    +    name = "archive_info"
    +
    +    def __init__(
    +        self,
    +        hash: Optional[str] = None,
    +        hashes: Optional[Dict[str, str]] = None,
    +    ) -> None:
    +        # set hashes before hash, since the hash setter will further populate hashes
    +        self.hashes = hashes
    +        self.hash = hash
    +
    +    @property
    +    def hash(self) -> Optional[str]:
    +        return self._hash
    +
    +    @hash.setter
    +    def hash(self, value: Optional[str]) -> None:
    +        if value is not None:
    +            # Auto-populate the hashes key to upgrade to the new format automatically.
    +            # We don't back-populate the legacy hash key from hashes.
    +            try:
    +                hash_name, hash_value = value.split("=", 1)
    +            except ValueError:
    +                raise DirectUrlValidationError(
    +                    f"invalid archive_info.hash format: {value!r}"
    +                )
    +            if self.hashes is None:
    +                self.hashes = {hash_name: hash_value}
    +            elif hash_name not in self.hashes:
    +                self.hashes = self.hashes.copy()
    +                self.hashes[hash_name] = hash_value
    +        self._hash = value
    +
    +    @classmethod
    +    def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]:
    +        if d is None:
    +            return None
    +        return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes"))
    +
    +    def _to_dict(self) -> Dict[str, Any]:
    +        return _filter_none(hash=self.hash, hashes=self.hashes)
    +
    +
    +@dataclass
    +class DirInfo:
    +    name: ClassVar = "dir_info"
    +
    +    editable: bool = False
    +
    +    @classmethod
    +    def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]:
    +        if d is None:
    +            return None
    +        return cls(editable=_get_required(d, bool, "editable", default=False))
    +
    +    def _to_dict(self) -> Dict[str, Any]:
    +        return _filter_none(editable=self.editable or None)
    +
    +
    +InfoType = Union[ArchiveInfo, DirInfo, VcsInfo]
    +
    +
    +@dataclass
    +class DirectUrl:
    +    url: str
    +    info: InfoType
    +    subdirectory: Optional[str] = None
    +
    +    def _remove_auth_from_netloc(self, netloc: str) -> str:
    +        if "@" not in netloc:
    +            return netloc
    +        user_pass, netloc_no_user_pass = netloc.split("@", 1)
    +        if (
    +            isinstance(self.info, VcsInfo)
    +            and self.info.vcs == "git"
    +            and user_pass == "git"
    +        ):
    +            return netloc
    +        if ENV_VAR_RE.match(user_pass):
    +            return netloc
    +        return netloc_no_user_pass
    +
    +    @property
    +    def redacted_url(self) -> str:
    +        """url with user:password part removed unless it is formed with
    +        environment variables as specified in PEP 610, or it is ``git``
    +        in the case of a git URL.
    +        """
    +        purl = urllib.parse.urlsplit(self.url)
    +        netloc = self._remove_auth_from_netloc(purl.netloc)
    +        surl = urllib.parse.urlunsplit(
    +            (purl.scheme, netloc, purl.path, purl.query, purl.fragment)
    +        )
    +        return surl
    +
    +    def validate(self) -> None:
    +        self.from_dict(self.to_dict())
    +
    +    @classmethod
    +    def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl":
    +        return DirectUrl(
    +            url=_get_required(d, str, "url"),
    +            subdirectory=_get(d, str, "subdirectory"),
    +            info=_exactly_one_of(
    +                [
    +                    ArchiveInfo._from_dict(_get(d, dict, "archive_info")),
    +                    DirInfo._from_dict(_get(d, dict, "dir_info")),
    +                    VcsInfo._from_dict(_get(d, dict, "vcs_info")),
    +                ]
    +            ),
    +        )
    +
    +    def to_dict(self) -> Dict[str, Any]:
    +        res = _filter_none(
    +            url=self.redacted_url,
    +            subdirectory=self.subdirectory,
    +        )
    +        res[self.info.name] = self.info._to_dict()
    +        return res
    +
    +    @classmethod
    +    def from_json(cls, s: str) -> "DirectUrl":
    +        return cls.from_dict(json.loads(s))
    +
    +    def to_json(self) -> str:
    +        return json.dumps(self.to_dict(), sort_keys=True)
    +
    +    def is_local_editable(self) -> bool:
    +        return isinstance(self.info, DirInfo) and self.info.editable
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/format_control.py b/env/lib/python3.12/site-packages/pip/_internal/models/format_control.py
    new file mode 100644
    index 0000000..ccd1127
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/format_control.py
    @@ -0,0 +1,78 @@
    +from typing import FrozenSet, Optional, Set
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.exceptions import CommandError
    +
    +
    +class FormatControl:
    +    """Helper for managing formats from which a package can be installed."""
    +
    +    __slots__ = ["no_binary", "only_binary"]
    +
    +    def __init__(
    +        self,
    +        no_binary: Optional[Set[str]] = None,
    +        only_binary: Optional[Set[str]] = None,
    +    ) -> None:
    +        if no_binary is None:
    +            no_binary = set()
    +        if only_binary is None:
    +            only_binary = set()
    +
    +        self.no_binary = no_binary
    +        self.only_binary = only_binary
    +
    +    def __eq__(self, other: object) -> bool:
    +        if not isinstance(other, self.__class__):
    +            return NotImplemented
    +
    +        if self.__slots__ != other.__slots__:
    +            return False
    +
    +        return all(getattr(self, k) == getattr(other, k) for k in self.__slots__)
    +
    +    def __repr__(self) -> str:
    +        return f"{self.__class__.__name__}({self.no_binary}, {self.only_binary})"
    +
    +    @staticmethod
    +    def handle_mutual_excludes(value: str, target: Set[str], other: Set[str]) -> None:
    +        if value.startswith("-"):
    +            raise CommandError(
    +                "--no-binary / --only-binary option requires 1 argument."
    +            )
    +        new = value.split(",")
    +        while ":all:" in new:
    +            other.clear()
    +            target.clear()
    +            target.add(":all:")
    +            del new[: new.index(":all:") + 1]
    +            # Without a none, we want to discard everything as :all: covers it
    +            if ":none:" not in new:
    +                return
    +        for name in new:
    +            if name == ":none:":
    +                target.clear()
    +                continue
    +            name = canonicalize_name(name)
    +            other.discard(name)
    +            target.add(name)
    +
    +    def get_allowed_formats(self, canonical_name: str) -> FrozenSet[str]:
    +        result = {"binary", "source"}
    +        if canonical_name in self.only_binary:
    +            result.discard("source")
    +        elif canonical_name in self.no_binary:
    +            result.discard("binary")
    +        elif ":all:" in self.only_binary:
    +            result.discard("source")
    +        elif ":all:" in self.no_binary:
    +            result.discard("binary")
    +        return frozenset(result)
    +
    +    def disallow_binaries(self) -> None:
    +        self.handle_mutual_excludes(
    +            ":all:",
    +            self.no_binary,
    +            self.only_binary,
    +        )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/index.py b/env/lib/python3.12/site-packages/pip/_internal/models/index.py
    new file mode 100644
    index 0000000..b94c325
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/index.py
    @@ -0,0 +1,28 @@
    +import urllib.parse
    +
    +
    +class PackageIndex:
    +    """Represents a Package Index and provides easier access to endpoints"""
    +
    +    __slots__ = ["url", "netloc", "simple_url", "pypi_url", "file_storage_domain"]
    +
    +    def __init__(self, url: str, file_storage_domain: str) -> None:
    +        super().__init__()
    +        self.url = url
    +        self.netloc = urllib.parse.urlsplit(url).netloc
    +        self.simple_url = self._url_for_path("simple")
    +        self.pypi_url = self._url_for_path("pypi")
    +
    +        # This is part of a temporary hack used to block installs of PyPI
    +        # packages which depend on external urls only necessary until PyPI can
    +        # block such packages themselves
    +        self.file_storage_domain = file_storage_domain
    +
    +    def _url_for_path(self, path: str) -> str:
    +        return urllib.parse.urljoin(self.url, path)
    +
    +
    +PyPI = PackageIndex("https://pypi.org/", file_storage_domain="files.pythonhosted.org")
    +TestPyPI = PackageIndex(
    +    "https://test.pypi.org/", file_storage_domain="test-files.pythonhosted.org"
    +)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/installation_report.py b/env/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
    new file mode 100644
    index 0000000..b9c6330
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
    @@ -0,0 +1,56 @@
    +from typing import Any, Dict, Sequence
    +
    +from pip._vendor.packaging.markers import default_environment
    +
    +from pip import __version__
    +from pip._internal.req.req_install import InstallRequirement
    +
    +
    +class InstallationReport:
    +    def __init__(self, install_requirements: Sequence[InstallRequirement]):
    +        self._install_requirements = install_requirements
    +
    +    @classmethod
    +    def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]:
    +        assert ireq.download_info, f"No download_info for {ireq}"
    +        res = {
    +            # PEP 610 json for the download URL. download_info.archive_info.hashes may
    +            # be absent when the requirement was installed from the wheel cache
    +            # and the cache entry was populated by an older pip version that did not
    +            # record origin.json.
    +            "download_info": ireq.download_info.to_dict(),
    +            # is_direct is true if the requirement was a direct URL reference (which
    +            # includes editable requirements), and false if the requirement was
    +            # downloaded from a PEP 503 index or --find-links.
    +            "is_direct": ireq.is_direct,
    +            # is_yanked is true if the requirement was yanked from the index, but
    +            # was still selected by pip to conform to PEP 592.
    +            "is_yanked": ireq.link.is_yanked if ireq.link else False,
    +            # requested is true if the requirement was specified by the user (aka
    +            # top level requirement), and false if it was installed as a dependency of a
    +            # requirement. https://peps.python.org/pep-0376/#requested
    +            "requested": ireq.user_supplied,
    +            # PEP 566 json encoding for metadata
    +            # https://www.python.org/dev/peps/pep-0566/#json-compatible-metadata
    +            "metadata": ireq.get_dist().metadata_dict,
    +        }
    +        if ireq.user_supplied and ireq.extras:
    +            # For top level requirements, the list of requested extras, if any.
    +            res["requested_extras"] = sorted(ireq.extras)
    +        return res
    +
    +    def to_dict(self) -> Dict[str, Any]:
    +        return {
    +            "version": "1",
    +            "pip_version": __version__,
    +            "install": [
    +                self._install_req_to_dict(ireq) for ireq in self._install_requirements
    +            ],
    +            # https://peps.python.org/pep-0508/#environment-markers
    +            # TODO: currently, the resolver uses the default environment to evaluate
    +            # environment markers, so that is what we report here. In the future, it
    +            # should also take into account options such as --python-version or
    +            # --platform, perhaps under the form of an environment_override field?
    +            # https://github.com/pypa/pip/issues/11198
    +            "environment": default_environment(),
    +        }
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/link.py b/env/lib/python3.12/site-packages/pip/_internal/models/link.py
    new file mode 100644
    index 0000000..2f41f2f
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/link.py
    @@ -0,0 +1,590 @@
    +import functools
    +import itertools
    +import logging
    +import os
    +import posixpath
    +import re
    +import urllib.parse
    +from dataclasses import dataclass
    +from typing import (
    +    TYPE_CHECKING,
    +    Any,
    +    Dict,
    +    List,
    +    Mapping,
    +    NamedTuple,
    +    Optional,
    +    Tuple,
    +    Union,
    +)
    +
    +from pip._internal.utils.deprecation import deprecated
    +from pip._internal.utils.filetypes import WHEEL_EXTENSION
    +from pip._internal.utils.hashes import Hashes
    +from pip._internal.utils.misc import (
    +    pairwise,
    +    redact_auth_from_url,
    +    split_auth_from_netloc,
    +    splitext,
    +)
    +from pip._internal.utils.urls import path_to_url, url_to_path
    +
    +if TYPE_CHECKING:
    +    from pip._internal.index.collector import IndexContent
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +# Order matters, earlier hashes have a precedence over later hashes for what
    +# we will pick to use.
    +_SUPPORTED_HASHES = ("sha512", "sha384", "sha256", "sha224", "sha1", "md5")
    +
    +
    +@dataclass(frozen=True)
    +class LinkHash:
    +    """Links to content may have embedded hash values. This class parses those.
    +
    +    `name` must be any member of `_SUPPORTED_HASHES`.
    +
    +    This class can be converted to and from `ArchiveInfo`. While ArchiveInfo intends to
    +    be JSON-serializable to conform to PEP 610, this class contains the logic for
    +    parsing a hash name and value for correctness, and then checking whether that hash
    +    conforms to a schema with `.is_hash_allowed()`."""
    +
    +    name: str
    +    value: str
    +
    +    _hash_url_fragment_re = re.compile(
    +        # NB: we do not validate that the second group (.*) is a valid hex
    +        # digest. Instead, we simply keep that string in this class, and then check it
    +        # against Hashes when hash-checking is needed. This is easier to debug than
    +        # proactively discarding an invalid hex digest, as we handle incorrect hashes
    +        # and malformed hashes in the same place.
    +        r"[#&]({choices})=([^&]*)".format(
    +            choices="|".join(re.escape(hash_name) for hash_name in _SUPPORTED_HASHES)
    +        ),
    +    )
    +
    +    def __post_init__(self) -> None:
    +        assert self.name in _SUPPORTED_HASHES
    +
    +    @classmethod
    +    @functools.lru_cache(maxsize=None)
    +    def find_hash_url_fragment(cls, url: str) -> Optional["LinkHash"]:
    +        """Search a string for a checksum algorithm name and encoded output value."""
    +        match = cls._hash_url_fragment_re.search(url)
    +        if match is None:
    +            return None
    +        name, value = match.groups()
    +        return cls(name=name, value=value)
    +
    +    def as_dict(self) -> Dict[str, str]:
    +        return {self.name: self.value}
    +
    +    def as_hashes(self) -> Hashes:
    +        """Return a Hashes instance which checks only for the current hash."""
    +        return Hashes({self.name: [self.value]})
    +
    +    def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
    +        """
    +        Return True if the current hash is allowed by `hashes`.
    +        """
    +        if hashes is None:
    +            return False
    +        return hashes.is_hash_allowed(self.name, hex_digest=self.value)
    +
    +
    +@dataclass(frozen=True)
    +class MetadataFile:
    +    """Information about a core metadata file associated with a distribution."""
    +
    +    hashes: Optional[Dict[str, str]]
    +
    +    def __post_init__(self) -> None:
    +        if self.hashes is not None:
    +            assert all(name in _SUPPORTED_HASHES for name in self.hashes)
    +
    +
    +def supported_hashes(hashes: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]:
    +    # Remove any unsupported hash types from the mapping. If this leaves no
    +    # supported hashes, return None
    +    if hashes is None:
    +        return None
    +    hashes = {n: v for n, v in hashes.items() if n in _SUPPORTED_HASHES}
    +    if not hashes:
    +        return None
    +    return hashes
    +
    +
    +def _clean_url_path_part(part: str) -> str:
    +    """
    +    Clean a "part" of a URL path (i.e. after splitting on "@" characters).
    +    """
    +    # We unquote prior to quoting to make sure nothing is double quoted.
    +    return urllib.parse.quote(urllib.parse.unquote(part))
    +
    +
    +def _clean_file_url_path(part: str) -> str:
    +    """
    +    Clean the first part of a URL path that corresponds to a local
    +    filesystem path (i.e. the first part after splitting on "@" characters).
    +    """
    +    # We unquote prior to quoting to make sure nothing is double quoted.
    +    # Also, on Windows the path part might contain a drive letter which
    +    # should not be quoted. On Linux where drive letters do not
    +    # exist, the colon should be quoted. We rely on urllib.request
    +    # to do the right thing here.
    +    return urllib.request.pathname2url(urllib.request.url2pathname(part))
    +
    +
    +# percent-encoded:                   /
    +_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE)
    +
    +
    +def _clean_url_path(path: str, is_local_path: bool) -> str:
    +    """
    +    Clean the path portion of a URL.
    +    """
    +    if is_local_path:
    +        clean_func = _clean_file_url_path
    +    else:
    +        clean_func = _clean_url_path_part
    +
    +    # Split on the reserved characters prior to cleaning so that
    +    # revision strings in VCS URLs are properly preserved.
    +    parts = _reserved_chars_re.split(path)
    +
    +    cleaned_parts = []
    +    for to_clean, reserved in pairwise(itertools.chain(parts, [""])):
    +        cleaned_parts.append(clean_func(to_clean))
    +        # Normalize %xx escapes (e.g. %2f -> %2F)
    +        cleaned_parts.append(reserved.upper())
    +
    +    return "".join(cleaned_parts)
    +
    +
    +def _ensure_quoted_url(url: str) -> str:
    +    """
    +    Make sure a link is fully quoted.
    +    For example, if ' ' occurs in the URL, it will be replaced with "%20",
    +    and without double-quoting other characters.
    +    """
    +    # Split the URL into parts according to the general structure
    +    # `scheme://netloc/path;parameters?query#fragment`.
    +    result = urllib.parse.urlparse(url)
    +    # If the netloc is empty, then the URL refers to a local filesystem path.
    +    is_local_path = not result.netloc
    +    path = _clean_url_path(result.path, is_local_path=is_local_path)
    +    return urllib.parse.urlunparse(result._replace(path=path))
    +
    +
    +@functools.total_ordering
    +class Link:
    +    """Represents a parsed link from a Package Index's simple URL"""
    +
    +    __slots__ = [
    +        "_parsed_url",
    +        "_url",
    +        "_hashes",
    +        "comes_from",
    +        "requires_python",
    +        "yanked_reason",
    +        "metadata_file_data",
    +        "cache_link_parsing",
    +        "egg_fragment",
    +    ]
    +
    +    def __init__(
    +        self,
    +        url: str,
    +        comes_from: Optional[Union[str, "IndexContent"]] = None,
    +        requires_python: Optional[str] = None,
    +        yanked_reason: Optional[str] = None,
    +        metadata_file_data: Optional[MetadataFile] = None,
    +        cache_link_parsing: bool = True,
    +        hashes: Optional[Mapping[str, str]] = None,
    +    ) -> None:
    +        """
    +        :param url: url of the resource pointed to (href of the link)
    +        :param comes_from: instance of IndexContent where the link was found,
    +            or string.
    +        :param requires_python: String containing the `Requires-Python`
    +            metadata field, specified in PEP 345. This may be specified by
    +            a data-requires-python attribute in the HTML link tag, as
    +            described in PEP 503.
    +        :param yanked_reason: the reason the file has been yanked, if the
    +            file has been yanked, or None if the file hasn't been yanked.
    +            This is the value of the "data-yanked" attribute, if present, in
    +            a simple repository HTML link. If the file has been yanked but
    +            no reason was provided, this should be the empty string. See
    +            PEP 592 for more information and the specification.
    +        :param metadata_file_data: the metadata attached to the file, or None if
    +            no such metadata is provided. This argument, if not None, indicates
    +            that a separate metadata file exists, and also optionally supplies
    +            hashes for that file.
    +        :param cache_link_parsing: A flag that is used elsewhere to determine
    +            whether resources retrieved from this link should be cached. PyPI
    +            URLs should generally have this set to False, for example.
    +        :param hashes: A mapping of hash names to digests to allow us to
    +            determine the validity of a download.
    +        """
    +
    +        # The comes_from, requires_python, and metadata_file_data arguments are
    +        # only used by classmethods of this class, and are not used in client
    +        # code directly.
    +
    +        # url can be a UNC windows share
    +        if url.startswith("\\\\"):
    +            url = path_to_url(url)
    +
    +        self._parsed_url = urllib.parse.urlsplit(url)
    +        # Store the url as a private attribute to prevent accidentally
    +        # trying to set a new value.
    +        self._url = url
    +
    +        link_hash = LinkHash.find_hash_url_fragment(url)
    +        hashes_from_link = {} if link_hash is None else link_hash.as_dict()
    +        if hashes is None:
    +            self._hashes = hashes_from_link
    +        else:
    +            self._hashes = {**hashes, **hashes_from_link}
    +
    +        self.comes_from = comes_from
    +        self.requires_python = requires_python if requires_python else None
    +        self.yanked_reason = yanked_reason
    +        self.metadata_file_data = metadata_file_data
    +
    +        self.cache_link_parsing = cache_link_parsing
    +        self.egg_fragment = self._egg_fragment()
    +
    +    @classmethod
    +    def from_json(
    +        cls,
    +        file_data: Dict[str, Any],
    +        page_url: str,
    +    ) -> Optional["Link"]:
    +        """
    +        Convert an pypi json document from a simple repository page into a Link.
    +        """
    +        file_url = file_data.get("url")
    +        if file_url is None:
    +            return None
    +
    +        url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url))
    +        pyrequire = file_data.get("requires-python")
    +        yanked_reason = file_data.get("yanked")
    +        hashes = file_data.get("hashes", {})
    +
    +        # PEP 714: Indexes must use the name core-metadata, but
    +        # clients should support the old name as a fallback for compatibility.
    +        metadata_info = file_data.get("core-metadata")
    +        if metadata_info is None:
    +            metadata_info = file_data.get("dist-info-metadata")
    +
    +        # The metadata info value may be a boolean, or a dict of hashes.
    +        if isinstance(metadata_info, dict):
    +            # The file exists, and hashes have been supplied
    +            metadata_file_data = MetadataFile(supported_hashes(metadata_info))
    +        elif metadata_info:
    +            # The file exists, but there are no hashes
    +            metadata_file_data = MetadataFile(None)
    +        else:
    +            # False or not present: the file does not exist
    +            metadata_file_data = None
    +
    +        # The Link.yanked_reason expects an empty string instead of a boolean.
    +        if yanked_reason and not isinstance(yanked_reason, str):
    +            yanked_reason = ""
    +        # The Link.yanked_reason expects None instead of False.
    +        elif not yanked_reason:
    +            yanked_reason = None
    +
    +        return cls(
    +            url,
    +            comes_from=page_url,
    +            requires_python=pyrequire,
    +            yanked_reason=yanked_reason,
    +            hashes=hashes,
    +            metadata_file_data=metadata_file_data,
    +        )
    +
    +    @classmethod
    +    def from_element(
    +        cls,
    +        anchor_attribs: Dict[str, Optional[str]],
    +        page_url: str,
    +        base_url: str,
    +    ) -> Optional["Link"]:
    +        """
    +        Convert an anchor element's attributes in a simple repository page to a Link.
    +        """
    +        href = anchor_attribs.get("href")
    +        if not href:
    +            return None
    +
    +        url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href))
    +        pyrequire = anchor_attribs.get("data-requires-python")
    +        yanked_reason = anchor_attribs.get("data-yanked")
    +
    +        # PEP 714: Indexes must use the name data-core-metadata, but
    +        # clients should support the old name as a fallback for compatibility.
    +        metadata_info = anchor_attribs.get("data-core-metadata")
    +        if metadata_info is None:
    +            metadata_info = anchor_attribs.get("data-dist-info-metadata")
    +        # The metadata info value may be the string "true", or a string of
    +        # the form "hashname=hashval"
    +        if metadata_info == "true":
    +            # The file exists, but there are no hashes
    +            metadata_file_data = MetadataFile(None)
    +        elif metadata_info is None:
    +            # The file does not exist
    +            metadata_file_data = None
    +        else:
    +            # The file exists, and hashes have been supplied
    +            hashname, sep, hashval = metadata_info.partition("=")
    +            if sep == "=":
    +                metadata_file_data = MetadataFile(supported_hashes({hashname: hashval}))
    +            else:
    +                # Error - data is wrong. Treat as no hashes supplied.
    +                logger.debug(
    +                    "Index returned invalid data-dist-info-metadata value: %s",
    +                    metadata_info,
    +                )
    +                metadata_file_data = MetadataFile(None)
    +
    +        return cls(
    +            url,
    +            comes_from=page_url,
    +            requires_python=pyrequire,
    +            yanked_reason=yanked_reason,
    +            metadata_file_data=metadata_file_data,
    +        )
    +
    +    def __str__(self) -> str:
    +        if self.requires_python:
    +            rp = f" (requires-python:{self.requires_python})"
    +        else:
    +            rp = ""
    +        if self.comes_from:
    +            return f"{redact_auth_from_url(self._url)} (from {self.comes_from}){rp}"
    +        else:
    +            return redact_auth_from_url(str(self._url))
    +
    +    def __repr__(self) -> str:
    +        return f""
    +
    +    def __hash__(self) -> int:
    +        return hash(self.url)
    +
    +    def __eq__(self, other: Any) -> bool:
    +        if not isinstance(other, Link):
    +            return NotImplemented
    +        return self.url == other.url
    +
    +    def __lt__(self, other: Any) -> bool:
    +        if not isinstance(other, Link):
    +            return NotImplemented
    +        return self.url < other.url
    +
    +    @property
    +    def url(self) -> str:
    +        return self._url
    +
    +    @property
    +    def filename(self) -> str:
    +        path = self.path.rstrip("/")
    +        name = posixpath.basename(path)
    +        if not name:
    +            # Make sure we don't leak auth information if the netloc
    +            # includes a username and password.
    +            netloc, user_pass = split_auth_from_netloc(self.netloc)
    +            return netloc
    +
    +        name = urllib.parse.unquote(name)
    +        assert name, f"URL {self._url!r} produced no filename"
    +        return name
    +
    +    @property
    +    def file_path(self) -> str:
    +        return url_to_path(self.url)
    +
    +    @property
    +    def scheme(self) -> str:
    +        return self._parsed_url.scheme
    +
    +    @property
    +    def netloc(self) -> str:
    +        """
    +        This can contain auth information.
    +        """
    +        return self._parsed_url.netloc
    +
    +    @property
    +    def path(self) -> str:
    +        return urllib.parse.unquote(self._parsed_url.path)
    +
    +    def splitext(self) -> Tuple[str, str]:
    +        return splitext(posixpath.basename(self.path.rstrip("/")))
    +
    +    @property
    +    def ext(self) -> str:
    +        return self.splitext()[1]
    +
    +    @property
    +    def url_without_fragment(self) -> str:
    +        scheme, netloc, path, query, fragment = self._parsed_url
    +        return urllib.parse.urlunsplit((scheme, netloc, path, query, ""))
    +
    +    _egg_fragment_re = re.compile(r"[#&]egg=([^&]*)")
    +
    +    # Per PEP 508.
    +    _project_name_re = re.compile(
    +        r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE
    +    )
    +
    +    def _egg_fragment(self) -> Optional[str]:
    +        match = self._egg_fragment_re.search(self._url)
    +        if not match:
    +            return None
    +
    +        # An egg fragment looks like a PEP 508 project name, along with
    +        # an optional extras specifier. Anything else is invalid.
    +        project_name = match.group(1)
    +        if not self._project_name_re.match(project_name):
    +            deprecated(
    +                reason=f"{self} contains an egg fragment with a non-PEP 508 name",
    +                replacement="to use the req @ url syntax, and remove the egg fragment",
    +                gone_in="25.0",
    +                issue=11617,
    +            )
    +
    +        return project_name
    +
    +    _subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)")
    +
    +    @property
    +    def subdirectory_fragment(self) -> Optional[str]:
    +        match = self._subdirectory_fragment_re.search(self._url)
    +        if not match:
    +            return None
    +        return match.group(1)
    +
    +    def metadata_link(self) -> Optional["Link"]:
    +        """Return a link to the associated core metadata file (if any)."""
    +        if self.metadata_file_data is None:
    +            return None
    +        metadata_url = f"{self.url_without_fragment}.metadata"
    +        if self.metadata_file_data.hashes is None:
    +            return Link(metadata_url)
    +        return Link(metadata_url, hashes=self.metadata_file_data.hashes)
    +
    +    def as_hashes(self) -> Hashes:
    +        return Hashes({k: [v] for k, v in self._hashes.items()})
    +
    +    @property
    +    def hash(self) -> Optional[str]:
    +        return next(iter(self._hashes.values()), None)
    +
    +    @property
    +    def hash_name(self) -> Optional[str]:
    +        return next(iter(self._hashes), None)
    +
    +    @property
    +    def show_url(self) -> str:
    +        return posixpath.basename(self._url.split("#", 1)[0].split("?", 1)[0])
    +
    +    @property
    +    def is_file(self) -> bool:
    +        return self.scheme == "file"
    +
    +    def is_existing_dir(self) -> bool:
    +        return self.is_file and os.path.isdir(self.file_path)
    +
    +    @property
    +    def is_wheel(self) -> bool:
    +        return self.ext == WHEEL_EXTENSION
    +
    +    @property
    +    def is_vcs(self) -> bool:
    +        from pip._internal.vcs import vcs
    +
    +        return self.scheme in vcs.all_schemes
    +
    +    @property
    +    def is_yanked(self) -> bool:
    +        return self.yanked_reason is not None
    +
    +    @property
    +    def has_hash(self) -> bool:
    +        return bool(self._hashes)
    +
    +    def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
    +        """
    +        Return True if the link has a hash and it is allowed by `hashes`.
    +        """
    +        if hashes is None:
    +            return False
    +        return any(hashes.is_hash_allowed(k, v) for k, v in self._hashes.items())
    +
    +
    +class _CleanResult(NamedTuple):
    +    """Convert link for equivalency check.
    +
    +    This is used in the resolver to check whether two URL-specified requirements
    +    likely point to the same distribution and can be considered equivalent. This
    +    equivalency logic avoids comparing URLs literally, which can be too strict
    +    (e.g. "a=1&b=2" vs "b=2&a=1") and produce conflicts unexpecting to users.
    +
    +    Currently this does three things:
    +
    +    1. Drop the basic auth part. This is technically wrong since a server can
    +       serve different content based on auth, but if it does that, it is even
    +       impossible to guarantee two URLs without auth are equivalent, since
    +       the user can input different auth information when prompted. So the
    +       practical solution is to assume the auth doesn't affect the response.
    +    2. Parse the query to avoid the ordering issue. Note that ordering under the
    +       same key in the query are NOT cleaned; i.e. "a=1&a=2" and "a=2&a=1" are
    +       still considered different.
    +    3. Explicitly drop most of the fragment part, except ``subdirectory=`` and
    +       hash values, since it should have no impact the downloaded content. Note
    +       that this drops the "egg=" part historically used to denote the requested
    +       project (and extras), which is wrong in the strictest sense, but too many
    +       people are supplying it inconsistently to cause superfluous resolution
    +       conflicts, so we choose to also ignore them.
    +    """
    +
    +    parsed: urllib.parse.SplitResult
    +    query: Dict[str, List[str]]
    +    subdirectory: str
    +    hashes: Dict[str, str]
    +
    +
    +def _clean_link(link: Link) -> _CleanResult:
    +    parsed = link._parsed_url
    +    netloc = parsed.netloc.rsplit("@", 1)[-1]
    +    # According to RFC 8089, an empty host in file: means localhost.
    +    if parsed.scheme == "file" and not netloc:
    +        netloc = "localhost"
    +    fragment = urllib.parse.parse_qs(parsed.fragment)
    +    if "egg" in fragment:
    +        logger.debug("Ignoring egg= fragment in %s", link)
    +    try:
    +        # If there are multiple subdirectory values, use the first one.
    +        # This matches the behavior of Link.subdirectory_fragment.
    +        subdirectory = fragment["subdirectory"][0]
    +    except (IndexError, KeyError):
    +        subdirectory = ""
    +    # If there are multiple hash values under the same algorithm, use the
    +    # first one. This matches the behavior of Link.hash_value.
    +    hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment}
    +    return _CleanResult(
    +        parsed=parsed._replace(netloc=netloc, query="", fragment=""),
    +        query=urllib.parse.parse_qs(parsed.query),
    +        subdirectory=subdirectory,
    +        hashes=hashes,
    +    )
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def links_equivalent(link1: Link, link2: Link) -> bool:
    +    return _clean_link(link1) == _clean_link(link2)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py b/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py
    new file mode 100644
    index 0000000..06a9a55
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/scheme.py
    @@ -0,0 +1,25 @@
    +"""
    +For types associated with installation schemes.
    +
    +For a general overview of available schemes and their context, see
    +https://docs.python.org/3/install/index.html#alternate-installation.
    +"""
    +
    +from dataclasses import dataclass
    +
    +SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"]
    +
    +
    +@dataclass(frozen=True)
    +class Scheme:
    +    """A Scheme holds paths which are used as the base directories for
    +    artifacts associated with a Python package.
    +    """
    +
    +    __slots__ = SCHEME_KEYS
    +
    +    platlib: str
    +    purelib: str
    +    headers: str
    +    scripts: str
    +    data: str
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py b/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py
    new file mode 100644
    index 0000000..ee7bc86
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/search_scope.py
    @@ -0,0 +1,127 @@
    +import itertools
    +import logging
    +import os
    +import posixpath
    +import urllib.parse
    +from dataclasses import dataclass
    +from typing import List
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.models.index import PyPI
    +from pip._internal.utils.compat import has_tls
    +from pip._internal.utils.misc import normalize_path, redact_auth_from_url
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +@dataclass(frozen=True)
    +class SearchScope:
    +    """
    +    Encapsulates the locations that pip is configured to search.
    +    """
    +
    +    __slots__ = ["find_links", "index_urls", "no_index"]
    +
    +    find_links: List[str]
    +    index_urls: List[str]
    +    no_index: bool
    +
    +    @classmethod
    +    def create(
    +        cls,
    +        find_links: List[str],
    +        index_urls: List[str],
    +        no_index: bool,
    +    ) -> "SearchScope":
    +        """
    +        Create a SearchScope object after normalizing the `find_links`.
    +        """
    +        # Build find_links. If an argument starts with ~, it may be
    +        # a local file relative to a home directory. So try normalizing
    +        # it and if it exists, use the normalized version.
    +        # This is deliberately conservative - it might be fine just to
    +        # blindly normalize anything starting with a ~...
    +        built_find_links: List[str] = []
    +        for link in find_links:
    +            if link.startswith("~"):
    +                new_link = normalize_path(link)
    +                if os.path.exists(new_link):
    +                    link = new_link
    +            built_find_links.append(link)
    +
    +        # If we don't have TLS enabled, then WARN if anyplace we're looking
    +        # relies on TLS.
    +        if not has_tls():
    +            for link in itertools.chain(index_urls, built_find_links):
    +                parsed = urllib.parse.urlparse(link)
    +                if parsed.scheme == "https":
    +                    logger.warning(
    +                        "pip is configured with locations that require "
    +                        "TLS/SSL, however the ssl module in Python is not "
    +                        "available."
    +                    )
    +                    break
    +
    +        return cls(
    +            find_links=built_find_links,
    +            index_urls=index_urls,
    +            no_index=no_index,
    +        )
    +
    +    def get_formatted_locations(self) -> str:
    +        lines = []
    +        redacted_index_urls = []
    +        if self.index_urls and self.index_urls != [PyPI.simple_url]:
    +            for url in self.index_urls:
    +                redacted_index_url = redact_auth_from_url(url)
    +
    +                # Parse the URL
    +                purl = urllib.parse.urlsplit(redacted_index_url)
    +
    +                # URL is generally invalid if scheme and netloc is missing
    +                # there are issues with Python and URL parsing, so this test
    +                # is a bit crude. See bpo-20271, bpo-23505. Python doesn't
    +                # always parse invalid URLs correctly - it should raise
    +                # exceptions for malformed URLs
    +                if not purl.scheme and not purl.netloc:
    +                    logger.warning(
    +                        'The index url "%s" seems invalid, please provide a scheme.',
    +                        redacted_index_url,
    +                    )
    +
    +                redacted_index_urls.append(redacted_index_url)
    +
    +            lines.append(
    +                "Looking in indexes: {}".format(", ".join(redacted_index_urls))
    +            )
    +
    +        if self.find_links:
    +            lines.append(
    +                "Looking in links: {}".format(
    +                    ", ".join(redact_auth_from_url(url) for url in self.find_links)
    +                )
    +            )
    +        return "\n".join(lines)
    +
    +    def get_index_urls_locations(self, project_name: str) -> List[str]:
    +        """Returns the locations found via self.index_urls
    +
    +        Checks the url_name on the main (first in the list) index and
    +        use this url_name to produce all locations
    +        """
    +
    +        def mkurl_pypi_url(url: str) -> str:
    +            loc = posixpath.join(
    +                url, urllib.parse.quote(canonicalize_name(project_name))
    +            )
    +            # For maximum compatibility with easy_install, ensure the path
    +            # ends in a trailing slash.  Although this isn't in the spec
    +            # (and PyPI can handle it without the slash) some other index
    +            # implementations might break if they relied on easy_install's
    +            # behavior.
    +            if not loc.endswith("/"):
    +                loc = loc + "/"
    +            return loc
    +
    +        return [mkurl_pypi_url(url) for url in self.index_urls]
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py b/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py
    new file mode 100644
    index 0000000..e9b50aa
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py
    @@ -0,0 +1,53 @@
    +from typing import Optional
    +
    +from pip._internal.models.format_control import FormatControl
    +
    +
    +# TODO: This needs Python 3.10's improved slots support for dataclasses
    +# to be converted into a dataclass.
    +class SelectionPreferences:
    +    """
    +    Encapsulates the candidate selection preferences for downloading
    +    and installing files.
    +    """
    +
    +    __slots__ = [
    +        "allow_yanked",
    +        "allow_all_prereleases",
    +        "format_control",
    +        "prefer_binary",
    +        "ignore_requires_python",
    +    ]
    +
    +    # Don't include an allow_yanked default value to make sure each call
    +    # site considers whether yanked releases are allowed. This also causes
    +    # that decision to be made explicit in the calling code, which helps
    +    # people when reading the code.
    +    def __init__(
    +        self,
    +        allow_yanked: bool,
    +        allow_all_prereleases: bool = False,
    +        format_control: Optional[FormatControl] = None,
    +        prefer_binary: bool = False,
    +        ignore_requires_python: Optional[bool] = None,
    +    ) -> None:
    +        """Create a SelectionPreferences object.
    +
    +        :param allow_yanked: Whether files marked as yanked (in the sense
    +            of PEP 592) are permitted to be candidates for install.
    +        :param format_control: A FormatControl object or None. Used to control
    +            the selection of source packages / binary packages when consulting
    +            the index and links.
    +        :param prefer_binary: Whether to prefer an old, but valid, binary
    +            dist over a new source dist.
    +        :param ignore_requires_python: Whether to ignore incompatible
    +            "Requires-Python" values in links. Defaults to False.
    +        """
    +        if ignore_requires_python is None:
    +            ignore_requires_python = False
    +
    +        self.allow_yanked = allow_yanked
    +        self.allow_all_prereleases = allow_all_prereleases
    +        self.format_control = format_control
    +        self.prefer_binary = prefer_binary
    +        self.ignore_requires_python = ignore_requires_python
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py b/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py
    new file mode 100644
    index 0000000..88925a9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/target_python.py
    @@ -0,0 +1,121 @@
    +import sys
    +from typing import List, Optional, Set, Tuple
    +
    +from pip._vendor.packaging.tags import Tag
    +
    +from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot
    +from pip._internal.utils.misc import normalize_version_info
    +
    +
    +class TargetPython:
    +    """
    +    Encapsulates the properties of a Python interpreter one is targeting
    +    for a package install, download, etc.
    +    """
    +
    +    __slots__ = [
    +        "_given_py_version_info",
    +        "abis",
    +        "implementation",
    +        "platforms",
    +        "py_version",
    +        "py_version_info",
    +        "_valid_tags",
    +        "_valid_tags_set",
    +    ]
    +
    +    def __init__(
    +        self,
    +        platforms: Optional[List[str]] = None,
    +        py_version_info: Optional[Tuple[int, ...]] = None,
    +        abis: Optional[List[str]] = None,
    +        implementation: Optional[str] = None,
    +    ) -> None:
    +        """
    +        :param platforms: A list of strings or None. If None, searches for
    +            packages that are supported by the current system. Otherwise, will
    +            find packages that can be built on the platforms passed in. These
    +            packages will only be downloaded for distribution: they will
    +            not be built locally.
    +        :param py_version_info: An optional tuple of ints representing the
    +            Python version information to use (e.g. `sys.version_info[:3]`).
    +            This can have length 1, 2, or 3 when provided.
    +        :param abis: A list of strings or None. This is passed to
    +            compatibility_tags.py's get_supported() function as is.
    +        :param implementation: A string or None. This is passed to
    +            compatibility_tags.py's get_supported() function as is.
    +        """
    +        # Store the given py_version_info for when we call get_supported().
    +        self._given_py_version_info = py_version_info
    +
    +        if py_version_info is None:
    +            py_version_info = sys.version_info[:3]
    +        else:
    +            py_version_info = normalize_version_info(py_version_info)
    +
    +        py_version = ".".join(map(str, py_version_info[:2]))
    +
    +        self.abis = abis
    +        self.implementation = implementation
    +        self.platforms = platforms
    +        self.py_version = py_version
    +        self.py_version_info = py_version_info
    +
    +        # This is used to cache the return value of get_(un)sorted_tags.
    +        self._valid_tags: Optional[List[Tag]] = None
    +        self._valid_tags_set: Optional[Set[Tag]] = None
    +
    +    def format_given(self) -> str:
    +        """
    +        Format the given, non-None attributes for display.
    +        """
    +        display_version = None
    +        if self._given_py_version_info is not None:
    +            display_version = ".".join(
    +                str(part) for part in self._given_py_version_info
    +            )
    +
    +        key_values = [
    +            ("platforms", self.platforms),
    +            ("version_info", display_version),
    +            ("abis", self.abis),
    +            ("implementation", self.implementation),
    +        ]
    +        return " ".join(
    +            f"{key}={value!r}" for key, value in key_values if value is not None
    +        )
    +
    +    def get_sorted_tags(self) -> List[Tag]:
    +        """
    +        Return the supported PEP 425 tags to check wheel candidates against.
    +
    +        The tags are returned in order of preference (most preferred first).
    +        """
    +        if self._valid_tags is None:
    +            # Pass versions=None if no py_version_info was given since
    +            # versions=None uses special default logic.
    +            py_version_info = self._given_py_version_info
    +            if py_version_info is None:
    +                version = None
    +            else:
    +                version = version_info_to_nodot(py_version_info)
    +
    +            tags = get_supported(
    +                version=version,
    +                platforms=self.platforms,
    +                abis=self.abis,
    +                impl=self.implementation,
    +            )
    +            self._valid_tags = tags
    +
    +        return self._valid_tags
    +
    +    def get_unsorted_tags(self) -> Set[Tag]:
    +        """Exactly the same as get_sorted_tags, but returns a set.
    +
    +        This is important for performance.
    +        """
    +        if self._valid_tags_set is None:
    +            self._valid_tags_set = set(self.get_sorted_tags())
    +
    +        return self._valid_tags_set
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py
    new file mode 100644
    index 0000000..ea85600
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/models/wheel.py
    @@ -0,0 +1,118 @@
    +"""Represents a wheel file and provides access to the various parts of the
    +name that have meaning.
    +"""
    +
    +import re
    +from typing import Dict, Iterable, List
    +
    +from pip._vendor.packaging.tags import Tag
    +from pip._vendor.packaging.utils import (
    +    InvalidWheelFilename as PackagingInvalidWheelName,
    +)
    +from pip._vendor.packaging.utils import parse_wheel_filename
    +
    +from pip._internal.exceptions import InvalidWheelFilename
    +from pip._internal.utils.deprecation import deprecated
    +
    +
    +class Wheel:
    +    """A wheel file"""
    +
    +    wheel_file_re = re.compile(
    +        r"""^(?P(?P[^\s-]+?)-(?P[^\s-]*?))
    +        ((-(?P\d[^-]*?))?-(?P[^\s-]+?)-(?P[^\s-]+?)-(?P[^\s-]+?)
    +        \.whl|\.dist-info)$""",
    +        re.VERBOSE,
    +    )
    +
    +    def __init__(self, filename: str) -> None:
    +        """
    +        :raises InvalidWheelFilename: when the filename is invalid for a wheel
    +        """
    +        wheel_info = self.wheel_file_re.match(filename)
    +        if not wheel_info:
    +            raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.")
    +        self.filename = filename
    +        self.name = wheel_info.group("name").replace("_", "-")
    +        _version = wheel_info.group("ver")
    +        if "_" in _version:
    +            try:
    +                parse_wheel_filename(filename)
    +            except PackagingInvalidWheelName as e:
    +                deprecated(
    +                    reason=(
    +                        f"Wheel filename {filename!r} is not correctly normalised. "
    +                        "Future versions of pip will raise the following error:\n"
    +                        f"{e.args[0]}\n\n"
    +                    ),
    +                    replacement=(
    +                        "to rename the wheel to use a correctly normalised "
    +                        "name (this may require updating the version in "
    +                        "the project metadata)"
    +                    ),
    +                    gone_in="25.1",
    +                    issue=12938,
    +                )
    +
    +            _version = _version.replace("_", "-")
    +
    +        self.version = _version
    +        self.build_tag = wheel_info.group("build")
    +        self.pyversions = wheel_info.group("pyver").split(".")
    +        self.abis = wheel_info.group("abi").split(".")
    +        self.plats = wheel_info.group("plat").split(".")
    +
    +        # All the tag combinations from this file
    +        self.file_tags = {
    +            Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats
    +        }
    +
    +    def get_formatted_file_tags(self) -> List[str]:
    +        """Return the wheel's tags as a sorted list of strings."""
    +        return sorted(str(tag) for tag in self.file_tags)
    +
    +    def support_index_min(self, tags: List[Tag]) -> int:
    +        """Return the lowest index that one of the wheel's file_tag combinations
    +        achieves in the given list of supported tags.
    +
    +        For example, if there are 8 supported tags and one of the file tags
    +        is first in the list, then return 0.
    +
    +        :param tags: the PEP 425 tags to check the wheel against, in order
    +            with most preferred first.
    +
    +        :raises ValueError: If none of the wheel's file tags match one of
    +            the supported tags.
    +        """
    +        try:
    +            return next(i for i, t in enumerate(tags) if t in self.file_tags)
    +        except StopIteration:
    +            raise ValueError()
    +
    +    def find_most_preferred_tag(
    +        self, tags: List[Tag], tag_to_priority: Dict[Tag, int]
    +    ) -> int:
    +        """Return the priority of the most preferred tag that one of the wheel's file
    +        tag combinations achieves in the given list of supported tags using the given
    +        tag_to_priority mapping, where lower priorities are more-preferred.
    +
    +        This is used in place of support_index_min in some cases in order to avoid
    +        an expensive linear scan of a large list of tags.
    +
    +        :param tags: the PEP 425 tags to check the wheel against.
    +        :param tag_to_priority: a mapping from tag to priority of that tag, where
    +            lower is more preferred.
    +
    +        :raises ValueError: If none of the wheel's file tags match one of
    +            the supported tags.
    +        """
    +        return min(
    +            tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority
    +        )
    +
    +    def supported(self, tags: Iterable[Tag]) -> bool:
    +        """Return whether the wheel is compatible with one of the given tags.
    +
    +        :param tags: the PEP 425 tags to check the wheel against.
    +        """
    +        return not self.file_tags.isdisjoint(tags)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/network/__init__.py
    new file mode 100644
    index 0000000..b51bde9
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/__init__.py
    @@ -0,0 +1,2 @@
    +"""Contains purely network-related utilities.
    +"""
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..0b2cc181a0b1a8f459b5368835638df2a647abcb
    GIT binary patch
    literal 272
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..11b615f96b1265c52972f92e2d9cda89704e5ca0
    GIT binary patch
    literal 11625
    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
    TyyAPn%r0n&
    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
    MHT{&M9K)sm7uG?i4*&oF
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..29e8269b1960b906fbbc1ea9744929aff8277c7a
    GIT binary patch
    literal 2273
    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
    a%1mLW_?z)xkME7lv`1#Xf-i*#_x}Pa4Bj~a
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/auth.py b/env/lib/python3.12/site-packages/pip/_internal/network/auth.py
    new file mode 100644
    index 0000000..1a2606e
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/auth.py
    @@ -0,0 +1,566 @@
    +"""Network Authentication Helpers
    +
    +Contains interface (MultiDomainBasicAuth) and associated glue code for
    +providing credentials in the context of network requests.
    +"""
    +
    +import logging
    +import os
    +import shutil
    +import subprocess
    +import sysconfig
    +import typing
    +import urllib.parse
    +from abc import ABC, abstractmethod
    +from functools import lru_cache
    +from os.path import commonprefix
    +from pathlib import Path
    +from typing import Any, Dict, List, NamedTuple, Optional, Tuple
    +
    +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
    +from pip._vendor.requests.models import Request, Response
    +from pip._vendor.requests.utils import get_netrc_auth
    +
    +from pip._internal.utils.logging import getLogger
    +from pip._internal.utils.misc import (
    +    ask,
    +    ask_input,
    +    ask_password,
    +    remove_auth_from_url,
    +    split_auth_netloc_from_url,
    +)
    +from pip._internal.vcs.versioncontrol import AuthInfo
    +
    +logger = getLogger(__name__)
    +
    +KEYRING_DISABLED = False
    +
    +
    +class Credentials(NamedTuple):
    +    url: str
    +    username: str
    +    password: str
    +
    +
    +class KeyRingBaseProvider(ABC):
    +    """Keyring base provider interface"""
    +
    +    has_keyring: bool
    +
    +    @abstractmethod
    +    def get_auth_info(
    +        self, url: str, username: Optional[str]
    +    ) -> Optional[AuthInfo]: ...
    +
    +    @abstractmethod
    +    def save_auth_info(self, url: str, username: str, password: str) -> None: ...
    +
    +
    +class KeyRingNullProvider(KeyRingBaseProvider):
    +    """Keyring null provider"""
    +
    +    has_keyring = False
    +
    +    def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
    +        return None
    +
    +    def save_auth_info(self, url: str, username: str, password: str) -> None:
    +        return None
    +
    +
    +class KeyRingPythonProvider(KeyRingBaseProvider):
    +    """Keyring interface which uses locally imported `keyring`"""
    +
    +    has_keyring = True
    +
    +    def __init__(self) -> None:
    +        import keyring
    +
    +        self.keyring = keyring
    +
    +    def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
    +        # Support keyring's get_credential interface which supports getting
    +        # credentials without a username. This is only available for
    +        # keyring>=15.2.0.
    +        if hasattr(self.keyring, "get_credential"):
    +            logger.debug("Getting credentials from keyring for %s", url)
    +            cred = self.keyring.get_credential(url, username)
    +            if cred is not None:
    +                return cred.username, cred.password
    +            return None
    +
    +        if username is not None:
    +            logger.debug("Getting password from keyring for %s", url)
    +            password = self.keyring.get_password(url, username)
    +            if password:
    +                return username, password
    +        return None
    +
    +    def save_auth_info(self, url: str, username: str, password: str) -> None:
    +        self.keyring.set_password(url, username, password)
    +
    +
    +class KeyRingCliProvider(KeyRingBaseProvider):
    +    """Provider which uses `keyring` cli
    +
    +    Instead of calling the keyring package installed alongside pip
    +    we call keyring on the command line which will enable pip to
    +    use which ever installation of keyring is available first in
    +    PATH.
    +    """
    +
    +    has_keyring = True
    +
    +    def __init__(self, cmd: str) -> None:
    +        self.keyring = cmd
    +
    +    def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
    +        # This is the default implementation of keyring.get_credential
    +        # https://github.com/jaraco/keyring/blob/97689324abcf01bd1793d49063e7ca01e03d7d07/keyring/backend.py#L134-L139
    +        if username is not None:
    +            password = self._get_password(url, username)
    +            if password is not None:
    +                return username, password
    +        return None
    +
    +    def save_auth_info(self, url: str, username: str, password: str) -> None:
    +        return self._set_password(url, username, password)
    +
    +    def _get_password(self, service_name: str, username: str) -> Optional[str]:
    +        """Mirror the implementation of keyring.get_password using cli"""
    +        if self.keyring is None:
    +            return None
    +
    +        cmd = [self.keyring, "get", service_name, username]
    +        env = os.environ.copy()
    +        env["PYTHONIOENCODING"] = "utf-8"
    +        res = subprocess.run(
    +            cmd,
    +            stdin=subprocess.DEVNULL,
    +            stdout=subprocess.PIPE,
    +            env=env,
    +        )
    +        if res.returncode:
    +            return None
    +        return res.stdout.decode("utf-8").strip(os.linesep)
    +
    +    def _set_password(self, service_name: str, username: str, password: str) -> None:
    +        """Mirror the implementation of keyring.set_password using cli"""
    +        if self.keyring is None:
    +            return None
    +        env = os.environ.copy()
    +        env["PYTHONIOENCODING"] = "utf-8"
    +        subprocess.run(
    +            [self.keyring, "set", service_name, username],
    +            input=f"{password}{os.linesep}".encode(),
    +            env=env,
    +            check=True,
    +        )
    +        return None
    +
    +
    +@lru_cache(maxsize=None)
    +def get_keyring_provider(provider: str) -> KeyRingBaseProvider:
    +    logger.verbose("Keyring provider requested: %s", provider)
    +
    +    # keyring has previously failed and been disabled
    +    if KEYRING_DISABLED:
    +        provider = "disabled"
    +    if provider in ["import", "auto"]:
    +        try:
    +            impl = KeyRingPythonProvider()
    +            logger.verbose("Keyring provider set: import")
    +            return impl
    +        except ImportError:
    +            pass
    +        except Exception as exc:
    +            # In the event of an unexpected exception
    +            # we should warn the user
    +            msg = "Installed copy of keyring fails with exception %s"
    +            if provider == "auto":
    +                msg = msg + ", trying to find a keyring executable as a fallback"
    +            logger.warning(msg, exc, exc_info=logger.isEnabledFor(logging.DEBUG))
    +    if provider in ["subprocess", "auto"]:
    +        cli = shutil.which("keyring")
    +        if cli and cli.startswith(sysconfig.get_path("scripts")):
    +            # all code within this function is stolen from shutil.which implementation
    +            @typing.no_type_check
    +            def PATH_as_shutil_which_determines_it() -> str:
    +                path = os.environ.get("PATH", None)
    +                if path is None:
    +                    try:
    +                        path = os.confstr("CS_PATH")
    +                    except (AttributeError, ValueError):
    +                        # os.confstr() or CS_PATH is not available
    +                        path = os.defpath
    +                # bpo-35755: Don't use os.defpath if the PATH environment variable is
    +                # set to an empty string
    +
    +                return path
    +
    +            scripts = Path(sysconfig.get_path("scripts"))
    +
    +            paths = []
    +            for path in PATH_as_shutil_which_determines_it().split(os.pathsep):
    +                p = Path(path)
    +                try:
    +                    if not p.samefile(scripts):
    +                        paths.append(path)
    +                except FileNotFoundError:
    +                    pass
    +
    +            path = os.pathsep.join(paths)
    +
    +            cli = shutil.which("keyring", path=path)
    +
    +        if cli:
    +            logger.verbose("Keyring provider set: subprocess with executable %s", cli)
    +            return KeyRingCliProvider(cli)
    +
    +    logger.verbose("Keyring provider set: disabled")
    +    return KeyRingNullProvider()
    +
    +
    +class MultiDomainBasicAuth(AuthBase):
    +    def __init__(
    +        self,
    +        prompting: bool = True,
    +        index_urls: Optional[List[str]] = None,
    +        keyring_provider: str = "auto",
    +    ) -> None:
    +        self.prompting = prompting
    +        self.index_urls = index_urls
    +        self.keyring_provider = keyring_provider  # type: ignore[assignment]
    +        self.passwords: Dict[str, AuthInfo] = {}
    +        # When the user is prompted to enter credentials and keyring is
    +        # available, we will offer to save them. If the user accepts,
    +        # this value is set to the credentials they entered. After the
    +        # request authenticates, the caller should call
    +        # ``save_credentials`` to save these.
    +        self._credentials_to_save: Optional[Credentials] = None
    +
    +    @property
    +    def keyring_provider(self) -> KeyRingBaseProvider:
    +        return get_keyring_provider(self._keyring_provider)
    +
    +    @keyring_provider.setter
    +    def keyring_provider(self, provider: str) -> None:
    +        # The free function get_keyring_provider has been decorated with
    +        # functools.cache. If an exception occurs in get_keyring_auth that
    +        # cache will be cleared and keyring disabled, take that into account
    +        # if you want to remove this indirection.
    +        self._keyring_provider = provider
    +
    +    @property
    +    def use_keyring(self) -> bool:
    +        # We won't use keyring when --no-input is passed unless
    +        # a specific provider is requested because it might require
    +        # user interaction
    +        return self.prompting or self._keyring_provider not in ["auto", "disabled"]
    +
    +    def _get_keyring_auth(
    +        self,
    +        url: Optional[str],
    +        username: Optional[str],
    +    ) -> Optional[AuthInfo]:
    +        """Return the tuple auth for a given url from keyring."""
    +        # Do nothing if no url was provided
    +        if not url:
    +            return None
    +
    +        try:
    +            return self.keyring_provider.get_auth_info(url, username)
    +        except Exception as exc:
    +            # Log the full exception (with stacktrace) at debug, so it'll only
    +            # show up when running in verbose mode.
    +            logger.debug("Keyring is skipped due to an exception", exc_info=True)
    +            # Always log a shortened version of the exception.
    +            logger.warning(
    +                "Keyring is skipped due to an exception: %s",
    +                str(exc),
    +            )
    +            global KEYRING_DISABLED
    +            KEYRING_DISABLED = True
    +            get_keyring_provider.cache_clear()
    +            return None
    +
    +    def _get_index_url(self, url: str) -> Optional[str]:
    +        """Return the original index URL matching the requested URL.
    +
    +        Cached or dynamically generated credentials may work against
    +        the original index URL rather than just the netloc.
    +
    +        The provided url should have had its username and password
    +        removed already. If the original index url had credentials then
    +        they will be included in the return value.
    +
    +        Returns None if no matching index was found, or if --no-index
    +        was specified by the user.
    +        """
    +        if not url or not self.index_urls:
    +            return None
    +
    +        url = remove_auth_from_url(url).rstrip("/") + "/"
    +        parsed_url = urllib.parse.urlsplit(url)
    +
    +        candidates = []
    +
    +        for index in self.index_urls:
    +            index = index.rstrip("/") + "/"
    +            parsed_index = urllib.parse.urlsplit(remove_auth_from_url(index))
    +            if parsed_url == parsed_index:
    +                return index
    +
    +            if parsed_url.netloc != parsed_index.netloc:
    +                continue
    +
    +            candidate = urllib.parse.urlsplit(index)
    +            candidates.append(candidate)
    +
    +        if not candidates:
    +            return None
    +
    +        candidates.sort(
    +            reverse=True,
    +            key=lambda candidate: commonprefix(
    +                [
    +                    parsed_url.path,
    +                    candidate.path,
    +                ]
    +            ).rfind("/"),
    +        )
    +
    +        return urllib.parse.urlunsplit(candidates[0])
    +
    +    def _get_new_credentials(
    +        self,
    +        original_url: str,
    +        *,
    +        allow_netrc: bool = True,
    +        allow_keyring: bool = False,
    +    ) -> AuthInfo:
    +        """Find and return credentials for the specified URL."""
    +        # Split the credentials and netloc from the url.
    +        url, netloc, url_user_password = split_auth_netloc_from_url(
    +            original_url,
    +        )
    +
    +        # Start with the credentials embedded in the url
    +        username, password = url_user_password
    +        if username is not None and password is not None:
    +            logger.debug("Found credentials in url for %s", netloc)
    +            return url_user_password
    +
    +        # Find a matching index url for this request
    +        index_url = self._get_index_url(url)
    +        if index_url:
    +            # Split the credentials from the url.
    +            index_info = split_auth_netloc_from_url(index_url)
    +            if index_info:
    +                index_url, _, index_url_user_password = index_info
    +                logger.debug("Found index url %s", index_url)
    +
    +        # If an index URL was found, try its embedded credentials
    +        if index_url and index_url_user_password[0] is not None:
    +            username, password = index_url_user_password
    +            if username is not None and password is not None:
    +                logger.debug("Found credentials in index url for %s", netloc)
    +                return index_url_user_password
    +
    +        # Get creds from netrc if we still don't have them
    +        if allow_netrc:
    +            netrc_auth = get_netrc_auth(original_url)
    +            if netrc_auth:
    +                logger.debug("Found credentials in netrc for %s", netloc)
    +                return netrc_auth
    +
    +        # If we don't have a password and keyring is available, use it.
    +        if allow_keyring:
    +            # The index url is more specific than the netloc, so try it first
    +            # fmt: off
    +            kr_auth = (
    +                self._get_keyring_auth(index_url, username) or
    +                self._get_keyring_auth(netloc, username)
    +            )
    +            # fmt: on
    +            if kr_auth:
    +                logger.debug("Found credentials in keyring for %s", netloc)
    +                return kr_auth
    +
    +        return username, password
    +
    +    def _get_url_and_credentials(
    +        self, original_url: str
    +    ) -> Tuple[str, Optional[str], Optional[str]]:
    +        """Return the credentials to use for the provided URL.
    +
    +        If allowed, netrc and keyring may be used to obtain the
    +        correct credentials.
    +
    +        Returns (url_without_credentials, username, password). Note
    +        that even if the original URL contains credentials, this
    +        function may return a different username and password.
    +        """
    +        url, netloc, _ = split_auth_netloc_from_url(original_url)
    +
    +        # Try to get credentials from original url
    +        username, password = self._get_new_credentials(original_url)
    +
    +        # If credentials not found, use any stored credentials for this netloc.
    +        # Do this if either the username or the password is missing.
    +        # This accounts for the situation in which the user has specified
    +        # the username in the index url, but the password comes from keyring.
    +        if (username is None or password is None) and netloc in self.passwords:
    +            un, pw = self.passwords[netloc]
    +            # It is possible that the cached credentials are for a different username,
    +            # in which case the cache should be ignored.
    +            if username is None or username == un:
    +                username, password = un, pw
    +
    +        if username is not None or password is not None:
    +            # Convert the username and password if they're None, so that
    +            # this netloc will show up as "cached" in the conditional above.
    +            # Further, HTTPBasicAuth doesn't accept None, so it makes sense to
    +            # cache the value that is going to be used.
    +            username = username or ""
    +            password = password or ""
    +
    +            # Store any acquired credentials.
    +            self.passwords[netloc] = (username, password)
    +
    +        assert (
    +            # Credentials were found
    +            (username is not None and password is not None)
    +            # Credentials were not found
    +            or (username is None and password is None)
    +        ), f"Could not load credentials from url: {original_url}"
    +
    +        return url, username, password
    +
    +    def __call__(self, req: Request) -> Request:
    +        # Get credentials for this request
    +        url, username, password = self._get_url_and_credentials(req.url)
    +
    +        # Set the url of the request to the url without any credentials
    +        req.url = url
    +
    +        if username is not None and password is not None:
    +            # Send the basic auth with this request
    +            req = HTTPBasicAuth(username, password)(req)
    +
    +        # Attach a hook to handle 401 responses
    +        req.register_hook("response", self.handle_401)
    +
    +        return req
    +
    +    # Factored out to allow for easy patching in tests
    +    def _prompt_for_password(
    +        self, netloc: str
    +    ) -> Tuple[Optional[str], Optional[str], bool]:
    +        username = ask_input(f"User for {netloc}: ") if self.prompting else None
    +        if not username:
    +            return None, None, False
    +        if self.use_keyring:
    +            auth = self._get_keyring_auth(netloc, username)
    +            if auth and auth[0] is not None and auth[1] is not None:
    +                return auth[0], auth[1], False
    +        password = ask_password("Password: ")
    +        return username, password, True
    +
    +    # Factored out to allow for easy patching in tests
    +    def _should_save_password_to_keyring(self) -> bool:
    +        if (
    +            not self.prompting
    +            or not self.use_keyring
    +            or not self.keyring_provider.has_keyring
    +        ):
    +            return False
    +        return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y"
    +
    +    def handle_401(self, resp: Response, **kwargs: Any) -> Response:
    +        # We only care about 401 responses, anything else we want to just
    +        #   pass through the actual response
    +        if resp.status_code != 401:
    +            return resp
    +
    +        username, password = None, None
    +
    +        # Query the keyring for credentials:
    +        if self.use_keyring:
    +            username, password = self._get_new_credentials(
    +                resp.url,
    +                allow_netrc=False,
    +                allow_keyring=True,
    +            )
    +
    +        # We are not able to prompt the user so simply return the response
    +        if not self.prompting and not username and not password:
    +            return resp
    +
    +        parsed = urllib.parse.urlparse(resp.url)
    +
    +        # Prompt the user for a new username and password
    +        save = False
    +        if not username and not password:
    +            username, password, save = self._prompt_for_password(parsed.netloc)
    +
    +        # Store the new username and password to use for future requests
    +        self._credentials_to_save = None
    +        if username is not None and password is not None:
    +            self.passwords[parsed.netloc] = (username, password)
    +
    +            # Prompt to save the password to keyring
    +            if save and self._should_save_password_to_keyring():
    +                self._credentials_to_save = Credentials(
    +                    url=parsed.netloc,
    +                    username=username,
    +                    password=password,
    +                )
    +
    +        # Consume content and release the original connection to allow our new
    +        #   request to reuse the same one.
    +        # The result of the assignment isn't used, it's just needed to consume
    +        # the content.
    +        _ = resp.content
    +        resp.raw.release_conn()
    +
    +        # Add our new username and password to the request
    +        req = HTTPBasicAuth(username or "", password or "")(resp.request)
    +        req.register_hook("response", self.warn_on_401)
    +
    +        # On successful request, save the credentials that were used to
    +        # keyring. (Note that if the user responded "no" above, this member
    +        # is not set and nothing will be saved.)
    +        if self._credentials_to_save:
    +            req.register_hook("response", self.save_credentials)
    +
    +        # Send our new request
    +        new_resp = resp.connection.send(req, **kwargs)
    +        new_resp.history.append(resp)
    +
    +        return new_resp
    +
    +    def warn_on_401(self, resp: Response, **kwargs: Any) -> None:
    +        """Response callback to warn about incorrect credentials."""
    +        if resp.status_code == 401:
    +            logger.warning(
    +                "401 Error, Credentials not correct for %s",
    +                resp.request.url,
    +            )
    +
    +    def save_credentials(self, resp: Response, **kwargs: Any) -> None:
    +        """Response callback to save credentials on success."""
    +        assert (
    +            self.keyring_provider.has_keyring
    +        ), "should never reach here without keyring"
    +
    +        creds = self._credentials_to_save
    +        self._credentials_to_save = None
    +        if creds and resp.status_code < 400:
    +            try:
    +                logger.info("Saving credentials to keyring")
    +                self.keyring_provider.save_auth_info(
    +                    creds.url, creds.username, creds.password
    +                )
    +            except Exception:
    +                logger.exception("Failed to save credentials")
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/cache.py b/env/lib/python3.12/site-packages/pip/_internal/network/cache.py
    new file mode 100644
    index 0000000..4d0fb54
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/cache.py
    @@ -0,0 +1,106 @@
    +"""HTTP cache implementation.
    +"""
    +
    +import os
    +from contextlib import contextmanager
    +from datetime import datetime
    +from typing import BinaryIO, Generator, Optional, Union
    +
    +from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache
    +from pip._vendor.cachecontrol.caches import SeparateBodyFileCache
    +from pip._vendor.requests.models import Response
    +
    +from pip._internal.utils.filesystem import adjacent_tmp_file, replace
    +from pip._internal.utils.misc import ensure_dir
    +
    +
    +def is_from_cache(response: Response) -> bool:
    +    return getattr(response, "from_cache", False)
    +
    +
    +@contextmanager
    +def suppressed_cache_errors() -> Generator[None, None, None]:
    +    """If we can't access the cache then we can just skip caching and process
    +    requests as if caching wasn't enabled.
    +    """
    +    try:
    +        yield
    +    except OSError:
    +        pass
    +
    +
    +class SafeFileCache(SeparateBodyBaseCache):
    +    """
    +    A file based cache which is safe to use even when the target directory may
    +    not be accessible or writable.
    +
    +    There is a race condition when two processes try to write and/or read the
    +    same entry at the same time, since each entry consists of two separate
    +    files (https://github.com/psf/cachecontrol/issues/324).  We therefore have
    +    additional logic that makes sure that both files to be present before
    +    returning an entry; this fixes the read side of the race condition.
    +
    +    For the write side, we assume that the server will only ever return the
    +    same data for the same URL, which ought to be the case for files pip is
    +    downloading.  PyPI does not have a mechanism to swap out a wheel for
    +    another wheel, for example.  If this assumption is not true, the
    +    CacheControl issue will need to be fixed.
    +    """
    +
    +    def __init__(self, directory: str) -> None:
    +        assert directory is not None, "Cache directory must not be None."
    +        super().__init__()
    +        self.directory = directory
    +
    +    def _get_cache_path(self, name: str) -> str:
    +        # From cachecontrol.caches.file_cache.FileCache._fn, brought into our
    +        # class for backwards-compatibility and to avoid using a non-public
    +        # method.
    +        hashed = SeparateBodyFileCache.encode(name)
    +        parts = list(hashed[:5]) + [hashed]
    +        return os.path.join(self.directory, *parts)
    +
    +    def get(self, key: str) -> Optional[bytes]:
    +        # The cache entry is only valid if both metadata and body exist.
    +        metadata_path = self._get_cache_path(key)
    +        body_path = metadata_path + ".body"
    +        if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
    +            return None
    +        with suppressed_cache_errors():
    +            with open(metadata_path, "rb") as f:
    +                return f.read()
    +
    +    def _write(self, path: str, data: bytes) -> None:
    +        with suppressed_cache_errors():
    +            ensure_dir(os.path.dirname(path))
    +
    +            with adjacent_tmp_file(path) as f:
    +                f.write(data)
    +
    +            replace(f.name, path)
    +
    +    def set(
    +        self, key: str, value: bytes, expires: Union[int, datetime, None] = None
    +    ) -> None:
    +        path = self._get_cache_path(key)
    +        self._write(path, value)
    +
    +    def delete(self, key: str) -> None:
    +        path = self._get_cache_path(key)
    +        with suppressed_cache_errors():
    +            os.remove(path)
    +        with suppressed_cache_errors():
    +            os.remove(path + ".body")
    +
    +    def get_body(self, key: str) -> Optional[BinaryIO]:
    +        # The cache entry is only valid if both metadata and body exist.
    +        metadata_path = self._get_cache_path(key)
    +        body_path = metadata_path + ".body"
    +        if not (os.path.exists(metadata_path) and os.path.exists(body_path)):
    +            return None
    +        with suppressed_cache_errors():
    +            return open(body_path, "rb")
    +
    +    def set_body(self, key: str, body: bytes) -> None:
    +        path = self._get_cache_path(key) + ".body"
    +        self._write(path, body)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/download.py b/env/lib/python3.12/site-packages/pip/_internal/network/download.py
    new file mode 100644
    index 0000000..5c3bce3
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/download.py
    @@ -0,0 +1,187 @@
    +"""Download files with progress indicators.
    +"""
    +
    +import email.message
    +import logging
    +import mimetypes
    +import os
    +from typing import Iterable, Optional, Tuple
    +
    +from pip._vendor.requests.models import Response
    +
    +from pip._internal.cli.progress_bars import get_download_progress_renderer
    +from pip._internal.exceptions import NetworkConnectionError
    +from pip._internal.models.index import PyPI
    +from pip._internal.models.link import Link
    +from pip._internal.network.cache import is_from_cache
    +from pip._internal.network.session import PipSession
    +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks
    +from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def _get_http_response_size(resp: Response) -> Optional[int]:
    +    try:
    +        return int(resp.headers["content-length"])
    +    except (ValueError, KeyError, TypeError):
    +        return None
    +
    +
    +def _prepare_download(
    +    resp: Response,
    +    link: Link,
    +    progress_bar: str,
    +) -> Iterable[bytes]:
    +    total_length = _get_http_response_size(resp)
    +
    +    if link.netloc == PyPI.file_storage_domain:
    +        url = link.show_url
    +    else:
    +        url = link.url_without_fragment
    +
    +    logged_url = redact_auth_from_url(url)
    +
    +    if total_length:
    +        logged_url = f"{logged_url} ({format_size(total_length)})"
    +
    +    if is_from_cache(resp):
    +        logger.info("Using cached %s", logged_url)
    +    else:
    +        logger.info("Downloading %s", logged_url)
    +
    +    if logger.getEffectiveLevel() > logging.INFO:
    +        show_progress = False
    +    elif is_from_cache(resp):
    +        show_progress = False
    +    elif not total_length:
    +        show_progress = True
    +    elif total_length > (512 * 1024):
    +        show_progress = True
    +    else:
    +        show_progress = False
    +
    +    chunks = response_chunks(resp)
    +
    +    if not show_progress:
    +        return chunks
    +
    +    renderer = get_download_progress_renderer(bar_type=progress_bar, size=total_length)
    +    return renderer(chunks)
    +
    +
    +def sanitize_content_filename(filename: str) -> str:
    +    """
    +    Sanitize the "filename" value from a Content-Disposition header.
    +    """
    +    return os.path.basename(filename)
    +
    +
    +def parse_content_disposition(content_disposition: str, default_filename: str) -> str:
    +    """
    +    Parse the "filename" value from a Content-Disposition header, and
    +    return the default filename if the result is empty.
    +    """
    +    m = email.message.Message()
    +    m["content-type"] = content_disposition
    +    filename = m.get_param("filename")
    +    if filename:
    +        # We need to sanitize the filename to prevent directory traversal
    +        # in case the filename contains ".." path parts.
    +        filename = sanitize_content_filename(str(filename))
    +    return filename or default_filename
    +
    +
    +def _get_http_response_filename(resp: Response, link: Link) -> str:
    +    """Get an ideal filename from the given HTTP response, falling back to
    +    the link filename if not provided.
    +    """
    +    filename = link.filename  # fallback
    +    # Have a look at the Content-Disposition header for a better guess
    +    content_disposition = resp.headers.get("content-disposition")
    +    if content_disposition:
    +        filename = parse_content_disposition(content_disposition, filename)
    +    ext: Optional[str] = splitext(filename)[1]
    +    if not ext:
    +        ext = mimetypes.guess_extension(resp.headers.get("content-type", ""))
    +        if ext:
    +            filename += ext
    +    if not ext and link.url != resp.url:
    +        ext = os.path.splitext(resp.url)[1]
    +        if ext:
    +            filename += ext
    +    return filename
    +
    +
    +def _http_get_download(session: PipSession, link: Link) -> Response:
    +    target_url = link.url.split("#", 1)[0]
    +    resp = session.get(target_url, headers=HEADERS, stream=True)
    +    raise_for_status(resp)
    +    return resp
    +
    +
    +class Downloader:
    +    def __init__(
    +        self,
    +        session: PipSession,
    +        progress_bar: str,
    +    ) -> None:
    +        self._session = session
    +        self._progress_bar = progress_bar
    +
    +    def __call__(self, link: Link, location: str) -> Tuple[str, str]:
    +        """Download the file given by link into location."""
    +        try:
    +            resp = _http_get_download(self._session, link)
    +        except NetworkConnectionError as e:
    +            assert e.response is not None
    +            logger.critical(
    +                "HTTP error %s while getting %s", e.response.status_code, link
    +            )
    +            raise
    +
    +        filename = _get_http_response_filename(resp, link)
    +        filepath = os.path.join(location, filename)
    +
    +        chunks = _prepare_download(resp, link, self._progress_bar)
    +        with open(filepath, "wb") as content_file:
    +            for chunk in chunks:
    +                content_file.write(chunk)
    +        content_type = resp.headers.get("Content-Type", "")
    +        return filepath, content_type
    +
    +
    +class BatchDownloader:
    +    def __init__(
    +        self,
    +        session: PipSession,
    +        progress_bar: str,
    +    ) -> None:
    +        self._session = session
    +        self._progress_bar = progress_bar
    +
    +    def __call__(
    +        self, links: Iterable[Link], location: str
    +    ) -> Iterable[Tuple[Link, Tuple[str, str]]]:
    +        """Download the files given by links into location."""
    +        for link in links:
    +            try:
    +                resp = _http_get_download(self._session, link)
    +            except NetworkConnectionError as e:
    +                assert e.response is not None
    +                logger.critical(
    +                    "HTTP error %s while getting %s",
    +                    e.response.status_code,
    +                    link,
    +                )
    +                raise
    +
    +            filename = _get_http_response_filename(resp, link)
    +            filepath = os.path.join(location, filename)
    +
    +            chunks = _prepare_download(resp, link, self._progress_bar)
    +            with open(filepath, "wb") as content_file:
    +                for chunk in chunks:
    +                    content_file.write(chunk)
    +            content_type = resp.headers.get("Content-Type", "")
    +            yield link, (filepath, content_type)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py b/env/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
    new file mode 100644
    index 0000000..03f883c
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
    @@ -0,0 +1,210 @@
    +"""Lazy ZIP over HTTP"""
    +
    +__all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"]
    +
    +from bisect import bisect_left, bisect_right
    +from contextlib import contextmanager
    +from tempfile import NamedTemporaryFile
    +from typing import Any, Dict, Generator, List, Optional, Tuple
    +from zipfile import BadZipFile, ZipFile
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
    +
    +from pip._internal.metadata import BaseDistribution, MemoryWheel, get_wheel_distribution
    +from pip._internal.network.session import PipSession
    +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks
    +
    +
    +class HTTPRangeRequestUnsupported(Exception):
    +    pass
    +
    +
    +def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution:
    +    """Return a distribution object from the given wheel URL.
    +
    +    This uses HTTP range requests to only fetch the portion of the wheel
    +    containing metadata, just enough for the object to be constructed.
    +    If such requests are not supported, HTTPRangeRequestUnsupported
    +    is raised.
    +    """
    +    with LazyZipOverHTTP(url, session) as zf:
    +        # For read-only ZIP files, ZipFile only needs methods read,
    +        # seek, seekable and tell, not the whole IO protocol.
    +        wheel = MemoryWheel(zf.name, zf)  # type: ignore
    +        # After context manager exit, wheel.name
    +        # is an invalid file by intention.
    +        return get_wheel_distribution(wheel, canonicalize_name(name))
    +
    +
    +class LazyZipOverHTTP:
    +    """File-like object mapped to a ZIP file over HTTP.
    +
    +    This uses HTTP range requests to lazily fetch the file's content,
    +    which is supposed to be fed to ZipFile.  If such requests are not
    +    supported by the server, raise HTTPRangeRequestUnsupported
    +    during initialization.
    +    """
    +
    +    def __init__(
    +        self, url: str, session: PipSession, chunk_size: int = CONTENT_CHUNK_SIZE
    +    ) -> None:
    +        head = session.head(url, headers=HEADERS)
    +        raise_for_status(head)
    +        assert head.status_code == 200
    +        self._session, self._url, self._chunk_size = session, url, chunk_size
    +        self._length = int(head.headers["Content-Length"])
    +        self._file = NamedTemporaryFile()
    +        self.truncate(self._length)
    +        self._left: List[int] = []
    +        self._right: List[int] = []
    +        if "bytes" not in head.headers.get("Accept-Ranges", "none"):
    +            raise HTTPRangeRequestUnsupported("range request is not supported")
    +        self._check_zip()
    +
    +    @property
    +    def mode(self) -> str:
    +        """Opening mode, which is always rb."""
    +        return "rb"
    +
    +    @property
    +    def name(self) -> str:
    +        """Path to the underlying file."""
    +        return self._file.name
    +
    +    def seekable(self) -> bool:
    +        """Return whether random access is supported, which is True."""
    +        return True
    +
    +    def close(self) -> None:
    +        """Close the file."""
    +        self._file.close()
    +
    +    @property
    +    def closed(self) -> bool:
    +        """Whether the file is closed."""
    +        return self._file.closed
    +
    +    def read(self, size: int = -1) -> bytes:
    +        """Read up to size bytes from the object and return them.
    +
    +        As a convenience, if size is unspecified or -1,
    +        all bytes until EOF are returned.  Fewer than
    +        size bytes may be returned if EOF is reached.
    +        """
    +        download_size = max(size, self._chunk_size)
    +        start, length = self.tell(), self._length
    +        stop = length if size < 0 else min(start + download_size, length)
    +        start = max(0, stop - download_size)
    +        self._download(start, stop - 1)
    +        return self._file.read(size)
    +
    +    def readable(self) -> bool:
    +        """Return whether the file is readable, which is True."""
    +        return True
    +
    +    def seek(self, offset: int, whence: int = 0) -> int:
    +        """Change stream position and return the new absolute position.
    +
    +        Seek to offset relative position indicated by whence:
    +        * 0: Start of stream (the default).  pos should be >= 0;
    +        * 1: Current position - pos may be negative;
    +        * 2: End of stream - pos usually negative.
    +        """
    +        return self._file.seek(offset, whence)
    +
    +    def tell(self) -> int:
    +        """Return the current position."""
    +        return self._file.tell()
    +
    +    def truncate(self, size: Optional[int] = None) -> int:
    +        """Resize the stream to the given size in bytes.
    +
    +        If size is unspecified resize to the current position.
    +        The current stream position isn't changed.
    +
    +        Return the new file size.
    +        """
    +        return self._file.truncate(size)
    +
    +    def writable(self) -> bool:
    +        """Return False."""
    +        return False
    +
    +    def __enter__(self) -> "LazyZipOverHTTP":
    +        self._file.__enter__()
    +        return self
    +
    +    def __exit__(self, *exc: Any) -> None:
    +        self._file.__exit__(*exc)
    +
    +    @contextmanager
    +    def _stay(self) -> Generator[None, None, None]:
    +        """Return a context manager keeping the position.
    +
    +        At the end of the block, seek back to original position.
    +        """
    +        pos = self.tell()
    +        try:
    +            yield
    +        finally:
    +            self.seek(pos)
    +
    +    def _check_zip(self) -> None:
    +        """Check and download until the file is a valid ZIP."""
    +        end = self._length - 1
    +        for start in reversed(range(0, end, self._chunk_size)):
    +            self._download(start, end)
    +            with self._stay():
    +                try:
    +                    # For read-only ZIP files, ZipFile only needs
    +                    # methods read, seek, seekable and tell.
    +                    ZipFile(self)
    +                except BadZipFile:
    +                    pass
    +                else:
    +                    break
    +
    +    def _stream_response(
    +        self, start: int, end: int, base_headers: Dict[str, str] = HEADERS
    +    ) -> Response:
    +        """Return HTTP response to a range request from start to end."""
    +        headers = base_headers.copy()
    +        headers["Range"] = f"bytes={start}-{end}"
    +        # TODO: Get range requests to be correctly cached
    +        headers["Cache-Control"] = "no-cache"
    +        return self._session.get(self._url, headers=headers, stream=True)
    +
    +    def _merge(
    +        self, start: int, end: int, left: int, right: int
    +    ) -> Generator[Tuple[int, int], None, None]:
    +        """Return a generator of intervals to be fetched.
    +
    +        Args:
    +            start (int): Start of needed interval
    +            end (int): End of needed interval
    +            left (int): Index of first overlapping downloaded data
    +            right (int): Index after last overlapping downloaded data
    +        """
    +        lslice, rslice = self._left[left:right], self._right[left:right]
    +        i = start = min([start] + lslice[:1])
    +        end = max([end] + rslice[-1:])
    +        for j, k in zip(lslice, rslice):
    +            if j > i:
    +                yield i, j - 1
    +            i = k + 1
    +        if i <= end:
    +            yield i, end
    +        self._left[left:right], self._right[left:right] = [start], [end]
    +
    +    def _download(self, start: int, end: int) -> None:
    +        """Download bytes from start to end inclusively."""
    +        with self._stay():
    +            left = bisect_left(self._right, start)
    +            right = bisect_right(self._left, end)
    +            for start, end in self._merge(start, end, left, right):
    +                response = self._stream_response(start, end)
    +                response.raise_for_status()
    +                self.seek(start)
    +                for chunk in response_chunks(response, self._chunk_size):
    +                    self._file.write(chunk)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/session.py b/env/lib/python3.12/site-packages/pip/_internal/network/session.py
    new file mode 100644
    index 0000000..1765b4f
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/session.py
    @@ -0,0 +1,522 @@
    +"""PipSession and supporting code, containing all pip-specific
    +network request configuration and behavior.
    +"""
    +
    +import email.utils
    +import functools
    +import io
    +import ipaddress
    +import json
    +import logging
    +import mimetypes
    +import os
    +import platform
    +import shutil
    +import subprocess
    +import sys
    +import urllib.parse
    +import warnings
    +from typing import (
    +    TYPE_CHECKING,
    +    Any,
    +    Dict,
    +    Generator,
    +    List,
    +    Mapping,
    +    Optional,
    +    Sequence,
    +    Tuple,
    +    Union,
    +)
    +
    +from pip._vendor import requests, urllib3
    +from pip._vendor.cachecontrol import CacheControlAdapter as _BaseCacheControlAdapter
    +from pip._vendor.requests.adapters import DEFAULT_POOLBLOCK, BaseAdapter
    +from pip._vendor.requests.adapters import HTTPAdapter as _BaseHTTPAdapter
    +from pip._vendor.requests.models import PreparedRequest, Response
    +from pip._vendor.requests.structures import CaseInsensitiveDict
    +from pip._vendor.urllib3.connectionpool import ConnectionPool
    +from pip._vendor.urllib3.exceptions import InsecureRequestWarning
    +
    +from pip import __version__
    +from pip._internal.metadata import get_default_environment
    +from pip._internal.models.link import Link
    +from pip._internal.network.auth import MultiDomainBasicAuth
    +from pip._internal.network.cache import SafeFileCache
    +
    +# Import ssl from compat so the initial import occurs in only one place.
    +from pip._internal.utils.compat import has_tls
    +from pip._internal.utils.glibc import libc_ver
    +from pip._internal.utils.misc import build_url_from_netloc, parse_netloc
    +from pip._internal.utils.urls import url_to_path
    +
    +if TYPE_CHECKING:
    +    from ssl import SSLContext
    +
    +    from pip._vendor.urllib3.poolmanager import PoolManager
    +
    +
    +logger = logging.getLogger(__name__)
    +
    +SecureOrigin = Tuple[str, str, Optional[Union[int, str]]]
    +
    +
    +# Ignore warning raised when using --trusted-host.
    +warnings.filterwarnings("ignore", category=InsecureRequestWarning)
    +
    +
    +SECURE_ORIGINS: List[SecureOrigin] = [
    +    # protocol, hostname, port
    +    # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC)
    +    ("https", "*", "*"),
    +    ("*", "localhost", "*"),
    +    ("*", "127.0.0.0/8", "*"),
    +    ("*", "::1/128", "*"),
    +    ("file", "*", None),
    +    # ssh is always secure.
    +    ("ssh", "*", "*"),
    +]
    +
    +
    +# These are environment variables present when running under various
    +# CI systems.  For each variable, some CI systems that use the variable
    +# are indicated.  The collection was chosen so that for each of a number
    +# of popular systems, at least one of the environment variables is used.
    +# This list is used to provide some indication of and lower bound for
    +# CI traffic to PyPI.  Thus, it is okay if the list is not comprehensive.
    +# For more background, see: https://github.com/pypa/pip/issues/5499
    +CI_ENVIRONMENT_VARIABLES = (
    +    # Azure Pipelines
    +    "BUILD_BUILDID",
    +    # Jenkins
    +    "BUILD_ID",
    +    # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI
    +    "CI",
    +    # Explicit environment variable.
    +    "PIP_IS_CI",
    +)
    +
    +
    +def looks_like_ci() -> bool:
    +    """
    +    Return whether it looks like pip is running under CI.
    +    """
    +    # We don't use the method of checking for a tty (e.g. using isatty())
    +    # because some CI systems mimic a tty (e.g. Travis CI).  Thus that
    +    # method doesn't provide definitive information in either direction.
    +    return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES)
    +
    +
    +@functools.lru_cache(maxsize=1)
    +def user_agent() -> str:
    +    """
    +    Return a string representing the user agent.
    +    """
    +    data: Dict[str, Any] = {
    +        "installer": {"name": "pip", "version": __version__},
    +        "python": platform.python_version(),
    +        "implementation": {
    +            "name": platform.python_implementation(),
    +        },
    +    }
    +
    +    if data["implementation"]["name"] == "CPython":
    +        data["implementation"]["version"] = platform.python_version()
    +    elif data["implementation"]["name"] == "PyPy":
    +        pypy_version_info = sys.pypy_version_info  # type: ignore
    +        if pypy_version_info.releaselevel == "final":
    +            pypy_version_info = pypy_version_info[:3]
    +        data["implementation"]["version"] = ".".join(
    +            [str(x) for x in pypy_version_info]
    +        )
    +    elif data["implementation"]["name"] == "Jython":
    +        # Complete Guess
    +        data["implementation"]["version"] = platform.python_version()
    +    elif data["implementation"]["name"] == "IronPython":
    +        # Complete Guess
    +        data["implementation"]["version"] = platform.python_version()
    +
    +    if sys.platform.startswith("linux"):
    +        from pip._vendor import distro
    +
    +        linux_distribution = distro.name(), distro.version(), distro.codename()
    +        distro_infos: Dict[str, Any] = dict(
    +            filter(
    +                lambda x: x[1],
    +                zip(["name", "version", "id"], linux_distribution),
    +            )
    +        )
    +        libc = dict(
    +            filter(
    +                lambda x: x[1],
    +                zip(["lib", "version"], libc_ver()),
    +            )
    +        )
    +        if libc:
    +            distro_infos["libc"] = libc
    +        if distro_infos:
    +            data["distro"] = distro_infos
    +
    +    if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
    +        data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
    +
    +    if platform.system():
    +        data.setdefault("system", {})["name"] = platform.system()
    +
    +    if platform.release():
    +        data.setdefault("system", {})["release"] = platform.release()
    +
    +    if platform.machine():
    +        data["cpu"] = platform.machine()
    +
    +    if has_tls():
    +        import _ssl as ssl
    +
    +        data["openssl_version"] = ssl.OPENSSL_VERSION
    +
    +    setuptools_dist = get_default_environment().get_distribution("setuptools")
    +    if setuptools_dist is not None:
    +        data["setuptools_version"] = str(setuptools_dist.version)
    +
    +    if shutil.which("rustc") is not None:
    +        # If for any reason `rustc --version` fails, silently ignore it
    +        try:
    +            rustc_output = subprocess.check_output(
    +                ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5
    +            )
    +        except Exception:
    +            pass
    +        else:
    +            if rustc_output.startswith(b"rustc "):
    +                # The format of `rustc --version` is:
    +                # `b'rustc 1.52.1 (9bc8c42bb 2021-05-09)\n'`
    +                # We extract just the middle (1.52.1) part
    +                data["rustc_version"] = rustc_output.split(b" ")[1].decode()
    +
    +    # Use None rather than False so as not to give the impression that
    +    # pip knows it is not being run under CI.  Rather, it is a null or
    +    # inconclusive result.  Also, we include some value rather than no
    +    # value to make it easier to know that the check has been run.
    +    data["ci"] = True if looks_like_ci() else None
    +
    +    user_data = os.environ.get("PIP_USER_AGENT_USER_DATA")
    +    if user_data is not None:
    +        data["user_data"] = user_data
    +
    +    return "{data[installer][name]}/{data[installer][version]} {json}".format(
    +        data=data,
    +        json=json.dumps(data, separators=(",", ":"), sort_keys=True),
    +    )
    +
    +
    +class LocalFSAdapter(BaseAdapter):
    +    def send(
    +        self,
    +        request: PreparedRequest,
    +        stream: bool = False,
    +        timeout: Optional[Union[float, Tuple[float, float]]] = None,
    +        verify: Union[bool, str] = True,
    +        cert: Optional[Union[str, Tuple[str, str]]] = None,
    +        proxies: Optional[Mapping[str, str]] = None,
    +    ) -> Response:
    +        pathname = url_to_path(request.url)
    +
    +        resp = Response()
    +        resp.status_code = 200
    +        resp.url = request.url
    +
    +        try:
    +            stats = os.stat(pathname)
    +        except OSError as exc:
    +            # format the exception raised as a io.BytesIO object,
    +            # to return a better error message:
    +            resp.status_code = 404
    +            resp.reason = type(exc).__name__
    +            resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode())
    +        else:
    +            modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
    +            content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
    +            resp.headers = CaseInsensitiveDict(
    +                {
    +                    "Content-Type": content_type,
    +                    "Content-Length": stats.st_size,
    +                    "Last-Modified": modified,
    +                }
    +            )
    +
    +            resp.raw = open(pathname, "rb")
    +            resp.close = resp.raw.close
    +
    +        return resp
    +
    +    def close(self) -> None:
    +        pass
    +
    +
    +class _SSLContextAdapterMixin:
    +    """Mixin to add the ``ssl_context`` constructor argument to HTTP adapters.
    +
    +    The additional argument is forwarded directly to the pool manager. This allows us
    +    to dynamically decide what SSL store to use at runtime, which is used to implement
    +    the optional ``truststore`` backend.
    +    """
    +
    +    def __init__(
    +        self,
    +        *,
    +        ssl_context: Optional["SSLContext"] = None,
    +        **kwargs: Any,
    +    ) -> None:
    +        self._ssl_context = ssl_context
    +        super().__init__(**kwargs)
    +
    +    def init_poolmanager(
    +        self,
    +        connections: int,
    +        maxsize: int,
    +        block: bool = DEFAULT_POOLBLOCK,
    +        **pool_kwargs: Any,
    +    ) -> "PoolManager":
    +        if self._ssl_context is not None:
    +            pool_kwargs.setdefault("ssl_context", self._ssl_context)
    +        return super().init_poolmanager(  # type: ignore[misc]
    +            connections=connections,
    +            maxsize=maxsize,
    +            block=block,
    +            **pool_kwargs,
    +        )
    +
    +
    +class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter):
    +    pass
    +
    +
    +class CacheControlAdapter(_SSLContextAdapterMixin, _BaseCacheControlAdapter):
    +    pass
    +
    +
    +class InsecureHTTPAdapter(HTTPAdapter):
    +    def cert_verify(
    +        self,
    +        conn: ConnectionPool,
    +        url: str,
    +        verify: Union[bool, str],
    +        cert: Optional[Union[str, Tuple[str, str]]],
    +    ) -> None:
    +        super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
    +
    +
    +class InsecureCacheControlAdapter(CacheControlAdapter):
    +    def cert_verify(
    +        self,
    +        conn: ConnectionPool,
    +        url: str,
    +        verify: Union[bool, str],
    +        cert: Optional[Union[str, Tuple[str, str]]],
    +    ) -> None:
    +        super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
    +
    +
    +class PipSession(requests.Session):
    +    timeout: Optional[int] = None
    +
    +    def __init__(
    +        self,
    +        *args: Any,
    +        retries: int = 0,
    +        cache: Optional[str] = None,
    +        trusted_hosts: Sequence[str] = (),
    +        index_urls: Optional[List[str]] = None,
    +        ssl_context: Optional["SSLContext"] = None,
    +        **kwargs: Any,
    +    ) -> None:
    +        """
    +        :param trusted_hosts: Domains not to emit warnings for when not using
    +            HTTPS.
    +        """
    +        super().__init__(*args, **kwargs)
    +
    +        # Namespace the attribute with "pip_" just in case to prevent
    +        # possible conflicts with the base class.
    +        self.pip_trusted_origins: List[Tuple[str, Optional[int]]] = []
    +
    +        # Attach our User Agent to the request
    +        self.headers["User-Agent"] = user_agent()
    +
    +        # Attach our Authentication handler to the session
    +        self.auth = MultiDomainBasicAuth(index_urls=index_urls)
    +
    +        # Create our urllib3.Retry instance which will allow us to customize
    +        # how we handle retries.
    +        retries = urllib3.Retry(
    +            # Set the total number of retries that a particular request can
    +            # have.
    +            total=retries,
    +            # A 503 error from PyPI typically means that the Fastly -> Origin
    +            # connection got interrupted in some way. A 503 error in general
    +            # is typically considered a transient error so we'll go ahead and
    +            # retry it.
    +            # A 500 may indicate transient error in Amazon S3
    +            # A 502 may be a transient error from a CDN like CloudFlare or CloudFront
    +            # A 520 or 527 - may indicate transient error in CloudFlare
    +            status_forcelist=[500, 502, 503, 520, 527],
    +            # Add a small amount of back off between failed requests in
    +            # order to prevent hammering the service.
    +            backoff_factor=0.25,
    +        )  # type: ignore
    +
    +        # Our Insecure HTTPAdapter disables HTTPS validation. It does not
    +        # support caching so we'll use it for all http:// URLs.
    +        # If caching is disabled, we will also use it for
    +        # https:// hosts that we've marked as ignoring
    +        # TLS errors for (trusted-hosts).
    +        insecure_adapter = InsecureHTTPAdapter(max_retries=retries)
    +
    +        # We want to _only_ cache responses on securely fetched origins or when
    +        # the host is specified as trusted. We do this because
    +        # we can't validate the response of an insecurely/untrusted fetched
    +        # origin, and we don't want someone to be able to poison the cache and
    +        # require manual eviction from the cache to fix it.
    +        if cache:
    +            secure_adapter = CacheControlAdapter(
    +                cache=SafeFileCache(cache),
    +                max_retries=retries,
    +                ssl_context=ssl_context,
    +            )
    +            self._trusted_host_adapter = InsecureCacheControlAdapter(
    +                cache=SafeFileCache(cache),
    +                max_retries=retries,
    +            )
    +        else:
    +            secure_adapter = HTTPAdapter(max_retries=retries, ssl_context=ssl_context)
    +            self._trusted_host_adapter = insecure_adapter
    +
    +        self.mount("https://", secure_adapter)
    +        self.mount("http://", insecure_adapter)
    +
    +        # Enable file:// urls
    +        self.mount("file://", LocalFSAdapter())
    +
    +        for host in trusted_hosts:
    +            self.add_trusted_host(host, suppress_logging=True)
    +
    +    def update_index_urls(self, new_index_urls: List[str]) -> None:
    +        """
    +        :param new_index_urls: New index urls to update the authentication
    +            handler with.
    +        """
    +        self.auth.index_urls = new_index_urls
    +
    +    def add_trusted_host(
    +        self, host: str, source: Optional[str] = None, suppress_logging: bool = False
    +    ) -> None:
    +        """
    +        :param host: It is okay to provide a host that has previously been
    +            added.
    +        :param source: An optional source string, for logging where the host
    +            string came from.
    +        """
    +        if not suppress_logging:
    +            msg = f"adding trusted host: {host!r}"
    +            if source is not None:
    +                msg += f" (from {source})"
    +            logger.info(msg)
    +
    +        parsed_host, parsed_port = parse_netloc(host)
    +        if parsed_host is None:
    +            raise ValueError(f"Trusted host URL must include a host part: {host!r}")
    +        if (parsed_host, parsed_port) not in self.pip_trusted_origins:
    +            self.pip_trusted_origins.append((parsed_host, parsed_port))
    +
    +        self.mount(
    +            build_url_from_netloc(host, scheme="http") + "/", self._trusted_host_adapter
    +        )
    +        self.mount(build_url_from_netloc(host) + "/", self._trusted_host_adapter)
    +        if not parsed_port:
    +            self.mount(
    +                build_url_from_netloc(host, scheme="http") + ":",
    +                self._trusted_host_adapter,
    +            )
    +            # Mount wildcard ports for the same host.
    +            self.mount(build_url_from_netloc(host) + ":", self._trusted_host_adapter)
    +
    +    def iter_secure_origins(self) -> Generator[SecureOrigin, None, None]:
    +        yield from SECURE_ORIGINS
    +        for host, port in self.pip_trusted_origins:
    +            yield ("*", host, "*" if port is None else port)
    +
    +    def is_secure_origin(self, location: Link) -> bool:
    +        # Determine if this url used a secure transport mechanism
    +        parsed = urllib.parse.urlparse(str(location))
    +        origin_protocol, origin_host, origin_port = (
    +            parsed.scheme,
    +            parsed.hostname,
    +            parsed.port,
    +        )
    +
    +        # The protocol to use to see if the protocol matches.
    +        # Don't count the repository type as part of the protocol: in
    +        # cases such as "git+ssh", only use "ssh". (I.e., Only verify against
    +        # the last scheme.)
    +        origin_protocol = origin_protocol.rsplit("+", 1)[-1]
    +
    +        # Determine if our origin is a secure origin by looking through our
    +        # hardcoded list of secure origins, as well as any additional ones
    +        # configured on this PackageFinder instance.
    +        for secure_origin in self.iter_secure_origins():
    +            secure_protocol, secure_host, secure_port = secure_origin
    +            if origin_protocol != secure_protocol and secure_protocol != "*":
    +                continue
    +
    +            try:
    +                addr = ipaddress.ip_address(origin_host or "")
    +                network = ipaddress.ip_network(secure_host)
    +            except ValueError:
    +                # We don't have both a valid address or a valid network, so
    +                # we'll check this origin against hostnames.
    +                if (
    +                    origin_host
    +                    and origin_host.lower() != secure_host.lower()
    +                    and secure_host != "*"
    +                ):
    +                    continue
    +            else:
    +                # We have a valid address and network, so see if the address
    +                # is contained within the network.
    +                if addr not in network:
    +                    continue
    +
    +            # Check to see if the port matches.
    +            if (
    +                origin_port != secure_port
    +                and secure_port != "*"
    +                and secure_port is not None
    +            ):
    +                continue
    +
    +            # If we've gotten here, then this origin matches the current
    +            # secure origin and we should return True
    +            return True
    +
    +        # If we've gotten to this point, then the origin isn't secure and we
    +        # will not accept it as a valid location to search. We will however
    +        # log a warning that we are ignoring it.
    +        logger.warning(
    +            "The repository located at %s is not a trusted or secure host and "
    +            "is being ignored. If this repository is available via HTTPS we "
    +            "recommend you use HTTPS instead, otherwise you may silence "
    +            "this warning and allow it anyway with '--trusted-host %s'.",
    +            origin_host,
    +            origin_host,
    +        )
    +
    +        return False
    +
    +    def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response:
    +        # Allow setting a default timeout on a session
    +        kwargs.setdefault("timeout", self.timeout)
    +        # Allow setting a default proxies on a session
    +        kwargs.setdefault("proxies", self.proxies)
    +
    +        # Dispatch the actual request
    +        return super().request(method, url, *args, **kwargs)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/utils.py b/env/lib/python3.12/site-packages/pip/_internal/network/utils.py
    new file mode 100644
    index 0000000..bba4c26
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/utils.py
    @@ -0,0 +1,98 @@
    +from typing import Dict, Generator
    +
    +from pip._vendor.requests.models import Response
    +
    +from pip._internal.exceptions import NetworkConnectionError
    +
    +# The following comments and HTTP headers were originally added by
    +# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03.
    +#
    +# We use Accept-Encoding: identity here because requests defaults to
    +# accepting compressed responses. This breaks in a variety of ways
    +# depending on how the server is configured.
    +# - Some servers will notice that the file isn't a compressible file
    +#   and will leave the file alone and with an empty Content-Encoding
    +# - Some servers will notice that the file is already compressed and
    +#   will leave the file alone, adding a Content-Encoding: gzip header
    +# - Some servers won't notice anything at all and will take a file
    +#   that's already been compressed and compress it again, and set
    +#   the Content-Encoding: gzip header
    +# By setting this to request only the identity encoding we're hoping
    +# to eliminate the third case.  Hopefully there does not exist a server
    +# which when given a file will notice it is already compressed and that
    +# you're not asking for a compressed file and will then decompress it
    +# before sending because if that's the case I don't think it'll ever be
    +# possible to make this work.
    +HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"}
    +
    +DOWNLOAD_CHUNK_SIZE = 256 * 1024
    +
    +
    +def raise_for_status(resp: Response) -> None:
    +    http_error_msg = ""
    +    if isinstance(resp.reason, bytes):
    +        # We attempt to decode utf-8 first because some servers
    +        # choose to localize their reason strings. If the string
    +        # isn't utf-8, we fall back to iso-8859-1 for all other
    +        # encodings.
    +        try:
    +            reason = resp.reason.decode("utf-8")
    +        except UnicodeDecodeError:
    +            reason = resp.reason.decode("iso-8859-1")
    +    else:
    +        reason = resp.reason
    +
    +    if 400 <= resp.status_code < 500:
    +        http_error_msg = (
    +            f"{resp.status_code} Client Error: {reason} for url: {resp.url}"
    +        )
    +
    +    elif 500 <= resp.status_code < 600:
    +        http_error_msg = (
    +            f"{resp.status_code} Server Error: {reason} for url: {resp.url}"
    +        )
    +
    +    if http_error_msg:
    +        raise NetworkConnectionError(http_error_msg, response=resp)
    +
    +
    +def response_chunks(
    +    response: Response, chunk_size: int = DOWNLOAD_CHUNK_SIZE
    +) -> Generator[bytes, None, None]:
    +    """Given a requests Response, provide the data chunks."""
    +    try:
    +        # Special case for urllib3.
    +        for chunk in response.raw.stream(
    +            chunk_size,
    +            # We use decode_content=False here because we don't
    +            # want urllib3 to mess with the raw bytes we get
    +            # from the server. If we decompress inside of
    +            # urllib3 then we cannot verify the checksum
    +            # because the checksum will be of the compressed
    +            # file. This breakage will only occur if the
    +            # server adds a Content-Encoding header, which
    +            # depends on how the server was configured:
    +            # - Some servers will notice that the file isn't a
    +            #   compressible file and will leave the file alone
    +            #   and with an empty Content-Encoding
    +            # - Some servers will notice that the file is
    +            #   already compressed and will leave the file
    +            #   alone and will add a Content-Encoding: gzip
    +            #   header
    +            # - Some servers won't notice anything at all and
    +            #   will take a file that's already been compressed
    +            #   and compress it again and set the
    +            #   Content-Encoding: gzip header
    +            #
    +            # By setting this not to decode automatically we
    +            # hope to eliminate problems with the second case.
    +            decode_content=False,
    +        ):
    +            yield chunk
    +    except AttributeError:
    +        # Standard file-like object.
    +        while True:
    +            chunk = response.raw.read(chunk_size)
    +            if not chunk:
    +                break
    +            yield chunk
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py b/env/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
    new file mode 100644
    index 0000000..22ec8d2
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
    @@ -0,0 +1,62 @@
    +"""xmlrpclib.Transport implementation
    +"""
    +
    +import logging
    +import urllib.parse
    +import xmlrpc.client
    +from typing import TYPE_CHECKING, Tuple
    +
    +from pip._internal.exceptions import NetworkConnectionError
    +from pip._internal.network.session import PipSession
    +from pip._internal.network.utils import raise_for_status
    +
    +if TYPE_CHECKING:
    +    from xmlrpc.client import _HostType, _Marshallable
    +
    +    from _typeshed import SizedBuffer
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class PipXmlrpcTransport(xmlrpc.client.Transport):
    +    """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
    +    object.
    +    """
    +
    +    def __init__(
    +        self, index_url: str, session: PipSession, use_datetime: bool = False
    +    ) -> None:
    +        super().__init__(use_datetime)
    +        index_parts = urllib.parse.urlparse(index_url)
    +        self._scheme = index_parts.scheme
    +        self._session = session
    +
    +    def request(
    +        self,
    +        host: "_HostType",
    +        handler: str,
    +        request_body: "SizedBuffer",
    +        verbose: bool = False,
    +    ) -> Tuple["_Marshallable", ...]:
    +        assert isinstance(host, str)
    +        parts = (self._scheme, host, handler, None, None, None)
    +        url = urllib.parse.urlunparse(parts)
    +        try:
    +            headers = {"Content-Type": "text/xml"}
    +            response = self._session.post(
    +                url,
    +                data=request_body,
    +                headers=headers,
    +                stream=True,
    +            )
    +            raise_for_status(response)
    +            self.verbose = verbose
    +            return self.parse_response(response.raw)
    +        except NetworkConnectionError as exc:
    +            assert exc.response
    +            logger.critical(
    +                "HTTP error %s while getting %s",
    +                exc.response.status_code,
    +                url,
    +            )
    +            raise
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/operations/__init__.py
    new file mode 100644
    index 0000000..e69de29
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..6986651dea70fdea992c7f92e4a17e53db458bcd
    GIT binary patch
    literal 215
    zcmZ9GJqiLb5QP(eKm-qBu{-{>Vxyv!UO))Z9e0D9ACjz)lXwQt;tgy)fox}G()!@d
    z`{pslJV&D;iQ2GZnev^+zuI1G?j(>g-9L!!#H~#?-y2j~BFLuVQt|@U`rJrV-oaM*
    zU2}rzWRk6UaM|IKt#pBa>IStqfeF6SYMxJL;DpD_@bi_I=)edAOel|5@fx&2%e~Ob
    g0gJ8hjO8Z01`DZ+rpBf1$2VxSOYrGZN^LjN4{(q=G5`Po
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..d6b8a13752e76c349982dc7afca75399534aec33
    GIT binary patch
    literal 7122
    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
    I$j|rx0i0#=_y7O^
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..1a5f273fc48a6a2e39766e65c01aa4ff2beb0379
    GIT binary patch
    literal 10146
    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
    KMkH30`hNkYi!2)e
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..2cc18752e66247193db4e429d77ed249f186f4ca
    GIT binary patch
    literal 25790
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py
    new file mode 100644
    index 0000000..e69de29
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..3e784952822f7064e46be96534022c83c735a68e
    GIT binary patch
    literal 221
    zcmZ8bNeaS15X`uM2tLF^>_o5PMMY2g0b!UVZ8Dfym_-Qq58vQh{DD_rAh~&Ra^EWfZ4EoiQRa_P`WR)f-LnBz)X
    k$ULtLpy9_Ir8C{UMoXazU*pOQLm3jrcH+|~gqVI%KmYDLcK`qY
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..a29b7910ba2b37bb15f68b5c16a34f8d711fe5d0
    GIT binary patch
    literal 7685
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..0d44a339827721b9e5b39ad3f5e709690e1a2e08
    GIT binary patch
    literal 1875
    zcmZ`)&2Jk;6rb4-ukCpAS*1ZKWJN-Pk?d_~OC{76a2rwtq*c-$Y9X!G-buXaeraYM
    z*O3Di;?PQniW3|-RN{o%KY)r;bE?E8QHxrwK&n7Ja0?_TC|r26_BymGV|i!Zyf<%u
    z^WN{h{ZUo32*!-@(b5+(Lceh#8R^bqy9SG|kcG;~!j|CRGKN`n1XnDJnD0rBn$`aM;A?jk<%6%r4dz(UDT|N3C
    z2~EokO>K#Igqor4dz#}f*;Q@PryBF?v`RF~W+AmJb*^Q_?C%`xTpmZmrMm4{C9`^&
    zc-C3pzkJ$s96~|UA8Tg36`T5=OS~{IM5FI{EChr2B@6XRK>aFVY=%;wMk5K3*)EQE
    zP1_+BI2)yP55O4>JFFQjuw%i6qvjF;wR(ZL!5N#9YUtBul&Nq~2Ju!RrP78LDHdGQ
    zc3706B&<`fDt6+{Ck6go-d@B!_8~mmgJLQdPm
    zl5TZ;tjR6B%>6$zT5@8+Pi7EUWu7qsv9<3fl|fdD{}MEi*JtFgH}UX1l*>l?HC0E8->8z~g8dG29R^x&-&Z
    z=<{>`v%k>Z&nv4=C(%T66AIRu?Ja>=t(l(9T&7usRe^WJ(riyVKXYC?HhsL9&1x{_
    z<2*7gtdWGeVAgeIC3Gmp)~kK4ZxQMh5`zoCN9nTdSyBIz<5z%{O~W-kAe6N_ex8!R
    zq-`vn>UcG10$rDZV#UyRojlO4F934E0i(mMxqOE5GLEFc3~Q8UJsMzLnj38rM_Lej
    zCq@FrfI>6coNd$yaVX~zP4VM`&mw8rx4nFta(+;rAlk!Kecj`s8^CR&Tz7*@sm|MS
    zymW1E(Kq<6On9v^j*`cakG+;&^If95^_uCrrlp_pt94$mOrN#Gv-OHTefV(UjM-#`
    zbBl%35Jep-OLy#w9yG(6?;R;lzpgVoB!x~qm>$@HZrEN30XH4p4?2B?>G3V~1ZXj6
    zMgyI;vmXw62+(n|vTxyW747t*gA*J1H}73|Fg$a~d@f#^40raqY;{T5_dIg1CGChg~l{Z3EriVa0vIwi$frc}5{LTu!Jq-$nR1#98|e
    zZNs|}9pwnpC!pl&4mm|9LFE0AorMQP5#v7ujHT@q!r3S2)Dv`cR}iuAR~q42{0n+x
    hD>aOdKI$9W68Zev+wJ-Nxp;mor*~x7r>}sse*x_J1(*N;
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..c19789bc4a7f46a9743183430440fe59c88e0aa2
    GIT binary patch
    literal 1909
    zcmZ`)-ES0C6u2-~#d-r4Um}dE2n$$rg{lCvQ+S?LK`qF{-NMvI>
    zvW+?76KY3J;2Ul*=hThafEp}l(mFA)!y@X`n%v6Dg+DmhQzaoDtTY`LSM2%);^PxR
    zaN(Hkx`cvdTVk2=7aSV+9`U1+7!SYgvj`lLLuQ(_kOpu)-YVtaapWV
    z5;dt`m(qOmNrQhbug?lR_Yr(MgTKIa>6+M)mZi2dpRO|xJ}=8{^coUS1aI0ISiY9V
    zSXSD?JdgjxXe*fq-HpEsbo3={$xR=c7+yxfCUg8b5bF)wcbLZvOjsRwN3h}e#+j)z#=(OVRfra^k(z=LMKhe>`(I2Yi$-I6jWI&ACAhSlO~X+Xq77rB}{S655nw
    zA=ruRn)?XGm%WSRQj(o2M#!hyjb``M~i@Im)?0`D4)@ZtCksh`bPP9v8a`E~)8(
    zMP9~^KO0zFs}Npyj05HQ
    zBw
    zOqat}yesWR#LBeY9MRo?ms6R23!h79qZjSmyIMMY^W2@mvzJcaA9&&Jz}T&Uu}km%
    zmha!lq5koE#l!28*k8D;uBoW^nY;SvEq(Nxg`f5EnkeZr!o88vyCWxWjhwtWd3)r8
    zFN&KA>NPj}P+?$W7b^B%J#^*J)yXT9UlqS`Z};q9mG}R%p`jh-Ur2z>zYLbYU%WFo
    zee?a*ZD;>olelhcQ-cVrdU-2}a{1XU_Bvqw`nk%O^n*|tR({<6<`MaZo&)*Dk$h!H
    zTT%7OfVMKA@b!=cE-S-IWp94P(7W^@^asybvPT*VU8d-2}Rj-$x%8ABJY^&1biTig7Bv(2=cm$gu(-K^Z`1s
    tDN2I)cMb{D!msGynmQyLxYswbCh_^@H#+k>r;_=;lG{)~PhW&!{{bz>5xD>W
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..d1afc1d2b64ba45cb70b2faedb1ff669d84f4417
    GIT binary patch
    literal 3029
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..34ea289e7a722963edb2f30e0be97f09c25a827c
    GIT binary patch
    literal 2034
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
    new file mode 100644
    index 0000000..0ed8dd2
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
    @@ -0,0 +1,138 @@
    +import contextlib
    +import hashlib
    +import logging
    +import os
    +from types import TracebackType
    +from typing import Dict, Generator, Optional, Type, Union
    +
    +from pip._internal.req.req_install import InstallRequirement
    +from pip._internal.utils.temp_dir import TempDirectory
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +@contextlib.contextmanager
    +def update_env_context_manager(**changes: str) -> Generator[None, None, None]:
    +    target = os.environ
    +
    +    # Save values from the target and change them.
    +    non_existent_marker = object()
    +    saved_values: Dict[str, Union[object, str]] = {}
    +    for name, new_value in changes.items():
    +        try:
    +            saved_values[name] = target[name]
    +        except KeyError:
    +            saved_values[name] = non_existent_marker
    +        target[name] = new_value
    +
    +    try:
    +        yield
    +    finally:
    +        # Restore original values in the target.
    +        for name, original_value in saved_values.items():
    +            if original_value is non_existent_marker:
    +                del target[name]
    +            else:
    +                assert isinstance(original_value, str)  # for mypy
    +                target[name] = original_value
    +
    +
    +@contextlib.contextmanager
    +def get_build_tracker() -> Generator["BuildTracker", None, None]:
    +    root = os.environ.get("PIP_BUILD_TRACKER")
    +    with contextlib.ExitStack() as ctx:
    +        if root is None:
    +            root = ctx.enter_context(TempDirectory(kind="build-tracker")).path
    +            ctx.enter_context(update_env_context_manager(PIP_BUILD_TRACKER=root))
    +            logger.debug("Initialized build tracking at %s", root)
    +
    +        with BuildTracker(root) as tracker:
    +            yield tracker
    +
    +
    +class TrackerId(str):
    +    """Uniquely identifying string provided to the build tracker."""
    +
    +
    +class BuildTracker:
    +    """Ensure that an sdist cannot request itself as a setup requirement.
    +
    +    When an sdist is prepared, it identifies its setup requirements in the
    +    context of ``BuildTracker.track()``. If a requirement shows up recursively, this
    +    raises an exception.
    +
    +    This stops fork bombs embedded in malicious packages."""
    +
    +    def __init__(self, root: str) -> None:
    +        self._root = root
    +        self._entries: Dict[TrackerId, InstallRequirement] = {}
    +        logger.debug("Created build tracker: %s", self._root)
    +
    +    def __enter__(self) -> "BuildTracker":
    +        logger.debug("Entered build tracker: %s", self._root)
    +        return self
    +
    +    def __exit__(
    +        self,
    +        exc_type: Optional[Type[BaseException]],
    +        exc_val: Optional[BaseException],
    +        exc_tb: Optional[TracebackType],
    +    ) -> None:
    +        self.cleanup()
    +
    +    def _entry_path(self, key: TrackerId) -> str:
    +        hashed = hashlib.sha224(key.encode()).hexdigest()
    +        return os.path.join(self._root, hashed)
    +
    +    def add(self, req: InstallRequirement, key: TrackerId) -> None:
    +        """Add an InstallRequirement to build tracking."""
    +
    +        # Get the file to write information about this requirement.
    +        entry_path = self._entry_path(key)
    +
    +        # Try reading from the file. If it exists and can be read from, a build
    +        # is already in progress, so a LookupError is raised.
    +        try:
    +            with open(entry_path) as fp:
    +                contents = fp.read()
    +        except FileNotFoundError:
    +            pass
    +        else:
    +            message = f"{req.link} is already being built: {contents}"
    +            raise LookupError(message)
    +
    +        # If we're here, req should really not be building already.
    +        assert key not in self._entries
    +
    +        # Start tracking this requirement.
    +        with open(entry_path, "w", encoding="utf-8") as fp:
    +            fp.write(str(req))
    +        self._entries[key] = req
    +
    +        logger.debug("Added %s to build tracker %r", req, self._root)
    +
    +    def remove(self, req: InstallRequirement, key: TrackerId) -> None:
    +        """Remove an InstallRequirement from build tracking."""
    +
    +        # Delete the created file and the corresponding entry.
    +        os.unlink(self._entry_path(key))
    +        del self._entries[key]
    +
    +        logger.debug("Removed %s from build tracker %r", req, self._root)
    +
    +    def cleanup(self) -> None:
    +        for key, req in list(self._entries.items()):
    +            self.remove(req, key)
    +
    +        logger.debug("Removed build tracker: %r", self._root)
    +
    +    @contextlib.contextmanager
    +    def track(self, req: InstallRequirement, key: str) -> Generator[None, None, None]:
    +        """Ensure that `key` cannot install itself as a setup requirement.
    +
    +        :raises LookupError: If `key` was already provided in a parent invocation of
    +                             the context introduced by this method."""
    +        tracker_id = TrackerId(key)
    +        self.add(req, tracker_id)
    +        yield
    +        self.remove(req, tracker_id)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py
    new file mode 100644
    index 0000000..c66ac35
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py
    @@ -0,0 +1,39 @@
    +"""Metadata generation logic for source distributions.
    +"""
    +
    +import os
    +
    +from pip._vendor.pyproject_hooks import BuildBackendHookCaller
    +
    +from pip._internal.build_env import BuildEnvironment
    +from pip._internal.exceptions import (
    +    InstallationSubprocessError,
    +    MetadataGenerationFailed,
    +)
    +from pip._internal.utils.subprocess import runner_with_spinner_message
    +from pip._internal.utils.temp_dir import TempDirectory
    +
    +
    +def generate_metadata(
    +    build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str
    +) -> str:
    +    """Generate metadata using mechanisms described in PEP 517.
    +
    +    Returns the generated metadata directory.
    +    """
    +    metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True)
    +
    +    metadata_dir = metadata_tmpdir.path
    +
    +    with build_env:
    +        # Note that BuildBackendHookCaller implements a fallback for
    +        # prepare_metadata_for_build_wheel, so we don't have to
    +        # consider the possibility that this hook doesn't exist.
    +        runner = runner_with_spinner_message("Preparing metadata (pyproject.toml)")
    +        with backend.subprocess_runner(runner):
    +            try:
    +                distinfo_dir = backend.prepare_metadata_for_build_wheel(metadata_dir)
    +            except InstallationSubprocessError as error:
    +                raise MetadataGenerationFailed(package_details=details) from error
    +
    +    return os.path.join(metadata_dir, distinfo_dir)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py
    new file mode 100644
    index 0000000..27c69f0
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py
    @@ -0,0 +1,41 @@
    +"""Metadata generation logic for source distributions.
    +"""
    +
    +import os
    +
    +from pip._vendor.pyproject_hooks import BuildBackendHookCaller
    +
    +from pip._internal.build_env import BuildEnvironment
    +from pip._internal.exceptions import (
    +    InstallationSubprocessError,
    +    MetadataGenerationFailed,
    +)
    +from pip._internal.utils.subprocess import runner_with_spinner_message
    +from pip._internal.utils.temp_dir import TempDirectory
    +
    +
    +def generate_editable_metadata(
    +    build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str
    +) -> str:
    +    """Generate metadata using mechanisms described in PEP 660.
    +
    +    Returns the generated metadata directory.
    +    """
    +    metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True)
    +
    +    metadata_dir = metadata_tmpdir.path
    +
    +    with build_env:
    +        # Note that BuildBackendHookCaller implements a fallback for
    +        # prepare_metadata_for_build_wheel/editable, so we don't have to
    +        # consider the possibility that this hook doesn't exist.
    +        runner = runner_with_spinner_message(
    +            "Preparing editable metadata (pyproject.toml)"
    +        )
    +        with backend.subprocess_runner(runner):
    +            try:
    +                distinfo_dir = backend.prepare_metadata_for_build_editable(metadata_dir)
    +            except InstallationSubprocessError as error:
    +                raise MetadataGenerationFailed(package_details=details) from error
    +
    +    return os.path.join(metadata_dir, distinfo_dir)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py
    new file mode 100644
    index 0000000..c01dd1c
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py
    @@ -0,0 +1,74 @@
    +"""Metadata generation logic for legacy source distributions.
    +"""
    +
    +import logging
    +import os
    +
    +from pip._internal.build_env import BuildEnvironment
    +from pip._internal.cli.spinners import open_spinner
    +from pip._internal.exceptions import (
    +    InstallationError,
    +    InstallationSubprocessError,
    +    MetadataGenerationFailed,
    +)
    +from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args
    +from pip._internal.utils.subprocess import call_subprocess
    +from pip._internal.utils.temp_dir import TempDirectory
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def _find_egg_info(directory: str) -> str:
    +    """Find an .egg-info subdirectory in `directory`."""
    +    filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")]
    +
    +    if not filenames:
    +        raise InstallationError(f"No .egg-info directory found in {directory}")
    +
    +    if len(filenames) > 1:
    +        raise InstallationError(
    +            f"More than one .egg-info directory found in {directory}"
    +        )
    +
    +    return os.path.join(directory, filenames[0])
    +
    +
    +def generate_metadata(
    +    build_env: BuildEnvironment,
    +    setup_py_path: str,
    +    source_dir: str,
    +    isolated: bool,
    +    details: str,
    +) -> str:
    +    """Generate metadata using setup.py-based defacto mechanisms.
    +
    +    Returns the generated metadata directory.
    +    """
    +    logger.debug(
    +        "Running setup.py (path:%s) egg_info for package %s",
    +        setup_py_path,
    +        details,
    +    )
    +
    +    egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path
    +
    +    args = make_setuptools_egg_info_args(
    +        setup_py_path,
    +        egg_info_dir=egg_info_dir,
    +        no_user_config=isolated,
    +    )
    +
    +    with build_env:
    +        with open_spinner("Preparing metadata (setup.py)") as spinner:
    +            try:
    +                call_subprocess(
    +                    args,
    +                    cwd=source_dir,
    +                    command_desc="python setup.py egg_info",
    +                    spinner=spinner,
    +                )
    +            except InstallationSubprocessError as error:
    +                raise MetadataGenerationFailed(package_details=details) from error
    +
    +    # Return the .egg-info directory.
    +    return _find_egg_info(egg_info_dir)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
    new file mode 100644
    index 0000000..064811a
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
    @@ -0,0 +1,37 @@
    +import logging
    +import os
    +from typing import Optional
    +
    +from pip._vendor.pyproject_hooks import BuildBackendHookCaller
    +
    +from pip._internal.utils.subprocess import runner_with_spinner_message
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def build_wheel_pep517(
    +    name: str,
    +    backend: BuildBackendHookCaller,
    +    metadata_directory: str,
    +    tempd: str,
    +) -> Optional[str]:
    +    """Build one InstallRequirement using the PEP 517 build process.
    +
    +    Returns path to wheel if successfully built. Otherwise, returns None.
    +    """
    +    assert metadata_directory is not None
    +    try:
    +        logger.debug("Destination directory: %s", tempd)
    +
    +        runner = runner_with_spinner_message(
    +            f"Building wheel for {name} (pyproject.toml)"
    +        )
    +        with backend.subprocess_runner(runner):
    +            wheel_name = backend.build_wheel(
    +                tempd,
    +                metadata_directory=metadata_directory,
    +            )
    +    except Exception:
    +        logger.error("Failed building wheel for %s", name)
    +        return None
    +    return os.path.join(tempd, wheel_name)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
    new file mode 100644
    index 0000000..719d69d
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
    @@ -0,0 +1,46 @@
    +import logging
    +import os
    +from typing import Optional
    +
    +from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing
    +
    +from pip._internal.utils.subprocess import runner_with_spinner_message
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def build_wheel_editable(
    +    name: str,
    +    backend: BuildBackendHookCaller,
    +    metadata_directory: str,
    +    tempd: str,
    +) -> Optional[str]:
    +    """Build one InstallRequirement using the PEP 660 build process.
    +
    +    Returns path to wheel if successfully built. Otherwise, returns None.
    +    """
    +    assert metadata_directory is not None
    +    try:
    +        logger.debug("Destination directory: %s", tempd)
    +
    +        runner = runner_with_spinner_message(
    +            f"Building editable for {name} (pyproject.toml)"
    +        )
    +        with backend.subprocess_runner(runner):
    +            try:
    +                wheel_name = backend.build_editable(
    +                    tempd,
    +                    metadata_directory=metadata_directory,
    +                )
    +            except HookMissing as e:
    +                logger.error(
    +                    "Cannot build editable %s because the build "
    +                    "backend does not have the %s hook",
    +                    name,
    +                    e,
    +                )
    +                return None
    +    except Exception:
    +        logger.error("Failed building editable for %s", name)
    +        return None
    +    return os.path.join(tempd, wheel_name)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py
    new file mode 100644
    index 0000000..3ee2a70
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py
    @@ -0,0 +1,102 @@
    +import logging
    +import os.path
    +from typing import List, Optional
    +
    +from pip._internal.cli.spinners import open_spinner
    +from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args
    +from pip._internal.utils.subprocess import call_subprocess, format_command_args
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +def format_command_result(
    +    command_args: List[str],
    +    command_output: str,
    +) -> str:
    +    """Format command information for logging."""
    +    command_desc = format_command_args(command_args)
    +    text = f"Command arguments: {command_desc}\n"
    +
    +    if not command_output:
    +        text += "Command output: None"
    +    elif logger.getEffectiveLevel() > logging.DEBUG:
    +        text += "Command output: [use --verbose to show]"
    +    else:
    +        if not command_output.endswith("\n"):
    +            command_output += "\n"
    +        text += f"Command output:\n{command_output}"
    +
    +    return text
    +
    +
    +def get_legacy_build_wheel_path(
    +    names: List[str],
    +    temp_dir: str,
    +    name: str,
    +    command_args: List[str],
    +    command_output: str,
    +) -> Optional[str]:
    +    """Return the path to the wheel in the temporary build directory."""
    +    # Sort for determinism.
    +    names = sorted(names)
    +    if not names:
    +        msg = f"Legacy build of wheel for {name!r} created no files.\n"
    +        msg += format_command_result(command_args, command_output)
    +        logger.warning(msg)
    +        return None
    +
    +    if len(names) > 1:
    +        msg = (
    +            f"Legacy build of wheel for {name!r} created more than one file.\n"
    +            f"Filenames (choosing first): {names}\n"
    +        )
    +        msg += format_command_result(command_args, command_output)
    +        logger.warning(msg)
    +
    +    return os.path.join(temp_dir, names[0])
    +
    +
    +def build_wheel_legacy(
    +    name: str,
    +    setup_py_path: str,
    +    source_dir: str,
    +    global_options: List[str],
    +    build_options: List[str],
    +    tempd: str,
    +) -> Optional[str]:
    +    """Build one unpacked package using the "legacy" build process.
    +
    +    Returns path to wheel if successfully built. Otherwise, returns None.
    +    """
    +    wheel_args = make_setuptools_bdist_wheel_args(
    +        setup_py_path,
    +        global_options=global_options,
    +        build_options=build_options,
    +        destination_dir=tempd,
    +    )
    +
    +    spin_message = f"Building wheel for {name} (setup.py)"
    +    with open_spinner(spin_message) as spinner:
    +        logger.debug("Destination directory: %s", tempd)
    +
    +        try:
    +            output = call_subprocess(
    +                wheel_args,
    +                command_desc="python setup.py bdist_wheel",
    +                cwd=source_dir,
    +                spinner=spinner,
    +            )
    +        except Exception:
    +            spinner.finish("error")
    +            logger.error("Failed building wheel for %s", name)
    +            return None
    +
    +        names = os.listdir(tempd)
    +        wheel_path = get_legacy_build_wheel_path(
    +            names=names,
    +            temp_dir=tempd,
    +            name=name,
    +            command_args=wheel_args,
    +            command_output=output,
    +        )
    +        return wheel_path
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/check.py b/env/lib/python3.12/site-packages/pip/_internal/operations/check.py
    new file mode 100644
    index 0000000..4b6fbc4
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/check.py
    @@ -0,0 +1,181 @@
    +"""Validation of dependencies of packages
    +"""
    +
    +import logging
    +from contextlib import suppress
    +from email.parser import Parser
    +from functools import reduce
    +from typing import (
    +    Callable,
    +    Dict,
    +    FrozenSet,
    +    Generator,
    +    Iterable,
    +    List,
    +    NamedTuple,
    +    Optional,
    +    Set,
    +    Tuple,
    +)
    +
    +from pip._vendor.packaging.requirements import Requirement
    +from pip._vendor.packaging.tags import Tag, parse_tag
    +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
    +from pip._vendor.packaging.version import Version
    +
    +from pip._internal.distributions import make_distribution_for_install_requirement
    +from pip._internal.metadata import get_default_environment
    +from pip._internal.metadata.base import BaseDistribution
    +from pip._internal.req.req_install import InstallRequirement
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class PackageDetails(NamedTuple):
    +    version: Version
    +    dependencies: List[Requirement]
    +
    +
    +# Shorthands
    +PackageSet = Dict[NormalizedName, PackageDetails]
    +Missing = Tuple[NormalizedName, Requirement]
    +Conflicting = Tuple[NormalizedName, Version, Requirement]
    +
    +MissingDict = Dict[NormalizedName, List[Missing]]
    +ConflictingDict = Dict[NormalizedName, List[Conflicting]]
    +CheckResult = Tuple[MissingDict, ConflictingDict]
    +ConflictDetails = Tuple[PackageSet, CheckResult]
    +
    +
    +def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
    +    """Converts a list of distributions into a PackageSet."""
    +    package_set = {}
    +    problems = False
    +    env = get_default_environment()
    +    for dist in env.iter_installed_distributions(local_only=False, skip=()):
    +        name = dist.canonical_name
    +        try:
    +            dependencies = list(dist.iter_dependencies())
    +            package_set[name] = PackageDetails(dist.version, dependencies)
    +        except (OSError, ValueError) as e:
    +            # Don't crash on unreadable or broken metadata.
    +            logger.warning("Error parsing dependencies of %s: %s", name, e)
    +            problems = True
    +    return package_set, problems
    +
    +
    +def check_package_set(
    +    package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] = None
    +) -> CheckResult:
    +    """Check if a package set is consistent
    +
    +    If should_ignore is passed, it should be a callable that takes a
    +    package name and returns a boolean.
    +    """
    +
    +    missing = {}
    +    conflicting = {}
    +
    +    for package_name, package_detail in package_set.items():
    +        # Info about dependencies of package_name
    +        missing_deps: Set[Missing] = set()
    +        conflicting_deps: Set[Conflicting] = set()
    +
    +        if should_ignore and should_ignore(package_name):
    +            continue
    +
    +        for req in package_detail.dependencies:
    +            name = canonicalize_name(req.name)
    +
    +            # Check if it's missing
    +            if name not in package_set:
    +                missed = True
    +                if req.marker is not None:
    +                    missed = req.marker.evaluate({"extra": ""})
    +                if missed:
    +                    missing_deps.add((name, req))
    +                continue
    +
    +            # Check if there's a conflict
    +            version = package_set[name].version
    +            if not req.specifier.contains(version, prereleases=True):
    +                conflicting_deps.add((name, version, req))
    +
    +        if missing_deps:
    +            missing[package_name] = sorted(missing_deps, key=str)
    +        if conflicting_deps:
    +            conflicting[package_name] = sorted(conflicting_deps, key=str)
    +
    +    return missing, conflicting
    +
    +
    +def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails:
    +    """For checking if the dependency graph would be consistent after \
    +    installing given requirements
    +    """
    +    # Start from the current state
    +    package_set, _ = create_package_set_from_installed()
    +    # Install packages
    +    would_be_installed = _simulate_installation_of(to_install, package_set)
    +
    +    # Only warn about directly-dependent packages; create a whitelist of them
    +    whitelist = _create_whitelist(would_be_installed, package_set)
    +
    +    return (
    +        package_set,
    +        check_package_set(
    +            package_set, should_ignore=lambda name: name not in whitelist
    +        ),
    +    )
    +
    +
    +def check_unsupported(
    +    packages: Iterable[BaseDistribution],
    +    supported_tags: Iterable[Tag],
    +) -> Generator[BaseDistribution, None, None]:
    +    for p in packages:
    +        with suppress(FileNotFoundError):
    +            wheel_file = p.read_text("WHEEL")
    +            wheel_tags: FrozenSet[Tag] = reduce(
    +                frozenset.union,
    +                map(parse_tag, Parser().parsestr(wheel_file).get_all("Tag", [])),
    +                frozenset(),
    +            )
    +            if wheel_tags.isdisjoint(supported_tags):
    +                yield p
    +
    +
    +def _simulate_installation_of(
    +    to_install: List[InstallRequirement], package_set: PackageSet
    +) -> Set[NormalizedName]:
    +    """Computes the version of packages after installing to_install."""
    +    # Keep track of packages that were installed
    +    installed = set()
    +
    +    # Modify it as installing requirement_set would (assuming no errors)
    +    for inst_req in to_install:
    +        abstract_dist = make_distribution_for_install_requirement(inst_req)
    +        dist = abstract_dist.get_metadata_distribution()
    +        name = dist.canonical_name
    +        package_set[name] = PackageDetails(dist.version, list(dist.iter_dependencies()))
    +
    +        installed.add(name)
    +
    +    return installed
    +
    +
    +def _create_whitelist(
    +    would_be_installed: Set[NormalizedName], package_set: PackageSet
    +) -> Set[NormalizedName]:
    +    packages_affected = set(would_be_installed)
    +
    +    for package_name in package_set:
    +        if package_name in packages_affected:
    +            continue
    +
    +        for req in package_set[package_name].dependencies:
    +            if canonicalize_name(req.name) in packages_affected:
    +                packages_affected.add(package_name)
    +                break
    +
    +    return packages_affected
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py b/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
    new file mode 100644
    index 0000000..bb1039f
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
    @@ -0,0 +1,258 @@
    +import collections
    +import logging
    +import os
    +from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +from pip._vendor.packaging.version import InvalidVersion
    +
    +from pip._internal.exceptions import BadCommand, InstallationError
    +from pip._internal.metadata import BaseDistribution, get_environment
    +from pip._internal.req.constructors import (
    +    install_req_from_editable,
    +    install_req_from_line,
    +)
    +from pip._internal.req.req_file import COMMENT_RE
    +from pip._internal.utils.direct_url_helpers import direct_url_as_pep440_direct_reference
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +class _EditableInfo(NamedTuple):
    +    requirement: str
    +    comments: List[str]
    +
    +
    +def freeze(
    +    requirement: Optional[List[str]] = None,
    +    local_only: bool = False,
    +    user_only: bool = False,
    +    paths: Optional[List[str]] = None,
    +    isolated: bool = False,
    +    exclude_editable: bool = False,
    +    skip: Container[str] = (),
    +) -> Generator[str, None, None]:
    +    installations: Dict[str, FrozenRequirement] = {}
    +
    +    dists = get_environment(paths).iter_installed_distributions(
    +        local_only=local_only,
    +        skip=(),
    +        user_only=user_only,
    +    )
    +    for dist in dists:
    +        req = FrozenRequirement.from_dist(dist)
    +        if exclude_editable and req.editable:
    +            continue
    +        installations[req.canonical_name] = req
    +
    +    if requirement:
    +        # the options that don't get turned into an InstallRequirement
    +        # should only be emitted once, even if the same option is in multiple
    +        # requirements files, so we need to keep track of what has been emitted
    +        # so that we don't emit it again if it's seen again
    +        emitted_options: Set[str] = set()
    +        # keep track of which files a requirement is in so that we can
    +        # give an accurate warning if a requirement appears multiple times.
    +        req_files: Dict[str, List[str]] = collections.defaultdict(list)
    +        for req_file_path in requirement:
    +            with open(req_file_path) as req_file:
    +                for line in req_file:
    +                    if (
    +                        not line.strip()
    +                        or line.strip().startswith("#")
    +                        or line.startswith(
    +                            (
    +                                "-r",
    +                                "--requirement",
    +                                "-f",
    +                                "--find-links",
    +                                "-i",
    +                                "--index-url",
    +                                "--pre",
    +                                "--trusted-host",
    +                                "--process-dependency-links",
    +                                "--extra-index-url",
    +                                "--use-feature",
    +                            )
    +                        )
    +                    ):
    +                        line = line.rstrip()
    +                        if line not in emitted_options:
    +                            emitted_options.add(line)
    +                            yield line
    +                        continue
    +
    +                    if line.startswith("-e") or line.startswith("--editable"):
    +                        if line.startswith("-e"):
    +                            line = line[2:].strip()
    +                        else:
    +                            line = line[len("--editable") :].strip().lstrip("=")
    +                        line_req = install_req_from_editable(
    +                            line,
    +                            isolated=isolated,
    +                        )
    +                    else:
    +                        line_req = install_req_from_line(
    +                            COMMENT_RE.sub("", line).strip(),
    +                            isolated=isolated,
    +                        )
    +
    +                    if not line_req.name:
    +                        logger.info(
    +                            "Skipping line in requirement file [%s] because "
    +                            "it's not clear what it would install: %s",
    +                            req_file_path,
    +                            line.strip(),
    +                        )
    +                        logger.info(
    +                            "  (add #egg=PackageName to the URL to avoid"
    +                            " this warning)"
    +                        )
    +                    else:
    +                        line_req_canonical_name = canonicalize_name(line_req.name)
    +                        if line_req_canonical_name not in installations:
    +                            # either it's not installed, or it is installed
    +                            # but has been processed already
    +                            if not req_files[line_req.name]:
    +                                logger.warning(
    +                                    "Requirement file [%s] contains %s, but "
    +                                    "package %r is not installed",
    +                                    req_file_path,
    +                                    COMMENT_RE.sub("", line).strip(),
    +                                    line_req.name,
    +                                )
    +                            else:
    +                                req_files[line_req.name].append(req_file_path)
    +                        else:
    +                            yield str(installations[line_req_canonical_name]).rstrip()
    +                            del installations[line_req_canonical_name]
    +                            req_files[line_req.name].append(req_file_path)
    +
    +        # Warn about requirements that were included multiple times (in a
    +        # single requirements file or in different requirements files).
    +        for name, files in req_files.items():
    +            if len(files) > 1:
    +                logger.warning(
    +                    "Requirement %s included multiple times [%s]",
    +                    name,
    +                    ", ".join(sorted(set(files))),
    +                )
    +
    +        yield ("## The following requirements were added by pip freeze:")
    +    for installation in sorted(installations.values(), key=lambda x: x.name.lower()):
    +        if installation.canonical_name not in skip:
    +            yield str(installation).rstrip()
    +
    +
    +def _format_as_name_version(dist: BaseDistribution) -> str:
    +    try:
    +        dist_version = dist.version
    +    except InvalidVersion:
    +        # legacy version
    +        return f"{dist.raw_name}==={dist.raw_version}"
    +    else:
    +        return f"{dist.raw_name}=={dist_version}"
    +
    +
    +def _get_editable_info(dist: BaseDistribution) -> _EditableInfo:
    +    """
    +    Compute and return values (req, comments) for use in
    +    FrozenRequirement.from_dist().
    +    """
    +    editable_project_location = dist.editable_project_location
    +    assert editable_project_location
    +    location = os.path.normcase(os.path.abspath(editable_project_location))
    +
    +    from pip._internal.vcs import RemoteNotFoundError, RemoteNotValidError, vcs
    +
    +    vcs_backend = vcs.get_backend_for_dir(location)
    +
    +    if vcs_backend is None:
    +        display = _format_as_name_version(dist)
    +        logger.debug(
    +            'No VCS found for editable requirement "%s" in: %r',
    +            display,
    +            location,
    +        )
    +        return _EditableInfo(
    +            requirement=location,
    +            comments=[f"# Editable install with no version control ({display})"],
    +        )
    +
    +    vcs_name = type(vcs_backend).__name__
    +
    +    try:
    +        req = vcs_backend.get_src_requirement(location, dist.raw_name)
    +    except RemoteNotFoundError:
    +        display = _format_as_name_version(dist)
    +        return _EditableInfo(
    +            requirement=location,
    +            comments=[f"# Editable {vcs_name} install with no remote ({display})"],
    +        )
    +    except RemoteNotValidError as ex:
    +        display = _format_as_name_version(dist)
    +        return _EditableInfo(
    +            requirement=location,
    +            comments=[
    +                f"# Editable {vcs_name} install ({display}) with either a deleted "
    +                f"local remote or invalid URI:",
    +                f"# '{ex.url}'",
    +            ],
    +        )
    +    except BadCommand:
    +        logger.warning(
    +            "cannot determine version of editable source in %s "
    +            "(%s command not found in path)",
    +            location,
    +            vcs_backend.name,
    +        )
    +        return _EditableInfo(requirement=location, comments=[])
    +    except InstallationError as exc:
    +        logger.warning("Error when trying to get requirement for VCS system %s", exc)
    +    else:
    +        return _EditableInfo(requirement=req, comments=[])
    +
    +    logger.warning("Could not determine repository location of %s", location)
    +
    +    return _EditableInfo(
    +        requirement=location,
    +        comments=["## !! Could not determine repository location"],
    +    )
    +
    +
    +class FrozenRequirement:
    +    def __init__(
    +        self,
    +        name: str,
    +        req: str,
    +        editable: bool,
    +        comments: Iterable[str] = (),
    +    ) -> None:
    +        self.name = name
    +        self.canonical_name = canonicalize_name(name)
    +        self.req = req
    +        self.editable = editable
    +        self.comments = comments
    +
    +    @classmethod
    +    def from_dist(cls, dist: BaseDistribution) -> "FrozenRequirement":
    +        editable = dist.editable
    +        if editable:
    +            req, comments = _get_editable_info(dist)
    +        else:
    +            comments = []
    +            direct_url = dist.direct_url
    +            if direct_url:
    +                # if PEP 610 metadata is present, use it
    +                req = direct_url_as_pep440_direct_reference(direct_url, dist.raw_name)
    +            else:
    +                # name==version requirement
    +                req = _format_as_name_version(dist)
    +
    +        return cls(dist.raw_name, req, editable, comments=comments)
    +
    +    def __str__(self) -> str:
    +        req = self.req
    +        if self.editable:
    +            req = f"-e {req}"
    +        return "\n".join(list(self.comments) + [str(req)]) + "\n"
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py
    new file mode 100644
    index 0000000..24d6a5d
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py
    @@ -0,0 +1,2 @@
    +"""For modules related to installing packages.
    +"""
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..008db498c5f1dc2cb60a65b4ea649072640fa1df
    GIT binary patch
    literal 284
    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 None:
    +    """Install a package in editable mode. Most arguments are pass-through
    +    to setuptools.
    +    """
    +    logger.info("Running setup.py develop for %s", name)
    +
    +    args = make_setuptools_develop_args(
    +        setup_py_path,
    +        global_options=global_options,
    +        no_user_config=isolated,
    +        prefix=prefix,
    +        home=home,
    +        use_user_site=use_user_site,
    +    )
    +
    +    with indent_log():
    +        with build_env:
    +            call_subprocess(
    +                args,
    +                command_desc="python setup.py develop",
    +                cwd=unpacked_source_directory,
    +            )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
    new file mode 100644
    index 0000000..aef42aa
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
    @@ -0,0 +1,741 @@
    +"""Support for installing and building the "wheel" binary package format.
    +"""
    +
    +import collections
    +import compileall
    +import contextlib
    +import csv
    +import importlib
    +import logging
    +import os.path
    +import re
    +import shutil
    +import sys
    +import warnings
    +from base64 import urlsafe_b64encode
    +from email.message import Message
    +from itertools import chain, filterfalse, starmap
    +from typing import (
    +    IO,
    +    TYPE_CHECKING,
    +    Any,
    +    BinaryIO,
    +    Callable,
    +    Dict,
    +    Generator,
    +    Iterable,
    +    Iterator,
    +    List,
    +    NewType,
    +    Optional,
    +    Protocol,
    +    Sequence,
    +    Set,
    +    Tuple,
    +    Union,
    +    cast,
    +)
    +from zipfile import ZipFile, ZipInfo
    +
    +from pip._vendor.distlib.scripts import ScriptMaker
    +from pip._vendor.distlib.util import get_export_entry
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.exceptions import InstallationError
    +from pip._internal.locations import get_major_minor_version
    +from pip._internal.metadata import (
    +    BaseDistribution,
    +    FilesystemWheel,
    +    get_wheel_distribution,
    +)
    +from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
    +from pip._internal.models.scheme import SCHEME_KEYS, Scheme
    +from pip._internal.utils.filesystem import adjacent_tmp_file, replace
    +from pip._internal.utils.misc import StreamWrapper, ensure_dir, hash_file, partition
    +from pip._internal.utils.unpacking import (
    +    current_umask,
    +    is_within_directory,
    +    set_extracted_file_to_default_mode_plus_executable,
    +    zip_item_is_executable,
    +)
    +from pip._internal.utils.wheel import parse_wheel
    +
    +if TYPE_CHECKING:
    +
    +    class File(Protocol):
    +        src_record_path: "RecordPath"
    +        dest_path: str
    +        changed: bool
    +
    +        def save(self) -> None:
    +            pass
    +
    +
    +logger = logging.getLogger(__name__)
    +
    +RecordPath = NewType("RecordPath", str)
    +InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]]
    +
    +
    +def rehash(path: str, blocksize: int = 1 << 20) -> Tuple[str, str]:
    +    """Return (encoded_digest, length) for path using hashlib.sha256()"""
    +    h, length = hash_file(path, blocksize)
    +    digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=")
    +    return (digest, str(length))
    +
    +
    +def csv_io_kwargs(mode: str) -> Dict[str, Any]:
    +    """Return keyword arguments to properly open a CSV file
    +    in the given mode.
    +    """
    +    return {"mode": mode, "newline": "", "encoding": "utf-8"}
    +
    +
    +def fix_script(path: str) -> bool:
    +    """Replace #!python with #!/path/to/python
    +    Return True if file was changed.
    +    """
    +    # XXX RECORD hashes will need to be updated
    +    assert os.path.isfile(path)
    +
    +    with open(path, "rb") as script:
    +        firstline = script.readline()
    +        if not firstline.startswith(b"#!python"):
    +            return False
    +        exename = sys.executable.encode(sys.getfilesystemencoding())
    +        firstline = b"#!" + exename + os.linesep.encode("ascii")
    +        rest = script.read()
    +    with open(path, "wb") as script:
    +        script.write(firstline)
    +        script.write(rest)
    +    return True
    +
    +
    +def wheel_root_is_purelib(metadata: Message) -> bool:
    +    return metadata.get("Root-Is-Purelib", "").lower() == "true"
    +
    +
    +def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, str]]:
    +    console_scripts = {}
    +    gui_scripts = {}
    +    for entry_point in dist.iter_entry_points():
    +        if entry_point.group == "console_scripts":
    +            console_scripts[entry_point.name] = entry_point.value
    +        elif entry_point.group == "gui_scripts":
    +            gui_scripts[entry_point.name] = entry_point.value
    +    return console_scripts, gui_scripts
    +
    +
    +def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
    +    """Determine if any scripts are not on PATH and format a warning.
    +    Returns a warning message if one or more scripts are not on PATH,
    +    otherwise None.
    +    """
    +    if not scripts:
    +        return None
    +
    +    # Group scripts by the path they were installed in
    +    grouped_by_dir: Dict[str, Set[str]] = collections.defaultdict(set)
    +    for destfile in scripts:
    +        parent_dir = os.path.dirname(destfile)
    +        script_name = os.path.basename(destfile)
    +        grouped_by_dir[parent_dir].add(script_name)
    +
    +    # We don't want to warn for directories that are on PATH.
    +    not_warn_dirs = [
    +        os.path.normcase(os.path.normpath(i)).rstrip(os.sep)
    +        for i in os.environ.get("PATH", "").split(os.pathsep)
    +    ]
    +    # If an executable sits with sys.executable, we don't warn for it.
    +    #     This covers the case of venv invocations without activating the venv.
    +    not_warn_dirs.append(
    +        os.path.normcase(os.path.normpath(os.path.dirname(sys.executable)))
    +    )
    +    warn_for: Dict[str, Set[str]] = {
    +        parent_dir: scripts
    +        for parent_dir, scripts in grouped_by_dir.items()
    +        if os.path.normcase(os.path.normpath(parent_dir)) not in not_warn_dirs
    +    }
    +    if not warn_for:
    +        return None
    +
    +    # Format a message
    +    msg_lines = []
    +    for parent_dir, dir_scripts in warn_for.items():
    +        sorted_scripts: List[str] = sorted(dir_scripts)
    +        if len(sorted_scripts) == 1:
    +            start_text = f"script {sorted_scripts[0]} is"
    +        else:
    +            start_text = "scripts {} are".format(
    +                ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1]
    +            )
    +
    +        msg_lines.append(
    +            f"The {start_text} installed in '{parent_dir}' which is not on PATH."
    +        )
    +
    +    last_line_fmt = (
    +        "Consider adding {} to PATH or, if you prefer "
    +        "to suppress this warning, use --no-warn-script-location."
    +    )
    +    if len(msg_lines) == 1:
    +        msg_lines.append(last_line_fmt.format("this directory"))
    +    else:
    +        msg_lines.append(last_line_fmt.format("these directories"))
    +
    +    # Add a note if any directory starts with ~
    +    warn_for_tilde = any(
    +        i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i
    +    )
    +    if warn_for_tilde:
    +        tilde_warning_msg = (
    +            "NOTE: The current PATH contains path(s) starting with `~`, "
    +            "which may not be expanded by all applications."
    +        )
    +        msg_lines.append(tilde_warning_msg)
    +
    +    # Returns the formatted multiline message
    +    return "\n".join(msg_lines)
    +
    +
    +def _normalized_outrows(
    +    outrows: Iterable[InstalledCSVRow],
    +) -> List[Tuple[str, str, str]]:
    +    """Normalize the given rows of a RECORD file.
    +
    +    Items in each row are converted into str. Rows are then sorted to make
    +    the value more predictable for tests.
    +
    +    Each row is a 3-tuple (path, hash, size) and corresponds to a record of
    +    a RECORD file (see PEP 376 and PEP 427 for details).  For the rows
    +    passed to this function, the size can be an integer as an int or string,
    +    or the empty string.
    +    """
    +    # Normally, there should only be one row per path, in which case the
    +    # second and third elements don't come into play when sorting.
    +    # However, in cases in the wild where a path might happen to occur twice,
    +    # we don't want the sort operation to trigger an error (but still want
    +    # determinism).  Since the third element can be an int or string, we
    +    # coerce each element to a string to avoid a TypeError in this case.
    +    # For additional background, see--
    +    # https://github.com/pypa/pip/issues/5868
    +    return sorted(
    +        (record_path, hash_, str(size)) for record_path, hash_, size in outrows
    +    )
    +
    +
    +def _record_to_fs_path(record_path: RecordPath, lib_dir: str) -> str:
    +    return os.path.join(lib_dir, record_path)
    +
    +
    +def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath:
    +    # On Windows, do not handle relative paths if they belong to different
    +    # logical disks
    +    if os.path.splitdrive(path)[0].lower() == os.path.splitdrive(lib_dir)[0].lower():
    +        path = os.path.relpath(path, lib_dir)
    +
    +    path = path.replace(os.path.sep, "/")
    +    return cast("RecordPath", path)
    +
    +
    +def get_csv_rows_for_installed(
    +    old_csv_rows: List[List[str]],
    +    installed: Dict[RecordPath, RecordPath],
    +    changed: Set[RecordPath],
    +    generated: List[str],
    +    lib_dir: str,
    +) -> List[InstalledCSVRow]:
    +    """
    +    :param installed: A map from archive RECORD path to installation RECORD
    +        path.
    +    """
    +    installed_rows: List[InstalledCSVRow] = []
    +    for row in old_csv_rows:
    +        if len(row) > 3:
    +            logger.warning("RECORD line has more than three elements: %s", row)
    +        old_record_path = cast("RecordPath", row[0])
    +        new_record_path = installed.pop(old_record_path, old_record_path)
    +        if new_record_path in changed:
    +            digest, length = rehash(_record_to_fs_path(new_record_path, lib_dir))
    +        else:
    +            digest = row[1] if len(row) > 1 else ""
    +            length = row[2] if len(row) > 2 else ""
    +        installed_rows.append((new_record_path, digest, length))
    +    for f in generated:
    +        path = _fs_to_record_path(f, lib_dir)
    +        digest, length = rehash(f)
    +        installed_rows.append((path, digest, length))
    +    return installed_rows + [
    +        (installed_record_path, "", "") for installed_record_path in installed.values()
    +    ]
    +
    +
    +def get_console_script_specs(console: Dict[str, str]) -> List[str]:
    +    """
    +    Given the mapping from entrypoint name to callable, return the relevant
    +    console script specs.
    +    """
    +    # Don't mutate caller's version
    +    console = console.copy()
    +
    +    scripts_to_generate = []
    +
    +    # Special case pip and setuptools to generate versioned wrappers
    +    #
    +    # The issue is that some projects (specifically, pip and setuptools) use
    +    # code in setup.py to create "versioned" entry points - pip2.7 on Python
    +    # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
    +    # the wheel metadata at build time, and so if the wheel is installed with
    +    # a *different* version of Python the entry points will be wrong. The
    +    # correct fix for this is to enhance the metadata to be able to describe
    +    # such versioned entry points.
    +    # Currently, projects using versioned entry points will either have
    +    # incorrect versioned entry points, or they will not be able to distribute
    +    # "universal" wheels (i.e., they will need a wheel per Python version).
    +    #
    +    # Because setuptools and pip are bundled with _ensurepip and virtualenv,
    +    # we need to use universal wheels. As a workaround, we
    +    # override the versioned entry points in the wheel and generate the
    +    # correct ones.
    +    #
    +    # To add the level of hack in this section of code, in order to support
    +    # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
    +    # variable which will control which version scripts get installed.
    +    #
    +    # ENSUREPIP_OPTIONS=altinstall
    +    #   - Only pipX.Y and easy_install-X.Y will be generated and installed
    +    # ENSUREPIP_OPTIONS=install
    +    #   - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
    +    #     that this option is technically if ENSUREPIP_OPTIONS is set and is
    +    #     not altinstall
    +    # DEFAULT
    +    #   - The default behavior is to install pip, pipX, pipX.Y, easy_install
    +    #     and easy_install-X.Y.
    +    pip_script = console.pop("pip", None)
    +    if pip_script:
    +        if "ENSUREPIP_OPTIONS" not in os.environ:
    +            scripts_to_generate.append("pip = " + pip_script)
    +
    +        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
    +            scripts_to_generate.append(f"pip{sys.version_info[0]} = {pip_script}")
    +
    +        scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}")
    +        # Delete any other versioned pip entry points
    +        pip_ep = [k for k in console if re.match(r"pip(\d+(\.\d+)?)?$", k)]
    +        for k in pip_ep:
    +            del console[k]
    +    easy_install_script = console.pop("easy_install", None)
    +    if easy_install_script:
    +        if "ENSUREPIP_OPTIONS" not in os.environ:
    +            scripts_to_generate.append("easy_install = " + easy_install_script)
    +
    +        scripts_to_generate.append(
    +            f"easy_install-{get_major_minor_version()} = {easy_install_script}"
    +        )
    +        # Delete any other versioned easy_install entry points
    +        easy_install_ep = [
    +            k for k in console if re.match(r"easy_install(-\d+\.\d+)?$", k)
    +        ]
    +        for k in easy_install_ep:
    +            del console[k]
    +
    +    # Generate the console entry points specified in the wheel
    +    scripts_to_generate.extend(starmap("{} = {}".format, console.items()))
    +
    +    return scripts_to_generate
    +
    +
    +class ZipBackedFile:
    +    def __init__(
    +        self, src_record_path: RecordPath, dest_path: str, zip_file: ZipFile
    +    ) -> None:
    +        self.src_record_path = src_record_path
    +        self.dest_path = dest_path
    +        self._zip_file = zip_file
    +        self.changed = False
    +
    +    def _getinfo(self) -> ZipInfo:
    +        return self._zip_file.getinfo(self.src_record_path)
    +
    +    def save(self) -> None:
    +        # When we open the output file below, any existing file is truncated
    +        # before we start writing the new contents. This is fine in most
    +        # cases, but can cause a segfault if pip has loaded a shared
    +        # object (e.g. from pyopenssl through its vendored urllib3)
    +        # Since the shared object is mmap'd an attempt to call a
    +        # symbol in it will then cause a segfault. Unlinking the file
    +        # allows writing of new contents while allowing the process to
    +        # continue to use the old copy.
    +        if os.path.exists(self.dest_path):
    +            os.unlink(self.dest_path)
    +
    +        zipinfo = self._getinfo()
    +
    +        # optimization: the file is created by open(),
    +        # skip the decompression when there is 0 bytes to decompress.
    +        with open(self.dest_path, "wb") as dest:
    +            if zipinfo.file_size > 0:
    +                with self._zip_file.open(zipinfo) as f:
    +                    blocksize = min(zipinfo.file_size, 1024 * 1024)
    +                    shutil.copyfileobj(f, dest, blocksize)
    +
    +        if zip_item_is_executable(zipinfo):
    +            set_extracted_file_to_default_mode_plus_executable(self.dest_path)
    +
    +
    +class ScriptFile:
    +    def __init__(self, file: "File") -> None:
    +        self._file = file
    +        self.src_record_path = self._file.src_record_path
    +        self.dest_path = self._file.dest_path
    +        self.changed = False
    +
    +    def save(self) -> None:
    +        self._file.save()
    +        self.changed = fix_script(self.dest_path)
    +
    +
    +class MissingCallableSuffix(InstallationError):
    +    def __init__(self, entry_point: str) -> None:
    +        super().__init__(
    +            f"Invalid script entry point: {entry_point} - A callable "
    +            "suffix is required. Cf https://packaging.python.org/"
    +            "specifications/entry-points/#use-for-scripts for more "
    +            "information."
    +        )
    +
    +
    +def _raise_for_invalid_entrypoint(specification: str) -> None:
    +    entry = get_export_entry(specification)
    +    if entry is not None and entry.suffix is None:
    +        raise MissingCallableSuffix(str(entry))
    +
    +
    +class PipScriptMaker(ScriptMaker):
    +    def make(
    +        self, specification: str, options: Optional[Dict[str, Any]] = None
    +    ) -> List[str]:
    +        _raise_for_invalid_entrypoint(specification)
    +        return super().make(specification, options)
    +
    +
    +def _install_wheel(  # noqa: C901, PLR0915 function is too long
    +    name: str,
    +    wheel_zip: ZipFile,
    +    wheel_path: str,
    +    scheme: Scheme,
    +    pycompile: bool = True,
    +    warn_script_location: bool = True,
    +    direct_url: Optional[DirectUrl] = None,
    +    requested: bool = False,
    +) -> None:
    +    """Install a wheel.
    +
    +    :param name: Name of the project to install
    +    :param wheel_zip: open ZipFile for wheel being installed
    +    :param scheme: Distutils scheme dictating the install directories
    +    :param req_description: String used in place of the requirement, for
    +        logging
    +    :param pycompile: Whether to byte-compile installed Python files
    +    :param warn_script_location: Whether to check that scripts are installed
    +        into a directory on PATH
    +    :raises UnsupportedWheel:
    +        * when the directory holds an unpacked wheel with incompatible
    +          Wheel-Version
    +        * when the .dist-info dir does not match the wheel
    +    """
    +    info_dir, metadata = parse_wheel(wheel_zip, name)
    +
    +    if wheel_root_is_purelib(metadata):
    +        lib_dir = scheme.purelib
    +    else:
    +        lib_dir = scheme.platlib
    +
    +    # Record details of the files moved
    +    #   installed = files copied from the wheel to the destination
    +    #   changed = files changed while installing (scripts #! line typically)
    +    #   generated = files newly generated during the install (script wrappers)
    +    installed: Dict[RecordPath, RecordPath] = {}
    +    changed: Set[RecordPath] = set()
    +    generated: List[str] = []
    +
    +    def record_installed(
    +        srcfile: RecordPath, destfile: str, modified: bool = False
    +    ) -> None:
    +        """Map archive RECORD paths to installation RECORD paths."""
    +        newpath = _fs_to_record_path(destfile, lib_dir)
    +        installed[srcfile] = newpath
    +        if modified:
    +            changed.add(newpath)
    +
    +    def is_dir_path(path: RecordPath) -> bool:
    +        return path.endswith("/")
    +
    +    def assert_no_path_traversal(dest_dir_path: str, target_path: str) -> None:
    +        if not is_within_directory(dest_dir_path, target_path):
    +            message = (
    +                "The wheel {!r} has a file {!r} trying to install"
    +                " outside the target directory {!r}"
    +            )
    +            raise InstallationError(
    +                message.format(wheel_path, target_path, dest_dir_path)
    +            )
    +
    +    def root_scheme_file_maker(
    +        zip_file: ZipFile, dest: str
    +    ) -> Callable[[RecordPath], "File"]:
    +        def make_root_scheme_file(record_path: RecordPath) -> "File":
    +            normed_path = os.path.normpath(record_path)
    +            dest_path = os.path.join(dest, normed_path)
    +            assert_no_path_traversal(dest, dest_path)
    +            return ZipBackedFile(record_path, dest_path, zip_file)
    +
    +        return make_root_scheme_file
    +
    +    def data_scheme_file_maker(
    +        zip_file: ZipFile, scheme: Scheme
    +    ) -> Callable[[RecordPath], "File"]:
    +        scheme_paths = {key: getattr(scheme, key) for key in SCHEME_KEYS}
    +
    +        def make_data_scheme_file(record_path: RecordPath) -> "File":
    +            normed_path = os.path.normpath(record_path)
    +            try:
    +                _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2)
    +            except ValueError:
    +                message = (
    +                    f"Unexpected file in {wheel_path}: {record_path!r}. .data directory"
    +                    " contents should be named like: '/'."
    +                )
    +                raise InstallationError(message)
    +
    +            try:
    +                scheme_path = scheme_paths[scheme_key]
    +            except KeyError:
    +                valid_scheme_keys = ", ".join(sorted(scheme_paths))
    +                message = (
    +                    f"Unknown scheme key used in {wheel_path}: {scheme_key} "
    +                    f"(for file {record_path!r}). .data directory contents "
    +                    f"should be in subdirectories named with a valid scheme "
    +                    f"key ({valid_scheme_keys})"
    +                )
    +                raise InstallationError(message)
    +
    +            dest_path = os.path.join(scheme_path, dest_subpath)
    +            assert_no_path_traversal(scheme_path, dest_path)
    +            return ZipBackedFile(record_path, dest_path, zip_file)
    +
    +        return make_data_scheme_file
    +
    +    def is_data_scheme_path(path: RecordPath) -> bool:
    +        return path.split("/", 1)[0].endswith(".data")
    +
    +    paths = cast(List[RecordPath], wheel_zip.namelist())
    +    file_paths = filterfalse(is_dir_path, paths)
    +    root_scheme_paths, data_scheme_paths = partition(is_data_scheme_path, file_paths)
    +
    +    make_root_scheme_file = root_scheme_file_maker(wheel_zip, lib_dir)
    +    files: Iterator[File] = map(make_root_scheme_file, root_scheme_paths)
    +
    +    def is_script_scheme_path(path: RecordPath) -> bool:
    +        parts = path.split("/", 2)
    +        return len(parts) > 2 and parts[0].endswith(".data") and parts[1] == "scripts"
    +
    +    other_scheme_paths, script_scheme_paths = partition(
    +        is_script_scheme_path, data_scheme_paths
    +    )
    +
    +    make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme)
    +    other_scheme_files = map(make_data_scheme_file, other_scheme_paths)
    +    files = chain(files, other_scheme_files)
    +
    +    # Get the defined entry points
    +    distribution = get_wheel_distribution(
    +        FilesystemWheel(wheel_path),
    +        canonicalize_name(name),
    +    )
    +    console, gui = get_entrypoints(distribution)
    +
    +    def is_entrypoint_wrapper(file: "File") -> bool:
    +        # EP, EP.exe and EP-script.py are scripts generated for
    +        # entry point EP by setuptools
    +        path = file.dest_path
    +        name = os.path.basename(path)
    +        if name.lower().endswith(".exe"):
    +            matchname = name[:-4]
    +        elif name.lower().endswith("-script.py"):
    +            matchname = name[:-10]
    +        elif name.lower().endswith(".pya"):
    +            matchname = name[:-4]
    +        else:
    +            matchname = name
    +        # Ignore setuptools-generated scripts
    +        return matchname in console or matchname in gui
    +
    +    script_scheme_files: Iterator[File] = map(
    +        make_data_scheme_file, script_scheme_paths
    +    )
    +    script_scheme_files = filterfalse(is_entrypoint_wrapper, script_scheme_files)
    +    script_scheme_files = map(ScriptFile, script_scheme_files)
    +    files = chain(files, script_scheme_files)
    +
    +    existing_parents = set()
    +    for file in files:
    +        # directory creation is lazy and after file filtering
    +        # to ensure we don't install empty dirs; empty dirs can't be
    +        # uninstalled.
    +        parent_dir = os.path.dirname(file.dest_path)
    +        if parent_dir not in existing_parents:
    +            ensure_dir(parent_dir)
    +            existing_parents.add(parent_dir)
    +        file.save()
    +        record_installed(file.src_record_path, file.dest_path, file.changed)
    +
    +    def pyc_source_file_paths() -> Generator[str, None, None]:
    +        # We de-duplicate installation paths, since there can be overlap (e.g.
    +        # file in .data maps to same location as file in wheel root).
    +        # Sorting installation paths makes it easier to reproduce and debug
    +        # issues related to permissions on existing files.
    +        for installed_path in sorted(set(installed.values())):
    +            full_installed_path = os.path.join(lib_dir, installed_path)
    +            if not os.path.isfile(full_installed_path):
    +                continue
    +            if not full_installed_path.endswith(".py"):
    +                continue
    +            yield full_installed_path
    +
    +    def pyc_output_path(path: str) -> str:
    +        """Return the path the pyc file would have been written to."""
    +        return importlib.util.cache_from_source(path)
    +
    +    # Compile all of the pyc files for the installed files
    +    if pycompile:
    +        with contextlib.redirect_stdout(
    +            StreamWrapper.from_stream(sys.stdout)
    +        ) as stdout:
    +            with warnings.catch_warnings():
    +                warnings.filterwarnings("ignore")
    +                for path in pyc_source_file_paths():
    +                    success = compileall.compile_file(path, force=True, quiet=True)
    +                    if success:
    +                        pyc_path = pyc_output_path(path)
    +                        assert os.path.exists(pyc_path)
    +                        pyc_record_path = cast(
    +                            "RecordPath", pyc_path.replace(os.path.sep, "/")
    +                        )
    +                        record_installed(pyc_record_path, pyc_path)
    +        logger.debug(stdout.getvalue())
    +
    +    maker = PipScriptMaker(None, scheme.scripts)
    +
    +    # Ensure old scripts are overwritten.
    +    # See https://github.com/pypa/pip/issues/1800
    +    maker.clobber = True
    +
    +    # Ensure we don't generate any variants for scripts because this is almost
    +    # never what somebody wants.
    +    # See https://bitbucket.org/pypa/distlib/issue/35/
    +    maker.variants = {""}
    +
    +    # This is required because otherwise distlib creates scripts that are not
    +    # executable.
    +    # See https://bitbucket.org/pypa/distlib/issue/32/
    +    maker.set_mode = True
    +
    +    # Generate the console and GUI entry points specified in the wheel
    +    scripts_to_generate = get_console_script_specs(console)
    +
    +    gui_scripts_to_generate = list(starmap("{} = {}".format, gui.items()))
    +
    +    generated_console_scripts = maker.make_multiple(scripts_to_generate)
    +    generated.extend(generated_console_scripts)
    +
    +    generated.extend(maker.make_multiple(gui_scripts_to_generate, {"gui": True}))
    +
    +    if warn_script_location:
    +        msg = message_about_scripts_not_on_PATH(generated_console_scripts)
    +        if msg is not None:
    +            logger.warning(msg)
    +
    +    generated_file_mode = 0o666 & ~current_umask()
    +
    +    @contextlib.contextmanager
    +    def _generate_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]:
    +        with adjacent_tmp_file(path, **kwargs) as f:
    +            yield f
    +        os.chmod(f.name, generated_file_mode)
    +        replace(f.name, path)
    +
    +    dest_info_dir = os.path.join(lib_dir, info_dir)
    +
    +    # Record pip as the installer
    +    installer_path = os.path.join(dest_info_dir, "INSTALLER")
    +    with _generate_file(installer_path) as installer_file:
    +        installer_file.write(b"pip\n")
    +    generated.append(installer_path)
    +
    +    # Record the PEP 610 direct URL reference
    +    if direct_url is not None:
    +        direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME)
    +        with _generate_file(direct_url_path) as direct_url_file:
    +            direct_url_file.write(direct_url.to_json().encode("utf-8"))
    +        generated.append(direct_url_path)
    +
    +    # Record the REQUESTED file
    +    if requested:
    +        requested_path = os.path.join(dest_info_dir, "REQUESTED")
    +        with open(requested_path, "wb"):
    +            pass
    +        generated.append(requested_path)
    +
    +    record_text = distribution.read_text("RECORD")
    +    record_rows = list(csv.reader(record_text.splitlines()))
    +
    +    rows = get_csv_rows_for_installed(
    +        record_rows,
    +        installed=installed,
    +        changed=changed,
    +        generated=generated,
    +        lib_dir=lib_dir,
    +    )
    +
    +    # Record details of all files installed
    +    record_path = os.path.join(dest_info_dir, "RECORD")
    +
    +    with _generate_file(record_path, **csv_io_kwargs("w")) as record_file:
    +        # Explicitly cast to typing.IO[str] as a workaround for the mypy error:
    +        # "writer" has incompatible type "BinaryIO"; expected "_Writer"
    +        writer = csv.writer(cast("IO[str]", record_file))
    +        writer.writerows(_normalized_outrows(rows))
    +
    +
    +@contextlib.contextmanager
    +def req_error_context(req_description: str) -> Generator[None, None, None]:
    +    try:
    +        yield
    +    except InstallationError as e:
    +        message = f"For req: {req_description}. {e.args[0]}"
    +        raise InstallationError(message) from e
    +
    +
    +def install_wheel(
    +    name: str,
    +    wheel_path: str,
    +    scheme: Scheme,
    +    req_description: str,
    +    pycompile: bool = True,
    +    warn_script_location: bool = True,
    +    direct_url: Optional[DirectUrl] = None,
    +    requested: bool = False,
    +) -> None:
    +    with ZipFile(wheel_path, allowZip64=True) as z:
    +        with req_error_context(req_description):
    +            _install_wheel(
    +                name=name,
    +                wheel_zip=z,
    +                wheel_path=wheel_path,
    +                scheme=scheme,
    +                pycompile=pycompile,
    +                warn_script_location=warn_script_location,
    +                direct_url=direct_url,
    +                requested=requested,
    +            )
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py b/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
    new file mode 100644
    index 0000000..e6aa344
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
    @@ -0,0 +1,732 @@
    +"""Prepares a distribution for installation
    +"""
    +
    +# The following comment should be removed at some point in the future.
    +# mypy: strict-optional=False
    +
    +import mimetypes
    +import os
    +import shutil
    +from dataclasses import dataclass
    +from pathlib import Path
    +from typing import Dict, Iterable, List, Optional
    +
    +from pip._vendor.packaging.utils import canonicalize_name
    +
    +from pip._internal.distributions import make_distribution_for_install_requirement
    +from pip._internal.distributions.installed import InstalledDistribution
    +from pip._internal.exceptions import (
    +    DirectoryUrlHashUnsupported,
    +    HashMismatch,
    +    HashUnpinned,
    +    InstallationError,
    +    MetadataInconsistent,
    +    NetworkConnectionError,
    +    VcsHashUnsupported,
    +)
    +from pip._internal.index.package_finder import PackageFinder
    +from pip._internal.metadata import BaseDistribution, get_metadata_distribution
    +from pip._internal.models.direct_url import ArchiveInfo
    +from pip._internal.models.link import Link
    +from pip._internal.models.wheel import Wheel
    +from pip._internal.network.download import BatchDownloader, Downloader
    +from pip._internal.network.lazy_wheel import (
    +    HTTPRangeRequestUnsupported,
    +    dist_from_wheel_url,
    +)
    +from pip._internal.network.session import PipSession
    +from pip._internal.operations.build.build_tracker import BuildTracker
    +from pip._internal.req.req_install import InstallRequirement
    +from pip._internal.utils._log import getLogger
    +from pip._internal.utils.direct_url_helpers import (
    +    direct_url_for_editable,
    +    direct_url_from_link,
    +)
    +from pip._internal.utils.hashes import Hashes, MissingHashes
    +from pip._internal.utils.logging import indent_log
    +from pip._internal.utils.misc import (
    +    display_path,
    +    hash_file,
    +    hide_url,
    +    redact_auth_from_requirement,
    +)
    +from pip._internal.utils.temp_dir import TempDirectory
    +from pip._internal.utils.unpacking import unpack_file
    +from pip._internal.vcs import vcs
    +
    +logger = getLogger(__name__)
    +
    +
    +def _get_prepared_distribution(
    +    req: InstallRequirement,
    +    build_tracker: BuildTracker,
    +    finder: PackageFinder,
    +    build_isolation: bool,
    +    check_build_deps: bool,
    +) -> BaseDistribution:
    +    """Prepare a distribution for installation."""
    +    abstract_dist = make_distribution_for_install_requirement(req)
    +    tracker_id = abstract_dist.build_tracker_id
    +    if tracker_id is not None:
    +        with build_tracker.track(req, tracker_id):
    +            abstract_dist.prepare_distribution_metadata(
    +                finder, build_isolation, check_build_deps
    +            )
    +    return abstract_dist.get_metadata_distribution()
    +
    +
    +def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None:
    +    vcs_backend = vcs.get_backend_for_scheme(link.scheme)
    +    assert vcs_backend is not None
    +    vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity)
    +
    +
    +@dataclass
    +class File:
    +    path: str
    +    content_type: Optional[str] = None
    +
    +    def __post_init__(self) -> None:
    +        if self.content_type is None:
    +            self.content_type = mimetypes.guess_type(self.path)[0]
    +
    +
    +def get_http_url(
    +    link: Link,
    +    download: Downloader,
    +    download_dir: Optional[str] = None,
    +    hashes: Optional[Hashes] = None,
    +) -> File:
    +    temp_dir = TempDirectory(kind="unpack", globally_managed=True)
    +    # If a download dir is specified, is the file already downloaded there?
    +    already_downloaded_path = None
    +    if download_dir:
    +        already_downloaded_path = _check_download_dir(link, download_dir, hashes)
    +
    +    if already_downloaded_path:
    +        from_path = already_downloaded_path
    +        content_type = None
    +    else:
    +        # let's download to a tmp dir
    +        from_path, content_type = download(link, temp_dir.path)
    +        if hashes:
    +            hashes.check_against_path(from_path)
    +
    +    return File(from_path, content_type)
    +
    +
    +def get_file_url(
    +    link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None
    +) -> File:
    +    """Get file and optionally check its hash."""
    +    # If a download dir is specified, is the file already there and valid?
    +    already_downloaded_path = None
    +    if download_dir:
    +        already_downloaded_path = _check_download_dir(link, download_dir, hashes)
    +
    +    if already_downloaded_path:
    +        from_path = already_downloaded_path
    +    else:
    +        from_path = link.file_path
    +
    +    # If --require-hashes is off, `hashes` is either empty, the
    +    # link's embedded hash, or MissingHashes; it is required to
    +    # match. If --require-hashes is on, we are satisfied by any
    +    # hash in `hashes` matching: a URL-based or an option-based
    +    # one; no internet-sourced hash will be in `hashes`.
    +    if hashes:
    +        hashes.check_against_path(from_path)
    +    return File(from_path, None)
    +
    +
    +def unpack_url(
    +    link: Link,
    +    location: str,
    +    download: Downloader,
    +    verbosity: int,
    +    download_dir: Optional[str] = None,
    +    hashes: Optional[Hashes] = None,
    +) -> Optional[File]:
    +    """Unpack link into location, downloading if required.
    +
    +    :param hashes: A Hashes object, one of whose embedded hashes must match,
    +        or HashMismatch will be raised. If the Hashes is empty, no matches are
    +        required, and unhashable types of requirements (like VCS ones, which
    +        would ordinarily raise HashUnsupported) are allowed.
    +    """
    +    # non-editable vcs urls
    +    if link.is_vcs:
    +        unpack_vcs_link(link, location, verbosity=verbosity)
    +        return None
    +
    +    assert not link.is_existing_dir()
    +
    +    # file urls
    +    if link.is_file:
    +        file = get_file_url(link, download_dir, hashes=hashes)
    +
    +    # http urls
    +    else:
    +        file = get_http_url(
    +            link,
    +            download,
    +            download_dir,
    +            hashes=hashes,
    +        )
    +
    +    # unpack the archive to the build dir location. even when only downloading
    +    # archives, they have to be unpacked to parse dependencies, except wheels
    +    if not link.is_wheel:
    +        unpack_file(file.path, location, file.content_type)
    +
    +    return file
    +
    +
    +def _check_download_dir(
    +    link: Link,
    +    download_dir: str,
    +    hashes: Optional[Hashes],
    +    warn_on_hash_mismatch: bool = True,
    +) -> Optional[str]:
    +    """Check download_dir for previously downloaded file with correct hash
    +    If a correct file is found return its path else None
    +    """
    +    download_path = os.path.join(download_dir, link.filename)
    +
    +    if not os.path.exists(download_path):
    +        return None
    +
    +    # If already downloaded, does its hash match?
    +    logger.info("File was already downloaded %s", download_path)
    +    if hashes:
    +        try:
    +            hashes.check_against_path(download_path)
    +        except HashMismatch:
    +            if warn_on_hash_mismatch:
    +                logger.warning(
    +                    "Previously-downloaded file %s has bad hash. Re-downloading.",
    +                    download_path,
    +                )
    +            os.unlink(download_path)
    +            return None
    +    return download_path
    +
    +
    +class RequirementPreparer:
    +    """Prepares a Requirement"""
    +
    +    def __init__(
    +        self,
    +        build_dir: str,
    +        download_dir: Optional[str],
    +        src_dir: str,
    +        build_isolation: bool,
    +        check_build_deps: bool,
    +        build_tracker: BuildTracker,
    +        session: PipSession,
    +        progress_bar: str,
    +        finder: PackageFinder,
    +        require_hashes: bool,
    +        use_user_site: bool,
    +        lazy_wheel: bool,
    +        verbosity: int,
    +        legacy_resolver: bool,
    +    ) -> None:
    +        super().__init__()
    +
    +        self.src_dir = src_dir
    +        self.build_dir = build_dir
    +        self.build_tracker = build_tracker
    +        self._session = session
    +        self._download = Downloader(session, progress_bar)
    +        self._batch_download = BatchDownloader(session, progress_bar)
    +        self.finder = finder
    +
    +        # Where still-packed archives should be written to. If None, they are
    +        # not saved, and are deleted immediately after unpacking.
    +        self.download_dir = download_dir
    +
    +        # Is build isolation allowed?
    +        self.build_isolation = build_isolation
    +
    +        # Should check build dependencies?
    +        self.check_build_deps = check_build_deps
    +
    +        # Should hash-checking be required?
    +        self.require_hashes = require_hashes
    +
    +        # Should install in user site-packages?
    +        self.use_user_site = use_user_site
    +
    +        # Should wheels be downloaded lazily?
    +        self.use_lazy_wheel = lazy_wheel
    +
    +        # How verbose should underlying tooling be?
    +        self.verbosity = verbosity
    +
    +        # Are we using the legacy resolver?
    +        self.legacy_resolver = legacy_resolver
    +
    +        # Memoized downloaded files, as mapping of url: path.
    +        self._downloaded: Dict[str, str] = {}
    +
    +        # Previous "header" printed for a link-based InstallRequirement
    +        self._previous_requirement_header = ("", "")
    +
    +    def _log_preparing_link(self, req: InstallRequirement) -> None:
    +        """Provide context for the requirement being prepared."""
    +        if req.link.is_file and not req.is_wheel_from_cache:
    +            message = "Processing %s"
    +            information = str(display_path(req.link.file_path))
    +        else:
    +            message = "Collecting %s"
    +            information = redact_auth_from_requirement(req.req) if req.req else str(req)
    +
    +        # If we used req.req, inject requirement source if available (this
    +        # would already be included if we used req directly)
    +        if req.req and req.comes_from:
    +            if isinstance(req.comes_from, str):
    +                comes_from: Optional[str] = req.comes_from
    +            else:
    +                comes_from = req.comes_from.from_path()
    +            if comes_from:
    +                information += f" (from {comes_from})"
    +
    +        if (message, information) != self._previous_requirement_header:
    +            self._previous_requirement_header = (message, information)
    +            logger.info(message, information)
    +
    +        if req.is_wheel_from_cache:
    +            with indent_log():
    +                logger.info("Using cached %s", req.link.filename)
    +
    +    def _ensure_link_req_src_dir(
    +        self, req: InstallRequirement, parallel_builds: bool
    +    ) -> None:
    +        """Ensure source_dir of a linked InstallRequirement."""
    +        # Since source_dir is only set for editable requirements.
    +        if req.link.is_wheel:
    +            # We don't need to unpack wheels, so no need for a source
    +            # directory.
    +            return
    +        assert req.source_dir is None
    +        if req.link.is_existing_dir():
    +            # build local directories in-tree
    +            req.source_dir = req.link.file_path
    +            return
    +
    +        # We always delete unpacked sdists after pip runs.
    +        req.ensure_has_source_dir(
    +            self.build_dir,
    +            autodelete=True,
    +            parallel_builds=parallel_builds,
    +        )
    +        req.ensure_pristine_source_checkout()
    +
    +    def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes:
    +        # By the time this is called, the requirement's link should have
    +        # been checked so we can tell what kind of requirements req is
    +        # and raise some more informative errors than otherwise.
    +        # (For example, we can raise VcsHashUnsupported for a VCS URL
    +        # rather than HashMissing.)
    +        if not self.require_hashes:
    +            return req.hashes(trust_internet=True)
    +
    +        # We could check these first 2 conditions inside unpack_url
    +        # and save repetition of conditions, but then we would
    +        # report less-useful error messages for unhashable
    +        # requirements, complaining that there's no hash provided.
    +        if req.link.is_vcs:
    +            raise VcsHashUnsupported()
    +        if req.link.is_existing_dir():
    +            raise DirectoryUrlHashUnsupported()
    +
    +        # Unpinned packages are asking for trouble when a new version
    +        # is uploaded.  This isn't a security check, but it saves users
    +        # a surprising hash mismatch in the future.
    +        # file:/// URLs aren't pinnable, so don't complain about them
    +        # not being pinned.
    +        if not req.is_direct and not req.is_pinned:
    +            raise HashUnpinned()
    +
    +        # If known-good hashes are missing for this requirement,
    +        # shim it with a facade object that will provoke hash
    +        # computation and then raise a HashMissing exception
    +        # showing the user what the hash should be.
    +        return req.hashes(trust_internet=False) or MissingHashes()
    +
    +    def _fetch_metadata_only(
    +        self,
    +        req: InstallRequirement,
    +    ) -> Optional[BaseDistribution]:
    +        if self.legacy_resolver:
    +            logger.debug(
    +                "Metadata-only fetching is not used in the legacy resolver",
    +            )
    +            return None
    +        if self.require_hashes:
    +            logger.debug(
    +                "Metadata-only fetching is not used as hash checking is required",
    +            )
    +            return None
    +        # Try PEP 658 metadata first, then fall back to lazy wheel if unavailable.
    +        return self._fetch_metadata_using_link_data_attr(
    +            req
    +        ) or self._fetch_metadata_using_lazy_wheel(req.link)
    +
    +    def _fetch_metadata_using_link_data_attr(
    +        self,
    +        req: InstallRequirement,
    +    ) -> Optional[BaseDistribution]:
    +        """Fetch metadata from the data-dist-info-metadata attribute, if possible."""
    +        # (1) Get the link to the metadata file, if provided by the backend.
    +        metadata_link = req.link.metadata_link()
    +        if metadata_link is None:
    +            return None
    +        assert req.req is not None
    +        logger.verbose(
    +            "Obtaining dependency information for %s from %s",
    +            req.req,
    +            metadata_link,
    +        )
    +        # (2) Download the contents of the METADATA file, separate from the dist itself.
    +        metadata_file = get_http_url(
    +            metadata_link,
    +            self._download,
    +            hashes=metadata_link.as_hashes(),
    +        )
    +        with open(metadata_file.path, "rb") as f:
    +            metadata_contents = f.read()
    +        # (3) Generate a dist just from those file contents.
    +        metadata_dist = get_metadata_distribution(
    +            metadata_contents,
    +            req.link.filename,
    +            req.req.name,
    +        )
    +        # (4) Ensure the Name: field from the METADATA file matches the name from the
    +        #     install requirement.
    +        #
    +        #     NB: raw_name will fall back to the name from the install requirement if
    +        #     the Name: field is not present, but it's noted in the raw_name docstring
    +        #     that that should NEVER happen anyway.
    +        if canonicalize_name(metadata_dist.raw_name) != canonicalize_name(req.req.name):
    +            raise MetadataInconsistent(
    +                req, "Name", req.req.name, metadata_dist.raw_name
    +            )
    +        return metadata_dist
    +
    +    def _fetch_metadata_using_lazy_wheel(
    +        self,
    +        link: Link,
    +    ) -> Optional[BaseDistribution]:
    +        """Fetch metadata using lazy wheel, if possible."""
    +        # --use-feature=fast-deps must be provided.
    +        if not self.use_lazy_wheel:
    +            return None
    +        if link.is_file or not link.is_wheel:
    +            logger.debug(
    +                "Lazy wheel is not used as %r does not point to a remote wheel",
    +                link,
    +            )
    +            return None
    +
    +        wheel = Wheel(link.filename)
    +        name = canonicalize_name(wheel.name)
    +        logger.info(
    +            "Obtaining dependency information from %s %s",
    +            name,
    +            wheel.version,
    +        )
    +        url = link.url.split("#", 1)[0]
    +        try:
    +            return dist_from_wheel_url(name, url, self._session)
    +        except HTTPRangeRequestUnsupported:
    +            logger.debug("%s does not support range requests", url)
    +            return None
    +
    +    def _complete_partial_requirements(
    +        self,
    +        partially_downloaded_reqs: Iterable[InstallRequirement],
    +        parallel_builds: bool = False,
    +    ) -> None:
    +        """Download any requirements which were only fetched by metadata."""
    +        # Download to a temporary directory. These will be copied over as
    +        # needed for downstream 'download', 'wheel', and 'install' commands.
    +        temp_dir = TempDirectory(kind="unpack", globally_managed=True).path
    +
    +        # Map each link to the requirement that owns it. This allows us to set
    +        # `req.local_file_path` on the appropriate requirement after passing
    +        # all the links at once into BatchDownloader.
    +        links_to_fully_download: Dict[Link, InstallRequirement] = {}
    +        for req in partially_downloaded_reqs:
    +            assert req.link
    +            links_to_fully_download[req.link] = req
    +
    +        batch_download = self._batch_download(
    +            links_to_fully_download.keys(),
    +            temp_dir,
    +        )
    +        for link, (filepath, _) in batch_download:
    +            logger.debug("Downloading link %s to %s", link, filepath)
    +            req = links_to_fully_download[link]
    +            # Record the downloaded file path so wheel reqs can extract a Distribution
    +            # in .get_dist().
    +            req.local_file_path = filepath
    +            # Record that the file is downloaded so we don't do it again in
    +            # _prepare_linked_requirement().
    +            self._downloaded[req.link.url] = filepath
    +
    +            # If this is an sdist, we need to unpack it after downloading, but the
    +            # .source_dir won't be set up until we are in _prepare_linked_requirement().
    +            # Add the downloaded archive to the install requirement to unpack after
    +            # preparing the source dir.
    +            if not req.is_wheel:
    +                req.needs_unpacked_archive(Path(filepath))
    +
    +        # This step is necessary to ensure all lazy wheels are processed
    +        # successfully by the 'download', 'wheel', and 'install' commands.
    +        for req in partially_downloaded_reqs:
    +            self._prepare_linked_requirement(req, parallel_builds)
    +
    +    def prepare_linked_requirement(
    +        self, req: InstallRequirement, parallel_builds: bool = False
    +    ) -> BaseDistribution:
    +        """Prepare a requirement to be obtained from req.link."""
    +        assert req.link
    +        self._log_preparing_link(req)
    +        with indent_log():
    +            # Check if the relevant file is already available
    +            # in the download directory
    +            file_path = None
    +            if self.download_dir is not None and req.link.is_wheel:
    +                hashes = self._get_linked_req_hashes(req)
    +                file_path = _check_download_dir(
    +                    req.link,
    +                    self.download_dir,
    +                    hashes,
    +                    # When a locally built wheel has been found in cache, we don't warn
    +                    # about re-downloading when the already downloaded wheel hash does
    +                    # not match. This is because the hash must be checked against the
    +                    # original link, not the cached link. It that case the already
    +                    # downloaded file will be removed and re-fetched from cache (which
    +                    # implies a hash check against the cache entry's origin.json).
    +                    warn_on_hash_mismatch=not req.is_wheel_from_cache,
    +                )
    +
    +            if file_path is not None:
    +                # The file is already available, so mark it as downloaded
    +                self._downloaded[req.link.url] = file_path
    +            else:
    +                # The file is not available, attempt to fetch only metadata
    +                metadata_dist = self._fetch_metadata_only(req)
    +                if metadata_dist is not None:
    +                    req.needs_more_preparation = True
    +                    return metadata_dist
    +
    +            # None of the optimizations worked, fully prepare the requirement
    +            return self._prepare_linked_requirement(req, parallel_builds)
    +
    +    def prepare_linked_requirements_more(
    +        self, reqs: Iterable[InstallRequirement], parallel_builds: bool = False
    +    ) -> None:
    +        """Prepare linked requirements more, if needed."""
    +        reqs = [req for req in reqs if req.needs_more_preparation]
    +        for req in reqs:
    +            # Determine if any of these requirements were already downloaded.
    +            if self.download_dir is not None and req.link.is_wheel:
    +                hashes = self._get_linked_req_hashes(req)
    +                file_path = _check_download_dir(req.link, self.download_dir, hashes)
    +                if file_path is not None:
    +                    self._downloaded[req.link.url] = file_path
    +                    req.needs_more_preparation = False
    +
    +        # Prepare requirements we found were already downloaded for some
    +        # reason. The other downloads will be completed separately.
    +        partially_downloaded_reqs: List[InstallRequirement] = []
    +        for req in reqs:
    +            if req.needs_more_preparation:
    +                partially_downloaded_reqs.append(req)
    +            else:
    +                self._prepare_linked_requirement(req, parallel_builds)
    +
    +        # TODO: separate this part out from RequirementPreparer when the v1
    +        # resolver can be removed!
    +        self._complete_partial_requirements(
    +            partially_downloaded_reqs,
    +            parallel_builds=parallel_builds,
    +        )
    +
    +    def _prepare_linked_requirement(
    +        self, req: InstallRequirement, parallel_builds: bool
    +    ) -> BaseDistribution:
    +        assert req.link
    +        link = req.link
    +
    +        hashes = self._get_linked_req_hashes(req)
    +
    +        if hashes and req.is_wheel_from_cache:
    +            assert req.download_info is not None
    +            assert link.is_wheel
    +            assert link.is_file
    +            # We need to verify hashes, and we have found the requirement in the cache
    +            # of locally built wheels.
    +            if (
    +                isinstance(req.download_info.info, ArchiveInfo)
    +                and req.download_info.info.hashes
    +                and hashes.has_one_of(req.download_info.info.hashes)
    +            ):
    +                # At this point we know the requirement was built from a hashable source
    +                # artifact, and we verified that the cache entry's hash of the original
    +                # artifact matches one of the hashes we expect. We don't verify hashes
    +                # against the cached wheel, because the wheel is not the original.
    +                hashes = None
    +            else:
    +                logger.warning(
    +                    "The hashes of the source archive found in cache entry "
    +                    "don't match, ignoring cached built wheel "
    +                    "and re-downloading source."
    +                )
    +                req.link = req.cached_wheel_source_link
    +                link = req.link
    +
    +        self._ensure_link_req_src_dir(req, parallel_builds)
    +
    +        if link.is_existing_dir():
    +            local_file = None
    +        elif link.url not in self._downloaded:
    +            try:
    +                local_file = unpack_url(
    +                    link,
    +                    req.source_dir,
    +                    self._download,
    +                    self.verbosity,
    +                    self.download_dir,
    +                    hashes,
    +                )
    +            except NetworkConnectionError as exc:
    +                raise InstallationError(
    +                    f"Could not install requirement {req} because of HTTP "
    +                    f"error {exc} for URL {link}"
    +                )
    +        else:
    +            file_path = self._downloaded[link.url]
    +            if hashes:
    +                hashes.check_against_path(file_path)
    +            local_file = File(file_path, content_type=None)
    +
    +        # If download_info is set, we got it from the wheel cache.
    +        if req.download_info is None:
    +            # Editables don't go through this function (see
    +            # prepare_editable_requirement).
    +            assert not req.editable
    +            req.download_info = direct_url_from_link(link, req.source_dir)
    +            # Make sure we have a hash in download_info. If we got it as part of the
    +            # URL, it will have been verified and we can rely on it. Otherwise we
    +            # compute it from the downloaded file.
    +            # FIXME: https://github.com/pypa/pip/issues/11943
    +            if (
    +                isinstance(req.download_info.info, ArchiveInfo)
    +                and not req.download_info.info.hashes
    +                and local_file
    +            ):
    +                hash = hash_file(local_file.path)[0].hexdigest()
    +                # We populate info.hash for backward compatibility.
    +                # This will automatically populate info.hashes.
    +                req.download_info.info.hash = f"sha256={hash}"
    +
    +        # For use in later processing,
    +        # preserve the file path on the requirement.
    +        if local_file:
    +            req.local_file_path = local_file.path
    +
    +        dist = _get_prepared_distribution(
    +            req,
    +            self.build_tracker,
    +            self.finder,
    +            self.build_isolation,
    +            self.check_build_deps,
    +        )
    +        return dist
    +
    +    def save_linked_requirement(self, req: InstallRequirement) -> None:
    +        assert self.download_dir is not None
    +        assert req.link is not None
    +        link = req.link
    +        if link.is_vcs or (link.is_existing_dir() and req.editable):
    +            # Make a .zip of the source_dir we already created.
    +            req.archive(self.download_dir)
    +            return
    +
    +        if link.is_existing_dir():
    +            logger.debug(
    +                "Not copying link to destination directory "
    +                "since it is a directory: %s",
    +                link,
    +            )
    +            return
    +        if req.local_file_path is None:
    +            # No distribution was downloaded for this requirement.
    +            return
    +
    +        download_location = os.path.join(self.download_dir, link.filename)
    +        if not os.path.exists(download_location):
    +            shutil.copy(req.local_file_path, download_location)
    +            download_path = display_path(download_location)
    +            logger.info("Saved %s", download_path)
    +
    +    def prepare_editable_requirement(
    +        self,
    +        req: InstallRequirement,
    +    ) -> BaseDistribution:
    +        """Prepare an editable requirement."""
    +        assert req.editable, "cannot prepare a non-editable req as editable"
    +
    +        logger.info("Obtaining %s", req)
    +
    +        with indent_log():
    +            if self.require_hashes:
    +                raise InstallationError(
    +                    f"The editable requirement {req} cannot be installed when "
    +                    "requiring hashes, because there is no single file to "
    +                    "hash."
    +                )
    +            req.ensure_has_source_dir(self.src_dir)
    +            req.update_editable()
    +            assert req.source_dir
    +            req.download_info = direct_url_for_editable(req.unpacked_source_directory)
    +
    +            dist = _get_prepared_distribution(
    +                req,
    +                self.build_tracker,
    +                self.finder,
    +                self.build_isolation,
    +                self.check_build_deps,
    +            )
    +
    +            req.check_if_exists(self.use_user_site)
    +
    +        return dist
    +
    +    def prepare_installed_requirement(
    +        self,
    +        req: InstallRequirement,
    +        skip_reason: str,
    +    ) -> BaseDistribution:
    +        """Prepare an already-installed requirement."""
    +        assert req.satisfied_by, "req should have been satisfied but isn't"
    +        assert skip_reason is not None, (
    +            "did not get skip reason skipped but req.satisfied_by "
    +            f"is set to {req.satisfied_by}"
    +        )
    +        logger.info(
    +            "Requirement %s: %s (%s)", skip_reason, req, req.satisfied_by.version
    +        )
    +        with indent_log():
    +            if self.require_hashes:
    +                logger.debug(
    +                    "Since it is already installed, we are trusting this "
    +                    "package without checking its hash. To ensure a "
    +                    "completely repeatable environment, install into an "
    +                    "empty virtualenv."
    +                )
    +            return InstalledDistribution(req).get_metadata_distribution()
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/pyproject.py b/env/lib/python3.12/site-packages/pip/_internal/pyproject.py
    new file mode 100644
    index 0000000..2a9cad4
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/pyproject.py
    @@ -0,0 +1,185 @@
    +import importlib.util
    +import os
    +import sys
    +from collections import namedtuple
    +from typing import Any, List, Optional
    +
    +if sys.version_info >= (3, 11):
    +    import tomllib
    +else:
    +    from pip._vendor import tomli as tomllib
    +
    +from pip._vendor.packaging.requirements import InvalidRequirement
    +
    +from pip._internal.exceptions import (
    +    InstallationError,
    +    InvalidPyProjectBuildRequires,
    +    MissingPyProjectBuildRequires,
    +)
    +from pip._internal.utils.packaging import get_requirement
    +
    +
    +def _is_list_of_str(obj: Any) -> bool:
    +    return isinstance(obj, list) and all(isinstance(item, str) for item in obj)
    +
    +
    +def make_pyproject_path(unpacked_source_directory: str) -> str:
    +    return os.path.join(unpacked_source_directory, "pyproject.toml")
    +
    +
    +BuildSystemDetails = namedtuple(
    +    "BuildSystemDetails", ["requires", "backend", "check", "backend_path"]
    +)
    +
    +
    +def load_pyproject_toml(
    +    use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str
    +) -> Optional[BuildSystemDetails]:
    +    """Load the pyproject.toml file.
    +
    +    Parameters:
    +        use_pep517 - Has the user requested PEP 517 processing? None
    +                     means the user hasn't explicitly specified.
    +        pyproject_toml - Location of the project's pyproject.toml file
    +        setup_py - Location of the project's setup.py file
    +        req_name - The name of the requirement we're processing (for
    +                   error reporting)
    +
    +    Returns:
    +        None if we should use the legacy code path, otherwise a tuple
    +        (
    +            requirements from pyproject.toml,
    +            name of PEP 517 backend,
    +            requirements we should check are installed after setting
    +                up the build environment
    +            directory paths to import the backend from (backend-path),
    +                relative to the project root.
    +        )
    +    """
    +    has_pyproject = os.path.isfile(pyproject_toml)
    +    has_setup = os.path.isfile(setup_py)
    +
    +    if not has_pyproject and not has_setup:
    +        raise InstallationError(
    +            f"{req_name} does not appear to be a Python project: "
    +            f"neither 'setup.py' nor 'pyproject.toml' found."
    +        )
    +
    +    if has_pyproject:
    +        with open(pyproject_toml, encoding="utf-8") as f:
    +            pp_toml = tomllib.loads(f.read())
    +        build_system = pp_toml.get("build-system")
    +    else:
    +        build_system = None
    +
    +    # The following cases must use PEP 517
    +    # We check for use_pep517 being non-None and falsey because that means
    +    # the user explicitly requested --no-use-pep517.  The value 0 as
    +    # opposed to False can occur when the value is provided via an
    +    # environment variable or config file option (due to the quirk of
    +    # strtobool() returning an integer in pip's configuration code).
    +    if has_pyproject and not has_setup:
    +        if use_pep517 is not None and not use_pep517:
    +            raise InstallationError(
    +                "Disabling PEP 517 processing is invalid: "
    +                "project does not have a setup.py"
    +            )
    +        use_pep517 = True
    +    elif build_system and "build-backend" in build_system:
    +        if use_pep517 is not None and not use_pep517:
    +            raise InstallationError(
    +                "Disabling PEP 517 processing is invalid: "
    +                "project specifies a build backend of {} "
    +                "in pyproject.toml".format(build_system["build-backend"])
    +            )
    +        use_pep517 = True
    +
    +    # If we haven't worked out whether to use PEP 517 yet,
    +    # and the user hasn't explicitly stated a preference,
    +    # we do so if the project has a pyproject.toml file
    +    # or if we cannot import setuptools or wheels.
    +
    +    # We fallback to PEP 517 when without setuptools or without the wheel package,
    +    # so setuptools can be installed as a default build backend.
    +    # For more info see:
    +    # https://discuss.python.org/t/pip-without-setuptools-could-the-experience-be-improved/11810/9
    +    # https://github.com/pypa/pip/issues/8559
    +    elif use_pep517 is None:
    +        use_pep517 = (
    +            has_pyproject
    +            or not importlib.util.find_spec("setuptools")
    +            or not importlib.util.find_spec("wheel")
    +        )
    +
    +    # At this point, we know whether we're going to use PEP 517.
    +    assert use_pep517 is not None
    +
    +    # If we're using the legacy code path, there is nothing further
    +    # for us to do here.
    +    if not use_pep517:
    +        return None
    +
    +    if build_system is None:
    +        # Either the user has a pyproject.toml with no build-system
    +        # section, or the user has no pyproject.toml, but has opted in
    +        # explicitly via --use-pep517.
    +        # In the absence of any explicit backend specification, we
    +        # assume the setuptools backend that most closely emulates the
    +        # traditional direct setup.py execution, and require wheel and
    +        # a version of setuptools that supports that backend.
    +
    +        build_system = {
    +            "requires": ["setuptools>=40.8.0"],
    +            "build-backend": "setuptools.build_meta:__legacy__",
    +        }
    +
    +    # If we're using PEP 517, we have build system information (either
    +    # from pyproject.toml, or defaulted by the code above).
    +    # Note that at this point, we do not know if the user has actually
    +    # specified a backend, though.
    +    assert build_system is not None
    +
    +    # Ensure that the build-system section in pyproject.toml conforms
    +    # to PEP 518.
    +
    +    # Specifying the build-system table but not the requires key is invalid
    +    if "requires" not in build_system:
    +        raise MissingPyProjectBuildRequires(package=req_name)
    +
    +    # Error out if requires is not a list of strings
    +    requires = build_system["requires"]
    +    if not _is_list_of_str(requires):
    +        raise InvalidPyProjectBuildRequires(
    +            package=req_name,
    +            reason="It is not a list of strings.",
    +        )
    +
    +    # Each requirement must be valid as per PEP 508
    +    for requirement in requires:
    +        try:
    +            get_requirement(requirement)
    +        except InvalidRequirement as error:
    +            raise InvalidPyProjectBuildRequires(
    +                package=req_name,
    +                reason=f"It contains an invalid requirement: {requirement!r}",
    +            ) from error
    +
    +    backend = build_system.get("build-backend")
    +    backend_path = build_system.get("backend-path", [])
    +    check: List[str] = []
    +    if backend is None:
    +        # If the user didn't specify a backend, we assume they want to use
    +        # the setuptools backend. But we can't be sure they have included
    +        # a version of setuptools which supplies the backend. So we
    +        # make a note to check that this requirement is present once
    +        # we have set up the environment.
    +        # This is quite a lot of work to check for a very specific case. But
    +        # the problem is, that case is potentially quite common - projects that
    +        # adopted PEP 518 early for the ability to specify requirements to
    +        # execute setup.py, but never considered needing to mention the build
    +        # tools themselves. The original PEP 518 code had a similar check (but
    +        # implemented in a different way).
    +        backend = "setuptools.build_meta:__legacy__"
    +        check = ["setuptools>=40.8.0"]
    +
    +    return BuildSystemDetails(requires, backend, check, backend_path)
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py
    new file mode 100644
    index 0000000..422d851
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_internal/req/__init__.py
    @@ -0,0 +1,90 @@
    +import collections
    +import logging
    +from dataclasses import dataclass
    +from typing import Generator, List, Optional, Sequence, Tuple
    +
    +from pip._internal.utils.logging import indent_log
    +
    +from .req_file import parse_requirements
    +from .req_install import InstallRequirement
    +from .req_set import RequirementSet
    +
    +__all__ = [
    +    "RequirementSet",
    +    "InstallRequirement",
    +    "parse_requirements",
    +    "install_given_reqs",
    +]
    +
    +logger = logging.getLogger(__name__)
    +
    +
    +@dataclass(frozen=True)
    +class InstallationResult:
    +    name: str
    +
    +
    +def _validate_requirements(
    +    requirements: List[InstallRequirement],
    +) -> Generator[Tuple[str, InstallRequirement], None, None]:
    +    for req in requirements:
    +        assert req.name, f"invalid to-be-installed requirement: {req}"
    +        yield req.name, req
    +
    +
    +def install_given_reqs(
    +    requirements: List[InstallRequirement],
    +    global_options: Sequence[str],
    +    root: Optional[str],
    +    home: Optional[str],
    +    prefix: Optional[str],
    +    warn_script_location: bool,
    +    use_user_site: bool,
    +    pycompile: bool,
    +) -> List[InstallationResult]:
    +    """
    +    Install everything in the given list.
    +
    +    (to be called after having downloaded and unpacked the packages)
    +    """
    +    to_install = collections.OrderedDict(_validate_requirements(requirements))
    +
    +    if to_install:
    +        logger.info(
    +            "Installing collected packages: %s",
    +            ", ".join(to_install.keys()),
    +        )
    +
    +    installed = []
    +
    +    with indent_log():
    +        for req_name, requirement in to_install.items():
    +            if requirement.should_reinstall:
    +                logger.info("Attempting uninstall: %s", req_name)
    +                with indent_log():
    +                    uninstalled_pathset = requirement.uninstall(auto_confirm=True)
    +            else:
    +                uninstalled_pathset = None
    +
    +            try:
    +                requirement.install(
    +                    global_options,
    +                    root=root,
    +                    home=home,
    +                    prefix=prefix,
    +                    warn_script_location=warn_script_location,
    +                    use_user_site=use_user_site,
    +                    pycompile=pycompile,
    +                )
    +            except Exception:
    +                # if install did not succeed, rollback previous uninstall
    +                if uninstalled_pathset and not requirement.install_succeeded:
    +                    uninstalled_pathset.rollback()
    +                raise
    +            else:
    +                if uninstalled_pathset and requirement.install_succeeded:
    +                    uninstalled_pathset.commit()
    +
    +            installed.append(InstallationResult(req_name))
    +
    +    return installed
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..9bf1ab6bc27b3c8a2953aff862255947368e6d9c
    GIT binary patch
    literal 3463
    zcmahMTWk~A^^QHZXZ(mCv7L|y7(z&#keG*978c5)hG%(5gnq2WYBcd&Cu8Q}y)!0{
    zI%px93>JuLiOKz&(;z396xN$i{t2hZ@d?ZJbjgYBU>V
    z&@__xUoqL33t^_P$1!HJ$MFYX4~1+3c-)fzVZa%2p)*Jd-a=C7fvdsupwXdhQtH57
    z9Nq@B6viIR<1QS|yKI_~n7o@}c~*+tVzb>_c%zuZT{c$?`7g
    z44RU*yqMGt@_Oc(^tP|4C705S#Y>_o<`mH|(jJRHgEdS(9v_6VTy`!Wpfxt
    zJGPLM*i5q|1VTuVHUVg?nA}(F={rmQfO^EZx
    z*ya4#cXbJ8uy!M($Wxi(yg8$52gmmx$QZJT$BJU^x;TxEOi?ao1X(jNflJ815o81)
    zWm6Ewi}NH3TJ0tYh~b0gN9ct=bn6_U_ifKuL0Htf49iQfSt44l>9oLw5DVV`d>eUa
    zzK0k%z%rUZ?++ui$ds7^jJAW}KMw&|W`2%-;c}e%=C|;cnY`;~%qqj6pNz0*9{tum
    z%cNbG76xVQhN#F=%GAfE@L2P*v6R|k@X=J7Au-UNc9CA_EI0K68cnGb>7fHj!4@K#
    z-}E}N119MT;|Mf=NB>wt8(tLYTXxsNu{(1=o~v-DE4}YN>U`v>Y&*TionD@+bwuyX
    z+@87TURKw*-j^QW{-;6D=4NI;c_d;Um&Ksu
    zrN2!{noII726+Tlb^YhsGE;Vy-DS4yDSOMlhrS0i=l~e>!yxI0H8cUW0g0A_1?r1!
    z;G717KpS7!*)|QNNyE|x*lW`xoF2mI*DS1Tx4+C!LNxD31~cno(0gDRaL&xR-$S#^
    z05ba=iMtU=*;e=ccdLyESWTm-4K}U5iDr=__nZ2t4UL&Jw@~t@0GcHrg>PU2$xha$
    zQ?iyaXK>2S?kNSz&A8uY9X9pU6i(%!Vn8+!^N{>fGvW=pMABz9MHeMHu1TqqMiV6v
    zRF0D~)3%U>olT8&SxyI0ITIKirlYArW5KmIwa|UiG_eXn4QwT?nS|&pEj2;0Wa>gr
    z*YYw^FQvVN-VxbF8+tQjH*E%KL!Soem=$Phg6d*efy+d~1WOZg&b0H9<%Lo?jiI>8
    zT3)xYXmONs;quW63Ow=A=K&RDdG2u3NF!x)al@G2r!0=Z)~Dc*EU#EBVokD(LONt;Q<9>l|Ia;HemDR}CEr9q6$g3Pu9j9{
    zOS-l?TZUpuD2nEcflY&^6zT#kuroL5pvq}OkJ2~~?!AOwZAY>G_2_UlI{YMk;!$ud
    zeQ_;%Y3ckIzUVWq<4)jqpcc&3f{{DtZl7Bztm=35wdBxRaQKzS&HL+q6zyC(_cy-t
    zr+u}-%=+M=>foV24<4=tcP^h@xn2wRtcOP*hew}9lB$_@aW6KXwTcA&7Z6vL%~FajlVu*tNs_9N4)=Q#Dt($4dKoX7vSN%kq_CwI}
    z(GhSW`)z3X;Nhhx@F?S_v3bFcB|`r(AfvRgUqkdI)Ce|qO4pT!m(ir$coNxf2JTqn
    zb@v@|1}11;H6T@@x|?B`&r$4i)bSkc{0ln%6dnH(9rzLrKS!g_(ZJWNC*WH0)jN>C
    zce!hw@2T=V_ugLPcQ1KgdXX!zvik|s_1eWS9d!iFh8wxM>o&=Gn7&#pS?NkwVN&dMf$4hWFq7D_0;m`9zI&5*FV;PPgG&ZF
    zR}S7DtNSR$ITTMRKMEyQCU0M?2PhRpy*uh5igloPcRft82#Un(QHsTo*I)7XRXzQ$
    JI)S#&=--ihM)Cjv
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..fa0bfdfe725249a39b4e46067c9a006f33cf9d13
    GIT binary patch
    literal 21273
    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
    Tp2>r{8f~&RKCmIinAQIQ_EDch
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..853c73419146424cdf8f1d1c6703e10a2faf5dc5
    GIT binary patch
    literal 22141
    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
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..f71f4ee7912cfb9d73017306a35fd9759565adaa
    GIT binary patch
    literal 38493
    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
    J;bVKx{{z3$V(S0^
    
    literal 0
    HcmV?d00001
    
    diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..7ea7fa1768835661399123a76fbd44ad990919be
    GIT binary patch
    literal 5501
    zcmcgwPi))P8GocGnUZNsiJT~QoLH&d)JkpHaok`@WzRvJCQDiesEZxE7KAK5+j1#V
    zeWc@9wE-jW!2<%c1%|~%J0wSY$+qNHpod*{7_f^JrI5>YShlsmc2lDQTXx#_QKBr_
    zO1omf2oCdx7`+0PpWCE$*#LqG3A}|a)c+8%(poU@07IpE>~_%Nj$ko6wew_
    zn(p$IzLq5}BK`v#6A{j8zRDEJs4|{Rm=WF*u(X6%lZFX{`x0?Y*OH02n#@pHi>D}b
    z?*EZym~mBooxZb>WHd!JGf`f;Ox=}6>DN%X1$&(06f(steubkhg;!iNf+DQBrv!zk
    z?ipTjuL)D0O5FqXCZ&mr6+RK#-kP=-+CIfc-N29QG()?&(iWjDL0h6NFxpDRc6dLm
    z-?Ap$t!!z^ziX_uW-PGeiUh3Inqy5;(>j=#qlvd=VK3rw3x
    zRA9B=fOQxAOQS$;5wju&LYxgO6S>;A%t5Ow9F*p3VghDv9(EodkwMXnt}!5UPZu~`g!XE^+CZD3AM(Sg*$Ts)PED+A+tVgZF|
    z3|vf_mlmc6P7V(CkH?pc{;M})nw%a;FPU??b}D*uXuwFCv_BnByd9sV
    z#y~om9*~ooNtqT`2Ve*Imknx0(@T~p!%)(ck9HfD4IStZ|iNbDl_
    z>Bze9NNnFe9>cQx@#xsP@R@k51S}*`1ri#lb2jidp;8OH!mR4<5(T2uHna?j=1&I+dp^G!7qDpk;7vdrzwa_n!CL_8C98^w*Bf`92OkSm0P%`TI-
    zf`qJa%iMfrx!QtpHv`Mu&$(M1M{XVv$P)RLYmwXH&~|+Z5TGH?Fg>-!TYPlTasl2I
    z`LX~kV|inbxsg4w10Kvv14&i>8BZ|1haMr
    zv$W60I)LMQ2n^Y41Qr^3AZ-Rec5R%$eeuJKx1|Tt(-O+%M%OVeB3K^7_GApr&GKA}
    zs|(bygn2!wMR?|iPJ5(IjhbZHR+h}c#&F|_j1eHK?o2jkQxJG$DrLn!5B@~yM&7Ipi^egAwg4N-8g$V_HIIr8wQ%_N?4zs
    zrwQ}r@Vg0pK{Hpv;E0^;px20;4ZjN=#>!}h@B9DQ7kdFW+Sss8>`~%9=XSj2aag6s
    zvO2~d#5T`=d}_nEz4+nc?bw6ZQx*Z1h|BU;!LZym29|(Fj)?38?gTZ3y$Hne%;+o?
    zH!ZI$+f!s2LnERHHJ3^?)@QG{V~SQwc?#NKQkykUW5Qv_70M9mQECmsYIy*)z?cJK
    z8|StZC`d-`5i^mxED5)d|I&|v
    zK>TYQ_xQ`?24qN$9BU&p-!VWAVx;Y2BQ9p^Z7aOS^2F0=swogyY!8Rwx6Z?b;))_S
    z$el9BcPYy=_)rUs=Ygz}?cmWuu=`=KJ1cf)0YgzLh{tl`v4Yr}6MHugeFvw1kZjNL+8XD@NWnpx{+PaG9QDUT`*z5wbc}Gt72qHX{MuP+X`B*c?S@R
    zJ;`RKrvYGlxccE`#z`Omm%pRn?|SI(%8FfCf7h2GfT$2TlZ%|mht94`+b3RH7Ybr~
    zPHf-kdnmq8_CP4u#`vi)QWq(zo*DgpV}-g#u5+w|dq$?X%wzh|2uBILwxeoQ_%JO4
    z&1Z2)gtsbC+Ilz!tJEXtpNku{iF)SfF6?%VVv20x(eSerhbZp9db+k`lwvQ83xVG;^nh0mx
    zaZT8_0&s7yg~`Zt?b5j24CmoB2FB7=^4K3N_XP=l
    z4pUgyRGfm}6pa6RdzH$-e0a+to^B(s(
    zZqqChEI%R{($5$
    zm(no8P!u*w)?xUD6P2$)s-&}M`NIw{L>J7YYLxHfM{Ew~D^C>E1pkg2+2XLgU=y#x
    zTPZ8c)q`7rhK=?lzRbQy*q?bgQzSI~3Qgm?~_eawDC(`|Aa^x#=<|`6=
    g?Cn?&6}%leZ^y>UO
    zdSNk&P6Q}a2u5-U)^-ThIuTUM71X*F-8wbt+KJNUB)eKrfW~l5H#|*qPX7Q2rLvT^
    z?(e&^GqV7eg5%_pxO3;e=03ms-S4&k)#_59D;@uyZls1?x<$*_WqiI4ILW>
    zYCCG#yQ9BupuVG?=X6}CEadwRFZa4*W6&Ae6wJb(E3`T24%ramgM6312pPI8!R(g|
    z9Sy;pkR_OlG;>;-j&h*HLsGg7K@Z9{h8lx;p@KCv8-n>S8NQPm`i`bxLC7B3l&TS}
    zVP7`{3sJ+CholuDZR?6OS146dd3Lcjq9w)1yG_Tnalw+8xM1mbFw^8ZwzIf0#FeXY
    z%`C10ab7iU$0+Zs{5vYr?&GEG&Om2R$loP|2mE4qSm+G-tdjoV;HYFd9O&;4T<8x;
    zhSuKBh-7UG4Tgk3BrHgl;}L{d(#c*iB3VukMS8=7fqqGUCKQp3XNQOSLq469e=^h^
    z=p1cDp5aJuzj%C5jG$5}|H;8#Ie4m96nh7|p9pn^g&;~~b%!GU3%!H>AtBV&`@G~(
    z-iO7Ifaban1;h~5C-h!GmEl3ena>?>Z#{kP41y)0?rwj7@8CuMP$1GH_o_eK8DKee
    zk`=X`40m^j1j*Jr7z_pFz?G#EVkaU|1Lk^!G+Xth8hnLW6;UkSLjifrt>I
    z4&@yT_60go?rdmasI^xJbz(S1CFhD)w4+cM9z++r{loZ*;D4@Hhztk%LxayrX6jt9
    zSCH&tr_ehT@zWBr@=9h;^^mc^>R;0W4xzM2Z*=K`T0M9<#$VxoHMoeVs{fMXPyHGXz
    zmdLWSM-7dk=R;8^`HcgC!QQTr7>U{&Mk77p!R?J(w>62qkx;`>pz~s&J0vy@^$s=p
    zdk3-Ou)&&y&{yaW3oEsQ(0a+48Y#IkLLFL@hd=SR;r&nUmzTItvN(6nm63^&E3t{#
    zRNM4#C0$!D9b2&Fyx9ITd(MI-Yr&Z}{@7$NZY%lFP$It!#BDVn8frc^I~THxCT&xj
    z;#svxOYL3uvN4{uA!*t0nMf<>#edZk}H!t(CATyEe-IodIA^X&jEdJ%9_9|#70Mqwk$37glh`ZqZlC6S!MWx@!8#jFH
    z$)7Szo}SjdetNuh!IeAJ{GqF2!R@(bxoVm6yq>j?U;LWwzM0Fb`AoE+@b4Dy5bVg&z>zzv+9&hHd$2&#e+kVq0`Q>?vf*-
    z0@)b%jyl08tHZMRE-edfsrJz*u5x|$RS|fN0R*c++7L6O0I{LZxi)Xmpe!mZyxr@3
    z%eA(AOfCNmCTq+%W{R1B5E+ZPG4ndLWoo%GW)7O7_{`e&|Aw`hGuL+cU2Ghl9W|D~
    zpJQ?vgnzm>)F1Q$wP4493LDwE?Ayq;q$h%3gwcKuv#-6ETXqpDck5hijye>49bhr^0A{PZuVk3v&!fsM0%$;Fc_pj
    zm};O%k&Z(k12P)XD1Z7%1+sq$?FKs4h-&J6-bmmg9hU(?JwW|_)XA_nKh;W&PgQZe
    zE7dt~ujm~NM{s}w5!vh&0=*(C2@HBef)Exqv({1ny+dK(VL<56G90!8^1u;N$l7_l
    z{mj{eCr=)Ef^{+Vk)B9oNZixZBp*~jcF+bo!WzRucau02>co*RV_qUoEW+=Qry+G}
    zg@W1v$6C=Iby7ps(UF0Sv9jYb6G8MOUvJ67mgbjUD@h6er!6F
    zbZs6tEM(=pVq37guI!uGH0aP8dHbJxyaJwM%?%&VU`I(}$Uw~(7R**Pgp
    zwv4wf=H^{%x!Q7V@72B2y6M)Loo}2<=5E7jkdyz)V_%T?`;Xnv<#LKX6A2={c(C!X
    zkH5Y3;4VBQBik%1fG~kb0;J1vcrWW;Hmr-es;52*q}(fp2puoXsUVn-Se3XK7a=@@
    zxp!0?7eIIu$GxJDsGxIPKW^yK1$8f3VmP^#n!b}di+i)3ZPLgOs&dZ1-PDdhfA3g@!!?Z!R$`5|F{w765A
    ze+}(Y(*kIU*a=U@yp}javF*NzEB8%WmyDb<`^xEw(^JRiOE)JU$i4pv}3k2S+pma_ejFM_m)24KD?}_+`lNRmvQjl
    zJy>$EoCh4!Al(^!UTB0TnM9iGpztMn(FX=cg(if6Y96BqJL|Lzu-MCRf6y;p>>ZK;
    zCRL*#o{v77!s${y7oJAqmnp+D@IC`h=iuzlD|HifS2j&-x^#H4wBj2_E}d9(=T8p5
    zSv~Kr9XBlI7k#3R#z3S{qabd`7YK^3
    zSfGSdG3ZhX|7F|D_Lm*kxER;UUEw=*yhk8^f
    z6w@i`K=L#=q|1cTDR4$^RS&fa2hh5$QlS?5m~yzkr?y;>r-lB9y34f&)Q7t0gk$a<
    zorZpC?N!<^W(?{hZY6KfpoKwIGQMPZ#U3*NZvF?rO-CeG$v5u6jmiY5X|!
    znZB@`1?8-n%3XdG@ZA*CM{%m4f8#NI9}V{^7c(jC#g~kIC99J0I^jrLdAKL8b_~5u
    z%_vTl9~d}o)FMP)U=BA*Zz`Df(5?weD`Lhd*5?_l2cE5ok+hJ{8vTw!B?+)YDs@5u
    zA7kj9eBMNQ0uk?E2)HrMunQrtO#KR`u)VWAKqcvb8wiZzZ0YPD4r-_?&@Asr4@fhF
    z)P{xL?p}~8kQ-Oh!A^#+vQO9uTS}D;dPC2JaP%=!4Ulo*dKYDaj)40JCp-pE;sb&g
    zPlBVWBcy^B#4-)dPv7J(3xp=igEnnQx;D(awj^9zX0zvA+rR(xXY5e_-Cd9HD~=SJdp2xD#Q3^i
    z#d!c=$9NEb^b>{&9lA?xg-dnUy`sBs)43{lEhw3Bxg(mVK$JLvAq6zN=w}L@_(%2h
    zcTiL$P?PFu`N`XDH@|XybjC9?a+9C0*mJw>vt^q4-}Myy^LI?3ZK(FGO9FlJtdiwE%yLQ%i=~&#gbJ3kUdF(akrQ<-$X21Nt|2_ZQj-$zfw#1I3
    zv-~%8H_X?~H=Ng<(}84R{Y-YUa8rE8(L_PpU!IwBKaN7hW#8Cv>G+a?H*O?_qMH%y{&Z4yOg$R_
    zS_$Ygry^at3~~AlaR$1Up6>yqF#@4TK^UbrdInVl5NJu>L-MGAS~LXpG2?T%004o>
    z0MdUGs+@vsC{Lh1hD>$Gj9QM%eL!r~QPHmB>wI5DX|)jm#gZ@sIHmS6QzToC0qs=1
    zq7y+LBl!+S(yXCWeZ<09?lk1evK+w?2$4rcMF#<$0!z$780Y#lKaF<`l-@gWeY@ji|
    zV(!$jD-BSgb*aXgM!^g!c4|&>oxw#5*BLV*vP6}S>AG|(LTetu(Gwt?O2cF$#APOu
    z$~HnwMGB4d^nw@>F3aLH^qcjKy5tdI=tceuGl_3g)^vbY5A{hvDa4~F|Sl`q@
    z<(ReO4DAPAOdVqfD$Y(cQZlDnBs{OwE4lp&-W^OGwI(?eL%V1ZNW5RN;M`>+AQ`(D
    zubrK|en!Dm4qEn-UdbI`UI@3COc4%546e-MirMD6eI6_PUw9H=7fi4lFow
    zubh}Tkve-_*IhG)WMRXcqjACFykecOPS(8YTC#K5rQqWhmV9&jH-#G`*GJ|nni3UF
    zvw6vqmSn-MxWRKTD{rzpnN@zNZP~)*7LS`2Yii$Wd!udU=%1WUIJ`J(AD^=Pw5W2@
    zxR6_TZU5E%)3tNCz6DR|y~1L4>N~DGrq9iUl7-Ea#(SRpYi(ECuC-rnpWboD<6D&T
    z%oo-tfEMH>3!CCCZ66l4Et$By@@uEAo|@ip$5Velk1MXauje*2FX_>QrBW`p@ODeG
    z_{8m&oB7||cBAEb%Z<2|Z?zroK+sEz^p+#)UW%Yl27<4{;_3Sigo25Hmu?pe|$tS;K^PQ`);3
    z@8-033*Id#XT{TsrwvbA$d1wu5R2_;Vm;1Lz0WBXoQVX)o=|W#lO}rZAlr1<=d{>T
    zmuGKyh$LnprULl{>}V>>(&@U4Y;3F1c19k+i&3x2Lr7iC2O8N0xP1jCLJ*VigJmxp
    z0kESvKSHwWrZ@Gx9ZlUXz^gd
    z()_P-5kkV4>r-j|N(|&)2zy@Tv|9Hf1&3UQa%aFPj;O7y;RHyyX{6~O52{*fK*w}X
    zbC*w#aL?9yjDe8Mr_UTA7N9`aN#Paps>rJ*kH9qU=LG3kgk(|I4ox0fB*RJ%-I8cY$sPBz
    z?nO60bm3&k{a;X@NcT4^B8T4EvRM1b&DLb?!SQ2QO4}b9H(YT|xMaAPf;^sNVPnG5
    zbk|itOtiSA^p~GlId=hw=O|rJGqY)~VCO5xmh^c2TqN}HMf*V`ciWhEuuOlul!w1!
    zMG`n+EAnet0lx`3Nn2s-QdYi@b`s>r^kV>HV+O2#{Y9`Ng={M}b0*<|7?TAYGYsxY
    zqcN&07(Gh4FQ(Rv=`?gasMCZP&;m%gWd1JgqIJHR3Ec!TryzQCy%E}C#&v2@>C{SJ
    zaM`6X*|<)*TrIy6!X+ic*x-_qiakTum<%}>Tu|W!;DVm#p5_J(%Kl%cC7EVhg(NW@
    z&9*wz{N?|B`G5Ef(HAv%LdQr7u_G7&4&Y$eOO!H(JTmNUNC-dI3(OO6VKC$+#EFnr
    zMWPOv8AB-5{i(u}6t+hwaT>TtL9cdU5(6h(h3B)a0tzy@f}n+DIT0GwAPC7y_A`vj
    z)Hw`BzaUdWO=&R1&=U#-B@6IMKZS(X=_^z4*g;QSRKSXhffee13Zm3~AwLa%
    z01v1cm`P0FEsX*Q(nL|oje_e1H!7}I%y__An>CF006)tu7`K4+KH2kOR{4_7;LKYn
    zskm|A`hl6|M9G#(%Yr)(Y%QQe#4$f`^#EAvx%J?or-04)v4xt=Ye`G#|5B$?Y1ceE^|
    z0k$H}Q%YRHypP=;Ks0CG=l9AgZk)S*?uP%mf97nmY};(>B$~41
    zP++`ND3vbqg*NCRSHMSKRiFUf2i5IMhd;wD>7FUe2}2YKH^ITsh*v=y_^rDMnj
    zL{uCdAbDuu9}t1UmSTu#;JI*b5J&_Fp`!{DD3uX%Mgq?1)Xk47N{0fHu~$Tc=+Z{D
    z3SYTtU&b?yKF`2CfcFwuoO?V
    zPS?jvHqBW!qh#vtvhVu7nZmh}Z2$;P*Og-v$0ol#=O|yaxF!vgJ#&@{?A~$LT7C>+
    z7&4ZD0CB1N@LcUO5t25!lgOk+D{k)XcN3r{k4LY`!Bc!l(p-pih$_=)
    z!bKV%iIzWX9_4fkK#;f{?p^5vS{nw{6bta
    z>ZqjdG0(^4%Eif60H>^amWqwHQRNjI)N?
    z-U8_m--DEZ9yb~llgI@3g6zy!7)XEw|M(k?3bVwDbxLP~dTMDQUz1(P2(Q$fJU6&;
    zoiC~IOdCc`N<3E?Hg%%GvH}KV8B{?p5}taF~ipkm;YXVj_?Ww2yKULPYwpd1XWjWrA!+M
    zvZtLF8>4xr+I|}VtV#HiVvhy@wi#0%Y-6aKgecZ|
    zLfS0`BFss~VCcedcNz}&Rg8&n10G3^GXVa_6hrb23|I@V
    zQJRqnhYDEL#O`Cedx&y;o4jhup$k2)NCYX{-6Dkh`>A^mCmbj_aJ}Zlk5CV`e0JWo
    zlGjVd4=y@#hyoTb+!A-}nB6+(*n$0?Q-(`mMfHt~-@G`{K7MR6xTLc>w}ESQ&2iNc
    zFWWx*<(rW?w<^p?1g-kH+)eKY?~c4Z^6uB({@Tr+xu&*7U~b2+9-r#D)h%yY!Si;B+fLJm=n@YR8m+=EA&t
    zYr?(tAC`>B^|?sP@;@G`Jlv%F&rR0WM&p0pwYk-2{ISo7@Crf>!5{itChql0mQp4>
    zO2LE_5dWQSw
    z8@G7bf%dje@FKC@mnDHpM5I)|A7mxal7hoP)%}vg?9Xo8n+@J$Wicb8=u~{z}JM8j1tI362j-V&#
    z#?y%>sW)bYT%cXjw>f+(CyjpT9yR##B=;J^<*9=!2$w4F1UJbPdqLq2sF;E*9ZuX3
    zcBO`ExDUX_p-Q4hpS2VR73PRuDA4K>@8IE9jGPf1j!#3jvORdnGZEgAenBux&?7E%Ya
    zRInWwl`bU+PAHCK?H7jqOk`i6vro!r91Kn6P)>s$qzrXI?^uCTv8@y>T0Mm-MRpTy
    z;6o?`p&`a>2dcDKS@Uh^{9JY{H1EX2x{z0dhi$QRd$M%LxM9vx1pK*f%Y5zbMD6Y$
    zG$w10j~nh-s^ukLjk;D$qe{P}n^HQ&Qihx95oQ$T1@@HT{`AGHOJyRICvHc&C{E0j
    zlUae@v%)a+7GwsStRYB?m{cDaStP_ruK+K=M#0Pj%~h>HUf@mgMQF44C{(AwP{dI#
    zj6hK$jrwvH2O-JuG0`RAM+iYmVes4
    zUcqPAxe+TM5G_|6<~h?nUd1NYsZrg)N`2|9eFZ05m(uFgN-H6aN`N&=xV#DslpN{Q
    z2B8!=GTh?(GGV$ZjRKf*3Cel28kNv`<<=P$6;oE~OK+q^T+%e=iLVK13#
    zP1-A`D--sb8RLich6UsYVPGz=b~=*G+kD5-094k|$hIpm9a2jNLNBzUOPw@8ilZ?7
    zEz^~l-Cb!qRyl32CWRFQmzBYb7%0j`2kGe^?qVtS{d2w7yVU
    zJxaAMWh|Gro0LP>B(FTS*a-iVa=DJYk5(h9mpWB$oZJc>NnY(M;qO6o%bM_h#d!`~cMz4=1T=k2!
    zyKmMfYY$Hvu34{Ir|J`KtSk4G;}gdxdlHU{c}F#*-KLM+aco?2*jDdx_bBs
    ze}Wttz&eNrD$qm@r73Ao1z3(5HDX2@0YjB|Q}Tf<
    zMBdccfHbm+kwyp=S>^gvl>se58J!gI&VIWyczx_h#D3$->Nmm5ULD6{kM
    zZH%w*ugIgrOR@-o5!u#2J&@@+dceH3Dy_mi
    z>WUVu0h00u&l8ONf5-vOJx*ZHm9M_?)f5$H!F`;}3D~aM=H1l*gr6Ao&Mahd=H3N0
    zCwe_PU$HGwu`OP{eRk{Y+4no%>zLnhBC+E{y!m9j^iPy^H8?WCzXW4Vl
    zS@7yJAG=Bj6K+XVwA?h$RXn;-SUO+mOBDJbt5gPp{`)2Gl_bmdP1^32R=wFWvnN@-
    z^P|$1$<_r=5m7Rx4Rf9ip!bkKQ@r}nt=2o9i|Vz^+CDNP*>hAq^b8u~}TB6Z(~N)}jSyjY|OqhyAv3d~_h
    zyB=Zz6&h*xi%X;{uqkk0%%B4^EVyE)vlw$aQIy44PHt~*c
    z@BgTD+hi;4TegSqcs4+~ux$IMpbnQ`E4^C!xoAf<-)=fs3h5r>!42l9^Bfc3m7&z0
    z=qCA<#B}8-Z~Z`TcMt49K#U4(EP&ooSqj&;C%R#6W{7}_5VByZ+sq~vvgMv5Sqo@>
    z%cTjb?uoj-Btvd*{nJf@z5`xp8}p+QKPYj+FVI8)Xu>N53wggs9y=x)DMZ&M8P?|`
    zq!8U1p#M1~#mF0jw~Fd65EVUI^Xtq(lt%oIk)5RV%+}g(f((ksn?3J{Zw#>DO~W$9
    z+|PkD)#8RnZ+ZT_NR$YW&1?A`_LAPX%vWynZoRym9=*VqwWQjN`|DVR27Z
    zOoK_<__4(u&)$E_I%j!|1$W)7`Qhg8Z=SQXLHglihbNx5ac=X0TZTWk-?k?=L&f9N
    zJy%XVw`O`U>DqBKH{seFx9pXP8fdHP3<%L)Tkc2f!&rKm$mPI;sVs9DS#g91(`>AA
    zUkuSk)65ZN5;$a-??1X$v}9E)=rt2At3VUryBRUrOqYM9ObQPqCUOQWS;-~ifulNz
    zBW-;m#nfT!tiu{s$MBhCZkb^#-L#5)4v
    z1KNOTm{NPRlqx3_i?~Kw5^XeKQ8pO?VyplLrM`;+VW^ZaM2NtC(!-=?AU$V01*h&N&J-mz4zC14URA@6lN
    z>oK2cR}fB=X}?47M|Y`y-967|+Vk3(32Y@z=;#cmaTK)k76OudCNU#%*E(OPmS=zs
    zF@vVUpXqk`ofI4+gO@8?hmz{OH51t}sEQ}8lTWn<)uV%6k1?g!100BnYwBV~=;v6N
    zeh%rB`PS*D@nQYc1RqxSWaT?FyHt`V>QWi~SRW~;;7Vg=q?1VVDhI)|qa;uj!M{eE8rGHxsycL&I^jjMjcwc+6Are*wj3Zht#5et1m+h
    z%IL`Jw;PPB^MEI8{hDINm;*#ltmCV?%MN)RWAwsEcm77>0f89T+U;2Rv0r2zlt1DYf@MK4sI-ao&L5drL<=(
    zyYIO6ri7Fo(|1CN(Vj}0vWmxYFgmBSbR`taQFG+3zJIRM&eKXA+Vh26jm99B!zyD=
    z%#2-<`$7(U4@Nx0Nr05Rm=1pax2#I5v4%76IdvS@U8|e4RwjC&{CBUMDK`t$ec1ZW1c}<_b*jQfXkzHqOGK^--6U$TjtE?f+N{8}gvTOOz`7NxFLO{pV2y0)w+|OtyMUmfD
    zz8ox$JgbIFA{Uf!S}Z6nipkkvDd=?hz+dt)BOayx)Q&I6+=Ey_+V`>JVBr`HpCMyat&r>L@A{;E=&
    zudF@V(4KxnOGzQZICm$6D`1#WzQL*X8KYY>WrwEn1`+BgDVhmv8}|y~L6QtYJj{?q
    zf-rR~*+4pq$l>VTFQ^8$M)}L&7La@;gpvn?Ft6c7C3KHzj9MFE@SABNN1af+_A|9>
    zvV#}RCowb;`qpI3TehT3@kf2UWVsj$k(j#3Slt3`TVX$WyUF_iUep~5h@*KdD()+6{BiA{Q=MsGd%2+=y9mq~xpYRKE|CH4zHKYW0OcM3$&3qo#S`t)VV&N96M7@Dyt`nJn|A?cry!harTV
    z=>`?#FV@p%G}m`uDvaD7tu&Lh|fUq$$jbk}shXEcJwd3oDIYG;=Du&WRK8uc5#
    zp#BSFZ>NR3+=4$VvjhwC&Mt6{$Z)t~GyJGzhY4}z?JVs3Wi#`jSc<}^e+Z_SBCuiH
    zErcP*PRO`qpalcEC*efQ(6?ky&r96}6G~Q5$Y)ihtdkSdMy4!A_pG7BF}wQ2h|y@E
    znajeWKPLhoO&JNbaNe5viXDlH9UoP+OxhQ6%ja`z61g?thkTg3d$D3OEaP09-+45#
    z^XLc0WJUYDr#<0mU&!;$=hY_iYG)dfc`Yk*8Il#J<~^qpo>TX&oOjnV
    zV#c`__Z@tM{~>>{#dMqVAb2~knEWRG;BM3HEfxyz=HdIc$re(bBwh^D`LcOejfyN~
    zbp{5*gE0Hr&v;$3l$((<_6t9zf&B?QSXmqu8KbXTvXD+Fu>=LW$1>86RHg1AKk)?p
    zFlI13#Eee+$-F&rGk_*k7E5`Q^3WwsGDG=<(#V2O0Q@#c
    zslX;A$*W*r!_I7FaVWl)(C7$rRg(-GXQf5n2ukWAQgGZ
    zr41EzSd_9>Mo2kpVY*~f<3ve20{lZ4yJglUgXGG0s3p?M7{GQIuJ4f?)Ib?7Kz_a;
    zt*hw?GGH*tJ72g@-R4Cm@GWzw*ZMNRu&Qt%TKsSr@fK0b+QB%IbzxwGY23-UoEsB`
    z8xgb@#_e8}$9e!X$u$1zeGBI)n2fx(JMJjGSG{$%AzA$>M7K$XF#1YVEp=EewcxIY
    z)e7R$equE`vtT|-Eq~WueJ{UaKEFPZUq4fr%-{CCvaV)L
    zjV0X;4~!JMWaILx<~=lJcS`HEmzHHIA>|#h}WHJ>I}Hu4cc4tOzo_G
    z#xdvFu`Ra4zSOxZ{z#m>Or*ht4W=
    z$yqw@sDOOav=i1!7Aq>rF3F9t>ti$LlNFELJea81kL9Su$F9c~Q#0qf>Y8>Y-Hi+G
    zs%4|zn}uAd+DJ|+Uei1qjPE;@*m>$BM?3r8#t)qv7YjGfoc*Y9+oVC8xz;?4TXweKhA~ZVwYzFQ)TG3VPF~*&E1bYk{gzYYT!QqBn;)nK<#r&$*1}EC?<<}(h
    zYsX=z#bnK1C@!Bb-jgWa^HK5MNs~H^Zyq8$F>jrGK(9fN5&wsKX$mu3PkqjVk_YE
    zj}F+M+-3UnlI$n`yuLAK7{GJ;tZX
    z%^y{|p4zVeXd4gTr#pI7__wGGGCtqKL-=>(kw$~?K6&gs)zn?yqqsjKuZcWD2bf3=
    z@j{RKik+irC;Lkm+41un#X4g(_OU5@Nq0_XtY9r;
    zfo-i1I0`I7sV4hAOJwXH)~!zTNOgu(X!%hD(zR+rdPtk;q19r5o(tLdQQpbMk1=Rv
    znl&b9znEdUhuQUk#U7jRSExo{lAvCMR?2t)=a%_Rbp0b44`_TKBs)z#RJlDNl}a!d
    z1SiH%mjdP#K~;lfV7MCN>K{fDv_Od279{*9Bq|(AYR(D{B`un0sfHP-LanN9$6~>yyuyG$e3@gpwuAvyXpR(n7LoWJ;@MMxXR-9zOy$@)gGfSjmM6OCf&R
    z!BVkSK!Rq3&2KaO74u86s~i*lr4_NtDWeSnoI1mqSe2P(3xWulY6PqzCssz}0Q`&s
    z6C_xiseEdy(M)QhV43r3s|Dn7VqXv>UgeZcOvDdtU3GP?AzG6p6mtMH+zYz3Ho^rx
    z^nmq)5RoI6v#<}sa%N&(WU@D&*?PFf4pYd0VzE-odL^Rx66M`XPc9Sd6QoBZjv1hf
    z&iX-KCIPabRU@{8`K0S3BGW2Ih92pQnS_|v_5#G8{V?}QS5oF4GFvK>F*RG2N`CFB
    zF=*H?K7z=kt5*Z%-5W#f1g+EDZ&B{J&ux+fgK~XGZe*{vj|5UGMyZ9TQ$0qYA~B@BZ#!h+3(TBv$npyW4d{K
    zWUA)!3vcg`En~l!<>sS0r%mE*e}|vk`Bl_79O-J<70qFyBt#o#v@xPmO1hB?z=z&O
    zeX?kB8DTJ0^jb~cSK&$Kk$^zfk_FHQLH|)G9io6A{^XdAW|@Rzf>CDtD4q;}=c%Oa
    zDKhIUQ(|l*0_Ys_Nt#kj_fUOC7Dd0?!{{fn$_K8|7$i7Z!H6nLzk6!{TOOx#G$;pA
    z8(=o1kFzGS;srZz8h&W~J_Onh0g+AV7%`=x8@<;@ZWwQ!bCi8*=CZ0ui^!Fr(NAV=
    zowILU$S<8}yPID;-u4T-dn#{AxQ-tI*_0^SG}HEO``hg|Taud(&lR;U6qZe0xNe

    -}HqqZYtB~V!aU+KMM||Ot?fM^^cON;R`$=KW(JcK>wi}P^HUH#*^{CzW zXEvVvEaTAv^NM|TtNPG?jWd5D5b8U#rbz0RbA^f2`mt%fwQpp42i znqk`%j3a8{DhKGeDu!N_6CnfKgUySTte#P0O1;9=u7N03@=lT0V`e5cLjaGAgpnQu zN$nktRx0v$;5sl7JmgbE`-s&70wc}BS(prDyOizl@1lhQ+u?Mcvh6J3w|wZ=|6ZjC z+K(#`rFRjV8M9SH&j?3j3jM%r?XG!yX~JF_x7Va(@8U(rKWP5z-G8xr&haFymeSq? zLKM#<=~CbKeRG!9)%#6Zwl(v`n-ayF<{X>Z;)Q4*ZuVK#cz!MtK6$&Q^pI8mBdhUH zj#<9dSy$ic7;ThY=m_7FFK_HtN4;8Yp@3a9$U8(GB3{x<+>%aj+%*lm1bEDNmg%u% za~i!u05y?jaSq|i?CYT-$i zy|QJE{lb21D*Wffi||3y;Q60&?w@kjpK>+?e#UM7Id^WJJ9mdW_qW`cpL37?jNAS* zuJLDF>(9A;Kj)4ox#K_QPW_BK{0nQ&`e2tE0Mn?p1mbu0g(%dca6^R&dJ?V zXUOK=ls}Q%5YK8z7#o+3NQ4<+opni9&KJZhnwB^`XOG|Pyw&`H=Vmz3-2Q-KKp9Bo zSvthK`GUz^Q-`naTjCI$J~Na1#+R2VxKvvKLfh2yGy3aeOB{t~b7#-ISGdf=ORan( zUp4*wto{w8B6u_Jrg&@n_n-eD_k%NkQ5Zk)cw+Yx%arix1-^^tEAQjyV)@EXpU{8V Wz*pSo$p7>?OAGILz` Tuple[str, Optional[str]]: + m = re.match(r"^(.+)(\[[^\]]+\])$", path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras: Optional[str]) -> Set[str]: + if not extras: + return set() + return get_requirement("placeholder" + extras.lower()).extras + + +def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement: + """ + Returns a new requirement based on the given one, with the supplied extras. If the + given requirement already has extras those are replaced (or dropped if no new extras + are given). + """ + match: Optional[re.Match[str]] = re.fullmatch( + # see https://peps.python.org/pep-0508/#complete-grammar + r"([\w\t .-]+)(\[[^\]]*\])?(.*)", + str(req), + flags=re.ASCII, + ) + # ireq.req is a valid requirement so the regex should always match + assert ( + match is not None + ), f"regex match on requirement {req} failed, this should never happen" + pre: Optional[str] = match.group(1) + post: Optional[str] = match.group(3) + assert ( + pre is not None and post is not None + ), f"regex group selection for requirement {req} failed, this should never happen" + extras: str = "[{}]".format(",".join(sorted(new_extras)) if new_extras else "") + return get_requirement(f"{pre}{extras}{post}") + + +def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith("file:"): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + get_requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, set() + + for version_control in vcs: + if url.lower().startswith(f"{version_control}:"): + url = f"{version_control}+{url}" + break + + link = Link(url) + + if not link.is_vcs: + backends = ", ".join(vcs.all_schemes) + raise InstallationError( + f"{editable_req} is not a valid editable requirement. " + f"It should either be a path to a local project or a VCS URL " + f"(beginning with {backends})." + ) + + package_name = link.egg_fragment + if not package_name: + raise InstallationError( + f"Could not detect requirement name for '{editable_req}', " + "please specify one with #egg=your_package_name" + ) + return package_name, url, set() + + +def check_first_requirement_in_file(filename: str) -> None: + """Check if file is parsable as a requirements file. + + This is heavily based on ``pkg_resources.parse_requirements``, but + simplified to just check the first meaningful line. + + :raises InvalidRequirement: If the first meaningful line cannot be parsed + as an requirement. + """ + with open(filename, encoding="utf-8", errors="ignore") as f: + # Create a steppable iterator, so we can handle \-continuations. + lines = ( + line + for line in (line.strip() for line in f) + if line and not line.startswith("#") # Skip blank lines/comments. + ) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if " #" in line: + line = line[: line.find(" #")] + # If there is a line continuation, drop it, and append the next line. + if line.endswith("\\"): + line = line[:-2].strip() + next(lines, "") + get_requirement(line) + return + + +def deduce_helpful_msg(req: str) -> str: + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + if not os.path.exists(req): + return f" File '{req}' does not exist." + msg = " The path does exist. " + # Try to parse and check if it is a requirements file. + try: + check_first_requirement_in_file(req) + except InvalidRequirement: + logger.debug("Cannot parse '%s' as requirements file", req) + else: + msg += ( + f"The argument you provided " + f"({req}) appears to be a" + f" requirements file. If that is the" + f" case, use the '-r' flag to install" + f" the packages specified within it." + ) + return msg + + +@dataclass(frozen=True) +class RequirementParts: + requirement: Optional[Requirement] + link: Optional[Link] + markers: Optional[Marker] + extras: Set[str] + + +def parse_req_from_editable(editable_req: str) -> RequirementParts: + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req: Optional[Requirement] = get_requirement(name) + except InvalidRequirement as exc: + raise InstallationError(f"Invalid requirement: {name!r}: {exc}") + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req: str, + comes_from: Optional[Union[InstallRequirement, str]] = None, + *, + use_pep517: Optional[bool] = None, + isolated: bool = False, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + constraint: bool = False, + user_supplied: bool = False, + permit_editable_wheels: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + parts = parse_req_from_editable(editable_req) + + return InstallRequirement( + parts.requirement, + comes_from=comes_from, + user_supplied=user_supplied, + editable=True, + permit_editable_wheels=permit_editable_wheels, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + global_options=global_options, + hash_options=hash_options, + config_settings=config_settings, + extras=parts.extras, + ) + + +def _looks_like_path(name: str) -> bool: + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path: str, name: str) -> Optional[str]: + """ + First, it checks whether a provided path is an installable directory. If it + is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + # TODO: The is_installable_dir test here might not be necessary + # now that it is done in load_pyproject_toml too. + raise InstallationError( + f"Directory {name!r} is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split("@", 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + "Requirement %r looks like a filename, but the file does not exist", + name, + ) + return path_to_url(path) + + +def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts: + if is_url(name): + marker_sep = "; " + else: + marker_sep = ";" + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == "file" and re.search(r"\.\./", link.url): + link = Link(path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = f"{wheel.name}=={wheel.version}" + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text: str) -> str: + if not line_source: + return text + return f"{text} (from {line_source})" + + def _parse_req_string(req_as_string: str) -> Requirement: + try: + return get_requirement(req_as_string) + except InvalidRequirement as exc: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif "=" in req_as_string and not any( + op in req_as_string for op in operators + ): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + msg = with_source(f"Invalid requirement: {req_as_string!r}: {exc}") + if add_msg: + msg += f"\nHint: {add_msg}" + raise InstallationError(msg) + + if req_as_string is not None: + req: Optional[Requirement] = _parse_req_string(req_as_string) + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name: str, + comes_from: Optional[Union[str, InstallRequirement]] = None, + *, + use_pep517: Optional[bool] = None, + isolated: bool = False, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + constraint: bool = False, + line_source: Optional[str] = None, + user_supplied: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, + comes_from, + link=parts.link, + markers=parts.markers, + use_pep517=use_pep517, + isolated=isolated, + global_options=global_options, + hash_options=hash_options, + config_settings=config_settings, + constraint=constraint, + extras=parts.extras, + user_supplied=user_supplied, + ) + + +def install_req_from_req_string( + req_string: str, + comes_from: Optional[InstallRequirement] = None, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, +) -> InstallRequirement: + try: + req = get_requirement(req_string) + except InvalidRequirement as exc: + raise InstallationError(f"Invalid requirement: {req_string!r}: {exc}") + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if ( + req.url + and comes_from + and comes_from.link + and comes_from.link.netloc in domains_not_allowed + ): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + f"{comes_from.name} depends on {req} " + ) + + return InstallRequirement( + req, + comes_from, + isolated=isolated, + use_pep517=use_pep517, + user_supplied=user_supplied, + ) + + +def install_req_from_parsed_requirement( + parsed_req: ParsedRequirement, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, +) -> InstallRequirement: + if parsed_req.is_editable: + req = install_req_from_editable( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + constraint=parsed_req.constraint, + isolated=isolated, + user_supplied=user_supplied, + config_settings=config_settings, + ) + + else: + req = install_req_from_line( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + isolated=isolated, + global_options=( + parsed_req.options.get("global_options", []) + if parsed_req.options + else [] + ), + hash_options=( + parsed_req.options.get("hashes", {}) if parsed_req.options else {} + ), + constraint=parsed_req.constraint, + line_source=parsed_req.line_source, + user_supplied=user_supplied, + config_settings=config_settings, + ) + return req + + +def install_req_from_link_and_ireq( + link: Link, ireq: InstallRequirement +) -> InstallRequirement: + return InstallRequirement( + req=ireq.req, + comes_from=ireq.comes_from, + editable=ireq.editable, + link=link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, + ) + + +def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirement: + """ + Creates a new InstallationRequirement using the given template but without + any extras. Sets the original requirement as the new one's parent + (comes_from). + """ + return InstallRequirement( + req=( + _set_requirement_extras(ireq.req, set()) if ireq.req is not None else None + ), + comes_from=ireq, + editable=ireq.editable, + link=ireq.link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + constraint=ireq.constraint, + extras=[], + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, + permit_editable_wheels=ireq.permit_editable_wheels, + ) + + +def install_req_extend_extras( + ireq: InstallRequirement, + extras: Collection[str], +) -> InstallRequirement: + """ + Returns a copy of an installation requirement with some additional extras. + Makes a shallow copy of the ireq object. + """ + result = copy.copy(ireq) + result.extras = {*ireq.extras, *extras} + result.req = ( + _set_requirement_extras(ireq.req, result.extras) + if ireq.req is not None + else None + ) + return result diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..eb2a1f6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,574 @@ +""" +Requirements file parsing +""" + +import logging +import optparse +import os +import re +import shlex +import urllib.parse +from optparse import Values +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generator, + Iterable, + List, + NoReturn, + Optional, + Tuple, +) + +from pip._internal.cli import cmdoptions +from pip._internal.exceptions import InstallationError, RequirementsFileParseError +from pip._internal.models.search_scope import SearchScope +from pip._internal.utils.encoding import auto_decode + +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession + +__all__ = ["parse_requirements"] + +ReqFileLines = Iterable[Tuple[int, str]] + +LineParser = Callable[[str], Tuple[str, Values]] + +SCHEME_RE = re.compile(r"^(http|https|file):", re.I) +COMMENT_RE = re.compile(r"(^|\s+)#.*$") + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r"(?P\$\{(?P[A-Z0-9_]+)\})") + +SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.prefer_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.use_new_feature, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.global_options, + cmdoptions.hash, + cmdoptions.config_settings, +] + +SUPPORTED_OPTIONS_EDITABLE_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.config_settings, +] + + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] +SUPPORTED_OPTIONS_EDITABLE_REQ_DEST = [ + str(o().dest) for o in SUPPORTED_OPTIONS_EDITABLE_REQ +] + +logger = logging.getLogger(__name__) + + +class ParsedRequirement: + def __init__( + self, + requirement: str, + is_editable: bool, + comes_from: str, + constraint: bool, + options: Optional[Dict[str, Any]] = None, + line_source: Optional[str] = None, + ) -> None: + self.requirement = requirement + self.is_editable = is_editable + self.comes_from = comes_from + self.options = options + self.constraint = constraint + self.line_source = line_source + + +class ParsedLine: + def __init__( + self, + filename: str, + lineno: int, + args: str, + opts: Values, + constraint: bool, + ) -> None: + self.filename = filename + self.lineno = lineno + self.opts = opts + self.constraint = constraint + + if args: + self.is_requirement = True + self.is_editable = False + self.requirement = args + elif opts.editables: + self.is_requirement = True + self.is_editable = True + # We don't support multiple -e on one line + self.requirement = opts.editables[0] + else: + self.is_requirement = False + + +def parse_requirements( + filename: str, + session: "PipSession", + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + constraint: bool = False, +) -> Generator[ParsedRequirement, None, None]: + """Parse a requirements file and yield ParsedRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + """ + line_parser = get_line_parser(finder) + parser = RequirementsFileParser(session, line_parser) + + for parsed_line in parser.parse(filename, constraint): + parsed_req = handle_line( + parsed_line, options=options, finder=finder, session=session + ) + if parsed_req is not None: + yield parsed_req + + +def preprocess(content: str) -> ReqFileLines: + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + """ + lines_enum: ReqFileLines = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_requirement_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, +) -> ParsedRequirement: + # preserve for the nested code path + line_comes_from = "{} {} (line {})".format( + "-c" if line.constraint else "-r", + line.filename, + line.lineno, + ) + + assert line.is_requirement + + # get the options that apply to requirements + if line.is_editable: + supported_dest = SUPPORTED_OPTIONS_EDITABLE_REQ_DEST + else: + supported_dest = SUPPORTED_OPTIONS_REQ_DEST + req_options = {} + for dest in supported_dest: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + + line_source = f"line {line.lineno} of {line.filename}" + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + options=req_options, + line_source=line_source, + ) + + +def handle_option_line( + opts: Values, + filename: str, + lineno: int, + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + session: Optional["PipSession"] = None, +) -> None: + if opts.hashes: + logger.warning( + "%s line %s has --hash but no requirement, and will be ignored.", + filename, + lineno, + ) + + if options: + # percolate options upward + if opts.require_hashes: + options.require_hashes = opts.require_hashes + if opts.features_enabled: + options.features_enabled.extend( + f for f in opts.features_enabled if f not in options.features_enabled + ) + + # set finder options + if finder: + find_links = finder.find_links + index_urls = finder.index_urls + no_index = finder.search_scope.no_index + if opts.no_index is True: + no_index = True + index_urls = [] + if opts.index_url and not no_index: + index_urls = [opts.index_url] + if opts.extra_index_urls and not no_index: + index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + if session: + # We need to update the auth urls in session + session.update_index_urls(index_urls) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + no_index=no_index, + ) + finder.search_scope = search_scope + + if opts.pre: + finder.set_allow_all_prereleases() + + if opts.prefer_binary: + finder.set_prefer_binary() + + if session: + for host in opts.trusted_hosts or []: + source = f"line {lineno} of {filename}" + session.add_trusted_host(host, source=source) + + +def handle_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, + finder: Optional["PackageFinder"] = None, + session: Optional["PipSession"] = None, +) -> Optional[ParsedRequirement]: + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + :param line: The parsed line to be processed. + :param options: CLI options. + :param finder: The finder - updated by non-requirement lines. + :param session: The session - updated by non-requirement lines. + + Returns a ParsedRequirement object if the line is a requirement line, + otherwise returns None. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + if line.is_requirement: + parsed_req = handle_requirement_line(line, options) + return parsed_req + else: + handle_option_line( + line.opts, + line.filename, + line.lineno, + finder, + options, + session, + ) + return None + + +class RequirementsFileParser: + def __init__( + self, + session: "PipSession", + line_parser: LineParser, + ) -> None: + self._session = session + self._line_parser = line_parser + + def parse( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: + """Parse a given file, yielding parsed lines.""" + yield from self._parse_and_recurse( + filename, constraint, [{os.path.abspath(filename): None}] + ) + + def _parse_and_recurse( + self, + filename: str, + constraint: bool, + parsed_files_stack: List[Dict[str, Optional[str]]], + ) -> Generator[ParsedLine, None, None]: + for line in self._parse_file(filename, constraint): + if not line.is_requirement and ( + line.opts.requirements or line.opts.constraints + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib.parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + # and then abspath so that we can identify recursive references + req_path = os.path.abspath( + os.path.join( + os.path.dirname(filename), + req_path, + ) + ) + parsed_files = parsed_files_stack[0] + if req_path in parsed_files: + initial_file = parsed_files[req_path] + tail = ( + f" and again in {initial_file}" + if initial_file is not None + else "" + ) + raise RequirementsFileParseError( + f"{req_path} recursively references itself in {filename}{tail}" + ) + # Keeping a track where was each file first included in + new_parsed_files = parsed_files.copy() + new_parsed_files[req_path] = filename + yield from self._parse_and_recurse( + req_path, nested_constraint, [new_parsed_files, *parsed_files_stack] + ) + else: + yield line + + def _parse_file( + self, filename: str, constraint: bool + ) -> Generator[ParsedLine, None, None]: + _, content = get_file_content(filename, self._session) + + lines_enum = preprocess(content) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = f"Invalid requirement: {line}\n{e.msg}" + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser: + def parse_line(line: str) -> Tuple[str, Values]: + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + + try: + options = shlex.split(options_str) + except ValueError as e: + raise OptionParsingError(f"Could not split options: {options_str}") from e + + opts, _ = parser.parse_args(options, defaults) + + return args_str, opts + + return parse_line + + +def break_args_options(line: str) -> Tuple[str, str]: + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(" ") + args = [] + options = tokens[:] + for token in tokens: + if token.startswith("-") or token.startswith("--"): + break + else: + args.append(token) + options.pop(0) + return " ".join(args), " ".join(options) + + +class OptionParsingError(Exception): + def __init__(self, msg: str) -> None: + self.msg = msg + + +def build_parser() -> optparse.OptionParser: + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self: Any, msg: str) -> "NoReturn": + raise OptionParsingError(msg) + + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum: ReqFileLines) -> ReqFileLines: + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line: List[str] = [] + for line_number, line in lines_enum: + if not line.endswith("\\") or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = " " + line + if new_line: + new_line.append(line) + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip("\\")) + + # last line contains \ + if new_line: + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum: ReqFileLines) -> ReqFileLines: + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub("", line) + line = line.strip() + if line: + yield line_number, line + + +def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines: + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url: str, session: "PipSession") -> Tuple[str, str]: + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + """ + scheme = urllib.parse.urlsplit(url).scheme + # Pip has special support for file:// URLs (LocalFSAdapter). + if scheme in ["http", "https", "file"]: + # Delay importing heavy network modules until absolutely necessary. + from pip._internal.network.utils import raise_for_status + + resp = session.get(url) + raise_for_status(resp) + return resp.url, resp.text + + # Assume this is a bare path. + try: + with open(url, "rb") as f: + content = auto_decode(f.read()) + except OSError as exc: + raise InstallationError(f"Could not open requirements file: {exc}") + return url, content diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..834bc51 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,934 @@ +import functools +import logging +import os +import shutil +import sys +import uuid +import zipfile +from optparse import Values +from pathlib import Path +from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError, PreviousBuildDirError +from pip._internal.locations import get_scheme +from pip._internal.metadata import ( + BaseDistribution, + get_default_environment, + get_directory_distribution, + get_wheel_distribution, +) +from pip._internal.metadata.base import FilesystemWheel +from pip._internal.models.direct_url import DirectUrl +from pip._internal.models.link import Link +from pip._internal.operations.build.metadata import generate_metadata +from pip._internal.operations.build.metadata_editable import generate_editable_metadata +from pip._internal.operations.build.metadata_legacy import ( + generate_metadata as generate_metadata_legacy, +) +from pip._internal.operations.install.editable_legacy import ( + install_editable as install_editable_legacy, +) +from pip._internal.operations.install.wheel import install_wheel +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.misc import ( + ConfiguredBuildBackendHookCaller, + ask_path_exists, + backup_dir, + display_path, + hide_url, + is_installable_dir, + redact_auth_from_requirement, + redact_auth_from_url, +) +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.unpacking import unpack_file +from pip._internal.utils.virtualenv import running_under_virtualenv +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +class InstallRequirement: + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req: Optional[Requirement], + comes_from: Optional[Union[str, "InstallRequirement"]], + editable: bool = False, + link: Optional[Link] = None, + markers: Optional[Marker] = None, + use_pep517: Optional[bool] = None, + isolated: bool = False, + *, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + constraint: bool = False, + extras: Collection[str] = (), + user_supplied: bool = False, + permit_editable_wheels: bool = False, + ) -> None: + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + self.editable = editable + self.permit_editable_wheels = permit_editable_wheels + + # source_dir is the local directory where the linked requirement is + # located, or unpacked. In case unpacking is needed, creating and + # populating source_dir is done by the RequirementPreparer. Note this + # is not necessarily the directory where pyproject.toml or setup.py is + # located - that one is obtained via unpacked_source_directory. + self.source_dir: Optional[str] = None + if self.editable: + assert link + if link.is_file: + self.source_dir = os.path.normpath(os.path.abspath(link.file_path)) + + # original_link is the direct URL that was provided by the user for the + # requirement, either directly or via a constraints file. + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + # When this InstallRequirement is a wheel obtained from the cache of locally + # built wheels, this is the source link corresponding to the cache entry, which + # was used to download and build the cached wheel. + self.cached_wheel_source_link: Optional[Link] = None + + # Information about the location of the artifact that was downloaded . This + # property is guaranteed to be set in resolver results. + self.download_info: Optional[DirectUrl] = None + + # Path to any downloaded or already-existing package. + self.local_file_path: Optional[str] = None + if self.link and self.link.is_file: + self.local_file_path = self.link.file_path + + if extras: + self.extras = extras + elif req: + self.extras = req.extras + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + # This holds the Distribution object if this requirement is already installed. + self.satisfied_by: Optional[BaseDistribution] = None + # Whether the installation process should try to uninstall an existing + # distribution before installing this requirement. + self.should_reinstall = False + # Temporary build location + self._temp_build_dir: Optional[TempDirectory] = None + # Set to True after successful installation + self.install_succeeded: Optional[bool] = None + # Supplied options + self.global_options = global_options if global_options else [] + self.hash_options = hash_options if hash_options else {} + self.config_settings = config_settings + # Set to True after successful preparation of this requirement + self.prepared = False + # User supplied requirement are explicitly requested for installation + # by the user via CLI arguments or requirements files, as opposed to, + # e.g. dependencies, extras or constraints. + self.user_supplied = user_supplied + + self.isolated = isolated + self.build_env: BuildEnvironment = NoOpBuildEnvironment() + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory: Optional[str] = None + + # The static build requirements (from pyproject.toml) + self.pyproject_requires: Optional[List[str]] = None + + # Build requirements that we will check are available + self.requirements_to_check: List[str] = [] + + # The PEP 517 backend we should use to build the project + self.pep517_backend: Optional[BuildBackendHookCaller] = None + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + # If config settings are provided, enforce PEP 517. + if self.config_settings: + if self.use_pep517 is False: + logger.warning( + "--no-use-pep517 ignored for %s " + "because --config-settings are specified.", + self, + ) + self.use_pep517 = True + + # This requirement needs more preparation before it can be built + self.needs_more_preparation = False + + # This requirement needs to be unpacked before it can be installed. + self._archive_source: Optional[Path] = None + + def __str__(self) -> str: + if self.req: + s = redact_auth_from_requirement(self.req) + if self.link: + s += f" from {redact_auth_from_url(self.link.url)}" + elif self.link: + s = redact_auth_from_url(self.link.url) + else: + s = "" + if self.satisfied_by is not None: + if self.satisfied_by.location is not None: + location = display_path(self.satisfied_by.location) + else: + location = "" + s += f" in {location}" + if self.comes_from: + if isinstance(self.comes_from, str): + comes_from: Optional[str] = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += f" (from {comes_from})" + return s + + def __repr__(self) -> str: + return ( + f"<{self.__class__.__name__} object: " + f"{str(self)} editable={self.editable!r}>" + ) + + def format_debug(self) -> str: + """An un-tested helper for getting state, for debugging.""" + attributes = vars(self) + names = sorted(attributes) + + state = (f"{attr}={attributes[attr]!r}" for attr in sorted(names)) + return "<{name} object: {{{state}}}>".format( + name=self.__class__.__name__, + state=", ".join(state), + ) + + # Things that are valid for all kinds of requirements? + @property + def name(self) -> Optional[str]: + if self.req is None: + return None + return self.req.name + + @functools.cached_property + def supports_pyproject_editable(self) -> bool: + if not self.use_pep517: + return False + assert self.pep517_backend + with self.build_env: + runner = runner_with_spinner_message( + "Checking if build backend supports build_editable" + ) + with self.pep517_backend.subprocess_runner(runner): + return "build_editable" in self.pep517_backend._supported_features() + + @property + def specifier(self) -> SpecifierSet: + assert self.req is not None + return self.req.specifier + + @property + def is_direct(self) -> bool: + """Whether this requirement was specified as a direct URL.""" + return self.original_link is not None + + @property + def is_pinned(self) -> bool: + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + assert self.req is not None + specifiers = self.req.specifier + return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="} + + def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool: + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ("",) + if self.markers is not None: + return any( + self.markers.evaluate({"extra": extra}) for extra in extras_requested + ) + else: + return True + + @property + def has_hash_options(self) -> bool: + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.hash_options) + + def hashes(self, trust_internet: bool = True) -> Hashes: + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.hash_options.copy() + if trust_internet: + link = self.link + elif self.is_direct and self.user_supplied: + link = self.original_link + else: + link = None + if link and link.hash: + assert link.hash_name is not None + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self) -> Optional[str]: + """Format a nice indicator to show where this "comes from" """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + comes_from: Optional[str] + if isinstance(self.comes_from, str): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += "->" + comes_from + return s + + def ensure_build_location( + self, build_dir: str, autodelete: bool, parallel_builds: bool + ) -> str: + assert build_dir is not None + if self._temp_build_dir is not None: + assert self._temp_build_dir.path + return self._temp_build_dir.path + if self.req is None: + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = TempDirectory( + kind=tempdir_kinds.REQ_BUILD, globally_managed=True + ) + + return self._temp_build_dir.path + + # This is the only remaining place where we manually determine the path + # for the temporary directory. It is only needed for editables where + # it is the value of the --src option. + + # When parallel builds are enabled, add a UUID to the build directory + # name so multiple builds do not interfere with each other. + dir_name: str = canonicalize_name(self.req.name) + if parallel_builds: + dir_name = f"{dir_name}_{uuid.uuid4().hex}" + + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug("Creating directory %s", build_dir) + os.makedirs(build_dir) + actual_build_dir = os.path.join(build_dir, dir_name) + # `None` indicates that we respect the globally-configured deletion + # settings, which is what we actually want when auto-deleting. + delete_arg = None if autodelete else False + return TempDirectory( + path=actual_build_dir, + delete=delete_arg, + kind=tempdir_kinds.REQ_BUILD, + globally_managed=True, + ).path + + def _set_requirement(self) -> None: + """Set requirement after generating metadata.""" + assert self.req is None + assert self.metadata is not None + assert self.source_dir is not None + + # Construct a Requirement object from the generated metadata + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + + self.req = get_requirement( + "".join( + [ + self.metadata["Name"], + op, + self.metadata["Version"], + ] + ) + ) + + def warn_on_mismatching_name(self) -> None: + assert self.req is not None + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) == metadata_name: + # Everything is fine. + return + + # If we're here, there's a mismatch. Log a warning about it. + logger.warning( + "Generating metadata for package %s " + "produced metadata for project name %s. Fix your " + "#egg=%s fragments.", + self.name, + metadata_name, + self.name, + ) + self.req = get_requirement(metadata_name) + + def check_if_exists(self, use_user_site: bool) -> None: + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.should_reinstall appropriately. + """ + if self.req is None: + return + existing_dist = get_default_environment().get_distribution(self.req.name) + if not existing_dist: + return + + version_compatible = self.req.specifier.contains( + existing_dist.version, + prereleases=True, + ) + if not version_compatible: + self.satisfied_by = None + if use_user_site: + if existing_dist.in_usersite: + self.should_reinstall = True + elif running_under_virtualenv() and existing_dist.in_site_packages: + raise InstallationError( + f"Will not install to the user site because it will " + f"lack sys.path precedence to {existing_dist.raw_name} " + f"in {existing_dist.location}" + ) + else: + self.should_reinstall = True + else: + if self.editable: + self.should_reinstall = True + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + else: + self.satisfied_by = existing_dist + + # Things valid for wheels + @property + def is_wheel(self) -> bool: + if not self.link: + return False + return self.link.is_wheel + + @property + def is_wheel_from_cache(self) -> bool: + # When True, it means that this InstallRequirement is a local wheel file in the + # cache of locally built wheels. + return self.cached_wheel_source_link is not None + + # Things valid for sdists + @property + def unpacked_source_directory(self) -> str: + assert self.source_dir, f"No source dir for {self}" + return os.path.join( + self.source_dir, self.link and self.link.subdirectory_fragment or "" + ) + + @property + def setup_py_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_py = os.path.join(self.unpacked_source_directory, "setup.py") + + return setup_py + + @property + def setup_cfg_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg") + + return setup_cfg + + @property + def pyproject_toml_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + return make_pyproject_path(self.unpacked_source_directory) + + def load_pyproject_toml(self) -> None: + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pyproject_toml_data = load_pyproject_toml( + self.use_pep517, self.pyproject_toml_path, self.setup_py_path, str(self) + ) + + if pyproject_toml_data is None: + assert not self.config_settings + self.use_pep517 = False + return + + self.use_pep517 = True + requires, backend, check, backend_path = pyproject_toml_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = ConfiguredBuildBackendHookCaller( + self, + self.unpacked_source_directory, + backend, + backend_path=backend_path, + ) + + def isolated_editable_sanity_check(self) -> None: + """Check that an editable requirement if valid for use with PEP 517/518. + + This verifies that an editable that has a pyproject.toml either supports PEP 660 + or as a setup.py or a setup.cfg + """ + if ( + self.editable + and self.use_pep517 + and not self.supports_pyproject_editable + and not os.path.isfile(self.setup_py_path) + and not os.path.isfile(self.setup_cfg_path) + ): + raise InstallationError( + f"Project {self} has a 'pyproject.toml' and its build " + f"backend is missing the 'build_editable' hook. Since it does not " + f"have a 'setup.py' nor a 'setup.cfg', " + f"it cannot be installed in editable mode. " + f"Consider using a build backend that supports PEP 660." + ) + + def prepare_metadata(self) -> None: + """Ensure that project metadata is available. + + Under PEP 517 and PEP 660, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir, f"No source dir for {self}" + details = self.name or f"from {self.link}" + + if self.use_pep517: + assert self.pep517_backend is not None + if ( + self.editable + and self.permit_editable_wheels + and self.supports_pyproject_editable + ): + self.metadata_directory = generate_editable_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata_legacy( + build_env=self.build_env, + setup_py_path=self.setup_py_path, + source_dir=self.unpacked_source_directory, + isolated=self.isolated, + details=details, + ) + + # Act on the newly generated metadata, based on the name and version. + if not self.name: + self._set_requirement() + else: + self.warn_on_mismatching_name() + + self.assert_source_matches_version() + + @property + def metadata(self) -> Any: + if not hasattr(self, "_metadata"): + self._metadata = self.get_dist().metadata + + return self._metadata + + def get_dist(self) -> BaseDistribution: + if self.metadata_directory: + return get_directory_distribution(self.metadata_directory) + elif self.local_file_path and self.is_wheel: + assert self.req is not None + return get_wheel_distribution( + FilesystemWheel(self.local_file_path), + canonicalize_name(self.req.name), + ) + raise AssertionError( + f"InstallRequirement {self} has no metadata directory and no wheel: " + f"can't make a distribution." + ) + + def assert_source_matches_version(self) -> None: + assert self.source_dir, f"No source dir for {self}" + version = self.metadata["version"] + if self.req and self.req.specifier and version not in self.req.specifier: + logger.warning( + "Requested %s, but installing version %s", + self, + version, + ) + else: + logger.debug( + "Source in %s has version %s, which satisfies requirement %s", + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir( + self, + parent_dir: str, + autodelete: bool = False, + parallel_builds: bool = False, + ) -> None: + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.ensure_build_location( + parent_dir, + autodelete=autodelete, + parallel_builds=parallel_builds, + ) + + def needs_unpacked_archive(self, archive_source: Path) -> None: + assert self._archive_source is None + self._archive_source = archive_source + + def ensure_pristine_source_checkout(self) -> None: + """Ensure the source directory has not yet been built in.""" + assert self.source_dir is not None + if self._archive_source is not None: + unpack_file(str(self._archive_source), self.source_dir) + elif is_installable_dir(self.source_dir): + # If a checkout exists, it's unwise to keep going. + # version inconsistencies are logged later, but do not fail + # the installation. + raise PreviousBuildDirError( + f"pip can't proceed with requirements '{self}' due to a " + f"pre-existing build directory ({self.source_dir}). This is likely " + "due to a previous installation that failed . pip is " + "being responsible and not assuming it can delete this. " + "Please delete it and try again." + ) + + # For editable installations + def update_editable(self) -> None: + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == "file": + # Static paths don't get updated + return + vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) + # Editable requirements are validated in Requirement constructors. + # So here, if it's neither a path nor a valid VCS URL, it's a bug. + assert vcs_backend, f"Unsupported VCS URL {self.link.url}" + hidden_url = hide_url(self.link.url) + vcs_backend.obtain(self.source_dir, url=hidden_url, verbosity=0) + + # Top-level Actions + def uninstall( + self, auto_confirm: bool = False, verbose: bool = False + ) -> Optional[UninstallPathSet]: + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + assert self.req + dist = get_default_environment().get_distribution(self.req.name) + if not dist: + logger.warning("Skipping %s as it is not installed.", self.name) + return None + logger.info("Found existing installation: %s", dist) + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _get_archive_name(self, path: str, parentdir: str, rootdir: str) -> str: + def _clean_zip_name(name: str, prefix: str) -> str: + assert name.startswith( + prefix + os.path.sep + ), f"name {name!r} doesn't start with prefix {prefix!r}" + name = name[len(prefix) + 1 :] + name = name.replace(os.path.sep, "/") + return name + + assert self.req is not None + path = os.path.join(parentdir, path) + name = _clean_zip_name(path, rootdir) + return self.req.name + "/" + name + + def archive(self, build_dir: Optional[str]) -> None: + """Saves archive to provided build_dir. + + Used for saving downloaded VCS requirements as part of `pip download`. + """ + assert self.source_dir + if build_dir is None: + return + + create_archive = True + archive_name = "{}-{}.zip".format(self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + + if os.path.exists(archive_path): + response = ask_path_exists( + f"The file {display_path(archive_path)} exists. (i)gnore, (w)ipe, " + "(b)ackup, (a)bort ", + ("i", "w", "b", "a"), + ) + if response == "i": + create_archive = False + elif response == "w": + logger.warning("Deleting %s", display_path(archive_path)) + os.remove(archive_path) + elif response == "b": + dest_file = backup_dir(archive_path) + logger.warning( + "Backing up %s to %s", + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == "a": + sys.exit(-1) + + if not create_archive: + return + + zip_output = zipfile.ZipFile( + archive_path, + "w", + zipfile.ZIP_DEFLATED, + allowZip64=True, + ) + with zip_output: + dir = os.path.normcase(os.path.abspath(self.unpacked_source_directory)) + for dirpath, dirnames, filenames in os.walk(dir): + for dirname in dirnames: + dir_arcname = self._get_archive_name( + dirname, + parentdir=dirpath, + rootdir=dir, + ) + zipdir = zipfile.ZipInfo(dir_arcname + "/") + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip_output.writestr(zipdir, "") + for filename in filenames: + file_arcname = self._get_archive_name( + filename, + parentdir=dirpath, + rootdir=dir, + ) + filename = os.path.join(dirpath, filename) + zip_output.write(filename, file_arcname) + + logger.info("Saved %s", display_path(archive_path)) + + def install( + self, + global_options: Optional[Sequence[str]] = None, + root: Optional[str] = None, + home: Optional[str] = None, + prefix: Optional[str] = None, + warn_script_location: bool = True, + use_user_site: bool = False, + pycompile: bool = True, + ) -> None: + assert self.req is not None + scheme = get_scheme( + self.req.name, + user=use_user_site, + home=home, + root=root, + isolated=self.isolated, + prefix=prefix, + ) + + if self.editable and not self.is_wheel: + deprecated( + reason=( + f"Legacy editable install of {self} (setup.py develop) " + "is deprecated." + ), + replacement=( + "to add a pyproject.toml or enable --use-pep517, " + "and use setuptools >= 64. " + "If the resulting installation is not behaving as expected, " + "try using --config-settings editable_mode=compat. " + "Please consult the setuptools documentation for more information" + ), + gone_in="25.0", + issue=11457, + ) + if self.config_settings: + logger.warning( + "--config-settings ignored for legacy editable install of %s. " + "Consider upgrading to a version of setuptools " + "that supports PEP 660 (>= 64).", + self, + ) + install_editable_legacy( + global_options=global_options if global_options is not None else [], + prefix=prefix, + home=home, + use_user_site=use_user_site, + name=self.req.name, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + ) + self.install_succeeded = True + return + + assert self.is_wheel + assert self.local_file_path + + install_wheel( + self.req.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=self.download_info if self.is_direct else None, + requested=self.user_supplied, + ) + self.install_succeeded = True + + +def check_invalid_constraint_type(req: InstallRequirement) -> str: + # Check for unsupported forms + problem = "" + if not req.name: + problem = "Unnamed requirements are not allowed as constraints" + elif req.editable: + problem = "Editable requirements are not allowed as constraints" + elif req.extras: + problem = "Constraints cannot have extras" + + if problem: + deprecated( + reason=( + "Constraints are only allowed to take the form of a package " + "name and a version specifier. Other forms were originally " + "permitted as an accident of the implementation, but were " + "undocumented. The new implementation of the resolver no " + "longer supports these forms." + ), + replacement="replacing the constraint with a requirement", + # No plan yet for when the new resolver becomes default + gone_in=None, + issue=8210, + ) + + return problem + + +def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool: + if getattr(options, option, None): + return True + for req in reqs: + if getattr(req, option, None): + return True + return False + + +def check_legacy_setup_py_options( + options: Values, + reqs: List[InstallRequirement], +) -> None: + has_build_options = _has_option(options, reqs, "build_options") + has_global_options = _has_option(options, reqs, "global_options") + if has_build_options or has_global_options: + deprecated( + reason="--build-option and --global-option are deprecated.", + issue=11859, + replacement="to use --config-settings", + gone_in="25.0", + ) + logger.warning( + "Implying --no-binary=:all: due to the presence of " + "--build-option / --global-option. " + ) + options.format_control.disallow_binaries() diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..ec7a6e0 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,82 @@ +import logging +from collections import OrderedDict +from typing import Dict, List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.req.req_install import InstallRequirement + +logger = logging.getLogger(__name__) + + +class RequirementSet: + def __init__(self, check_supported_wheels: bool = True) -> None: + """Create a RequirementSet.""" + + self.requirements: Dict[str, InstallRequirement] = OrderedDict() + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements: List[InstallRequirement] = [] + + def __str__(self) -> str: + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name or ""), + ) + return " ".join(str(req.req) for req in requirements) + + def __repr__(self) -> str: + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name or ""), + ) + + format_string = "<{classname} object; {count} requirement(s): {reqs}>" + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=", ".join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req: InstallRequirement) -> None: + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req: InstallRequirement) -> None: + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def has_requirement(self, name: str) -> bool: + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements + and not self.requirements[project_name].constraint + ) + + def get_requirement(self, name: str) -> InstallRequirement: + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError(f"No project with the name {name!r}") + + @property + def all_requirements(self) -> List[InstallRequirement]: + return self.unnamed_requirements + list(self.requirements.values()) + + @property + def requirements_to_install(self) -> List[InstallRequirement]: + """Return the list of requirements that need to be installed. + + TODO remove this property together with the legacy resolver, since the new + resolver only returns requirements that need to be installed. + """ + return [ + install_req + for install_req in self.all_requirements + if not install_req.constraint and not install_req.satisfied_by + ] diff --git a/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py b/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..26df208 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,633 @@ +import functools +import os +import sys +import sysconfig +from importlib.util import cache_from_source +from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple + +from pip._internal.exceptions import LegacyDistutilsInstall, UninstallMissingRecord +from pip._internal.locations import get_bin_prefix, get_bin_user +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.logging import getLogger, indent_log +from pip._internal.utils.misc import ask, normalize_path, renames, rmtree +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.virtualenv import running_under_virtualenv + +logger = getLogger(__name__) + + +def _script_names( + bin_dir: str, script_name: str, is_gui: bool +) -> Generator[str, None, None]: + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + exe_name = os.path.join(bin_dir, script_name) + yield exe_name + if not WINDOWS: + return + yield f"{exe_name}.exe" + yield f"{exe_name}.exe.manifest" + if is_gui: + yield f"{exe_name}-script.pyw" + else: + yield f"{exe_name}-script.py" + + +def _unique( + fn: Callable[..., Generator[Any, None, None]] +) -> Callable[..., Generator[Any, None, None]]: + @functools.wraps(fn) + def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]: + seen: Set[Any] = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + + return unique + + +@_unique +def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + + If RECORD is not found, raises an error, + with possible information from the INSTALLER file. + + https://packaging.python.org/specifications/recording-installed-packages/ + """ + location = dist.location + assert location is not None, "not installed" + + entries = dist.iter_declared_entries() + if entries is None: + raise UninstallMissingRecord(distribution=dist) + + for entry in entries: + path = os.path.join(location, entry) + yield path + if path.endswith(".py"): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + ".pyc") + yield path + path = os.path.join(dn, base + ".pyo") + yield path + + +def compact(paths: Iterable[str]) -> Set[str]: + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths: Set[str] = set() + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) + and path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths: Iterable[str]) -> Set[str]: + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = {os.path.normcase(p): p for p in paths} + remaining = set(case_map) + unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len) + wildcards: Set[str] = set() + + def norm_join(*a: str) -> str: + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) for w in wildcards): + # This directory has already been handled. + continue + + all_files: Set[str] = set() + all_subdirs: Set[str] = set() + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) for d in subdirs) + all_files.update(norm_join(root, dirname, f) for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]: + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + _normcased_files = set(map(os.path.normcase, files)) + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if ( + os.path.isfile(file_) + and os.path.normcase(file_) not in _normcased_files + ): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | {os.path.join(folder, "*") for folder in folders} + + return will_remove, will_skip + + +class StashedUninstallPathSet: + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + + def __init__(self) -> None: + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs: Dict[str, TempDirectory] = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves: List[Tuple[str, str]] = [] + + def _get_directory_stash(self, path: str) -> str: + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir: TempDirectory = AdjacentTempDirectory(path) + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path: str) -> str: + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path: str) -> str: + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if path_is_dir and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self) -> None: + """Commits the uninstall by removing stashed files.""" + for save_dir in self._save_dirs.values(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self) -> None: + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug("Replacing %s from %s", new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self) -> bool: + return bool(self._moves) + + +class UninstallPathSet: + """A set of file paths to be removed in the uninstallation of a + requirement.""" + + def __init__(self, dist: BaseDistribution) -> None: + self._paths: Set[str] = set() + self._refuse: Set[str] = set() + self._pth: Dict[str, UninstallPthEntries] = {} + self._dist = dist + self._moved_paths = StashedUninstallPathSet() + # Create local cache of normalize_path results. Creating an UninstallPathSet + # can result in hundreds/thousands of redundant calls to normalize_path with + # the same args, which hurts performance. + self._normalize_path_cached = functools.lru_cache(normalize_path) + + def _permitted(self, path: str) -> bool: + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + # aka is_local, but caching normalized sys.prefix + if not running_under_virtualenv(): + return True + return path.startswith(self._normalize_path_cached(sys.prefix)) + + def add(self, path: str) -> None: + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(self._normalize_path_cached(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self._paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == ".py": + self.add(cache_from_source(path)) + + def add_pth(self, pth_file: str, entry: str) -> None: + pth_file = self._normalize_path_cached(pth_file) + if self._permitted(pth_file): + if pth_file not in self._pth: + self._pth[pth_file] = UninstallPthEntries(pth_file) + self._pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None: + """Remove paths in ``self._paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self._paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self._dist.raw_name, + ) + return + + dist_name_version = f"{self._dist.raw_name}-{self._dist.raw_version}" + logger.info("Uninstalling %s:", dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self._paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.verbose("Removing file or directory %s", path) + + for pth in self._pth.values(): + pth.remove() + + logger.info("Successfully uninstalled %s", dist_name_version) + + def _allowed_to_proceed(self, verbose: bool) -> bool: + """Display which files would be deleted and prompt for confirmation""" + + def _display(msg: str, paths: Iterable[str]) -> None: + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self._paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self._paths) + will_skip = set() + + _display("Would remove:", will_remove) + _display("Would not remove (might be manually added):", will_skip) + _display("Would not remove (outside of prefix):", self._refuse) + if verbose: + _display("Will actually move:", compress_for_rename(self._paths)) + + return ask("Proceed (Y/n)? ", ("y", "n", "")) != "n" + + def rollback(self) -> None: + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self._dist.raw_name, + ) + return + logger.info("Rolling back uninstall of %s", self._dist.raw_name) + self._moved_paths.rollback() + for pth in self._pth.values(): + pth.rollback() + + def commit(self) -> None: + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet": + dist_location = dist.location + info_location = dist.info_location + if dist_location is None: + logger.info( + "Not uninstalling %s since it is not installed", + dist.canonical_name, + ) + return cls(dist) + + normalized_dist_location = normalize_path(dist_location) + if not dist.local: + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.canonical_name, + normalized_dist_location, + sys.prefix, + ) + return cls(dist) + + if normalized_dist_location in { + p + for p in {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} + if p + }: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.canonical_name, + normalized_dist_location, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path_from_location(dist.raw_name) + + # Distribution is installed with metadata in a "flat" .egg-info + # directory. This means it is not a modern .dist-info installation, an + # egg, or legacy editable. + setuptools_flat_installation = ( + dist.installed_with_setuptools_egg_info + and info_location is not None + and os.path.exists(info_location) + # If dist is editable and the location points to a ``.egg-info``, + # we are in fact in the legacy editable case. + and not info_location.endswith(f"{dist.setuptools_filename}.egg-info") + ) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if setuptools_flat_installation: + if info_location is not None: + paths_to_remove.add(info_location) + installed_files = dist.iter_declared_entries() + if installed_files is not None: + for installed_file in installed_files: + paths_to_remove.add(os.path.join(dist_location, installed_file)) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.is_file("top_level.txt"): + try: + namespace_packages = dist.read_text("namespace_packages.txt") + except FileNotFoundError: + namespaces = [] + else: + namespaces = namespace_packages.splitlines(keepends=False) + for top_level_pkg in [ + p + for p in dist.read_text("top_level.txt").splitlines() + if p and p not in namespaces + ]: + path = os.path.join(dist_location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(f"{path}.py") + paths_to_remove.add(f"{path}.pyc") + paths_to_remove.add(f"{path}.pyo") + + elif dist.installed_by_distutils: + raise LegacyDistutilsInstall(distribution=dist) + + elif dist.installed_as_egg: + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist_location) + easy_install_egg = os.path.split(dist_location)[1] + easy_install_pth = os.path.join( + os.path.dirname(dist_location), + "easy-install.pth", + ) + paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg) + + elif dist.installed_with_dist_info: + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # PEP 660 modern editable is handled in the ``.dist-info`` case + # above, so this only covers the setuptools-style editable. + with open(develop_egg_link) as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + normalized_link_pointer = paths_to_remove._normalize_path_cached( + link_pointer + ) + assert os.path.samefile( + normalized_link_pointer, normalized_dist_location + ), ( + f"Egg-link {develop_egg_link} (to {link_pointer}) does not match " + f"installed location of {dist.raw_name} (at {dist_location})" + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join( + os.path.dirname(develop_egg_link), "easy-install.pth" + ) + paths_to_remove.add_pth(easy_install_pth, dist_location) + + else: + logger.debug( + "Not sure how to uninstall: %s - Check: %s", + dist, + dist_location, + ) + + if dist.in_usersite: + bin_dir = get_bin_user() + else: + bin_dir = get_bin_prefix() + + # find distutils scripts= scripts + try: + for script in dist.iter_distutils_script_names(): + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, f"{script}.bat")) + except (FileNotFoundError, NotADirectoryError): + pass + + # find console_scripts and gui_scripts + def iter_scripts_to_remove( + dist: BaseDistribution, + bin_dir: str, + ) -> Generator[str, None, None]: + for entry_point in dist.iter_entry_points(): + if entry_point.group == "console_scripts": + yield from _script_names(bin_dir, entry_point.name, False) + elif entry_point.group == "gui_scripts": + yield from _script_names(bin_dir, entry_point.name, True) + + for s in iter_scripts_to_remove(dist, bin_dir): + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries: + def __init__(self, pth_file: str) -> None: + self.file = pth_file + self.entries: Set[str] = set() + self._saved_lines: Optional[List[bytes]] = None + + def add(self, entry: str) -> None: + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace("\\", "/") + self.entries.add(entry) + + def remove(self) -> None: + logger.verbose("Removing pth entries from %s:", self.file) + + # If the file doesn't exist, log a warning and return + if not os.path.isfile(self.file): + logger.warning("Cannot remove entries from nonexistent file %s", self.file) + return + with open(self.file, "rb") as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b"\r\n" in line for line in lines): + endline = "\r\n" + else: + endline = "\n" + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.verbose("Removing entry: %s", entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, "wb") as fh: + fh.writelines(lines) + + def rollback(self) -> bool: + if self._saved_lines is None: + logger.error("Cannot roll back changes to %s, none were made", self.file) + return False + logger.debug("Rolling %s back to previous state", self.file) + with open(self.file, "wb") as fh: + fh.writelines(self._saved_lines) + return True diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3638912d611304874551d2414d52ff4d60a0dc9b GIT binary patch literal 215 zcmZ9GJqp4=5QVcwL4+K{B2Ls+Y>a577Z8?>8I#5A5Bn3yNj!sR@dmb@KAQELD)Y1&9{YG2?XJ5CIl-XS7$F!Itx4Q z_P&65mZdrCY@?0jVvTF_hr<%$iGt#eOR-#&G2^~>4W2E%bLc-Y%A z7<*62(Xggq{1Cw&i&(@HmU5q`hHs>%Z*t;{#7b@7uCSRnY0a;31{_>4!Cu5Sdj{BD zgOFc0*cOYd=Pa^c;MZvQjiJ-3eI(d2wR7;yeqJ7S|{5XHwzv z0~nOCfD|%??A$l$pP)Ka=x8`oFy2J4$AI}fV!jb^lxC5j2&F|PI9&%tS$-|D!NGjG z+O;AFS$9}#xq9YyDB%IfJlO@I>mtupAYdT%LZ=U%M}aJhA{Ppx;Bg-yk=hZUN|ANU zBQ-eFnJFJHVAx}d<5Z0o)AS&u{1Iep)2eDIvNiL@v-COG45W)G=`kgQQx` zX7j7?`gsaoTK2;<4I}Sv-YLl+>21a8*Rt(xtgo-$4To}dr@MM5kHCX$*GuBIR}57@ z&#tX)T=itEV6_N4kHQ{EuZRmTh%*HO-S-3?yrfomZS-NS80uQZ?ZT5&-#W84WoJ;? zcoxG`_Qhexe||N$JaU)ENHBVH5J>FR^a>F9f2)KXJhL(-XGe3*gZfWjXsJ?KmE3L}(~cSzan=)bD<-;ZM0yEZx%O`>u|WfR zj$E2(U;ObNY*KX~ZAvBdx&Quve~5fHMuR73TcQt>d6QJuFLBf4o%Ma zTXyAuUHQN^->_faEv>w^-M=o6=2s3H7f05mQR~LYy79?0&Ko0k?(asOU--;0RJH#B DD_b{C literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/base.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/base.py new file mode 100644 index 0000000..42dade1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/base.py @@ -0,0 +1,20 @@ +from typing import Callable, List, Optional + +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_set import RequirementSet + +InstallRequirementProvider = Callable[ + [str, Optional[InstallRequirement]], InstallRequirement +] + + +class BaseResolver: + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + raise NotImplementedError() + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + raise NotImplementedError() diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab0eafd9ab45a699604e737d43e84cac90eef749 GIT binary patch literal 222 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 None: + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + # This idiosyncratically converts the SpecifierSet to str and let + # check_requires_python then parse it again into SpecifierSet. But this + # is the legacy resolver so I'm just not going to bother refactoring. + try: + requires_python = str(dist.requires_python) + except FileNotFoundError as e: + raise NoneMetadataError(dist, str(e)) + try: + is_compatible = check_requires_python( + requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", dist.raw_name, exc + ) + return + + if is_compatible: + return + + version = ".".join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + "Ignoring failed Requires-Python check for package %r: %s not in %r", + dist.raw_name, + version, + requires_python, + ) + return + + raise UnsupportedPythonVersion( + f"Package {dist.raw_name!r} requires a different Python: " + f"{version} not in {requires_python!r}" + ) + + +class Resolver(BaseResolver): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + self.wheel_cache = wheel_cache + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies: DiscoveredDependencies = defaultdict(list) + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels) + for req in root_reqs: + if req.constraint: + check_invalid_constraint_type(req) + self._add_requirement_to_set(requirement_set, req) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # _populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs: List[InstallRequirement] = [] + hash_errors = HashErrors() + for req in chain(requirement_set.all_requirements, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + return requirement_set + + def _add_requirement_to_set( + self, + requirement_set: RequirementSet, + install_req: InstallRequirement, + parent_req_name: Optional[str] = None, + extras_requested: Optional[Iterable[str]] = None, + ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]: + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, + install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = compatibility_tags.get_supported() + if requirement_set.check_supported_wheels and not wheel.supported(tags): + raise InstallationError( + f"{wheel.filename} is not a supported wheel on this platform." + ) + + # This next bit is really a sanity check. + assert ( + not install_req.user_supplied or parent_req_name is None + ), "a user supplied req shouldn't have a parent" + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + requirement_set.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req: Optional[InstallRequirement] = ( + requirement_set.get_requirement(install_req.name) + ) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None + and existing_req + and not existing_req.constraint + and existing_req.extras == install_req.extras + and existing_req.req + and install_req.req + and existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + f"Double requirement given: {install_req} " + f"(already in {existing_req}, name={install_req.name!r})" + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + requirement_set.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = install_req.link and not ( + existing_req.link and install_req.link.path == existing_req.link.path + ) + if does_not_satisfy_constraint: + raise InstallationError( + f"Could not satisfy constraints for '{install_req.name}': " + "installation from path or url cannot be " + "constrained to a version" + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + # If we're now installing a user supplied requirement, + # mark the existing object as such. + if install_req.user_supplied: + existing_req.user_supplied = True + existing_req.extras = tuple( + sorted(set(existing_req.extras) | set(install_req.extras)) + ) + logger.debug( + "Setting %s extras to: %s", + existing_req, + existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def _is_upgrade_allowed(self, req: InstallRequirement) -> bool: + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.user_supplied or req.constraint + + def _set_req_to_reinstall(self, req: InstallRequirement) -> None: + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + assert req.satisfied_by is not None + if not self.use_user_site or req.satisfied_by.in_usersite: + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed( + self, req_to_install: InstallRequirement + ) -> Optional[str]: + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return "already satisfied, skipping upgrade" + return "already satisfied" + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return "already up-to-date" + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]: + upgrade = self._is_upgrade_allowed(req) + best_candidate = self.finder.find_requirement(req, upgrade) + if not best_candidate: + return None + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or "" + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + "The candidate selected for download or install is a " + f"yanked version: {best_candidate}\n" + f"Reason for being yanked: {reason}" + ) + logger.warning(msg) + + return link + + def _populate_link(self, req: InstallRequirement) -> None: + """Ensure that if a link can be found for this, that it is found. + + Note that req.link may still be None - if the requirement is already + installed and not needed to be upgraded based on the return value of + _is_upgrade_allowed(). + + If preparer.require_hashes is True, don't use the wheel cache, because + cached wheels, always built locally, have different hashes than the + files downloaded from the index server and thus throw false hash + mismatches. Furthermore, cached wheels at present have undeterministic + contents due to file modification times. + """ + if req.link is None: + req.link = self._find_requirement_link(req) + + if self.wheel_cache is None or self.preparer.require_hashes: + return + + assert req.link is not None, "_find_requirement_link unexpectedly returned None" + cache_entry = self.wheel_cache.get_cache_entry( + link=req.link, + package_name=req.name, + supported_tags=get_supported(), + ) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + if req.link is req.original_link and cache_entry.persistent: + req.cached_wheel_source_link = req.link + if cache_entry.origin is not None: + req.download_info = cache_entry.origin + else: + # Legacy cache entry that does not have origin.json. + # download_info may miss the archive_info.hashes field. + req.download_info = direct_url_from_link( + req.link, link_is_in_wheel_cache=cache_entry.persistent + ) + req.link = cache_entry.link + + def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution: + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement(req, skip_reason) + + # We eagerly populate the link, since that's our "legacy" behavior. + self._populate_link(req) + dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" + or self.force_reinstall + or self.ignore_installed + or req.link.scheme == "file" + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + "Requirement already satisfied (use --upgrade to upgrade): %s", + req, + ) + return dist + + def _resolve_one( + self, + requirement_set: RequirementSet, + req_to_install: InstallRequirement, + ) -> List[InstallRequirement]: + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # Parse and return dependencies + dist = self._get_dist_for(req_to_install) + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, + version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs: List[InstallRequirement] = [] + + def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None: + # This idiosyncratically converts the Requirement to str and let + # make_install_req then parse it again into Requirement. But this is + # the legacy resolver so I'm just not going to bother refactoring. + sub_install_req = self._make_install_req(str(subreq), req_to_install) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = self._add_requirement_to_set( + requirement_set, + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append(add_to_parent) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + assert req_to_install.name is not None + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.user_supplied + self._add_requirement_to_set( + requirement_set, req_to_install, parent_req_name=None + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ",".join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.iter_provided_extras()) + ) + for missing in missing_requested: + logger.warning( + "%s %s does not provide the extra '%s'", + dist.raw_name, + dist.version, + missing, + ) + + available_requested = sorted( + set(dist.iter_provided_extras()) & set(req_to_install.extras) + ) + for subreq in dist.iter_dependencies(available_requested): + add_req(subreq, extras_requested=available_requested) + + return more_reqs + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs: Set[InstallRequirement] = set() + + def schedule(req: InstallRequirement) -> None: + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a743dee53f65f85fcce51e8bf5f3c6efa8827c8 GIT binary patch literal 226 zcmZ9GI|{-;5QeipKm-qB5ywX>Hb%743kb_<#$+-3U>|{$p29PD7H?qd3B=CIUF`f} z=Kp5+2j)H)^pl_!-51fHvHk1a37c!uBtx>jC8iaocg%b)P%42Se944hIb`bS1xjaO z&E3WyU@{)38Eb61JEcpNBcQCI;s?-;E0vs$CR4E7VXE2j%nG!ixdzImLnB!Q2Cb^R m<4XRp#&}FafICV@x_R{GLgl`~h3STmNGKcO)h2|PcAzh66h5;6 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42786e314543f1121358c128722c3caa3b5c9ace GIT binary patch literal 8167 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 CnLS?s literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59c21a94c37f7e6f2ad7fb36d2659d17bea14db6 GIT binary patch literal 29426 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 bwansnDRdv`ACKp(U3|?#=qDU*3|swQ=$#X5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..206ef44f7bfa71a7d65799502e294b6455e52142 GIT binary patch literal 32537 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 IPUr6b0OmfbYXATM literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57eb2f66b5a22275f0a6d65d4c0f47881c4b287b GIT binary patch literal 5058 zcmd5=U2NOd6(&VeqAXdKfAV9uL2v4`i4t3K(kzbMENg0QshiGmlNLj~E*vdh$#f`E zy`+*zQ-BW0g98kx_p)TzpZin?8Bp(O-qZRRV0*BU7FktXt?`2Orhm>U5 z*18qwfD!h&f9D>abMCp{In?i3TU$7IzOKBJ`)-uu{)B_tBUL*ax1n>F(>RScxI90> z^VkmP9ZncZ)isd1^WtUk#rItAmXr z(7DS|Zi3giiGUW;gxlhTpovt}Br0jV7RUy*Aj}0zfrRWv#`Qw&eQuCZr^w8)Ox12r zrU(=*-gwoM?9|tsfVU2$=BEm$)aUR`8oc+X0?bxD#&IPsA&r%13wnX*HZd&gnr`NZ z>X1A*NiP_bT&K*|Ez>4emVB?EX0E9@s+ek?-Xe}gGzxyn>n0^Pru58IjT?n!tb9Rr z^huC$LwBZ#Ot zQ-)2crx)+hMA1I`9??xU^!15>_-FJx`P5GNok7aSHZuDg{nT7D@#*savTVDl(ds0GHE0FqfcQSpliD^JahO4lk&$FV zU@`>LQ;)PlFCj7v99IC{+Xj3C= zW5|+!em^y3YZ{Ne^M zb8a}pKrIF@hHecjGWAObEC>%c-spe}dY7wk(=gciR07lW>$|mfGjKD|4MUADgMJwy z6F38-FCqbV-x4YS1k(s6JD%%2<4Y*7$y!D5_KHpo-ni-Tj_oki0u^yOvU|R{J--xc zaP^>SEx^BcORDhGkXUv;Y3@5$K>J`NI33%$23`nG$9K=(l5d47k|v?QK(5S41!yzh z{)E$lu+p(x2CRgBCi)Ug38cwYX;LLLy=OQ7gX)ye^@DGVT!YW{?dGpYH81c8%Hc8Z z?v>@yv2R=)CNJ2KtfGzRTORlpBBR4f0GgVf%~A$eht#93k7z|e91GzjYXGtgm!%d0 zkIR#CvLw|7z6H2cw5#AuZ3j>*5oPEES45;|o!AW;UZQkG-OO5U5RfIWI&K6< z*u!9tG@!d1EU2iG8>(gyH|{ek&?uBKi@B0UCyTj6n4tq1h8F9=S4keIxS=YLxI*5} zxiScc+Y0X%pvMjYqm99bMtKk0i+ekL!~rN&>dq)X*Lb^|F!Z9ZzX5rVTa%-!@}Xt< z(A<>|uYPd#k$iHIUzUfUeG>0ljrT3b`{u8FboKt#<@lKyX)O}JC$8>4wG4leQ)|(V zCmnlNI|i0J1{U@#cMQ&iK9ytdNA5&sU!Mzo82cc$IQrYM-;B-09+3-=G0q}Woch}IiCKZ@Fd>3v=0@W71m(eORJrSmpczX>P#$06L&_| z+qv%KW(OB;dp~+7I(vCV?q>VJPqF+LJB~^%qu+)LFN(LTTtBpl14C62qhb>x! zMyfnfn2TzyuqRfZYlFGg`dHNBFpiakM2CxMB8@?tg8-}5Y2~4Fkf!|_5laDwXcn~z zlmr;AP$T3B#5|#J5lTqmp6U*$lZ+m=^GVBMIa#=hXc%jk7x*jo$_vfw6LD zO{=8ssLTO1k0juTpM#BzAn5|)XJG%r$Thz5fo8_l#e5a_wE=--=m+&uS7Jpz>Ybh| z=}^_&%rxdJ%paa11JL=;hE(`1{09UCQ=Zvnio&4U(2l&o66_QRO$2=8I1POpUrmT_ zQ>g|& znEGCfHom5Ou&EClSw>L8^FSIrcxq94ET6@I0nl06b8>+$zP%!kcrN{Nqh%}beVuki ziDzJAlmvao@-v@f*?F{SM^q%{Au5jhsMQPWUM^}L7$;!)zX^;ThYi8sTR%!w^ACIL z%Lz>DBlSyAJ;b^u+Yhm0_xAGPrUvh3d>xI)%%`^z@}P~H3{ z>AI=?byc?6?^>7qks;ye{+7iF@9L6La2%6DVVxpTCAe#`%wj{C4Thw^7_UkIR>M ztT?d6k^|d^Cvo+Xw>mi2jgy1(&L%d#>ZtWtBJM^qmSMmbF8=u8fA@y40)|6kBCxnY zrv%Q<`Od*w#U%y!9#zX819%o{V4qGd%?}%F}`QE WZIef8+E^YbELD^k7|HGcxyg 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 tVuY+Uw|{A1dGuQNMqs6(x9IMxm?0O0us92&OUA str: + if not extras: + return project + extras_expr = ",".join(sorted(extras)) + return f"{project}[{extras_expr}]" + + +@dataclass(frozen=True) +class Constraint: + specifier: SpecifierSet + hashes: Hashes + links: FrozenSet[Link] + + @classmethod + def empty(cls) -> "Constraint": + return Constraint(SpecifierSet(), Hashes(), frozenset()) + + @classmethod + def from_ireq(cls, ireq: InstallRequirement) -> "Constraint": + links = frozenset([ireq.link]) if ireq.link else frozenset() + return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links) + + def __bool__(self) -> bool: + return bool(self.specifier) or bool(self.hashes) or bool(self.links) + + def __and__(self, other: InstallRequirement) -> "Constraint": + if not isinstance(other, InstallRequirement): + return NotImplemented + specifier = self.specifier & other.specifier + hashes = self.hashes & other.hashes(trust_internet=False) + links = self.links + if other.link: + links = links.union([other.link]) + return Constraint(specifier, hashes, links) + + def is_satisfied_by(self, candidate: "Candidate") -> bool: + # Reject if there are any mismatched URL constraints on this package. + if self.links and not all(_match_link(link, candidate) for link in self.links): + return False + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) + + +class Requirement: + @property + def project_name(self) -> NormalizedName: + """The "project name" of a requirement. + + This is different from ``name`` if this requirement contains extras, + in which case ``name`` would contain the ``[...]`` part, while this + refers to the name of the project. + """ + raise NotImplementedError("Subclass should override") + + @property + def name(self) -> str: + """The name identifying this requirement in the resolver. + + This is different from ``project_name`` if this requirement contains + extras, where ``project_name`` would not contain the ``[...]`` part. + """ + raise NotImplementedError("Subclass should override") + + def is_satisfied_by(self, candidate: "Candidate") -> bool: + return False + + def get_candidate_lookup(self) -> CandidateLookup: + raise NotImplementedError("Subclass should override") + + def format_for_error(self) -> str: + raise NotImplementedError("Subclass should override") + + +def _match_link(link: Link, candidate: "Candidate") -> bool: + if candidate.source_link: + return links_equivalent(link, candidate.source_link) + return False + + +class Candidate: + @property + def project_name(self) -> NormalizedName: + """The "project name" of the candidate. + + This is different from ``name`` if this candidate contains extras, + in which case ``name`` would contain the ``[...]`` part, while this + refers to the name of the project. + """ + raise NotImplementedError("Override in subclass") + + @property + def name(self) -> str: + """The name identifying this candidate in the resolver. + + This is different from ``project_name`` if this candidate contains + extras, where ``project_name`` would not contain the ``[...]`` part. + """ + raise NotImplementedError("Override in subclass") + + @property + def version(self) -> Version: + raise NotImplementedError("Override in subclass") + + @property + def is_installed(self) -> bool: + raise NotImplementedError("Override in subclass") + + @property + def is_editable(self) -> bool: + raise NotImplementedError("Override in subclass") + + @property + def source_link(self) -> Optional[Link]: + raise NotImplementedError("Override in subclass") + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + raise NotImplementedError("Override in subclass") + + def get_install_requirement(self) -> Optional[InstallRequirement]: + raise NotImplementedError("Override in subclass") + + def format_for_error(self) -> str: + raise NotImplementedError("Subclass should override") diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py new file mode 100644 index 0000000..6617644 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -0,0 +1,574 @@ +import logging +import sys +from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast + +from pip._vendor.packaging.requirements import InvalidRequirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import ( + HashError, + InstallationSubprocessError, + InvalidInstalledPackage, + MetadataInconsistent, + MetadataInvalid, +) +from pip._internal.metadata import BaseDistribution +from pip._internal.models.link import Link, links_equivalent +from pip._internal.models.wheel import Wheel +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.direct_url_helpers import direct_url_from_link +from pip._internal.utils.misc import normalize_version_info + +from .base import Candidate, Requirement, format_name + +if TYPE_CHECKING: + from .factory import Factory + +logger = logging.getLogger(__name__) + +BaseCandidate = Union[ + "AlreadyInstalledCandidate", + "EditableCandidate", + "LinkCandidate", +] + +# Avoid conflicting with the PyPI package "Python". +REQUIRES_PYTHON_IDENTIFIER = cast(NormalizedName, "") + + +def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]: + """The runtime version of BaseCandidate.""" + base_candidate_classes = ( + AlreadyInstalledCandidate, + EditableCandidate, + LinkCandidate, + ) + if isinstance(candidate, base_candidate_classes): + return candidate + return None + + +def make_install_req_from_link( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert not template.editable, "template is editable" + if template.req: + line = str(template.req) + else: + line = link.url + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.original_link = template.original_link + ireq.link = link + ireq.extras = template.extras + return ireq + + +def make_install_req_from_editable( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert template.editable, "template not editable" + ireq = install_req_from_editable( + link.url, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + permit_editable_wheels=template.permit_editable_wheels, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.extras = template.extras + return ireq + + +def _make_install_req_from_dist( + dist: BaseDistribution, template: InstallRequirement +) -> InstallRequirement: + if template.req: + line = str(template.req) + elif template.link: + line = f"{dist.canonical_name} @ {template.link.url}" + else: + line = f"{dist.canonical_name}=={dist.version}" + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + global_options=template.global_options, + hash_options=template.hash_options, + config_settings=template.config_settings, + ) + ireq.satisfied_by = dist + return ireq + + +class _InstallRequirementBackedCandidate(Candidate): + """A candidate backed by an ``InstallRequirement``. + + This represents a package request with the target not being already + in the environment, and needs to be fetched and installed. The backing + ``InstallRequirement`` is responsible for most of the leg work; this + class exposes appropriate information to the resolver. + + :param link: The link passed to the ``InstallRequirement``. The backing + ``InstallRequirement`` will use this link to fetch the distribution. + :param source_link: The link this candidate "originates" from. This is + different from ``link`` when the link is found in the wheel cache. + ``link`` would point to the wheel cache, while this points to the + found remote link (e.g. from pypi.org). + """ + + dist: BaseDistribution + is_installed = False + + def __init__( + self, + link: Link, + source_link: Link, + ireq: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[Version] = None, + ) -> None: + self._link = link + self._source_link = source_link + self._factory = factory + self._ireq = ireq + self._name = name + self._version = version + self.dist = self._prepare() + self._hash: Optional[int] = None + + def __str__(self) -> str: + return f"{self.name} {self.version}" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._link)!r})" + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash((self.__class__, self._link)) + return self._hash + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return links_equivalent(self._link, other._link) + return False + + @property + def source_link(self) -> Optional[Link]: + return self._source_link + + @property + def project_name(self) -> NormalizedName: + """The normalised name of the project the candidate refers to""" + if self._name is None: + self._name = self.dist.canonical_name + return self._name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> Version: + if self._version is None: + self._version = self.dist.version + return self._version + + def format_for_error(self) -> str: + return ( + f"{self.name} {self.version} " + f"(from {self._link.file_path if self._link.is_file else self._link})" + ) + + def _prepare_distribution(self) -> BaseDistribution: + raise NotImplementedError("Override in subclass") + + def _check_metadata_consistency(self, dist: BaseDistribution) -> None: + """Check for consistency of project name and version of dist.""" + if self._name is not None and self._name != dist.canonical_name: + raise MetadataInconsistent( + self._ireq, + "name", + self._name, + dist.canonical_name, + ) + if self._version is not None and self._version != dist.version: + raise MetadataInconsistent( + self._ireq, + "version", + str(self._version), + str(dist.version), + ) + # check dependencies are valid + # TODO performance: this means we iterate the dependencies at least twice, + # we may want to cache parsed Requires-Dist + try: + list(dist.iter_dependencies(list(dist.iter_provided_extras()))) + except InvalidRequirement as e: + raise MetadataInvalid(self._ireq, str(e)) + + def _prepare(self) -> BaseDistribution: + try: + dist = self._prepare_distribution() + except HashError as e: + # Provide HashError the underlying ireq that caused it. This + # provides context for the resulting error message to show the + # offending line to the user. + e.req = self._ireq + raise + except InstallationSubprocessError as exc: + # The output has been presented already, so don't duplicate it. + exc.context = "See above for output." + raise + + self._check_metadata_consistency(dist) + return dist + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + requires = self.dist.iter_dependencies() if with_requires else () + for r in requires: + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + yield self._factory.make_requires_python_requirement(self.dist.requires_python) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return self._ireq + + +class LinkCandidate(_InstallRequirementBackedCandidate): + is_editable = False + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[Version] = None, + ) -> None: + source_link = link + cache_entry = factory.get_wheel_cache_entry(source_link, name) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + link = cache_entry.link + ireq = make_install_req_from_link(link, template) + assert ireq.link == link + if ireq.link.is_wheel and not ireq.link.is_file: + wheel = Wheel(ireq.link.filename) + wheel_name = canonicalize_name(wheel.name) + assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel" + # Version may not be present for PEP 508 direct URLs + if version is not None: + wheel_version = Version(wheel.version) + assert ( + version == wheel_version + ), f"{version!r} != {wheel_version!r} for wheel {name}" + + if cache_entry is not None: + assert ireq.link.is_wheel + assert ireq.link.is_file + if cache_entry.persistent and template.link is template.original_link: + ireq.cached_wheel_source_link = source_link + if cache_entry.origin is not None: + ireq.download_info = cache_entry.origin + else: + # Legacy cache entry that does not have origin.json. + # download_info may miss the archive_info.hashes field. + ireq.download_info = direct_url_from_link( + source_link, link_is_in_wheel_cache=cache_entry.persistent + ) + + super().__init__( + link=link, + source_link=source_link, + ireq=ireq, + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + preparer = self._factory.preparer + return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True) + + +class EditableCandidate(_InstallRequirementBackedCandidate): + is_editable = True + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[Version] = None, + ) -> None: + super().__init__( + link=link, + source_link=link, + ireq=make_install_req_from_editable(link, template), + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + return self._factory.preparer.prepare_editable_requirement(self._ireq) + + +class AlreadyInstalledCandidate(Candidate): + is_installed = True + source_link = None + + def __init__( + self, + dist: BaseDistribution, + template: InstallRequirement, + factory: "Factory", + ) -> None: + self.dist = dist + self._ireq = _make_install_req_from_dist(dist, template) + self._factory = factory + self._version = None + + # This is just logging some messages, so we can do it eagerly. + # The returned dist would be exactly the same as self.dist because we + # set satisfied_by in _make_install_req_from_dist. + # TODO: Supply reason based on force_reinstall and upgrade_strategy. + skip_reason = "already satisfied" + factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) + + def __str__(self) -> str: + return str(self.dist) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.dist!r})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, AlreadyInstalledCandidate): + return NotImplemented + return self.name == other.name and self.version == other.version + + def __hash__(self) -> int: + return hash((self.name, self.version)) + + @property + def project_name(self) -> NormalizedName: + return self.dist.canonical_name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> Version: + if self._version is None: + self._version = self.dist.version + return self._version + + @property + def is_editable(self) -> bool: + return self.dist.editable + + def format_for_error(self) -> str: + return f"{self.name} {self.version} (Installed)" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + if not with_requires: + return + + try: + for r in self.dist.iter_dependencies(): + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) + except InvalidRequirement as exc: + raise InvalidInstalledPackage(dist=self.dist, invalid_exc=exc) from None + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None + + +class ExtrasCandidate(Candidate): + """A candidate that has 'extras', indicating additional dependencies. + + Requirements can be for a project with dependencies, something like + foo[extra]. The extras don't affect the project/version being installed + directly, but indicate that we need additional dependencies. We model that + by having an artificial ExtrasCandidate that wraps the "base" candidate. + + The ExtrasCandidate differs from the base in the following ways: + + 1. It has a unique name, of the form foo[extra]. This causes the resolver + to treat it as a separate node in the dependency graph. + 2. When we're getting the candidate's dependencies, + a) We specify that we want the extra dependencies as well. + b) We add a dependency on the base candidate. + See below for why this is needed. + 3. We return None for the underlying InstallRequirement, as the base + candidate will provide it, and we don't want to end up with duplicates. + + The dependency on the base candidate is needed so that the resolver can't + decide that it should recommend foo[extra1] version 1.0 and foo[extra2] + version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 + respectively forces the resolver to recognise that this is a conflict. + """ + + def __init__( + self, + base: BaseCandidate, + extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, + ) -> None: + """ + :param comes_from: the InstallRequirement that led to this candidate if it + differs from the base's InstallRequirement. This will often be the + case in the sense that this candidate's requirement has the extras + while the base's does not. Unlike the InstallRequirement backed + candidates, this requirement is used solely for reporting purposes, + it does not do any leg work. + """ + self.base = base + self.extras = frozenset(canonicalize_name(e) for e in extras) + self._comes_from = comes_from if comes_from is not None else self.base._ireq + + def __str__(self) -> str: + name, rest = str(self.base).split(" ", 1) + return "{}[{}] {}".format(name, ",".join(self.extras), rest) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(base={self.base!r}, extras={self.extras!r})" + + def __hash__(self) -> int: + return hash((self.base, self.extras)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self.base == other.base and self.extras == other.extras + return False + + @property + def project_name(self) -> NormalizedName: + return self.base.project_name + + @property + def name(self) -> str: + """The normalised name of the project the candidate refers to""" + return format_name(self.base.project_name, self.extras) + + @property + def version(self) -> Version: + return self.base.version + + def format_for_error(self) -> str: + return "{} [{}]".format( + self.base.format_for_error(), ", ".join(sorted(self.extras)) + ) + + @property + def is_installed(self) -> bool: + return self.base.is_installed + + @property + def is_editable(self) -> bool: + return self.base.is_editable + + @property + def source_link(self) -> Optional[Link]: + return self.base.source_link + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + factory = self.base._factory + + # Add a dependency on the exact base + # (See note 2b in the class docstring) + yield factory.make_requirement_from_candidate(self.base) + if not with_requires: + return + + # The user may have specified extras that the candidate doesn't + # support. We ignore any unsupported extras here. + valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras()) + invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras()) + for extra in sorted(invalid_extras): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra, + ) + + for r in self.base.dist.iter_dependencies(valid_extras): + yield from factory.make_requirements_from_spec( + str(r), + self._comes_from, + valid_extras, + ) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + # We don't return anything here, because we always + # depend on the base candidate, and we'll get the + # install requirement from that. + return None + + +class RequiresPythonCandidate(Candidate): + is_installed = False + source_link = None + + def __init__(self, py_version_info: Optional[Tuple[int, ...]]) -> None: + if py_version_info is not None: + version_info = normalize_version_info(py_version_info) + else: + version_info = sys.version_info[:3] + self._version = Version(".".join(str(c) for c in version_info)) + + # We don't need to implement __eq__() and __ne__() since there is always + # only one RequiresPythonCandidate in a resolution, i.e. the host Python. + # The built-in object.__eq__() and object.__ne__() do exactly what we want. + + def __str__(self) -> str: + return f"Python {self._version}" + + @property + def project_name(self) -> NormalizedName: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def name(self) -> str: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def version(self) -> Version: + return self._version + + def format_for_error(self) -> str: + return f"Python {self.version}" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + return () + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py new file mode 100644 index 0000000..dc6e2e1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -0,0 +1,823 @@ +import contextlib +import functools +import logging +from typing import ( + TYPE_CHECKING, + Callable, + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Mapping, + NamedTuple, + Optional, + Protocol, + Sequence, + Set, + Tuple, + TypeVar, + cast, +) + +from pip._vendor.packaging.requirements import InvalidRequirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import InvalidVersion, Version +from pip._vendor.resolvelib import ResolutionImpossible + +from pip._internal.cache import CacheEntry, WheelCache +from pip._internal.exceptions import ( + DistributionNotFound, + InstallationError, + InvalidInstalledPackage, + MetadataInconsistent, + MetadataInvalid, + UnsupportedPythonVersion, + UnsupportedWheel, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_drop_extras, + install_req_from_link_and_ireq, +) +from pip._internal.req.req_install import ( + InstallRequirement, + check_invalid_constraint_type, +) +from pip._internal.resolution.base import InstallRequirementProvider +from pip._internal.utils.compatibility_tags import get_supported +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import Candidate, Constraint, Requirement +from .candidates import ( + AlreadyInstalledCandidate, + BaseCandidate, + EditableCandidate, + ExtrasCandidate, + LinkCandidate, + RequiresPythonCandidate, + as_base_candidate, +) +from .found_candidates import FoundCandidates, IndexCandidateInfo +from .requirements import ( + ExplicitRequirement, + RequiresPythonRequirement, + SpecifierRequirement, + SpecifierWithoutExtrasRequirement, + UnsatisfiableRequirement, +) + +if TYPE_CHECKING: + + class ConflictCause(Protocol): + requirement: RequiresPythonRequirement + parent: Candidate + + +logger = logging.getLogger(__name__) + +C = TypeVar("C") +Cache = Dict[Link, C] + + +class CollectedRootRequirements(NamedTuple): + requirements: List[Requirement] + constraints: Dict[str, Constraint] + user_requested: Dict[str, int] + + +class Factory: + def __init__( + self, + finder: PackageFinder, + preparer: RequirementPreparer, + make_install_req: InstallRequirementProvider, + wheel_cache: Optional[WheelCache], + use_user_site: bool, + force_reinstall: bool, + ignore_installed: bool, + ignore_requires_python: bool, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + self._finder = finder + self.preparer = preparer + self._wheel_cache = wheel_cache + self._python_candidate = RequiresPythonCandidate(py_version_info) + self._make_install_req_from_spec = make_install_req + self._use_user_site = use_user_site + self._force_reinstall = force_reinstall + self._ignore_requires_python = ignore_requires_python + + self._build_failures: Cache[InstallationError] = {} + self._link_candidate_cache: Cache[LinkCandidate] = {} + self._editable_candidate_cache: Cache[EditableCandidate] = {} + self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {} + self._extras_candidate_cache: Dict[ + Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate + ] = {} + self._supported_tags_cache = get_supported() + + if not ignore_installed: + env = get_default_environment() + self._installed_dists = { + dist.canonical_name: dist + for dist in env.iter_installed_distributions(local_only=False) + } + else: + self._installed_dists = {} + + @property + def force_reinstall(self) -> bool: + return self._force_reinstall + + def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: + if not link.is_wheel: + return + wheel = Wheel(link.filename) + if wheel.supported(self._finder.target_python.get_unsorted_tags()): + return + msg = f"{link.filename} is not a supported wheel on this platform." + raise UnsupportedWheel(msg) + + def _make_extras_candidate( + self, + base: BaseCandidate, + extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, + ) -> ExtrasCandidate: + cache_key = (id(base), frozenset(canonicalize_name(e) for e in extras)) + try: + candidate = self._extras_candidate_cache[cache_key] + except KeyError: + candidate = ExtrasCandidate(base, extras, comes_from=comes_from) + self._extras_candidate_cache[cache_key] = candidate + return candidate + + def _make_candidate_from_dist( + self, + dist: BaseDistribution, + extras: FrozenSet[str], + template: InstallRequirement, + ) -> Candidate: + try: + base = self._installed_candidate_cache[dist.canonical_name] + except KeyError: + base = AlreadyInstalledCandidate(dist, template, factory=self) + self._installed_candidate_cache[dist.canonical_name] = base + if not extras: + return base + return self._make_extras_candidate(base, extras, comes_from=template) + + def _make_candidate_from_link( + self, + link: Link, + extras: FrozenSet[str], + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[Version], + ) -> Optional[Candidate]: + base: Optional[BaseCandidate] = self._make_base_candidate_from_link( + link, template, name, version + ) + if not extras or base is None: + return base + return self._make_extras_candidate(base, extras, comes_from=template) + + def _make_base_candidate_from_link( + self, + link: Link, + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[Version], + ) -> Optional[BaseCandidate]: + # TODO: Check already installed candidate, and use it if the link and + # editable flag match. + + if link in self._build_failures: + # We already tried this candidate before, and it does not build. + # Don't bother trying again. + return None + + if template.editable: + if link not in self._editable_candidate_cache: + try: + self._editable_candidate_cache[link] = EditableCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except (MetadataInconsistent, MetadataInvalid) as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + + return self._editable_candidate_cache[link] + else: + if link not in self._link_candidate_cache: + try: + self._link_candidate_cache[link] = LinkCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except MetadataInconsistent as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + return self._link_candidate_cache[link] + + def _iter_found_candidates( + self, + ireqs: Sequence[InstallRequirement], + specifier: SpecifierSet, + hashes: Hashes, + prefers_installed: bool, + incompatible_ids: Set[int], + ) -> Iterable[Candidate]: + if not ireqs: + return () + + # The InstallRequirement implementation requires us to give it a + # "template". Here we just choose the first requirement to represent + # all of them. + # Hopefully the Project model can correct this mismatch in the future. + template = ireqs[0] + assert template.req, "Candidates found on index must be PEP 508" + name = canonicalize_name(template.req.name) + + extras: FrozenSet[str] = frozenset() + for ireq in ireqs: + assert ireq.req, "Candidates found on index must be PEP 508" + specifier &= ireq.req.specifier + hashes &= ireq.hashes(trust_internet=False) + extras |= frozenset(ireq.extras) + + def _get_installed_candidate() -> Optional[Candidate]: + """Get the candidate for the currently-installed version.""" + # If --force-reinstall is set, we want the version from the index + # instead, so we "pretend" there is nothing installed. + if self._force_reinstall: + return None + try: + installed_dist = self._installed_dists[name] + except KeyError: + return None + + try: + # Don't use the installed distribution if its version + # does not fit the current dependency graph. + if not specifier.contains(installed_dist.version, prereleases=True): + return None + except InvalidVersion as e: + raise InvalidInstalledPackage(dist=installed_dist, invalid_exc=e) + + candidate = self._make_candidate_from_dist( + dist=installed_dist, + extras=extras, + template=template, + ) + # The candidate is a known incompatibility. Don't use it. + if id(candidate) in incompatible_ids: + return None + return candidate + + def iter_index_candidate_infos() -> Iterator[IndexCandidateInfo]: + result = self._finder.find_best_candidate( + project_name=name, + specifier=specifier, + hashes=hashes, + ) + icans = list(result.iter_applicable()) + + # PEP 592: Yanked releases are ignored unless the specifier + # explicitly pins a version (via '==' or '===') that can be + # solely satisfied by a yanked release. + all_yanked = all(ican.link.is_yanked for ican in icans) + + def is_pinned(specifier: SpecifierSet) -> bool: + for sp in specifier: + if sp.operator == "===": + return True + if sp.operator != "==": + continue + if sp.version.endswith(".*"): + continue + return True + return False + + pinned = is_pinned(specifier) + + # PackageFinder returns earlier versions first, so we reverse. + for ican in reversed(icans): + if not (all_yanked and pinned) and ican.link.is_yanked: + continue + func = functools.partial( + self._make_candidate_from_link, + link=ican.link, + extras=extras, + template=template, + name=name, + version=ican.version, + ) + yield ican.version, func + + return FoundCandidates( + iter_index_candidate_infos, + _get_installed_candidate(), + prefers_installed, + incompatible_ids, + ) + + def _iter_explicit_candidates_from_base( + self, + base_requirements: Iterable[Requirement], + extras: FrozenSet[str], + ) -> Iterator[Candidate]: + """Produce explicit candidates from the base given an extra-ed package. + + :param base_requirements: Requirements known to the resolver. The + requirements are guaranteed to not have extras. + :param extras: The extras to inject into the explicit requirements' + candidates. + """ + for req in base_requirements: + lookup_cand, _ = req.get_candidate_lookup() + if lookup_cand is None: # Not explicit. + continue + # We've stripped extras from the identifier, and should always + # get a BaseCandidate here, unless there's a bug elsewhere. + base_cand = as_base_candidate(lookup_cand) + assert base_cand is not None, "no extras here" + yield self._make_extras_candidate(base_cand, extras) + + def _iter_candidates_from_constraints( + self, + identifier: str, + constraint: Constraint, + template: InstallRequirement, + ) -> Iterator[Candidate]: + """Produce explicit candidates from constraints. + + This creates "fake" InstallRequirement objects that are basically clones + of what "should" be the template, but with original_link set to link. + """ + for link in constraint.links: + self._fail_if_link_is_unsupported_wheel(link) + candidate = self._make_base_candidate_from_link( + link, + template=install_req_from_link_and_ireq(link, template), + name=canonicalize_name(identifier), + version=None, + ) + if candidate: + yield candidate + + def find_candidates( + self, + identifier: str, + requirements: Mapping[str, Iterable[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + constraint: Constraint, + prefers_installed: bool, + is_satisfied_by: Callable[[Requirement, Candidate], bool], + ) -> Iterable[Candidate]: + # Collect basic lookup information from the requirements. + explicit_candidates: Set[Candidate] = set() + ireqs: List[InstallRequirement] = [] + for req in requirements[identifier]: + cand, ireq = req.get_candidate_lookup() + if cand is not None: + explicit_candidates.add(cand) + if ireq is not None: + ireqs.append(ireq) + + # If the current identifier contains extras, add requires and explicit + # candidates from entries from extra-less identifier. + with contextlib.suppress(InvalidRequirement): + parsed_requirement = get_requirement(identifier) + if parsed_requirement.name != identifier: + explicit_candidates.update( + self._iter_explicit_candidates_from_base( + requirements.get(parsed_requirement.name, ()), + frozenset(parsed_requirement.extras), + ), + ) + for req in requirements.get(parsed_requirement.name, []): + _, ireq = req.get_candidate_lookup() + if ireq is not None: + ireqs.append(ireq) + + # Add explicit candidates from constraints. We only do this if there are + # known ireqs, which represent requirements not already explicit. If + # there are no ireqs, we're constraining already-explicit requirements, + # which is handled later when we return the explicit candidates. + if ireqs: + try: + explicit_candidates.update( + self._iter_candidates_from_constraints( + identifier, + constraint, + template=ireqs[0], + ), + ) + except UnsupportedWheel: + # If we're constrained to install a wheel incompatible with the + # target architecture, no candidates will ever be valid. + return () + + # Since we cache all the candidates, incompatibility identification + # can be made quicker by comparing only the id() values. + incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())} + + # If none of the requirements want an explicit candidate, we can ask + # the finder for candidates. + if not explicit_candidates: + return self._iter_found_candidates( + ireqs, + constraint.specifier, + constraint.hashes, + prefers_installed, + incompat_ids, + ) + + return ( + c + for c in explicit_candidates + if id(c) not in incompat_ids + and constraint.is_satisfied_by(c) + and all(is_satisfied_by(req, c) for req in requirements[identifier]) + ) + + def _make_requirements_from_install_req( + self, ireq: InstallRequirement, requested_extras: Iterable[str] + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given InstallRequirement. In + most cases this will be a single object but the following special cases exist: + - the InstallRequirement has markers that do not apply -> result is empty + - the InstallRequirement has both a constraint (or link) and extras + -> result is split in two requirement objects: one with the constraint + (or link) and one with the extra. This allows centralized constraint + handling for the base, resulting in fewer candidate rejections. + """ + if not ireq.match_markers(requested_extras): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + ireq.name, + ireq.markers, + ) + elif not ireq.link: + if ireq.extras and ireq.req is not None and ireq.req.specifier: + yield SpecifierWithoutExtrasRequirement(ireq) + yield SpecifierRequirement(ireq) + else: + self._fail_if_link_is_unsupported_wheel(ireq.link) + # Always make the link candidate for the base requirement to make it + # available to `find_candidates` for explicit candidate lookup for any + # set of extras. + # The extras are required separately via a second requirement. + cand = self._make_base_candidate_from_link( + ireq.link, + template=install_req_drop_extras(ireq) if ireq.extras else ireq, + name=canonicalize_name(ireq.name) if ireq.name else None, + version=None, + ) + if cand is None: + # There's no way we can satisfy a URL requirement if the underlying + # candidate fails to build. An unnamed URL must be user-supplied, so + # we fail eagerly. If the URL is named, an unsatisfiable requirement + # can make the resolver do the right thing, either backtrack (and + # maybe find some other requirement that's buildable) or raise a + # ResolutionImpossible eventually. + if not ireq.name: + raise self._build_failures[ireq.link] + yield UnsatisfiableRequirement(canonicalize_name(ireq.name)) + else: + # require the base from the link + yield self.make_requirement_from_candidate(cand) + if ireq.extras: + # require the extras on top of the base candidate + yield self.make_requirement_from_candidate( + self._make_extras_candidate(cand, frozenset(ireq.extras)) + ) + + def collect_root_requirements( + self, root_ireqs: List[InstallRequirement] + ) -> CollectedRootRequirements: + collected = CollectedRootRequirements([], {}, {}) + for i, ireq in enumerate(root_ireqs): + if ireq.constraint: + # Ensure we only accept valid constraints + problem = check_invalid_constraint_type(ireq) + if problem: + raise InstallationError(problem) + if not ireq.match_markers(): + continue + assert ireq.name, "Constraint must be named" + name = canonicalize_name(ireq.name) + if name in collected.constraints: + collected.constraints[name] &= ireq + else: + collected.constraints[name] = Constraint.from_ireq(ireq) + else: + reqs = list( + self._make_requirements_from_install_req( + ireq, + requested_extras=(), + ) + ) + if not reqs: + continue + template = reqs[0] + if ireq.user_supplied and template.name not in collected.user_requested: + collected.user_requested[template.name] = i + collected.requirements.extend(reqs) + # Put requirements with extras at the end of the root requires. This does not + # affect resolvelib's picking preference but it does affect its initial criteria + # population: by putting extras at the end we enable the candidate finder to + # present resolvelib with a smaller set of candidates to resolvelib, already + # taking into account any non-transient constraints on the associated base. This + # means resolvelib will have fewer candidates to visit and reject. + # Python's list sort is stable, meaning relative order is kept for objects with + # the same key. + collected.requirements.sort(key=lambda r: r.name != r.project_name) + return collected + + def make_requirement_from_candidate( + self, candidate: Candidate + ) -> ExplicitRequirement: + return ExplicitRequirement(candidate) + + def make_requirements_from_spec( + self, + specifier: str, + comes_from: Optional[InstallRequirement], + requested_extras: Iterable[str] = (), + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given specifier. In most cases + this will be a single object but the following special cases exist: + - the specifier has markers that do not apply -> result is empty + - the specifier has both a constraint and extras -> result is split + in two requirement objects: one with the constraint and one with the + extra. This allows centralized constraint handling for the base, + resulting in fewer candidate rejections. + """ + ireq = self._make_install_req_from_spec(specifier, comes_from) + return self._make_requirements_from_install_req(ireq, requested_extras) + + def make_requires_python_requirement( + self, + specifier: SpecifierSet, + ) -> Optional[Requirement]: + if self._ignore_requires_python: + return None + # Don't bother creating a dependency for an empty Requires-Python. + if not str(specifier): + return None + return RequiresPythonRequirement(specifier, self._python_candidate) + + def get_wheel_cache_entry( + self, link: Link, name: Optional[str] + ) -> Optional[CacheEntry]: + """Look up the link in the wheel cache. + + If ``preparer.require_hashes`` is True, don't use the wheel cache, + because cached wheels, always built locally, have different hashes + than the files downloaded from the index server and thus throw false + hash mismatches. Furthermore, cached wheels at present have + nondeterministic contents due to file modification times. + """ + if self._wheel_cache is None: + return None + return self._wheel_cache.get_cache_entry( + link=link, + package_name=name, + supported_tags=self._supported_tags_cache, + ) + + def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]: + # TODO: Are there more cases this needs to return True? Editable? + dist = self._installed_dists.get(candidate.project_name) + if dist is None: # Not installed, no uninstallation required. + return None + + # We're installing into global site. The current installation must + # be uninstalled, no matter it's in global or user site, because the + # user site installation has precedence over global. + if not self._use_user_site: + return dist + + # We're installing into user site. Remove the user site installation. + if dist.in_usersite: + return dist + + # We're installing into user site, but the installed incompatible + # package is in global site. We can't uninstall that, and would let + # the new user installation to "shadow" it. But shadowing won't work + # in virtual environments, so we error out. + if running_under_virtualenv() and dist.in_site_packages: + message = ( + f"Will not install to the user site because it will lack " + f"sys.path precedence to {dist.raw_name} in {dist.location}" + ) + raise InstallationError(message) + return None + + def _report_requires_python_error( + self, causes: Sequence["ConflictCause"] + ) -> UnsupportedPythonVersion: + assert causes, "Requires-Python error reported with no cause" + + version = self._python_candidate.version + + if len(causes) == 1: + specifier = str(causes[0].requirement.specifier) + message = ( + f"Package {causes[0].parent.name!r} requires a different " + f"Python: {version} not in {specifier!r}" + ) + return UnsupportedPythonVersion(message) + + message = f"Packages require a different Python. {version} not in:" + for cause in causes: + package = cause.parent.format_for_error() + specifier = str(cause.requirement.specifier) + message += f"\n{specifier!r} (required by {package})" + return UnsupportedPythonVersion(message) + + def _report_single_requirement_conflict( + self, req: Requirement, parent: Optional[Candidate] + ) -> DistributionNotFound: + if parent is None: + req_disp = str(req) + else: + req_disp = f"{req} (from {parent.name})" + + cands = self._finder.find_all_candidates(req.project_name) + skipped_by_requires_python = self._finder.requires_python_skipped_reasons() + + versions_set: Set[Version] = set() + yanked_versions_set: Set[Version] = set() + for c in cands: + is_yanked = c.link.is_yanked if c.link else False + if is_yanked: + yanked_versions_set.add(c.version) + else: + versions_set.add(c.version) + + versions = [str(v) for v in sorted(versions_set)] + yanked_versions = [str(v) for v in sorted(yanked_versions_set)] + + if yanked_versions: + # Saying "version X is yanked" isn't entirely accurate. + # https://github.com/pypa/pip/issues/11745#issuecomment-1402805842 + logger.critical( + "Ignored the following yanked versions: %s", + ", ".join(yanked_versions) or "none", + ) + if skipped_by_requires_python: + logger.critical( + "Ignored the following versions that require a different python " + "version: %s", + "; ".join(skipped_by_requires_python) or "none", + ) + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req_disp, + ", ".join(versions) or "none", + ) + if str(req) == "requirements.txt": + logger.info( + "HINT: You are attempting to install a package literally " + 'named "requirements.txt" (which cannot exist). Consider ' + "using the '-r' flag to install the packages listed in " + "requirements.txt" + ) + + return DistributionNotFound(f"No matching distribution found for {req}") + + def get_installation_error( + self, + e: "ResolutionImpossible[Requirement, Candidate]", + constraints: Dict[str, Constraint], + ) -> InstallationError: + assert e.causes, "Installation error reported with no cause" + + # If one of the things we can't solve is "we need Python X.Y", + # that is what we report. + requires_python_causes = [ + cause + for cause in e.causes + if isinstance(cause.requirement, RequiresPythonRequirement) + and not cause.requirement.is_satisfied_by(self._python_candidate) + ] + if requires_python_causes: + # The comprehension above makes sure all Requirement instances are + # RequiresPythonRequirement, so let's cast for convenience. + return self._report_requires_python_error( + cast("Sequence[ConflictCause]", requires_python_causes), + ) + + # Otherwise, we have a set of causes which can't all be satisfied + # at once. + + # The simplest case is when we have *one* cause that can't be + # satisfied. We just report that case. + if len(e.causes) == 1: + req, parent = e.causes[0] + if req.name not in constraints: + return self._report_single_requirement_conflict(req, parent) + + # OK, we now have a list of requirements that can't all be + # satisfied at once. + + # A couple of formatting helpers + def text_join(parts: List[str]) -> str: + if len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def describe_trigger(parent: Candidate) -> str: + ireq = parent.get_install_requirement() + if not ireq or not ireq.comes_from: + return f"{parent.name}=={parent.version}" + if isinstance(ireq.comes_from, InstallRequirement): + return str(ireq.comes_from.name) + return str(ireq.comes_from) + + triggers = set() + for req, parent in e.causes: + if parent is None: + # This is a root requirement, so we can report it directly + trigger = req.format_for_error() + else: + trigger = describe_trigger(parent) + triggers.add(trigger) + + if triggers: + info = text_join(sorted(triggers)) + else: + info = "the requested packages" + + msg = ( + f"Cannot install {info} because these package versions " + "have conflicting dependencies." + ) + logger.critical(msg) + msg = "\nThe conflict is caused by:" + + relevant_constraints = set() + for req, parent in e.causes: + if req.name in constraints: + relevant_constraints.add(req.name) + msg = msg + "\n " + if parent: + msg = msg + f"{parent.name} {parent.version} depends on " + else: + msg = msg + "The user requested " + msg = msg + req.format_for_error() + for key in relevant_constraints: + spec = constraints[key].specifier + msg += f"\n The user requested (constraint) {key}{spec}" + + msg = ( + msg + + "\n\n" + + "To fix this you could try to:\n" + + "1. loosen the range of package versions you've specified\n" + + "2. remove package versions to allow pip to attempt to solve " + + "the dependency conflict\n" + ) + + logger.info(msg) + + return DistributionNotFound( + "ResolutionImpossible: for help visit " + "https://pip.pypa.io/en/latest/topics/dependency-resolution/" + "#dealing-with-dependency-conflicts" + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py new file mode 100644 index 0000000..a1d57e0 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py @@ -0,0 +1,174 @@ +"""Utilities to lazily create and visit candidates found. + +Creating and visiting a candidate is a *very* costly operation. It involves +fetching, extracting, potentially building modules from source, and verifying +distribution metadata. It is therefore crucial for performance to keep +everything here lazy all the way down, so we only touch candidates that we +absolutely need, and not "download the world" when we only need one version of +something. +""" + +import functools +import logging +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple + +from pip._vendor.packaging.version import _BaseVersion + +from pip._internal.exceptions import MetadataInvalid + +from .base import Candidate + +logger = logging.getLogger(__name__) + +IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]] + +if TYPE_CHECKING: + SequenceCandidate = Sequence[Candidate] +else: + # For compatibility: Python before 3.9 does not support using [] on the + # Sequence class. + # + # >>> from collections.abc import Sequence + # >>> Sequence[str] + # Traceback (most recent call last): + # File "", line 1, in + # TypeError: 'ABCMeta' object is not subscriptable + # + # TODO: Remove this block after dropping Python 3.8 support. + SequenceCandidate = Sequence + + +def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the package is not already installed. Candidates + from index come later in their normal ordering. + """ + versions_found: Set[_BaseVersion] = set() + for version, func in infos: + if version in versions_found: + continue + try: + candidate = func() + except MetadataInvalid as e: + logger.warning( + "Ignoring version %s of %s since it has invalid metadata:\n" + "%s\n" + "Please use pip<24.1 if you need to use this version.", + version, + e.ireq.name, + e, + ) + # Mark version as found to avoid trying other candidates with the same + # version, since they most likely have invalid metadata as well. + versions_found.add(version) + else: + if candidate is None: + continue + yield candidate + versions_found.add(version) + + +def _iter_built_with_prepended( + installed: Candidate, infos: Iterator[IndexCandidateInfo] +) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the resolver prefers the already-installed + candidate and NOT to upgrade. The installed candidate is therefore + always yielded first, and candidates from index come later in their + normal ordering, except skipped when the version is already installed. + """ + yield installed + versions_found: Set[_BaseVersion] = {installed.version} + for version, func in infos: + if version in versions_found: + continue + candidate = func() + if candidate is None: + continue + yield candidate + versions_found.add(version) + + +def _iter_built_with_inserted( + installed: Candidate, infos: Iterator[IndexCandidateInfo] +) -> Iterator[Candidate]: + """Iterator for ``FoundCandidates``. + + This iterator is used when the resolver prefers to upgrade an + already-installed package. Candidates from index are returned in their + normal ordering, except replaced when the version is already installed. + + The implementation iterates through and yields other candidates, inserting + the installed candidate exactly once before we start yielding older or + equivalent candidates, or after all other candidates if they are all newer. + """ + versions_found: Set[_BaseVersion] = set() + for version, func in infos: + if version in versions_found: + continue + # If the installed candidate is better, yield it first. + if installed.version >= version: + yield installed + versions_found.add(installed.version) + candidate = func() + if candidate is None: + continue + yield candidate + versions_found.add(version) + + # If the installed candidate is older than all other candidates. + if installed.version not in versions_found: + yield installed + + +class FoundCandidates(SequenceCandidate): + """A lazy sequence to provide candidates to the resolver. + + The intended usage is to return this from `find_matches()` so the resolver + can iterate through the sequence multiple times, but only access the index + page when remote packages are actually needed. This improve performances + when suitable candidates are already installed on disk. + """ + + def __init__( + self, + get_infos: Callable[[], Iterator[IndexCandidateInfo]], + installed: Optional[Candidate], + prefers_installed: bool, + incompatible_ids: Set[int], + ): + self._get_infos = get_infos + self._installed = installed + self._prefers_installed = prefers_installed + self._incompatible_ids = incompatible_ids + + def __getitem__(self, index: Any) -> Any: + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + def __iter__(self) -> Iterator[Candidate]: + infos = self._get_infos() + if not self._installed: + iterator = _iter_built(infos) + elif self._prefers_installed: + iterator = _iter_built_with_prepended(self._installed, infos) + else: + iterator = _iter_built_with_inserted(self._installed, infos) + return (c for c in iterator if id(c) not in self._incompatible_ids) + + def __len__(self) -> int: + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + @functools.lru_cache(maxsize=1) + def __bool__(self) -> bool: + if self._prefers_installed and self._installed: + return True + return any(self) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py new file mode 100644 index 0000000..fb0dd85 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -0,0 +1,258 @@ +import collections +import math +from functools import lru_cache +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + Iterator, + Mapping, + Sequence, + TypeVar, + Union, +) + +from pip._vendor.resolvelib.providers import AbstractProvider + +from .base import Candidate, Constraint, Requirement +from .candidates import REQUIRES_PYTHON_IDENTIFIER +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.providers import Preference + from pip._vendor.resolvelib.resolvers import RequirementInformation + + PreferenceInformation = RequirementInformation[Requirement, Candidate] + + _ProviderBase = AbstractProvider[Requirement, Candidate, str] +else: + _ProviderBase = AbstractProvider + +# Notes on the relationship between the provider, the factory, and the +# candidate and requirement classes. +# +# The provider is a direct implementation of the resolvelib class. Its role +# is to deliver the API that resolvelib expects. +# +# Rather than work with completely abstract "requirement" and "candidate" +# concepts as resolvelib does, pip has concrete classes implementing these two +# ideas. The API of Requirement and Candidate objects are defined in the base +# classes, but essentially map fairly directly to the equivalent provider +# methods. In particular, `find_matches` and `is_satisfied_by` are +# requirement methods, and `get_dependencies` is a candidate method. +# +# The factory is the interface to pip's internal mechanisms. It is stateless, +# and is created by the resolver and held as a property of the provider. It is +# responsible for creating Requirement and Candidate objects, and provides +# services to those objects (access to pip's finder and preparer). + + +D = TypeVar("D") +V = TypeVar("V") + + +def _get_with_identifier( + mapping: Mapping[str, V], + identifier: str, + default: D, +) -> Union[D, V]: + """Get item from a package name lookup mapping with a resolver identifier. + + This extra logic is needed when the target mapping is keyed by package + name, which cannot be directly looked up with an identifier (which may + contain requested extras). Additional logic is added to also look up a value + by "cleaning up" the extras from the identifier. + """ + if identifier in mapping: + return mapping[identifier] + # HACK: Theoretically we should check whether this identifier is a valid + # "NAME[EXTRAS]" format, and parse out the name part with packaging or + # some regular expression. But since pip's resolver only spits out three + # kinds of identifiers: normalized PEP 503 names, normalized names plus + # extras, and Requires-Python, we can cheat a bit here. + name, open_bracket, _ = identifier.partition("[") + if open_bracket and name in mapping: + return mapping[name] + return default + + +class PipProvider(_ProviderBase): + """Pip's provider implementation for resolvelib. + + :params constraints: A mapping of constraints specified by the user. Keys + are canonicalized project names. + :params ignore_dependencies: Whether the user specified ``--no-deps``. + :params upgrade_strategy: The user-specified upgrade strategy. + :params user_requested: A set of canonicalized package names that the user + supplied for pip to install/upgrade. + """ + + def __init__( + self, + factory: Factory, + constraints: Dict[str, Constraint], + ignore_dependencies: bool, + upgrade_strategy: str, + user_requested: Dict[str, int], + ) -> None: + self._factory = factory + self._constraints = constraints + self._ignore_dependencies = ignore_dependencies + self._upgrade_strategy = upgrade_strategy + self._user_requested = user_requested + self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf) + + def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str: + return requirement_or_candidate.name + + def get_preference( + self, + identifier: str, + resolutions: Mapping[str, Candidate], + candidates: Mapping[str, Iterator[Candidate]], + information: Mapping[str, Iterable["PreferenceInformation"]], + backtrack_causes: Sequence["PreferenceInformation"], + ) -> "Preference": + """Produce a sort key for given requirement based on preference. + + The lower the return value is, the more preferred this group of + arguments is. + + Currently pip considers the following in order: + + * Prefer if any of the known requirements is "direct", e.g. points to an + explicit URL. + * If equal, prefer if any requirement is "pinned", i.e. contains + operator ``===`` or ``==``. + * If equal, calculate an approximate "depth" and resolve requirements + closer to the user-specified requirements first. If the depth cannot + by determined (eg: due to no matching parents), it is considered + infinite. + * Order user-specified requirements by the order they are specified. + * If equal, prefers "non-free" requirements, i.e. contains at least one + operator, such as ``>=`` or ``<``. + * If equal, order alphabetically for consistency (helps debuggability). + """ + try: + next(iter(information[identifier])) + except StopIteration: + # There is no information for this identifier, so there's no known + # candidates. + has_information = False + else: + has_information = True + + if has_information: + lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) + candidate, ireqs = zip(*lookups) + else: + candidate, ireqs = None, () + + operators = [ + specifier.operator + for specifier_set in (ireq.specifier for ireq in ireqs if ireq) + for specifier in specifier_set + ] + + direct = candidate is not None + pinned = any(op[:2] == "==" for op in operators) + unfree = bool(operators) + + try: + requested_order: Union[int, float] = self._user_requested[identifier] + except KeyError: + requested_order = math.inf + if has_information: + parent_depths = ( + self._known_depths[parent.name] if parent is not None else 0.0 + for _, parent in information[identifier] + ) + inferred_depth = min(d for d in parent_depths) + 1.0 + else: + inferred_depth = math.inf + else: + inferred_depth = 1.0 + self._known_depths[identifier] = inferred_depth + + requested_order = self._user_requested.get(identifier, math.inf) + + # Requires-Python has only one candidate and the check is basically + # free, so we always do it first to avoid needless work if it fails. + requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER + + # Prefer the causes of backtracking on the assumption that the problem + # resolving the dependency tree is related to the failures that caused + # the backtracking + backtrack_cause = self.is_backtrack_cause(identifier, backtrack_causes) + + return ( + not requires_python, + not direct, + not pinned, + not backtrack_cause, + inferred_depth, + requested_order, + not unfree, + identifier, + ) + + def find_matches( + self, + identifier: str, + requirements: Mapping[str, Iterator[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + ) -> Iterable[Candidate]: + def _eligible_for_upgrade(identifier: str) -> bool: + """Are upgrades allowed for this project? + + This checks the upgrade strategy, and whether the project was one + that the user specified in the command line, in order to decide + whether we should upgrade if there's a newer version available. + + (Note that we don't need access to the `--upgrade` flag, because + an upgrade strategy of "to-satisfy-only" means that `--upgrade` + was not specified). + """ + if self._upgrade_strategy == "eager": + return True + elif self._upgrade_strategy == "only-if-needed": + user_order = _get_with_identifier( + self._user_requested, + identifier, + default=None, + ) + return user_order is not None + return False + + constraint = _get_with_identifier( + self._constraints, + identifier, + default=Constraint.empty(), + ) + return self._factory.find_candidates( + identifier=identifier, + requirements=requirements, + constraint=constraint, + prefers_installed=(not _eligible_for_upgrade(identifier)), + incompatibilities=incompatibilities, + is_satisfied_by=self.is_satisfied_by, + ) + + @lru_cache(maxsize=None) + def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: + return requirement.is_satisfied_by(candidate) + + def get_dependencies(self, candidate: Candidate) -> Sequence[Requirement]: + with_requires = not self._ignore_dependencies + return [r for r in candidate.iter_dependencies(with_requires) if r is not None] + + @staticmethod + def is_backtrack_cause( + identifier: str, backtrack_causes: Sequence["PreferenceInformation"] + ) -> bool: + for backtrack_cause in backtrack_causes: + if identifier == backtrack_cause.requirement.name: + return True + if backtrack_cause.parent and identifier == backtrack_cause.parent.name: + return True + return False diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py new file mode 100644 index 0000000..0594569 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py @@ -0,0 +1,81 @@ +from collections import defaultdict +from logging import getLogger +from typing import Any, DefaultDict + +from pip._vendor.resolvelib.reporters import BaseReporter + +from .base import Candidate, Requirement + +logger = getLogger(__name__) + + +class PipReporter(BaseReporter): + def __init__(self) -> None: + self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int) + + self._messages_at_reject_count = { + 1: ( + "pip is looking at multiple versions of {package_name} to " + "determine which version is compatible with other " + "requirements. This could take a while." + ), + 8: ( + "pip is still looking at multiple versions of {package_name} to " + "determine which version is compatible with other " + "requirements. This could take a while." + ), + 13: ( + "This is taking longer than usual. You might need to provide " + "the dependency resolver with stricter constraints to reduce " + "runtime. See https://pip.pypa.io/warnings/backtracking for " + "guidance. If you want to abort this run, press Ctrl + C." + ), + } + + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + self.reject_count_by_package[candidate.name] += 1 + + count = self.reject_count_by_package[candidate.name] + if count not in self._messages_at_reject_count: + return + + message = self._messages_at_reject_count[count] + logger.info("INFO: %s", message.format(package_name=candidate.name)) + + msg = "Will try a different candidate, due to conflict:" + for req_info in criterion.information: + req, parent = req_info.requirement, req_info.parent + # Inspired by Factory.get_installation_error + msg += "\n " + if parent: + msg += f"{parent.name} {parent.version} depends on " + else: + msg += "The user requested " + msg += req.format_for_error() + logger.debug(msg) + + +class PipDebuggingReporter(BaseReporter): + """A reporter that does an info log for every event it sees.""" + + def starting(self) -> None: + logger.info("Reporter.starting()") + + def starting_round(self, index: int) -> None: + logger.info("Reporter.starting_round(%r)", index) + + def ending_round(self, index: int, state: Any) -> None: + logger.info("Reporter.ending_round(%r, state)", index) + logger.debug("Reporter.ending_round(%r, %r)", index, state) + + def ending(self, state: Any) -> None: + logger.info("Reporter.ending(%r)", state) + + def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None: + logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent) + + def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None: + logger.info("Reporter.rejecting_candidate(%r, %r)", criterion, candidate) + + def pinning(self, candidate: Candidate) -> None: + logger.info("Reporter.pinning(%r)", candidate) diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py new file mode 100644 index 0000000..b04f41b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -0,0 +1,245 @@ +from typing import Any, Optional + +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name + +from pip._internal.req.constructors import install_req_drop_extras +from pip._internal.req.req_install import InstallRequirement + +from .base import Candidate, CandidateLookup, Requirement, format_name + + +class ExplicitRequirement(Requirement): + def __init__(self, candidate: Candidate) -> None: + self.candidate = candidate + + def __str__(self) -> str: + return str(self.candidate) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.candidate!r})" + + def __hash__(self) -> int: + return hash(self.candidate) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, ExplicitRequirement): + return False + return self.candidate == other.candidate + + @property + def project_name(self) -> NormalizedName: + # No need to canonicalize - the candidate did this + return self.candidate.project_name + + @property + def name(self) -> str: + # No need to canonicalize - the candidate did this + return self.candidate.name + + def format_for_error(self) -> str: + return self.candidate.format_for_error() + + def get_candidate_lookup(self) -> CandidateLookup: + return self.candidate, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + return candidate == self.candidate + + +class SpecifierRequirement(Requirement): + def __init__(self, ireq: InstallRequirement) -> None: + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = ireq + self._equal_cache: Optional[str] = None + self._hash: Optional[int] = None + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + + @property + def _equal(self) -> str: + if self._equal_cache is not None: + return self._equal_cache + + self._equal_cache = str(self._ireq) + return self._equal_cache + + def __str__(self) -> str: + return str(self._ireq.req) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._ireq.req)!r})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, SpecifierRequirement): + return NotImplemented + return self._equal == other._equal + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash(self._equal) + return self._hash + + @property + def project_name(self) -> NormalizedName: + assert self._ireq.req, "Specifier-backed ireq is always PEP 508" + return canonicalize_name(self._ireq.req.name) + + @property + def name(self) -> str: + return format_name(self.project_name, self._extras) + + def format_for_error(self) -> str: + # Convert comma-separated specifiers into "A, B, ..., F and G" + # This makes the specifier a bit more "human readable", without + # risking a change in meaning. (Hopefully! Not all edge cases have + # been checked) + parts = [s.strip() for s in str(self).split(",")] + if len(parts) == 0: + return "" + elif len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def get_candidate_lookup(self) -> CandidateLookup: + return None, self._ireq + + def is_satisfied_by(self, candidate: Candidate) -> bool: + assert candidate.name == self.name, ( + f"Internal issue: Candidate is not for this requirement " + f"{candidate.name} vs {self.name}" + ) + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + assert self._ireq.req, "Specifier-backed ireq is always PEP 508" + spec = self._ireq.req.specifier + return spec.contains(candidate.version, prereleases=True) + + +class SpecifierWithoutExtrasRequirement(SpecifierRequirement): + """ + Requirement backed by an install requirement on a base package. + Trims extras from its install requirement if there are any. + """ + + def __init__(self, ireq: InstallRequirement) -> None: + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = install_req_drop_extras(ireq) + self._equal_cache: Optional[str] = None + self._hash: Optional[int] = None + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + + @property + def _equal(self) -> str: + if self._equal_cache is not None: + return self._equal_cache + + self._equal_cache = str(self._ireq) + return self._equal_cache + + def __eq__(self, other: object) -> bool: + if not isinstance(other, SpecifierWithoutExtrasRequirement): + return NotImplemented + return self._equal == other._equal + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash(self._equal) + return self._hash + + +class RequiresPythonRequirement(Requirement): + """A requirement representing Requires-Python metadata.""" + + def __init__(self, specifier: SpecifierSet, match: Candidate) -> None: + self.specifier = specifier + self._specifier_string = str(specifier) # for faster __eq__ + self._hash: Optional[int] = None + self._candidate = match + + def __str__(self) -> str: + return f"Python {self.specifier}" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self.specifier)!r})" + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + + self._hash = hash((self._specifier_string, self._candidate)) + return self._hash + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, RequiresPythonRequirement): + return False + return ( + self._specifier_string == other._specifier_string + and self._candidate == other._candidate + ) + + @property + def project_name(self) -> NormalizedName: + return self._candidate.project_name + + @property + def name(self) -> str: + return self._candidate.name + + def format_for_error(self) -> str: + return str(self) + + def get_candidate_lookup(self) -> CandidateLookup: + if self.specifier.contains(self._candidate.version, prereleases=True): + return self._candidate, None + return None, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + assert candidate.name == self._candidate.name, "Not Python candidate" + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) + + +class UnsatisfiableRequirement(Requirement): + """A requirement that cannot be satisfied.""" + + def __init__(self, name: NormalizedName) -> None: + self._name = name + + def __str__(self) -> str: + return f"{self._name} (unavailable)" + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({str(self._name)!r})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, UnsatisfiableRequirement): + return NotImplemented + return self._name == other._name + + def __hash__(self) -> int: + return hash(self._name) + + @property + def project_name(self) -> NormalizedName: + return self._name + + @property + def name(self) -> str: + return self._name + + def format_for_error(self) -> str: + return str(self) + + def get_candidate_lookup(self) -> CandidateLookup: + return None, None + + def is_satisfied_by(self, candidate: Candidate) -> bool: + return False diff --git a/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py new file mode 100644 index 0000000..c12beef --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -0,0 +1,317 @@ +import contextlib +import functools +import logging +import os +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible +from pip._vendor.resolvelib import Resolver as RLResolver +from pip._vendor.resolvelib.structs import DirectedGraph + +from pip._internal.cache import WheelCache +from pip._internal.index.package_finder import PackageFinder +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import install_req_extend_extras +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_set import RequirementSet +from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider +from pip._internal.resolution.resolvelib.provider import PipProvider +from pip._internal.resolution.resolvelib.reporter import ( + PipDebuggingReporter, + PipReporter, +) +from pip._internal.utils.packaging import get_requirement + +from .base import Candidate, Requirement +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.resolvers import Result as RLResult + + Result = RLResult[Requirement, Candidate, str] + + +logger = logging.getLogger(__name__) + + +class Resolver(BaseResolver): + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + py_version_info: Optional[Tuple[int, ...]] = None, + ): + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + self.factory = Factory( + finder=finder, + preparer=preparer, + make_install_req=make_install_req, + wheel_cache=wheel_cache, + use_user_site=use_user_site, + force_reinstall=force_reinstall, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + py_version_info=py_version_info, + ) + self.ignore_dependencies = ignore_dependencies + self.upgrade_strategy = upgrade_strategy + self._result: Optional[Result] = None + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + collected = self.factory.collect_root_requirements(root_reqs) + provider = PipProvider( + factory=self.factory, + constraints=collected.constraints, + ignore_dependencies=self.ignore_dependencies, + upgrade_strategy=self.upgrade_strategy, + user_requested=collected.user_requested, + ) + if "PIP_RESOLVER_DEBUG" in os.environ: + reporter: BaseReporter = PipDebuggingReporter() + else: + reporter = PipReporter() + resolver: RLResolver[Requirement, Candidate, str] = RLResolver( + provider, + reporter, + ) + + try: + limit_how_complex_resolution_can_be = 200000 + result = self._result = resolver.resolve( + collected.requirements, max_rounds=limit_how_complex_resolution_can_be + ) + + except ResolutionImpossible as e: + error = self.factory.get_installation_error( + cast("ResolutionImpossible[Requirement, Candidate]", e), + collected.constraints, + ) + raise error from e + + req_set = RequirementSet(check_supported_wheels=check_supported_wheels) + # process candidates with extras last to ensure their base equivalent is + # already in the req_set if appropriate. + # Python's sort is stable so using a binary key function keeps relative order + # within both subsets. + for candidate in sorted( + result.mapping.values(), key=lambda c: c.name != c.project_name + ): + ireq = candidate.get_install_requirement() + if ireq is None: + if candidate.name != candidate.project_name: + # extend existing req's extras + with contextlib.suppress(KeyError): + req = req_set.get_requirement(candidate.project_name) + req_set.add_named_requirement( + install_req_extend_extras( + req, get_requirement(candidate.name).extras + ) + ) + continue + + # Check if there is already an installation under the same name, + # and set a flag for later stages to uninstall it, if needed. + installed_dist = self.factory.get_dist_to_uninstall(candidate) + if installed_dist is None: + # There is no existing installation -- nothing to uninstall. + ireq.should_reinstall = False + elif self.factory.force_reinstall: + # The --force-reinstall flag is set -- reinstall. + ireq.should_reinstall = True + elif installed_dist.version != candidate.version: + # The installation is different in version -- reinstall. + ireq.should_reinstall = True + elif candidate.is_editable or installed_dist.editable: + # The incoming distribution is editable, or different in + # editable-ness to installation -- reinstall. + ireq.should_reinstall = True + elif candidate.source_link and candidate.source_link.is_file: + # The incoming distribution is under file:// + if candidate.source_link.is_wheel: + # is a local wheel -- do nothing. + logger.info( + "%s is already installed with the same version as the " + "provided wheel. Use --force-reinstall to force an " + "installation of the wheel.", + ireq.name, + ) + continue + + # is a local sdist or path -- reinstall + ireq.should_reinstall = True + else: + continue + + link = candidate.source_link + if link and link.is_yanked: + # The reason can contain non-ASCII characters, Unicode + # is required for Python 2. + msg = ( + "The candidate selected for download or install is a " + "yanked version: {name!r} candidate (version {version} " + "at {link})\nReason for being yanked: {reason}" + ).format( + name=candidate.name, + version=candidate.version, + link=link, + reason=link.yanked_reason or "", + ) + logger.warning(msg) + + req_set.add_named_requirement(ireq) + + reqs = req_set.all_requirements + self.factory.preparer.prepare_linked_requirements_more(reqs) + for req in reqs: + req.prepared = True + req.needs_more_preparation = False + return req_set + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Get order for installation of requirements in RequirementSet. + + The returned list contains a requirement before another that depends on + it. This helps ensure that the environment is kept consistent as they + get installed one-by-one. + + The current implementation creates a topological ordering of the + dependency graph, giving more weight to packages with less + or no dependencies, while breaking any cycles in the graph at + arbitrary points. We make no guarantees about where the cycle + would be broken, other than it *would* be broken. + """ + assert self._result is not None, "must call resolve() first" + + if not req_set.requirements: + # Nothing is left to install, so we do not need an order. + return [] + + graph = self._result.graph + weights = get_topological_weights(graph, set(req_set.requirements.keys())) + + sorted_items = sorted( + req_set.requirements.items(), + key=functools.partial(_req_set_item_sorter, weights=weights), + reverse=True, + ) + return [ireq for _, ireq in sorted_items] + + +def get_topological_weights( + graph: "DirectedGraph[Optional[str]]", requirement_keys: Set[str] +) -> Dict[Optional[str], int]: + """Assign weights to each node based on how "deep" they are. + + This implementation may change at any point in the future without prior + notice. + + We first simplify the dependency graph by pruning any leaves and giving them + the highest weight: a package without any dependencies should be installed + first. This is done again and again in the same way, giving ever less weight + to the newly found leaves. The loop stops when no leaves are left: all + remaining packages have at least one dependency left in the graph. + + Then we continue with the remaining graph, by taking the length for the + longest path to any node from root, ignoring any paths that contain a single + node twice (i.e. cycles). This is done through a depth-first search through + the graph, while keeping track of the path to the node. + + Cycles in the graph result would result in node being revisited while also + being on its own path. In this case, take no action. This helps ensure we + don't get stuck in a cycle. + + When assigning weight, the longer path (i.e. larger length) is preferred. + + We are only interested in the weights of packages that are in the + requirement_keys. + """ + path: Set[Optional[str]] = set() + weights: Dict[Optional[str], int] = {} + + def visit(node: Optional[str]) -> None: + if node in path: + # We hit a cycle, so we'll break it here. + return + + # Time to visit the children! + path.add(node) + for child in graph.iter_children(node): + visit(child) + path.remove(node) + + if node not in requirement_keys: + return + + last_known_parent_count = weights.get(node, 0) + weights[node] = max(last_known_parent_count, len(path)) + + # Simplify the graph, pruning leaves that have no dependencies. + # This is needed for large graphs (say over 200 packages) because the + # `visit` function is exponentially slower then, taking minutes. + # See https://github.com/pypa/pip/issues/10557 + # We will loop until we explicitly break the loop. + while True: + leaves = set() + for key in graph: + if key is None: + continue + for _child in graph.iter_children(key): + # This means we have at least one child + break + else: + # No child. + leaves.add(key) + if not leaves: + # We are done simplifying. + break + # Calculate the weight for the leaves. + weight = len(graph) - 1 + for leaf in leaves: + if leaf not in requirement_keys: + continue + weights[leaf] = weight + # Remove the leaves from the graph, making it simpler. + for leaf in leaves: + graph.remove(leaf) + + # Visit the remaining graph. + # `None` is guaranteed to be the root node by resolvelib. + visit(None) + + # Sanity check: all requirement keys should be in the weights, + # and no other keys should be in the weights. + difference = set(weights.keys()).difference(requirement_keys) + assert not difference, difference + + return weights + + +def _req_set_item_sorter( + item: Tuple[str, InstallRequirement], + weights: Dict[Optional[str], int], +) -> Tuple[int, str]: + """Key function used to sort install requirements for installation. + + Based on the "weight" mapping calculated in ``get_installation_order()``. + The canonical package name is returned as the second member as a tie- + breaker to ensure the result is predictable, which is useful in tests. + """ + name = canonicalize_name(item[0]) + return weights[name], name diff --git a/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py b/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py new file mode 100644 index 0000000..f9a91af --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py @@ -0,0 +1,244 @@ +import datetime +import functools +import hashlib +import json +import logging +import optparse +import os.path +import sys +from dataclasses import dataclass +from typing import Any, Callable, Dict, Optional + +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.rich.console import Group +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text + +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import get_default_environment +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.entrypoints import ( + get_best_invocation_for_this_pip, + get_best_invocation_for_this_python, +) +from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace +from pip._internal.utils.misc import ensure_dir + +_WEEK = datetime.timedelta(days=7) + +logger = logging.getLogger(__name__) + + +def _get_statefile_name(key: str) -> str: + key_bytes = key.encode() + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +def _convert_date(isodate: str) -> datetime.datetime: + """Convert an ISO format string to a date. + + Handles the format 2020-01-22T14:24:01Z (trailing Z) + which is not supported by older versions of fromisoformat. + """ + return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00")) + + +class SelfCheckState: + def __init__(self, cache_dir: str) -> None: + self._state: Dict[str, Any] = {} + self._statefile_path = None + + # Try to load the existing state + if cache_dir: + self._statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self._statefile_path, encoding="utf-8") as statefile: + self._state = json.load(statefile) + except (OSError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self) -> str: + return sys.prefix + + def get(self, current_time: datetime.datetime) -> Optional[str]: + """Check if we have a not-outdated version loaded already.""" + if not self._state: + return None + + if "last_check" not in self._state: + return None + + if "pypi_version" not in self._state: + return None + + # Determine if we need to refresh the state + last_check = _convert_date(self._state["last_check"]) + time_since_last_check = current_time - last_check + if time_since_last_check > _WEEK: + return None + + return self._state["pypi_version"] + + def set(self, pypi_version: str, current_time: datetime.datetime) -> None: + # If we do not have a path to cache in, don't bother saving. + if not self._statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self._statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self._statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.isoformat(), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self._statefile_path) as f: + f.write(text.encode()) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self._statefile_path) + except OSError: + # Best effort. + pass + + +@dataclass +class UpgradePrompt: + old: str + new: str + + def __rich__(self) -> Group: + if WINDOWS: + pip_cmd = f"{get_best_invocation_for_this_python()} -m pip" + else: + pip_cmd = get_best_invocation_for_this_pip() + + notice = "[bold][[reset][blue]notice[reset][bold]][reset]" + return Group( + Text(), + Text.from_markup( + f"{notice} A new release of pip is available: " + f"[red]{self.old}[reset] -> [green]{self.new}[reset]" + ), + Text.from_markup( + f"{notice} To update, run: " + f"[green]{escape(pip_cmd)} install --upgrade pip" + ), + ) + + +def was_installed_by_pip(pkg: str) -> bool: + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + dist = get_default_environment().get_distribution(pkg) + return dist is not None and "pip" == dist.installer + + +def _get_current_remote_pip_version( + session: PipSession, options: optparse.Values +) -> Optional[str]: + # Lets use PackageFinder to see what the latest pip version is + link_collector = LinkCollector.create( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return None + + return str(best_candidate.version) + + +def _self_version_check_logic( + *, + state: SelfCheckState, + current_time: datetime.datetime, + local_version: Version, + get_remote_version: Callable[[], Optional[str]], +) -> Optional[UpgradePrompt]: + remote_version_str = state.get(current_time) + if remote_version_str is None: + remote_version_str = get_remote_version() + if remote_version_str is None: + logger.debug("No remote pip version found") + return None + state.set(remote_version_str, current_time) + + remote_version = parse_version(remote_version_str) + logger.debug("Remote version of pip: %s", remote_version) + logger.debug("Local version of pip: %s", local_version) + + pip_installed_by_pip = was_installed_by_pip("pip") + logger.debug("Was pip installed by pip? %s", pip_installed_by_pip) + if not pip_installed_by_pip: + return None # Only suggest upgrade if pip is installed by pip. + + local_version_is_older = ( + local_version < remote_version + and local_version.base_version != remote_version.base_version + ) + if local_version_is_older: + return UpgradePrompt(old=str(local_version), new=remote_version_str) + + return None + + +def pip_self_version_check(session: PipSession, options: optparse.Values) -> None: + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_dist = get_default_environment().get_distribution("pip") + if not installed_dist: + return + + upgrade_prompt = _self_version_check_logic( + state=SelfCheckState(cache_dir=options.cache_dir), + current_time=datetime.datetime.now(datetime.timezone.utc), + local_version=installed_dist.version, + get_remote_version=functools.partial( + _get_current_remote_pip_version, session, options + ), + ) + if upgrade_prompt is not None: + logger.warning("%s", upgrade_prompt, extra={"rich": True}) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..010ebd5bf745744ba424e6295f0c6d2654685d68 GIT binary patch literal 210 zcmX@j%ge<81g`Nh=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJV73yc?=celCmS!a8 z<|d}-yW}UA=BDPA6zjWZmUxsV=^Gjt=(;3U7VG+_={o19r0S>UmFeeXCg~ScmSp7T z8S5Du=@(~~r0NzVCTAz6rxxoMWESYhXXcfp7Ud=8=$Dpc<`nD40|hcm;^XxSDsOSv exJd2*kx8#z$sGM#ds$APWE`S~wa2 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf2f3e029ec38f3a9680dee0b351203890a694d9 GIT binary patch literal 4545 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f51db28ce78be09cb340621c846c5db1896c2d12 GIT binary patch literal 1881 zcmZuxOK%)S5bk;G&U$v8- zR=Gu3m1}E_GRYHr7xJUDEoSi=t8uGqvWZ(}dxF)O4b~p$PGj@Og}zj29By(NrM+I5 z^lW>Pcf*8B+R3-_buMTp3Z$gnR8Y0b={1bz!rkCvC6#>IbzSEgjk#J)nQPl&5-NX` zaN40UWTGpac7iD43_M7~X^;$P3dsbGQ`V2*M70{IJgB^k+vDnDagzNA%V{}!W}Hg~ znb`@Xdenra4z8C{8#%*iaCQhMfF5bl0^rbqjw;3*&PIHLN48Btt}b0Zf9c8+4JDMPZg8H^4_hBxf+87R zTsr^pvYUrxMl5@o8Hk?Ds@HE6R&do9NvormRe(i0V0FW@pmvB(w#XWI&x;y=v!(U) zE&W^Vr)o&HjPJBBwJXHYa=hTGnKingV`ir0QCA>RVgeO%QktN!j{jnBHI2C!_g8~B z4w$!?cKR_-l=PNEb)moFotm4QT?__t_EL9tA!Xd-$%Yq&E8hA5UOzeQo_fcVq2jaa zLFanV6cx0Z1;ko(RGcQmQ>vg=_6sT?TNAuX{>Z_Yy z+}ySHUcKL(-&4Of=fB_BZ_eMZ%?}}jI968k{UnIF?`O8}7qkMu;rpNUgJ`s4`94cK zuxv;r1onw|8PpF%yn_BqsH{@qKZ#_zMIP%$rFLLzl{0rv9}qBmGB@`+x%rtL;$o2m zzt2oOP}ITgXrM}|f`g|HFM!%1YP|R4F;zJY$QnjJCtKw1=$pHv=f|hsJP(j!2R~_= z8M@L}lqa$;pu5t(pwECj>S>^C!9dO&Qy>xY@-u6cFPj*5p`(d6U|-_#v_R@4#-loc z8>qI)KlSD}le;$_PR;F4&D}ftU~2wB{mgx{z~-5L#nW;uklasWu{I_)Y>Y%cGx=Ac%Uv2K6k5R@w}R_~3xm?nL&OodXv?XHH^F8{WI6d3aPSr{(g+y4 zh%={!#KL%S9Mzb&S>x%+D=2JY^T@YAZIi?TD=*IWO z+pvrLk>@}i7@DR%)+?GhJVLbQU*zOLjnpT%t;4FNow>cd)B3t~NWeWfs%vL&FB}js PcRm`TIkYWpHox=#k6*{= literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f6846d702b2960817df3eb20da82fbc4385890d GIT binary patch literal 2425 zcma)8O-$TI6t=zI^#B)k$QoEMC#I0(?f3?(MzKq`ewWfh|(rc+IjQy=DnHk zdvClyWim1c^11$XaWTblztKTUq-JO5d+6NbEN+~$cuR2jah_>mTmYSL5*2Y=E5M$&9s&D&ogb9P7f(#*%YP$g}*`BLHc<_r+725$)TYExc z6v1;58&+sI&TNl5g^+K%Mdmp`Bp|A95Yi(XuB9S4alq_U3wu7;fLCKOKv;#%YSS4U zQ#DJ5TSQht{)2KcoaZC)x=jMm?Y?6KaP$hjaU{XjU891cRD4yFr}j+|K_}q1(+ABx zF4$cw3r&lCss=nh5gs>JM!9@qcnHF^K>#BRN*>M&QCe>z9d(2RVcj&$64K!yc^)Uh z7oic<*S=QrDoCq@C8JU?EbXdih84Iu(XQFS7vY3Zi1KEvuYblwK58byol0GSs8iZzomRMSBz zw;i0}xSH^|$p;o{!YF4Y<`XpzGV=dDDTjE1eJ$SR6K~j`Ic$IHB*3~jJoHGwX|Tf7 zbWZ+OE0~@;X&1G;gy}t^4CCH10)tW?2_A_=sHswvv{W*0J4iMtAHfq|>d0URnjg^nTHCy<(Ui(c>gz(P=1r0v6weANdBF1@0wf_{_R; zrhZ}NtEbmCmFo*vx23jQ)y3+q`NjFWW1CXvi|o-QrIF%JbS;ehEOl&mo_cWM{)GoU z_j~H!tx6l6pDkryDw#V2w+FVA)9cFVWp6_%tceBO4j~TD5Fb_`L!gc2uxhgSsgD4{ z_JHOUlNwj!TP%%oLF$`tDZ0<|bWekEG@#dwKQmVv9bJA|`fo=-*zGE1U#>p5WH z!~|sz;FcHm@Fz6sn>gcB&}YqA=n(o!K-oz0t=eMk?#y%P!|iN$z4)-YksVk|4=}X5 z)|IaMwUzK`aZ?#y6Nh7%b{`h-uvNuo6$i792$$0Ne%kzX067 zW1fElT}eh)qQ+C-HNJdEnFTZ>n3OwOy*=G3AuCnn=U^HrlZG+gXtr9wc z9hV9a*?(zH)KFmN)3_6s@%yxiD~vvV`fi0~*)Xm`R&q(=J9dEIp-v@MKge&A3|V4h z_}=a3Im#VyKyWu~{TP14hUNh2x%akm=ht)R>($lnXO}l~U#?|utfgQ{EC zdX-jqtqxP5R?ac?v}=csUY!#85q^2J!BPG2a;#VTci6abq>a~>%?1amZawV((f*Tm H+1dU9SLrDG literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc7c69bf79b2f1b0998c4de46bef2ea5ae2c372c GIT binary patch literal 2922 zcmaJDTWlN0aqq#`krZiBjw~52&X#MNjU*~oBF zyGzp)q*M(8R00A>ZVE_6Q?zJ*Y&byjna}1cANdij0Cd+bV6;U6|1nVt6#44xQIr_j z=zu$OyF0I)*_q`R(Wrs|E^9XnS_q+k@<|6GyB|9h0ig|Kpe!;3L$rmg=us&vc~s8I z9`$8?KqcE>4rBuYDj-Atvycsn$dpRG9i{u!RPKXb4%x8bGb4G?@V_T#qej5&fq5)1 z8$p=IO<(Cmo39%ip?MJ@+;57dlilm>@6xGf*Rp+1B7}^Dp@9A{j0lXVXA3M2fIwa` zdfxM8`-;ej{YA(g2Ft_G>M5n3T{GgHv)mSlDxl{}8i(f3Aaq;6G2oC(W6#mk%Q>QptXeBQ)FwVd5g)1m6sIxV`6dJ8rz*CDFz7;44VY2L+U#jps) z)?AhHt%=NMF4?lgUgcWhQHc*epC%uDF<9#@NN|NX4p*YPU?saPepr+u-f^ zC>+hkaA{Fe#QYX}--K&b)o_M4p@j4sAt5oDCn&dDBe02(4~7^1-+C2E_xAQfZwU8y(}3qG=k=h( z6L$a>yAoFNAJ~NHzRptc+1-TzLLEy>LYF14pL~~pQRq}hsnb)s7?#8?X&$@-urCc) zN6d8l#lw66N{IstFkM6)`{a0+t-k-q`Fu}3`~4lcMf7`Qh<^|}+TRtDlAeU5C@R1; zuY6RV#M4BDIvZ8I^-0$xs^d~M@7lIoQ%SvSTh2V0@OHUmkmoUD2KIk4^)_!Go(n(q3ShY1cu3K$+JlOhW z>5NyY6Y6Zybi6~WU|;W?PIa-G)1A{)oikNz>JSWmQl_M}ne>(P^mKZ5A@v=J3+k+8 z+g_mBjfjU3Vum{^NiyOUolYrcqDz?UR!oNl)7rJk^vv`PdLwcu)Sz4!e{s~1K3meb!vQM`Apwpv?zXZ4*;3w5N(^pZ-@LMQ;ul+k*S32zTanBTI0b$2Dfjzn7!V8W_AwU3CUL7c zXR@H_ndfcDHn9rp?37Scm7uj8bQk8}PL9PLRG zejZ3$J8!I)Ul5I&x2e`qf_amE6$Y6A1Zni6LxauuP$NFnj3*oMs+p4m{d%mEhA{eZY1L1;`oZjgCpA zPMDw8D}2Q>4=SKcK}87O_-WuZF$-#%qnAxs^mA!gk>_03_MR$G0rexnyXIYK7TNtf z0WTdC8~htVEVLIlFI<@Cngu)mG?)VQgDI&&w_-B4gZXQ64|y^1Dux9wmR+N2o3G+Y z*y7I?`8ObV1O?$MQ4o4}{75+Z2=zQdp+`vhJ39Oi<%i3GmLDlcSNfZw!A59s^Za(` z7S1zsg@A!cC>p>J7TMmPGxMyv6 zb-1YtAH1W{{b-9 BwP^qV literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d248836118eb22ce869d6a4b5ae25a0b1d258c5c GIT binary patch literal 6365 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8ad89a10edb8a575fd5c4ab33ee148a75d399a0 GIT binary patch literal 699 zcmZuvzi$&U6t?etNmMSVQW;?CAsC2I;uORNEKPu=WnhbtPR`lQU2}Ine7;nNQYiyV zC)nDtBd7}_{{suC1Cqsn#KaZ|6BG842nq3|_rCYT&+qe--#43UKuh0$I{KmUs|i-p zSUQUv+BpUk3;>1His1lKn^_cTb+p!)z1N`i7ifS=tJQekdBBBt5VF+EqRcxWsmwje zy&z=4*pngiD3Q$5XJnMH&e}IKW>=w-5uu!fr!rJFC8eqfCJT`U_L7GIN2`e!6K#%x z)b@|;TPyD`?wiy9$k{SJv?W}X{?|JNQ#iHGma`Ah)SjYo4}d421$SGvYM4iu2PkAb zbS1;meSuqNy3xwdP%IX5h1X>E+JR&L?;Cqq}+TUY+%qnUm|M&S`$` z-kkNnTv&f~=jh%Cba|nBK+92e-={qAePKR~vNZ>VhMdRM?Qej%sMEqVwZ`3q(;{Z~ t#fA>e{;R=r8$$Tqf)Fig0Itt#2wph}=0L;iYZbiRuHaqor%6^f{s!XbsK)>R literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b40492b4e221ab37cf903f8c265c88b485090374 GIT binary patch literal 4206 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 S7Jqlfpx@hl$99l0y!sy*p9mlT literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a13dbc6f57d5d30c6ccc6e8cc179eb236fc52b6 GIT binary patch literal 3221 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66a4e93363f53b21c0877f924437f911271bf4c0 GIT binary patch literal 4008 zcmb7HU2GHC6~1GSf8zW&P8=tsp+R*vhtH2dY(n_Mv?Wn^bE1)N^M%aiD2w zuRL?_+@Ev5d(OGvIsQ$1djvt5$bNtR@2v>^iGO${*l29t77$uNGLi)qW!zfG2+p@J z<8x|%#t*em6}3PnpanBQfzR`+AuXHxZ?7Q6~!t6zq>5x0*77`=@(zORh_#;P1cV3iRKL}*v(C*6n z z%WcbocVGcoA#c2?hFO&KNngR1V??*8q~ZlCnI@q)Z%{0$DmGLZ^P!4qD7wW`kqCw| z1!pv9tb(Dl5o{HRLNQ>0eR5pK&?o6K)(mDj@<2Mw z(Ev`Fil+VL4Iot}i6pet89jNgIpPQ?5Y-&P3k2)NLPM9XW%BNEOZ0UkVK7F+j?57Od*ED&Qm_g(bdqxQJ^*IF zdiI+$=VvBQx=Lbrj&MwhUN+t*GM=k&Slk6zjw+_*NloD^{O}73I7nVnR9FD#&X>S{ z2?mWaFblUbct$F6StSw}oe_cymSwV&>GZr}6-sldoS~)7iYcXGUfT7D^zq{-PPon| zmlemY!6ssnT5f?ITA<$E6Azy_6pvGh~t`dO58sb8vd@)kjlr zzmsMld(@P2?@RN9IU312P7WNBE?J7oU{UiLniV^oZP=K`07Wl{GYqdKwAF_K;SZ;O zG`%jy>tcMv7ibyW@`nP!txnX|c~|`L$(q=+2~$yyzr4bOiyxlNp8>b*~*W?kIomu8<8_S!`!ta)E<4LsD4xG20qcKfR<`PYsW9sfRB9C*UJvc@z=-Db_iMY?U=WlK6b%e-R9$}uZ$M`RX_dE+77(q=-Lk|5+bXjhkY^d1_ZlUq$hc&#A^JS)4zCwHR=def=I?FzY(_2V7ADEku4S> z1X6BPJ7`h}YS-^c9=;Th*pU`1cI{sWWWPuBPa1#mxZvL<$)*bGDk9G zcLIKiR-Y&o?N-G zeBsmXhy4%wYon*v;%AmFZiP`-e5H4}cRjYh9^3!v;KRcY4nIsiNIgkB?OGc=wH7v^~1^bZQMx)Y|s`u@ifsW|n7aL&ts_Ki=qA zj~}SV4?N?)gMSP7d%89vs1N@%y3vdF9Nrp0(RbE5j@H_bJ(;Yvo~ntbXcwIJ6?)|a z;n3^vps|x)cT44fYPSic=wZ1Y;px=BKdzN(K7zG1Iu zbEVg+`kK^DeN|x=RpIg`g&U{-=L@>?X1d8;Dj9ZfSET82l*cv7|ApA$Ik;!sRVil( zI>=uK;Fa{-epo;c^NzRR#kiV152XirH-DYyL$mN&LVu35-$~s{Esed1#_lZKT3C{+z; zW^^Nn+M-L-j=7Vh37%FqIJ78VXuqq~GE|kNg+`M)ISSqz0=2JOUN%8** zPKsgozdGpT06b-a>+CX9TO-o~0eQm?Xj0LDBt=tzlPKomyR(q38ViKqYK!PRD`UV( z)R0R#i}Dx)364c=KO`DX65(7{M_KT9CE!qolj0n4FMIfu21`|PhMs}7Jbtpj!fV4X z2*PvJ`5d)8NA1s1ph3+J%?(; z@77LU{H$kYGvMD7{6o*o&4~>^YH7U_x)r(`_({jJo|%_?1TvqOZE+!S_uYHrtKIj{ x*SimGAozYVw8^WDRG)DA5wxM&_(rP`eKfm;p!&yGKM-Iw<5%&Qk-jlO{1=<5&Ncu5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06be7b9548ac549af23ec3a0bd7cb8f9a7459af8 GIT binary patch literal 7344 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 b{M1tCo>eRt8yTiIZ%6Uo1^ZJ>j1B#7$mlsV literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22ce4e1536889be4b29cb66acd3915ce3d43b45a GIT binary patch literal 1179 zcmZ8fOK;Oa5Z?7GiA$U|s0hTxv>Y%}Y$yl`@e-6kE1?#(DO47capFy5@JnmE5Q|3+ z96($G7kcCf;=<2Bf&)>JhjGj>&Jvo;9+HFdR_-LR zR$eb`;|m!tBEHG!;&X;h zqI#mH(m8#~s4my4bBnX{bBhX}svC3Jh6jR(q}Jk zVHI|mx|02G6HS~-wX+LbWGUyFE=mQAq8NJ(NG~#6EV1<4m?Q8EM1Ny{TQ;N%z%n^zhmRg~jy0Dew5V5KhZy7p7-suT;0(O<{0>Dp)dyki0}7%fGPJ z@?E64am#dF)6&lSjo3wA6lxdkXeO>}hYua9oHyHHWxiRN_AR6#Z&h>bx)!vfmhT-= z4^L?!8Eqvn8#m1r6l#GTXol@Y2z#cZ#gXlV8ZDGQlTZ!XX~_*8c*x}Ot2NOCVH_e(qbBcmHc3+9wknllW`Zx}`@ zkP~cg1=IGYyGa@9-!jy!4Ar&6#%7mFS7)l#OaGdKd78wA5l%~nVS1h)Wp6n&3@nfk z&QZuykf@TY`@WME{u1CarAH~9Kk52b?4Z+lFWJ(;gii?!SP0>F214$q0N|dlpz^7_ zyHn~<9P3D3zS~$k(rrB{t%G9&Mwnna#fNcsac#1@{OJA$5Fj&q<%DwV2SdUHt*h+g_;?F~5O(kJbkH*bDD z&->o@g#;mm*aGPlGi4s~cA^4Pa!kIgYsg2^7Uw-#_c@NTunV zHkFbttAxUd619kypYE3oB8?e&Rnjt2-ms(s1#fL?9OCPA7A5P8lC?$2l#$PXX?JWr zY86eD{)E<8EHCqN*3ea1FJu*6SJLtcBURAVyhY^^%{p0_k`D|F#7-zh8XM2VhK#f- ztNF_^gesdwD{JHj;|C7PRI}8WsibC=X_d;RX39w|Z>a<>PA*tlj>=9XakFTLwu*@~ zK`37MXb98-dKT=d1fvgvrys^nR$`~ip3{V3rQy~Ea5%UA3m9%K>-hS6RS`9{EsVWb_o3#F??>)VmV*P&5hsNHguMi4U($9s z>AOgRM?bfLTH!;9UHr;U47ve6jA0!3?1FUPM1Eix;1o0u79@NFA~35iX>J1;80O#^ z(H(i!0u0d1M&e)jOI(s&ha(&+aV~h~d8^g+mw4+f*S=SWFl{aIGhx^Js(lTle2I5} zw*mS$AqKGA0Q#1r8=!r26yW*6M@lX?1&{mx;WOpXOq{U5#%w{MDNTz8ZEwwQ2T$py zL980cJVPhWoFOc8zz=}1Y1L{#8DV!|i>YKPtB|B=`-n=}_I5x6KBShCPpN=%pgeC{ zO#w+oJ!Cgq(rOYTrBa&AE4oU7p;RI8c?)^U=yK}7U+40aLJ&yEM zBC&uVnz2Dxu9I3P)xE_2OY%hD-U#yQ{)D(G+un>9-Xy&2) zcfA|%zR49pO}m~W2;?6xY6(?+V7;V+5a*YkgoLiOCSd*o?LWN~+Sdrw*HamrFOK-kMAEud^K;1WtSVHZglvIx6P zCx99yI{0FT5LQ*34IIL>#Ur|rF67jsg#C|TvC;FO00TO=FJ^Dk zC4CJsyBcW4ZMU<_^bR<{toHWe$n8&;Q+GaJLts{~-~jHuv2T%IoLCgUk=GG)on!w4 D3jkIS literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8910b9721edac78eb99ee489c58872194a2f7f54 GIT binary patch literal 7618 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 I5V48=7uQ>>UjP6A literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c59586a00ad3c30c0b34081114b4455dae5bee7 GIT binary patch literal 13573 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cab0e7f9ff65bcbe69e3afb8f94cc8df131ec90 GIT binary patch literal 33466 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6bc6cce69f3666e9ce9d66b2340354af5e9aec2 GIT binary patch literal 2598 zcmai0O>7fK6rS~O{F69@gpdg6B(wqpwi6=$qP7wZP>@i9NKS@yJ=q=G8}`SYStmFG zDF+Tcf>eo|Dv&AxqK8)MA;;c(F>)o)(yCOgRP|;xsE3~VX1wd92(_zte&4)#?|bik zlkah;P8JqZ0OCczi;2U~x^;6Boku9&FU>6M})=b>T<`j8p6BE^UmEk>B3!z^MNYg9jf(`CfVu+A=5YYn&R*k0N{ zsTy|K$$K$I-8!>1A1G-n1PX=WxAg@y_t7o1t~3K_g>Qvc&^*e9$p#pf#PH2jsdfV!W$acd zt{5xS##f}z*moIQ#MP>lV}i$h(0HyRGLF08=95y}bd4}#1xF=X)A%f&%DEya*ePSf zb~$FW#wZ8q4Z8w*JKCfIVUk6b9hS2UTecc=0)5zZFqi`N9;W$99+!B7=XXZt+Vs?7 zDI3_*3DPt!EwDN*{ilzdxCVzL;SvTv`XV>-U908*Ahv37dJN1L(Z{6=#N@Qpy^g>p z$CvCCNF{wfNV{o#sfk8)tC{sh95RnWrujIp#$H zV-5+v>=?Eewn)tjbC+c!OymIT6(S>VT&H&9S$5s(+4|IG?j$D#$RUL}@A z^ujqus|y5p;bX(SSYIkkPE6#^kp|Drm2)$WP7BmtDVWAmp`&psKY6^s4VUI>M7u#M zlox77tpGXTQU--tsJn&9T1mD&9x zKJpx&dWKJJW?J}SGqV4;p?&uk?=3!91zK4S#*Tb?l?o!I{?3x%Jr>sgdUX zlg-r0X5{1+=t2ep2(yY8x5!Nn_3kC%ZWZ7IgS2j~f}p5mS6&~LlQDWgSrQ1(IAzeY#0>`ViJw&9aupvpb7+YNIi5+RxDiNmol%LE;itl zxeCdPO=p!dcpIqh*X=?THp_Ke6Yqx*)PbrDjkut^%p41sO0^pmhzfV=OryM1%Hvtb zrJ$a;(7*}!vmIC7D_E3+N5WYO5vL5!YXsZ@mEwg_g}>K`Shi%p} z*FHI$E0WyWMD9#Jw|LZ3)NGWAXMqXE_d<+9&DWQ_sPqOB=^a?!nMg@a%2bsIGm$?N zV*fBSkV69~-T!&!%YjFG9`0!#KC?OXU9>fJ;rZC*XJeOJW3#Q)Tr)B!lPkN|OGsoK z$As6@bSf2*yyKw9i@A-On201{f<%~jz@(Ah5EOnM7{=BemhTpYB(x5NjlWeO@AH6U z9VY$-Vnd>lJ}00wE`tG-c|EFxOI5v?FbP(|Kr&ur3Cxt-;U!E~S4FK+SwRwlCrJ9# zDYTyVEl01L^h0(WZV(m7A3@U&D~j?G^}j@YFHz!WG}%IvzoQdBq3K@+Mw+8XAJ4Z2 zCf75s5~H6DKTnK4ON?%uZYADbkF{fi%BdGa`!}?Ei|w!&A3wDj-kjg;`KBP}ucC>q zD6F^hC^WP_@?05wrVMT@{Gg1tLviKcgK!%`_c-;Z=(fTrbWpCh2NTK_<*wF7qTg^{ I%U(M24}5IEe*gdg literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..415e8469f5ed6e3353d43615408575c931418088 GIT binary patch literal 2123 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�-ip5QZmds1(<)bU_t+pL4gHFEsrO1Jblk~AD*s^qbxo;(~e5Ta0uM~(?Tx7tF2hJ=HU4OF_ z=&5)}pBK3sR~vViTze`$(&0x9txLlT1C;=229ZCq)V0u7A(U1^D9~65laUCr*f*O= b^}M-(@~;Fc2wr~~x)m)Q=zoOkM1ubVX@niy literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..896d8164b8fc6d377850c4cf5a87a6950e7e8a73 GIT binary patch literal 12039 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%0Ah6~^f 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6d8658a634b5a0be271a7d72cff4283547b4f75 GIT binary patch literal 2092 zcmah}U2NM_6u!0-C$Zi9tQ%u%8AhA7hOPC|2?iA!+L}>1rWPn{qN-H6vD-Lv?Ckm` zqal$Z#6t@Y3kYeM#x!_i8WMZlW8ZmM=tGM;q$1#<;w4gxg!aU_PMx-z1XsyDfA^ky ze9rmKPhDLCf^~6vYVJ)Qq2HgZT{{OW`oD5xas@>nND zY-Om`Ul1SS;J^6~Y_|~c^(e=7*bb8mcGwQ{KQ}_1gB_-V9&AV8(<&li-<)I<*Nn>{1i9T!3C7#vodU^Zns!WBMKuNZo6=Yb$wpG$GkyV){OeQvPvxcb;$sfLd zc|evw$m(s&4Z}3$8C}k+nl7s|j%^kRFqS4~)spV{x?Z%2uCszcBYuuE#fF626?+Uqohus?oX@pPXG99|FEs;if)w@ zcvC6NldNr>8AuH(jzRSPf||Le&gqU)Fbc}FVG$i$s;Lx-VLA$ZaiB2oiZq^SVo!qt zcS8sf_&ejU)zFrJr0C7Fi)UBFo~GFI&4qg-w@2=c-yZ)yz1*8x76)tTCqn$@sl`(( z!jYzMq;ca1{>SM3=t|#kvu}7Qz1%mtEL^G$uZq#yrA=^&FfHz$KBkHE`uHp8ty`#q za=W{n-hrhte#bfDC8V(xbO-QtmwV7QqfZ&q>H3_H)NLCjx&Q3uDTtxURM{#AJ5zz0 zR9G!=tq;QGv|yFB4)1g<<~6>;mcb|JqeS!{(Lyw)yR0AQo`@v>)DF$Xc6gtwuoaGa z_I*^jUGKhLVV$$2gN+L3pVGqDrXbQ}h0`L3;I<}sk-r48NM*9m_n+JEb33$zummS1 zt?Mw-q96t7JuP+^Rk;cW2#c5dguMvs;HnKX+COcCU^)xRsgLZUoKY>=w#<2%&aG`E z(vFj%3vExP5OCx^%OXF|3$AcQHH-R1jBSi*$y^ESgFc2`&eScJcL+ADIk!u7GKMj2>I9JH zBm-WvyUeu9TRMSH@v!btw=|)c*2NXU9Yr7Yh);lqLeTjOwi;@MkrcamZt>h|IJU*H z65m2>FwLw-h8~@HbYdy-I5fN&q#Dpm{8kvfaP;2g+m}~*Q_bGg!=uZ+uQmgRYUgXE z1yX;n!TcsB>Q@?{{Cwc$^+fj~|7#?^o;cVz{^g5{{2$ThSEFw&IZJborLj$pjS1i~ zB7jS29}QqdJl+(Ke_MJO_^!GvzEVs7Eul#Km-ur}q*y)h#b_h(`PixyuO}8q>Q0CK zy0mieWD|bUNzYhMEsQpLn$ofLSa3xRbpR(l82#!L#BjvjmzHZRLC(gwUK z>Q%>$LZ+z7AEbQ7rn9$QCJsvAO)oEp_mStZo#F5sd0Q)*`Z?SWp6PILhG1)P48yFU s$QtTeL)~lWz@Mn6#fO+!J<~!!8ktQ>TKkVN@%lsy0clKZQR4aj7bUXe+W-In literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a47385d4f90419995b7f9ad1195aeb95067f113 GIT binary patch literal 4481 zcmbVPU2GHC6}~eb|L4acCV>R87ZMV@C3ZprVWU7uNy4I1KqURa+IEx6ZVn+R)8Yr2)n1eb5Y~{4WKKm%r{$8I{mv(O zyY(bJb}J+WXnEC}_a%LKf6~t(9ubs_xQo_X5`4@#Z^;mh;d34JK39@GwJ}YyK$_FM z?ESTnY^lmVkXx&=ALIzge&Qo-2VnvB!1w@s-&Y+I1i8H`hd_>2YlL`{+(po&Qb3R3Eplp*v3`tDhHj!#@0zb&an za?Ui0WH~LVl*BBbLCm6|rP#`D@qyrhXL}y1HDtQqQI4;PHNo_{Vtt&<)#XNW9<$Y< z+!{q_7RC4_?LwBMZc(hHG29?NFHs^E43btBv82iNx9V$NGE>=jD1@QRWfh9EFhC^~ zUz@&$M+Q&fl%6lBilmwNwqlq?NyS71N!Rj3GiltOXoYv|5c60b*wpelJ6Qe8YZ ze4DlOB78-rHSfkVQ#!ovf4$XsA-Cp5sR8k4DmL6 zH(KC0?4cN{RrDr=np*FU-5L8s=fm~~`OjuQPkx##A3Xmoe120nZ#2Q6U1nttW1ICT z2w>JKyb&^MW|g_eRoOO6ez#c+BB`!fK=YKCjSSI9?KlNlRO?qzp^@dTb>K8STQON<4Dl6Z`_ZEPQX?}ZQS0fYl?28$@1?Hzb16IRjd@ZoY8 ze-WN}-aA$9o!Jy--o9(i!x4bs`#d~X^Ke+dT1>WrU2@DidrBQfD=3IeW;(kpL+t&N z$A#D_w8AZOIcCm1#no)Cbx#Mpx_v2L7TBM=8V8Z22Mr<0E$|$=0T<&?Nm%sUKnq+C zGHVgO7a1PbUlJCO(;M?H{pLE6WQu>qf{zmhR=|6i)5TNij2(lVI0+%jq!44kcOjZ! ziDDHZG1k-2YJ@s*>AD?KDZZj>UW6-&Y*&j*Q-*qs9iQ4SLg*8B46;`+FbwI1hyD^OJM45GT+7_c ztf}|Zhr^G?*2gxM%N^sZS1Y{F8-3$LE&D!BY+U?D^T-o!t3A4Q`rhf^oq5sT_pH6I z+Si)9xUMPmg&g z!IM}Sxei==n zUkoC^>JH2^jqfSTwOK3tGQY}w)V<8-YRIn-u5$)ixOE(~%6&A*_7PCY8}ms?*xHV| z_~y5u@g`2|21|*M=<%++0?`Io00m0m;LuHpv_MiyT7e{KW+f9ZWQo>zz66nrL6jB? z1)V~;Hg!Bt?BIM`p~}1pXf^cww}rEtb@<-I`6BoQa}-I@9GvT_sxJVJ?e!S6#++la zRQ_H31)s$>S#d^B%Ch3H9<_7=t2%fmUXToyE19b~j>TSF--5}IU#lMW+Y2>6th!)- z{m}hbCbR(5sqqCt6>ME8Wh%Ex98XeO%(D*}Ri6i%vBwnD)@1cKOmnsxAZ_34Y#KexO#IkLPNLoXJ9)&!ZOJ5fMjjnNMVo_diTc9%12H;=`0^P|7Ck;#gE#$Dgo5g_I83|DTf_& zJNo}7D46V&Mg%nHcYEutSxaO&`$tE;he>WoaNCvdp~a2T8l=A(zk+a5+o0hI8>GH^ zh_Tt(-<&uBpg*eV1C9}QGyk}`XdcC65mFQd^x9N}!4w##<4iV#&MPcGKqk{ON{Ydh z@v|L#)Q&eY0k#ToXMl$Q!YE5MhS=`B8~iMexB;W;{S8=Q)g`;X+cqo;o>@ZEFQYJDZ83!G2R&KIguW@0wV*nAc?yW?F~pNVmVcKacFmyYk>s zu|CwH-*2{Ti-hNOT_uusqGs?qtHq2PIc#3j8zz(Z zOiXatEDI(MrDaOn%WI=`%3fEyaT-Q4xb$Bx{{8cz&Yb(}a`B~@$l-j_tc!L-TwkvaP%V(Aftcyh!gK-5b2#n{l6KerR z3|#=DUe@DhKO})98GYvg6#6GR@>Q_w!_F7Mu4lon`)A6*-c{dL-{6D!N4fRfmN2pH z;rsbb)Kdw0xk>K++%{ruCF0}yH+r`bG?jfkcaeJlFRZPEnz-ow#SLL&_LJbVcTR32 kc&{Ap;@a+;+X$MNycliy1#@6Tm0Qpl`Hvj+t literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59c8036138076765a09802520443f3d564ff5e80 GIT binary patch literal 5918 zcmb_gTWl2989pqa!CRuVDJq?3nqmGQmgH1yfe1P?9DT? z7%%J8rF}3;RC1{lMO?LXiDo%5HvIuC(wF!s~&-!u^N56sw~P)V#bGlaZGWHLfzMrISt z2m>*fV3XVk$DquSa3uK=o~HSPGwB*}(X=xmB;6zKq-VrK^R9$9=^OFUw2-Jv`bYeb zc8>&DqA-)9-SKLyG`tIa<2TYMdlZlCRf4ilaVbHC8)G+te9S4={n|0oB>StSL68MN z7NW9x+M*d`4IpcwvPLT7Ko$g9tK6h;RO===RMF~?o1tX0+yZ@7rB?4U3+-B=bju7I z-jv&OE}O}uHA5WBrs9U0PU+%US`(+!+C?=rE>5e)gg8B+C<$>)O(=TA^A%2KILw%? z(~7Q3;|e65PfMDvXprKc$z~Etm^D3pl02ejjzc5URY^d3LtILwQ)*mFs5vE;l9JfG z{@IjnjY5$xU|(VOD_l2?g}`*v?qfMMV>+;b>C_Y>tEJ*tYJW~haPVJw4}#Z-n;4aa zCnQhu%)6Dkv#f!&=m&DPD(4KoD(CD?n{^oOs?@Qng@KlN*uZn7gBaK|{k9V=G|L+< zJD+E6fN|yd8|2NZ#;ag}v;6b?G&4;ub3Y-|Oqk2v8oX?1Qrr;L6fAvG!d(!@v~*H5 zCKNHFr7x+nB3rxAB`UC18g7khh)G2;ba7PD)woB5PdB8LENL=q6V0Ec3#C&%xO8HA zjHV;9svF(dohYlC5;xM?j0jDw4skDK@xqD0!BfzKA<2>NHco(nX&Hvw5&vx)TL-b9gSvYjEQt=e`N2zsID4HcSed|1nbtL88s7y2^or( zk`mFZp(gYwokb)wV|p{VS}~f}T45Yb@YfR%%#pH>=LeYk!Op_W;`UPTz`SrjxUCSr z`CKXZB%~YL3qq+eJnwoS5WaQ6RcN~7=={tZeCfHO_mQIGk%tew#MkyUVNi*GYhin# zxwx}uX=*86Z0{@i`-?*Vzsnq!eyd}zS38~{@4I`0+=unOe(tuPhotG$(^)O9tT`)a zq4cbLNP#g=CaY%!N-E#Gm3V+$XXESyiL*azA!L@#vy;^mWY;AWSnabUa|mp&urF?M zkXa5|aG=8xXU9=TGw5*S9h245R-?mVpF5p-F_d?_%)ZzP8hEJB>)zFKCG&Q@t4z)L ztV(6};s97qxTb}35{+ryC%Y!=)`=jSuj;XTvE!?7maVzXI*owcGVip@XI(W?rYaTk zu1RoB>%Y8U*U%ekMk?f;H(1%77jCd`R@Vc1cAkUPW8go_PTMKRGzoihzyEKCJf2P& zlA3~}ywP#D5kgXRMHhQ@fN#W|K}`enhu?Zg7S%B^l?FGF&Zgupv1hNHN^2fGd4NW8 zTG3NG0hJ^pKCu?N5PU2MF`1}_KAU2D&a*nS+}71}4JuXp%!QNLgrS0W*=Rm0Oo9&W zka%S_$99Ri(1z-AAv#Pt6+lbyd(^{)-KKzJOaOS9yq*CFG6f|i>sV@`6qis^rqcpw z(=nM=QyMZ1(?iwJiea~grf-23lQCU-b`(HRHyPb@+Zd*6L2OoM=cyAk{Z+q6^Ev_} zE-U>sIC(@vlcPZ=By@Dc05N{jweJr{Zymj}`*6vBWO?`Df;2yMefrw;OZr0Z3%^*H zDh0L`cORY`D*BIn-qum7Klb|2OH+lZcXDs#7Q6no^XMxL3qx}!i}lAo_cj5_6x)xM z{KtyIu`gVn`5*l1`32@<*CvqP^BuVB>sj{oEE#{A`Qyx=HtVL9w)KY`?>F~vcHH(kAT%A|E+#fc zwmGPeEMQ}715aK-JnF%#Ji>55Gy1K1^)U|odNc5bDiZ*o&cGQ3BwTw&WkAR0*;>y& zoD0O$*@R53O;aRU%(*CyIwXR>bf82--(?CvQfBDMGks^XDML*vG)E0D%vnYihKd@% zC(#jq!7iv(n60SA@;@=#ImVExX%VP4i1mL60hkKQ^Fz$NKEL)6u@FE%X-ORkTYrEIZ%u;f2p6pmA0GX%Z{_u^`Oki6P-gnOsq zAh*OH;mo=4w%2HESzn4yf81(3KtQs2ZPBEwH8Fww53vwE|wGSX6G6t^sUj(z>pWCMp1U21uPY z4XE2CY6!mHLD~w{az<$fxqw0;Sytj{8EIdRJtPhTJ;LoZom8xtjn4w71~xN*wQ7t< z!%3S0B`Lb0K{EqhnTNDJe9BnkwX6oAnsT1MLIR8sOb}OM7S8gVchwMO)Kxy<((Aq#hmDvMe5 z;D&wegge4UMk!bC0ybZ=d!$B+e3yP;qyeVp79%?--qeh*dV}C|qeJQ?CAE&SgMCr@ zzlPM~?W+5{#l9^=`(N#`?m}(b+*Zr{Rb5P~VBTPuYsyU~l54Rq32RCK`&^bs<-sE1 zQpX#3Wi+{@lrcHr+1ewp0H)`>l*n3^3<&rnihLEyAEVZZMz977HDp;dkg!OHfSP90 z)`j$PFfw=Qo-0^%ZK-u~pZPc6^^41XvE+YrZU~L_ICDSH^xJc91Q*7CmwY{Wv%j=; zPbsvw6xdf3_C37s4WWrbCGeEn4lcDUd5i4>CI4Vi7(^<59E=m0=G!}aedM;UwRbzG z;W*deAy%NK2oDK0rf7iJ`Yh9=B=+Fybya3JBF%Yt$(XEOIc*Juthy_MzK~!^o~$>y z^?5LQvN{erg2#=jNlsQt?`l7?Vx!_5^4TOuJ!Yn#9+k&K;iw*~q- z37rBT22M$-tu%qI8}NM^ssPc2S~VTh(d<$pqQkK0f8Ui^Sj=@}zA_uex=8%jFS9WL1@=P0hQJ1E2f-L~kDau36&HcN zoJe9ynO3y*x_9W|;jmyfo*z7W?&O)_SpS*RPxn4^vhUO&g(OV`W!g3jo`S&S0HI80 zB0WB?Xr>GI6FLa9^h{HhuOoM?P%*6$+hKrSQNIKM;7=9YcXqwC>%IN&>5D@ppz)6$DTR7gcn*m*M~Stk;ZAVJ$L<~X z1^;#bHUB-|!F#^I^%K`lSU^<@b(VZP|HWfvj(9p(pl1?pGhMNmoQ}t0rVD2PBRA`m zq@*SyN$cTGDDqILoM!c#W-axtq`NPo>)xl!%liJz{eDN-7)#m8AH)2 z;i1e!JB&pX?Qykl5p4hkcu6va!^yOqO(;Fuk0A?aLi92O0L~2aPnKaED^9`$J|Wva zA?=@#)=$aKFUb$SBu{)6+EOHqWhe1$nQyu4-n{JIyl}AO-ah9nI|Iztg#%>*(ajDT zE$&$2mM$#$miG;=pt!ufjcF>l$^@dD&>uvL`U*zn9w#%z6fTqr#*6({yadfKUv8{t z!l)Xe#r-r|IPpgLyV^oD(E-+3zy$&FB8Zv OaWwkK@c?slMg9Xp7w3)u literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py b/env/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py new file mode 100644 index 0000000..6ccf53b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py @@ -0,0 +1,109 @@ +"""Functions brought over from jaraco.text. + +These functions are not supposed to be used within `pip._internal`. These are +helper functions brought over from `jaraco.text` to enable vendoring newer +copies of `pkg_resources` without having to vendor `jaraco.text` and its entire +dependency cone; something that our vendoring setup is not currently capable of +handling. + +License reproduced from original source below: + +Copyright Jason R. Coombs + +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. +""" + +import functools +import itertools + + +def _nonblank(str): + return str and not str.startswith("#") + + +@functools.singledispatch +def yield_lines(iterable): + r""" + Yield valid lines of a string or iterable. + + >>> list(yield_lines('')) + [] + >>> list(yield_lines(['foo', 'bar'])) + ['foo', 'bar'] + >>> list(yield_lines('foo\nbar')) + ['foo', 'bar'] + >>> list(yield_lines('\nfoo\n#bar\nbaz #comment')) + ['foo', 'baz #comment'] + >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n'])) + ['foo', 'bar', 'baz', 'bing'] + """ + return itertools.chain.from_iterable(map(yield_lines, iterable)) + + +@yield_lines.register(str) +def _(text): + return filter(_nonblank, map(str.strip, text.splitlines())) + + +def drop_comment(line): + """ + Drop comments. + + >>> drop_comment('foo # bar') + 'foo' + + A hash without a space may be in a URL. + + >>> drop_comment('http://example.com/foo#bar') + 'http://example.com/foo#bar' + """ + return line.partition(" #")[0] + + +def join_continuation(lines): + r""" + Join lines continued by a trailing backslash. + + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar', 'baz'])) + ['foobar', 'baz'] + >>> list(join_continuation(['foo \\', 'bar \\', 'baz'])) + ['foobarbaz'] + + Not sure why, but... + The character preceding the backslash is also elided. + + >>> list(join_continuation(['goo\\', 'dly'])) + ['godly'] + + A terrible idea, but... + If no line is available to continue, suppress the lines. + + >>> list(join_continuation(['foo', 'bar\\', 'baz\\'])) + ['foo'] + """ + lines = iter(lines) + for item in lines: + while item.endswith("\\"): + try: + item = item[:-2].strip() + next(lines) + except StopIteration: + return + yield item diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/_log.py b/env/lib/python3.12/site-packages/pip/_internal/utils/_log.py new file mode 100644 index 0000000..92c4c6a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/_log.py @@ -0,0 +1,38 @@ +"""Customize logging + +Defines custom logger class for the `logger.verbose(...)` method. + +init_logging() must be called before any other modules that call logging.getLogger. +""" + +import logging +from typing import Any, cast + +# custom log level for `--verbose` output +# between DEBUG and INFO +VERBOSE = 15 + + +class VerboseLogger(logging.Logger): + """Custom Logger, defining a verbose log-level + + VERBOSE is between INFO and DEBUG. + """ + + def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None: + return self.log(VERBOSE, msg, *args, **kwargs) + + +def getLogger(name: str) -> VerboseLogger: + """logging.getLogger, but ensures our VerboseLogger class is returned""" + return cast(VerboseLogger, logging.getLogger(name)) + + +def init_logging() -> None: + """Register our VerboseLogger and VERBOSE log level. + + Should be called before any calls to getLogger(), + i.e. in pip._internal.__init__ + """ + logging.setLoggerClass(VerboseLogger) + logging.addLevelName(VERBOSE, "VERBOSE") diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py b/env/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..16933bf --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,52 @@ +""" +This code wraps the vendored appdirs module to so the return values are +compatible for the current pip code base. + +The intention is to rewrite current usages gradually, keeping the tests pass, +and eventually drop this after all usages are changed. +""" + +import os +import sys +from typing import List + +from pip._vendor import platformdirs as _appdirs + + +def user_cache_dir(appname: str) -> str: + return _appdirs.user_cache_dir(appname, appauthor=False) + + +def _macos_user_config_dir(appname: str, roaming: bool = True) -> str: + # Use ~/Application Support/pip, if the directory exists. + path = _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming) + if os.path.isdir(path): + return path + + # Use a Linux-like ~/.config/pip, by default. + linux_like_path = "~/.config/" + if appname: + linux_like_path = os.path.join(linux_like_path, appname) + + return os.path.expanduser(linux_like_path) + + +def user_config_dir(appname: str, roaming: bool = True) -> str: + if sys.platform == "darwin": + return _macos_user_config_dir(appname, roaming) + + return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) + + +# for the discussion regarding site_config_dir locations +# see +def site_config_dirs(appname: str) -> List[str]: + if sys.platform == "darwin": + return [_appdirs.site_data_dir(appname, appauthor=False, multipath=True)] + + dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) + if sys.platform == "win32": + return [dirval] + + # Unix-y system. Look in /etc as well. + return dirval.split(os.pathsep) + ["/etc"] diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py b/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..d8b54e4 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,79 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" + +import importlib.resources +import logging +import os +import sys +from typing import IO + +__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] + + +logger = logging.getLogger(__name__) + + +def has_tls() -> bool: + try: + import _ssl # noqa: F401 # ignore unused + + return True + except ImportError: + pass + + from pip._vendor.urllib3.util import IS_PYOPENSSL + + return IS_PYOPENSSL + + +def get_path_uid(path: str) -> int: + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, "O_NOFOLLOW"): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError(f"{path} is a symlink; Will not return uid for symlinks") + return file_uid + + +# The importlib.resources.open_text function was deprecated in 3.11 with suggested +# replacement we use below. +if sys.version_info < (3, 11): + open_text_resource = importlib.resources.open_text +else: + + def open_text_resource( + package: str, resource: str, encoding: str = "utf-8", errors: str = "strict" + ) -> IO[str]: + return (importlib.resources.files(package) / resource).open( + "r", encoding=encoding, errors=errors + ) + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py b/env/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py new file mode 100644 index 0000000..2e7b745 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py @@ -0,0 +1,188 @@ +"""Generate and work with PEP 425 Compatibility Tags. +""" + +import re +from typing import List, Optional, Tuple + +from pip._vendor.packaging.tags import ( + PythonVersion, + Tag, + compatible_tags, + cpython_tags, + generic_tags, + interpreter_name, + interpreter_version, + ios_platforms, + mac_platforms, +) + +_apple_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)") + + +def version_info_to_nodot(version_info: Tuple[int, ...]) -> str: + # Only use up to the first two numbers. + return "".join(map(str, version_info[:2])) + + +def _mac_platforms(arch: str) -> List[str]: + match = _apple_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + mac_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "macosx", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "macosxcustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + "{}_{}".format(name, arch[len("macosx_") :]) + for arch in mac_platforms(mac_version, actual_arch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _ios_platforms(arch: str) -> List[str]: + match = _apple_arch_pat.match(arch) + if match: + name, major, minor, actual_multiarch = match.groups() + ios_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "ios", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "ioscustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + "{}_{}".format(name, arch[len("ios_") :]) + for arch in ios_platforms(ios_version, actual_multiarch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _custom_manylinux_platforms(arch: str) -> List[str]: + arches = [arch] + arch_prefix, arch_sep, arch_suffix = arch.partition("_") + if arch_prefix == "manylinux2014": + # manylinux1/manylinux2010 wheels run on most manylinux2014 systems + # with the exception of wheels depending on ncurses. PEP 599 states + # manylinux1/manylinux2010 wheels should be considered + # manylinux2014 wheels: + # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels + if arch_suffix in {"i686", "x86_64"}: + arches.append("manylinux2010" + arch_sep + arch_suffix) + arches.append("manylinux1" + arch_sep + arch_suffix) + elif arch_prefix == "manylinux2010": + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches.append("manylinux1" + arch_sep + arch_suffix) + return arches + + +def _get_custom_platforms(arch: str) -> List[str]: + arch_prefix, arch_sep, arch_suffix = arch.partition("_") + if arch.startswith("macosx"): + arches = _mac_platforms(arch) + elif arch.startswith("ios"): + arches = _ios_platforms(arch) + elif arch_prefix in ["manylinux2014", "manylinux2010"]: + arches = _custom_manylinux_platforms(arch) + else: + arches = [arch] + return arches + + +def _expand_allowed_platforms(platforms: Optional[List[str]]) -> Optional[List[str]]: + if not platforms: + return None + + seen = set() + result = [] + + for p in platforms: + if p in seen: + continue + additions = [c for c in _get_custom_platforms(p) if c not in seen] + seen.update(additions) + result.extend(additions) + + return result + + +def _get_python_version(version: str) -> PythonVersion: + if len(version) > 1: + return int(version[0]), int(version[1:]) + else: + return (int(version[0]),) + + +def _get_custom_interpreter( + implementation: Optional[str] = None, version: Optional[str] = None +) -> str: + if implementation is None: + implementation = interpreter_name() + if version is None: + version = interpreter_version() + return f"{implementation}{version}" + + +def get_supported( + version: Optional[str] = None, + platforms: Optional[List[str]] = None, + impl: Optional[str] = None, + abis: Optional[List[str]] = None, +) -> List[Tag]: + """Return a list of supported tags for each version specified in + `versions`. + + :param version: a string version, of the form "33" or "32", + or None. The version will be assumed to support our ABI. + :param platform: specify a list of platforms you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abis: specify a list of abis you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported: List[Tag] = [] + + python_version: Optional[PythonVersion] = None + if version is not None: + python_version = _get_python_version(version) + + interpreter = _get_custom_interpreter(impl, version) + + platforms = _expand_allowed_platforms(platforms) + + is_cpython = (impl or interpreter_name()) == "cp" + if is_cpython: + supported.extend( + cpython_tags( + python_version=python_version, + abis=abis, + platforms=platforms, + ) + ) + else: + supported.extend( + generic_tags( + interpreter=interpreter, + abis=abis, + platforms=platforms, + ) + ) + supported.extend( + compatible_tags( + python_version=python_version, + interpreter=interpreter, + platforms=platforms, + ) + ) + + return supported diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/datetime.py b/env/lib/python3.12/site-packages/pip/_internal/utils/datetime.py new file mode 100644 index 0000000..8668b3b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/datetime.py @@ -0,0 +1,11 @@ +"""For when pip wants to check the date or time. +""" + +import datetime + + +def today_is_later_than(year: int, month: int, day: int) -> bool: + today = datetime.date.today() + given = datetime.date(year, month, day) + + return today > given diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py b/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..0911147 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,124 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" + +import logging +import warnings +from typing import Any, Optional, TextIO, Type, Union + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version # NOTE: tests patch this name. + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning: Any = None + + +# Warnings <-> Logging Integration +def _showwarning( + message: Union[Warning, str], + category: Type[Warning], + filename: str, + lineno: int, + file: Optional[TextIO] = None, + line: Optional[str] = None, +) -> None: + if file is not None: + if _original_showwarning is not None: + _original_showwarning(message, category, filename, lineno, file, line) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning(message, category, filename, lineno, file, line) + + +def install_warning_logger() -> None: + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated( + *, + reason: str, + replacement: Optional[str], + gone_in: Optional[str], + feature_flag: Optional[str] = None, + issue: Optional[int] = None, +) -> None: + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. Should be a complete sentence. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises an error if pip's current version is greater than or equal to + this. + feature_flag: + Command-line flag of the form --use-feature={feature_flag} for testing + upcoming functionality. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + """ + + # Determine whether or not the feature is already gone in this version. + is_gone = gone_in is not None and parse(current_version) >= parse(gone_in) + + message_parts = [ + (reason, f"{DEPRECATION_MSG_PREFIX}{{}}"), + ( + gone_in, + ( + "pip {} will enforce this behaviour change." + if not is_gone + else "Since pip {}, this is no longer supported." + ), + ), + ( + replacement, + "A possible replacement is {}.", + ), + ( + feature_flag, + ( + "You can use the flag --use-feature={} to test the upcoming behaviour." + if not is_gone + else None + ), + ), + ( + issue, + "Discussion can be found at https://github.com/pypa/pip/issues/{}", + ), + ] + + message = " ".join( + format_str.format(value) + for value, format_str in message_parts + if format_str is not None and value is not None + ) + + # Raise as an error if this behaviour is deprecated. + if is_gone: + raise PipDeprecationWarning(message) + + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py b/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py new file mode 100644 index 0000000..66020d3 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py @@ -0,0 +1,87 @@ +from typing import Optional + +from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo +from pip._internal.models.link import Link +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + + +def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> str: + """Convert a DirectUrl to a pip requirement string.""" + direct_url.validate() # if invalid, this is a pip bug + requirement = name + " @ " + fragments = [] + if isinstance(direct_url.info, VcsInfo): + requirement += ( + f"{direct_url.info.vcs}+{direct_url.url}@{direct_url.info.commit_id}" + ) + elif isinstance(direct_url.info, ArchiveInfo): + requirement += direct_url.url + if direct_url.info.hash: + fragments.append(direct_url.info.hash) + else: + assert isinstance(direct_url.info, DirInfo) + requirement += direct_url.url + if direct_url.subdirectory: + fragments.append("subdirectory=" + direct_url.subdirectory) + if fragments: + requirement += "#" + "&".join(fragments) + return requirement + + +def direct_url_for_editable(source_dir: str) -> DirectUrl: + return DirectUrl( + url=path_to_url(source_dir), + info=DirInfo(editable=True), + ) + + +def direct_url_from_link( + link: Link, source_dir: Optional[str] = None, link_is_in_wheel_cache: bool = False +) -> DirectUrl: + if link.is_vcs: + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend + url, requested_revision, _ = vcs_backend.get_url_rev_and_auth( + link.url_without_fragment + ) + # For VCS links, we need to find out and add commit_id. + if link_is_in_wheel_cache: + # If the requested VCS link corresponds to a cached + # wheel, it means the requested revision was an + # immutable commit hash, otherwise it would not have + # been cached. In that case we don't have a source_dir + # with the VCS checkout. + assert requested_revision + commit_id = requested_revision + else: + # If the wheel was not in cache, it means we have + # had to checkout from VCS to build and we have a source_dir + # which we can inspect to find out the commit id. + assert source_dir + commit_id = vcs_backend.get_revision(source_dir) + return DirectUrl( + url=url, + info=VcsInfo( + vcs=vcs_backend.name, + commit_id=commit_id, + requested_revision=requested_revision, + ), + subdirectory=link.subdirectory_fragment, + ) + elif link.is_existing_dir(): + return DirectUrl( + url=link.url_without_fragment, + info=DirInfo(), + subdirectory=link.subdirectory_fragment, + ) + else: + hash = None + hash_name = link.hash_name + if hash_name: + hash = f"{hash_name}={link.hash}" + return DirectUrl( + url=link.url_without_fragment, + info=ArchiveInfo(hash=hash), + subdirectory=link.subdirectory_fragment, + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py b/env/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py new file mode 100644 index 0000000..4a384a6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py @@ -0,0 +1,80 @@ +import os +import re +import sys +from typing import List, Optional + +from pip._internal.locations import site_packages, user_site +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) + +__all__ = [ + "egg_link_path_from_sys_path", + "egg_link_path_from_location", +] + + +def _egg_link_names(raw_name: str) -> List[str]: + """ + Convert a Name metadata value to a .egg-link name, by applying + the same substitution as pkg_resources's safe_name function. + Note: we cannot use canonicalize_name because it has a different logic. + + We also look for the raw name (without normalization) as setuptools 69 changed + the way it names .egg-link files (https://github.com/pypa/setuptools/issues/4167). + """ + return [ + re.sub("[^A-Za-z0-9.]+", "-", raw_name) + ".egg-link", + f"{raw_name}.egg-link", + ] + + +def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]: + """ + Look for a .egg-link file for project name, by walking sys.path. + """ + egg_link_names = _egg_link_names(raw_name) + for path_item in sys.path: + for egg_link_name in egg_link_names: + egg_link = os.path.join(path_item, egg_link_name) + if os.path.isfile(egg_link): + return egg_link + return None + + +def egg_link_path_from_location(raw_name: str) -> Optional[str]: + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites: List[str] = [] + if running_under_virtualenv(): + sites.append(site_packages) + if not virtualenv_no_global() and user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + egg_link_names = _egg_link_names(raw_name) + for site in sites: + for egg_link_name in egg_link_names: + egglink = os.path.join(site, egg_link_name) + if os.path.isfile(egglink): + return egglink + return None diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/encoding.py b/env/lib/python3.12/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..008f06a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,36 @@ +import codecs +import locale +import re +import sys +from typing import List, Tuple + +BOMS: List[Tuple[bytes, str]] = [ + (codecs.BOM_UTF8, "utf-8"), + (codecs.BOM_UTF16, "utf-16"), + (codecs.BOM_UTF16_BE, "utf-16-be"), + (codecs.BOM_UTF16_LE, "utf-16-le"), + (codecs.BOM_UTF32, "utf-32"), + (codecs.BOM_UTF32_BE, "utf-32-be"), + (codecs.BOM_UTF32_LE, "utf-32-le"), +] + +ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)") + + +def auto_decode(data: bytes) -> str: + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom) :].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b"\n")[:2]: + if line[0:1] == b"#" and ENCODING_RE.search(line): + result = ENCODING_RE.search(line) + assert result is not None + encoding = result.groups()[0].decode("ascii") + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py b/env/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py new file mode 100644 index 0000000..1501369 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py @@ -0,0 +1,84 @@ +import itertools +import os +import shutil +import sys +from typing import List, Optional + +from pip._internal.cli.main import main +from pip._internal.utils.compat import WINDOWS + +_EXECUTABLE_NAMES = [ + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", +] +if WINDOWS: + _allowed_extensions = {"", ".exe"} + _EXECUTABLE_NAMES = [ + "".join(parts) + for parts in itertools.product(_EXECUTABLE_NAMES, _allowed_extensions) + ] + + +def _wrapper(args: Optional[List[str]] = None) -> int: + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) + + +def get_best_invocation_for_this_pip() -> str: + """Try to figure out the best way to invoke pip in the current environment.""" + binary_directory = "Scripts" if WINDOWS else "bin" + binary_prefix = os.path.join(sys.prefix, binary_directory) + + # Try to use pip[X[.Y]] names, if those executables for this environment are + # the first on PATH with that name. + path_parts = os.path.normcase(os.environ.get("PATH", "")).split(os.pathsep) + exe_are_in_PATH = os.path.normcase(binary_prefix) in path_parts + if exe_are_in_PATH: + for exe_name in _EXECUTABLE_NAMES: + found_executable = shutil.which(exe_name) + binary_executable = os.path.join(binary_prefix, exe_name) + if ( + found_executable + and os.path.exists(binary_executable) + and os.path.samefile( + found_executable, + binary_executable, + ) + ): + return exe_name + + # Use the `-m` invocation, if there's no "nice" invocation. + return f"{get_best_invocation_for_this_python()} -m pip" + + +def get_best_invocation_for_this_python() -> str: + """Try to figure out the best way to invoke the current Python.""" + exe = sys.executable + exe_name = os.path.basename(exe) + + # Try to use the basename, if it's the first executable. + found_executable = shutil.which(exe_name) + if found_executable and os.path.samefile(found_executable, exe): + return exe_name + + # Use the full executable name, because we couldn't find something simpler. + return exe diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py b/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..22e356c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,149 @@ +import fnmatch +import os +import os.path +import random +import sys +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from typing import Any, BinaryIO, Generator, List, Union, cast + +from pip._internal.utils.compat import get_path_uid +from pip._internal.utils.misc import format_size +from pip._internal.utils.retry import retry + + +def check_path_owner(path: str) -> bool: + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +@contextmanager +def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]: + """Return a file-like object pointing to a tmp file next to path. + + The file is created securely and is ensured to be written to disk + after the context reaches its end. + + kwargs will be passed to tempfile.NamedTemporaryFile to control + the way the temporary file will be opened. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix=".tmp", + **kwargs, + ) as f: + result = cast(BinaryIO, f) + try: + yield result + finally: + result.flush() + os.fsync(result.fileno()) + + +replace = retry(stop_after_delay=1, wait=0.25)(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path: str) -> bool: + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == "posix": + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path: str) -> bool: + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = "accesstest_deleteme_fishfingers_custard_" + alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" + for _ in range(10): + name = basename + "".join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + except FileExistsError: + pass + except PermissionError: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + # This could as well be because the parent dir is not readable, + # due to non-privileged user access. + return False + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise OSError("Unexpected condition testing for writable directory") + + +def find_files(path: str, pattern: str) -> List[str]: + """Returns a list of absolute paths of files beneath path, recursively, + with filenames which match the UNIX-style shell glob pattern.""" + result: List[str] = [] + for root, _, files in os.walk(path): + matches = fnmatch.filter(files, pattern) + result.extend(os.path.join(root, f) for f in matches) + return result + + +def file_size(path: str) -> Union[int, float]: + # If it's a symlink, return 0. + if os.path.islink(path): + return 0 + return os.path.getsize(path) + + +def format_file_size(path: str) -> str: + return format_size(file_size(path)) + + +def directory_size(path: str) -> Union[int, float]: + size = 0.0 + for root, _dirs, files in os.walk(path): + for filename in files: + file_path = os.path.join(root, filename) + size += file_size(file_path) + return size + + +def format_directory_size(path: str) -> str: + return format_size(directory_size(path)) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py b/env/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py new file mode 100644 index 0000000..5948570 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py @@ -0,0 +1,27 @@ +"""Filetype information. +""" + +from typing import Tuple + +from pip._internal.utils.misc import splitext + +WHEEL_EXTENSION = ".whl" +BZ2_EXTENSIONS: Tuple[str, ...] = (".tar.bz2", ".tbz") +XZ_EXTENSIONS: Tuple[str, ...] = ( + ".tar.xz", + ".txz", + ".tlz", + ".tar.lz", + ".tar.lzma", +) +ZIP_EXTENSIONS: Tuple[str, ...] = (".zip", WHEEL_EXTENSION) +TAR_EXTENSIONS: Tuple[str, ...] = (".tar.gz", ".tgz", ".tar") +ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS + + +def is_archive_file(name: str) -> bool: + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py b/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..998868f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,101 @@ +import os +import sys +from typing import Optional, Tuple + + +def glibc_version_string() -> Optional[str]: + "Returns glibc version string, or None if not using glibc." + return glibc_version_string_confstr() or glibc_version_string_ctypes() + + +def glibc_version_string_confstr() -> Optional[str]: + "Primary implementation of glibc_version_string using os.confstr." + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module: + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 + if sys.platform == "win32": + return None + try: + gnu_libc_version = os.confstr("CS_GNU_LIBC_VERSION") + if gnu_libc_version is None: + return None + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": + _, version = gnu_libc_version.split() + except (AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def glibc_version_string_ctypes() -> Optional[str]: + "Fallback implementation of glibc_version_string using ctypes." + + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can't proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver() -> Tuple[str, str]: + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py b/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..535e94f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,147 @@ +import hashlib +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, NoReturn, Optional + +from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError +from pip._internal.utils.misc import read_chunks + +if TYPE_CHECKING: + from hashlib import _Hash + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = "sha256" + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ["sha256", "sha384", "sha512"] + + +class Hashes: + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + + def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None: + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + allowed = {} + if hashes is not None: + for alg, keys in hashes.items(): + # Make sure values are always sorted (to ease equality checks) + allowed[alg] = [k.lower() for k in sorted(keys)] + self._allowed = allowed + + def __and__(self, other: "Hashes") -> "Hashes": + if not isinstance(other, Hashes): + return NotImplemented + + # If either of the Hashes object is entirely empty (i.e. no hash + # specified at all), all hashes from the other object are allowed. + if not other: + return self + if not self: + return other + + # Otherwise only hashes that present in both objects are allowed. + new = {} + for alg, values in other._allowed.items(): + if alg not in self._allowed: + continue + new[alg] = [v for v in values if v in self._allowed[alg]] + return Hashes(new) + + @property + def digest_count(self) -> int: + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool: + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks: Iterable[bytes]) -> None: + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in self._allowed.keys(): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError(f"Unknown hash name: {hash_name}") + + for chunk in chunks: + for hash in gots.values(): + hash.update(chunk) + + for hash_name, got in gots.items(): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file: BinaryIO) -> None: + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path: str) -> None: + with open(path, "rb") as file: + return self.check_against_file(file) + + def has_one_of(self, hashes: Dict[str, str]) -> bool: + """Return whether any of the given hashes are allowed.""" + for hash_name, hex_digest in hashes.items(): + if self.is_hash_allowed(hash_name, hex_digest): + return True + return False + + def __bool__(self) -> bool: + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Hashes): + return NotImplemented + return self._allowed == other._allowed + + def __hash__(self) -> int: + return hash( + ",".join( + sorted( + ":".join((alg, digest)) + for alg, digest_list in self._allowed.items() + for digest in digest_list + ) + ) + ) + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + + def __init__(self) -> None: + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super().__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py b/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..41f6eb5 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,347 @@ +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +import threading +from dataclasses import dataclass +from io import TextIOWrapper +from logging import Filter +from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type + +from pip._vendor.rich.console import ( + Console, + ConsoleOptions, + ConsoleRenderable, + RenderableType, + RenderResult, + RichCast, +) +from pip._vendor.rich.highlighter import NullHighlighter +from pip._vendor.rich.logging import RichHandler +from pip._vendor.rich.segment import Segment +from pip._vendor.rich.style import Style + +from pip._internal.utils._log import VERBOSE, getLogger +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir + +_log_state = threading.local() +subprocess_logger = getLogger("pip.subprocessor") + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + + +def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> bool: + if exc_class is BrokenPipeError: + return True + + # On Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if not WINDOWS: + return False + + return isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE) + + +@contextlib.contextmanager +def indent_log(num: int = 2) -> Generator[None, None, None]: + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + # For thread-safety + _log_state.indentation = get_indentation() + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation() -> int: + return getattr(_log_state, "indentation", 0) + + +class IndentingFormatter(logging.Formatter): + default_time_format = "%Y-%m-%dT%H:%M:%S" + + def __init__( + self, + *args: Any, + add_timestamp: bool = False, + **kwargs: Any, + ) -> None: + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = add_timestamp + super().__init__(*args, **kwargs) + + def get_message_start(self, formatted: str, levelno: int) -> str: + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return "" + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return "" + if levelno < logging.ERROR: + return "WARNING: " + + return "ERROR: " + + def format(self, record: logging.LogRecord) -> str: + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super().format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = "" + if self.add_timestamp: + prefix = f"{self.formatTime(record)} " + prefix += " " * get_indentation() + formatted = "".join([prefix + line for line in formatted.splitlines(True)]) + return formatted + + +@dataclass +class IndentedRenderable: + renderable: RenderableType + indent: int + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + segments = console.render(self.renderable, options) + lines = Segment.split_lines(segments) + for line in lines: + yield Segment(" " * self.indent) + yield from line + yield Segment("\n") + + +class RichPipStreamHandler(RichHandler): + KEYWORDS: ClassVar[Optional[List[str]]] = [] + + def __init__(self, stream: Optional[TextIO], no_color: bool) -> None: + super().__init__( + console=Console(file=stream, no_color=no_color, soft_wrap=True), + show_time=False, + show_level=False, + show_path=False, + highlighter=NullHighlighter(), + ) + + # Our custom override on Rich's logger, to make things work as we need them to. + def emit(self, record: logging.LogRecord) -> None: + style: Optional[Style] = None + + # If we are given a diagnostic error to present, present it with indentation. + if getattr(record, "rich", False): + assert isinstance(record.args, tuple) + (rich_renderable,) = record.args + assert isinstance( + rich_renderable, (ConsoleRenderable, RichCast, str) + ), f"{rich_renderable} is not rich-console-renderable" + + renderable: RenderableType = IndentedRenderable( + rich_renderable, indent=get_indentation() + ) + else: + message = self.format(record) + renderable = self.render_message(record, message) + if record.levelno is not None: + if record.levelno >= logging.ERROR: + style = Style(color="red") + elif record.levelno >= logging.WARNING: + style = Style(color="yellow") + + try: + self.console.print(renderable, overflow="ignore", crop=False, style=style) + except Exception: + self.handleError(record) + + def handleError(self, record: logging.LogRecord) -> None: + """Called when logging is unable to log some output.""" + + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if ( + exc_class + and exc + and self.console.file is sys.stdout + and _is_broken_pipe_error(exc_class, exc) + ): + raise BrokenStdoutLoggingError() + + return super().handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + def _open(self) -> TextIOWrapper: + ensure_dir(os.path.dirname(self.baseFilename)) + return super()._open() + + +class MaxLevelFilter(Filter): + def __init__(self, level: int) -> None: + self.level = level + + def filter(self, record: logging.LogRecord) -> bool: + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record: logging.LogRecord) -> bool: + # The base Filter class allows only records from a logger (or its + # children). + return not super().filter(record) + + +def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str]) -> int: + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 2: + level_number = logging.DEBUG + elif verbosity == 1: + level_number = VERBOSE + elif verbosity == -1: + level_number = logging.WARNING + elif verbosity == -2: + level_number = logging.ERROR + elif verbosity <= -3: + level_number = logging.CRITICAL + else: + level_number = logging.INFO + + level = logging.getLevelName(level_number) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.RichPipStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "stream": log_streams["stderr"], + "no_color": no_color, + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "encoding": "utf-8", + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": {"pip._vendor": {"level": vendored_log_level}}, + } + ) + + return level_number diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py b/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..c0a3e4d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,772 @@ +import errno +import getpass +import hashlib +import logging +import os +import posixpath +import shutil +import stat +import sys +import sysconfig +import urllib.parse +from dataclasses import dataclass +from functools import partial +from io import StringIO +from itertools import filterfalse, tee, zip_longest +from pathlib import Path +from types import FunctionType, TracebackType +from typing import ( + Any, + BinaryIO, + Callable, + Dict, + Generator, + Iterable, + Iterator, + List, + Optional, + TextIO, + Tuple, + Type, + TypeVar, + Union, + cast, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.pyproject_hooks import BuildBackendHookCaller + +from pip import __version__ +from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment +from pip._internal.locations import get_major_minor_version +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.retry import retry +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = [ + "rmtree", + "display_path", + "backup_dir", + "ask", + "splitext", + "format_size", + "is_installable_dir", + "normalize_path", + "renames", + "get_prog", + "ensure_dir", + "remove_auth_from_url", + "check_externally_managed", + "ConfiguredBuildBackendHookCaller", +] + +logger = logging.getLogger(__name__) + +T = TypeVar("T") +ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] +VersionInfo = Tuple[int, int, int] +NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] +OnExc = Callable[[FunctionType, Path, BaseException], Any] +OnErr = Callable[[FunctionType, Path, ExcInfo], Any] + +FILE_CHUNK_SIZE = 1024 * 1024 + + +def get_pip_version() -> str: + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return f"pip {__version__} from {pip_pkg_dir} (python {get_major_minor_version()})" + + +def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]: + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast("VersionInfo", py_version_info) + + +def ensure_dir(path: str) -> None: + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog() -> str: + try: + prog = os.path.basename(sys.argv[0]) + if prog in ("__main__.py", "-c"): + return f"{sys.executable} -m pip" + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return "pip" + + +# Retry every half second for up to 3 seconds +@retry(stop_after_delay=3, wait=0.5) +def rmtree( + dir: str, ignore_errors: bool = False, onexc: Optional[OnExc] = None +) -> None: + if ignore_errors: + onexc = _onerror_ignore + if onexc is None: + onexc = _onerror_reraise + handler: OnErr = partial(rmtree_errorhandler, onexc=onexc) + if sys.version_info >= (3, 12): + # See https://docs.python.org/3.12/whatsnew/3.12.html#shutil. + shutil.rmtree(dir, onexc=handler) # type: ignore + else: + shutil.rmtree(dir, onerror=handler) # type: ignore + + +def _onerror_ignore(*_args: Any) -> None: + pass + + +def _onerror_reraise(*_args: Any) -> None: + raise # noqa: PLE0704 - Bare exception used to reraise existing exception + + +def rmtree_errorhandler( + func: FunctionType, + path: Path, + exc_info: Union[ExcInfo, BaseException], + *, + onexc: OnExc = _onerror_reraise, +) -> None: + """ + `rmtree` error handler to 'force' a file remove (i.e. like `rm -f`). + + * If a file is readonly then it's write flag is set and operation is + retried. + + * `onerror` is the original callback from `rmtree(... onerror=onerror)` + that is chained at the end if the "rm -f" still fails. + """ + try: + st_mode = os.stat(path).st_mode + except OSError: + # it's equivalent to os.path.exists + return + + if not st_mode & stat.S_IWRITE: + # convert to read/write + try: + os.chmod(path, st_mode | stat.S_IWRITE) + except OSError: + pass + else: + # use the original function to repeat the operation + try: + func(path) + return + except OSError: + pass + + if not isinstance(exc_info, BaseException): + _, exc_info, _ = exc_info + onexc(func, path, exc_info) + + +def display_path(path: str) -> str: + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if path.startswith(os.getcwd() + os.path.sep): + path = "." + path[len(os.getcwd()) :] + return path + + +def backup_dir(dir: str, ext: str = ".bak") -> str: + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message: str, options: Iterable[str]) -> str: + for action in os.environ.get("PIP_EXISTS_ACTION", "").split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message: str) -> None: + """Raise an error if no input is allowed.""" + if os.environ.get("PIP_NO_INPUT"): + raise Exception( + f"No input was expected ($PIP_NO_INPUT set); question: {message}" + ) + + +def ask(message: str, options: Iterable[str]) -> str: + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + "Your response ({!r}) was not one of the expected responses: " + "{}".format(response, ", ".join(options)) + ) + else: + return response + + +def ask_input(message: str) -> str: + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message: str) -> str: + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def strtobool(val: str) -> int: + """Convert a string representation of truth to true (1) or false (0). + + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + """ + val = val.lower() + if val in ("y", "yes", "t", "true", "on", "1"): + return 1 + elif val in ("n", "no", "f", "false", "off", "0"): + return 0 + else: + raise ValueError(f"invalid truth value {val!r}") + + +def format_size(bytes: float) -> str: + if bytes > 1000 * 1000: + return f"{bytes / 1000.0 / 1000:.1f} MB" + elif bytes > 10 * 1000: + return f"{int(bytes / 1000)} kB" + elif bytes > 1000: + return f"{bytes / 1000.0:.1f} kB" + else: + return f"{int(bytes)} bytes" + + +def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]: + """Return a list of formatted rows and a list of column sizes. + + For example:: + + >>> tabulate([['foobar', 2000], [0xdeadbeef]]) + (['foobar 2000', '3735928559'], [10, 4]) + """ + rows = [tuple(map(str, row)) for row in rows] + sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")] + table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] + return table, sizes + + +def is_installable_dir(path: str) -> bool: + """Is path is a directory containing pyproject.toml or setup.py? + + If pyproject.toml exists, this is a PEP 517 project. Otherwise we look for + a legacy setuptools layout by identifying setup.py. We don't check for the + setup.cfg because using it without setup.py is only available for PEP 517 + projects, which are already covered by the pyproject.toml check. + """ + if not os.path.isdir(path): + return False + if os.path.isfile(os.path.join(path, "pyproject.toml")): + return True + if os.path.isfile(os.path.join(path, "setup.py")): + return True + return False + + +def read_chunks( + file: BinaryIO, size: int = FILE_CHUNK_SIZE +) -> Generator[bytes, None, None]: + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path: str, resolve_symlinks: bool = True) -> str: + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = os.path.expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path: str) -> Tuple[str, str]: + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith(".tar"): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old: str, new: str) -> None: + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path: str) -> bool: + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + if not running_under_virtualenv(): + return True + return path.startswith(normalize_path(sys.prefix)) + + +def write_output(msg: Any, *args: Any) -> None: + logger.info(msg, *args) + + +class StreamWrapper(StringIO): + orig_stream: TextIO + + @classmethod + def from_stream(cls, orig_stream: TextIO) -> "StreamWrapper": + ret = cls() + ret.orig_stream = orig_stream + return ret + + # compileall.compile_dir() needs stdout.encoding to print to stdout + # type ignore is because TextIOBase.encoding is writeable + @property + def encoding(self) -> str: # type: ignore + return self.orig_stream.encoding + + +# Simulates an enum +def enum(*sequential: Any, **named: Any) -> Type[Any]: + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums["reverse_mapping"] = reverse + return type("Enum", (), enums) + + +def build_netloc(host: str, port: Optional[int]) -> str: + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ":" in host: + # Only wrap host with square brackets when it is IPv6 + host = f"[{host}]" + return f"{host}:{port}" + + +def build_url_from_netloc(netloc: str, scheme: str = "https") -> str: + """ + Build a full URL from a netloc. + """ + if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = f"[{netloc}]" + return f"{scheme}://{netloc}" + + +def parse_netloc(netloc: str) -> Tuple[Optional[str], Optional[int]]: + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib.parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc: str) -> NetlocTuple: + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if "@" not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit("@", 1) + pw: Optional[str] = None + if ":" in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user, pw = auth.split(":", 1) + else: + user, pw = auth, None + + user = urllib.parse.unquote(user) + if pw is not None: + pw = urllib.parse.unquote(pw) + + return netloc, (user, pw) + + +def redact_netloc(netloc: str) -> str: + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = "****" + password = "" + else: + user = urllib.parse.quote(user) + password = ":****" + return f"{user}{password}@{netloc}" + + +def _transform_url( + url: str, transform_netloc: Callable[[str], Tuple[Any, ...]] +) -> Tuple[str, NetlocTuple]: + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib.parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment) + surl = urllib.parse.urlunsplit(url_pieces) + return surl, cast("NetlocTuple", netloc_tuple) + + +def _get_netloc(netloc: str) -> NetlocTuple: + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc: str) -> Tuple[str]: + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url( + url: str, +) -> Tuple[str, str, Tuple[Optional[str], Optional[str]]]: + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url: str) -> str: + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url: str) -> str: + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +def redact_auth_from_requirement(req: Requirement) -> str: + """Replace the password in a given requirement url with ****.""" + if not req.url: + return str(req) + return str(req).replace(req.url, redact_auth_from_url(req.url)) + + +@dataclass(frozen=True) +class HiddenText: + secret: str + redacted: str + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return self.redacted + + # This is useful for testing. + def __eq__(self, other: Any) -> bool: + if type(self) is not type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return self.secret == other.secret + + +def hide_value(value: str) -> HiddenText: + return HiddenText(value, redacted="****") + + +def hide_url(url: str) -> HiddenText: + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip", + f"pip{sys.version_info.major}", + f"pip{sys.version_info.major}.{sys.version_info.minor}", + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [sys.executable, "-m", "pip"] + sys.argv[1:] + raise CommandError( + "To modify pip, please run the following command:\n{}".format( + " ".join(new_command) + ) + ) + + +def check_externally_managed() -> None: + """Check whether the current environment is externally managed. + + If the ``EXTERNALLY-MANAGED`` config file is found, the current environment + is considered externally managed, and an ExternallyManagedEnvironment is + raised. + """ + if running_under_virtualenv(): + return + marker = os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED") + if not os.path.isfile(marker): + return + raise ExternallyManagedEnvironment.from_config(marker) + + +def is_console_interactive() -> bool: + """Is this console interactive?""" + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]: + """Return (hash, length) for path using hashlib.sha256()""" + + h = hashlib.sha256() + length = 0 + with open(path, "rb") as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: + """ + Return paired elements. + + For example: + s -> (s0, s1), (s2, s3), (s4, s5), ... + """ + iterable = iter(iterable) + return zip_longest(iterable, iterable) + + +def partition( + pred: Callable[[T], bool], iterable: Iterable[T] +) -> Tuple[Iterable[T], Iterable[T]]: + """ + Use a predicate to partition entries into false entries and true entries, + like + + partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 + """ + t1, t2 = tee(iterable) + return filterfalse(pred, t1), filter(pred, t2) + + +class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller): + def __init__( + self, + config_holder: Any, + source_dir: str, + build_backend: str, + backend_path: Optional[str] = None, + runner: Optional[Callable[..., None]] = None, + python_executable: Optional[str] = None, + ): + super().__init__( + source_dir, build_backend, backend_path, runner, python_executable + ) + self.config_holder = config_holder + + def build_wheel( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_wheel( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def build_sdist( + self, + sdist_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_sdist(sdist_directory, config_settings=cs) + + def build_editable( + self, + wheel_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + metadata_directory: Optional[str] = None, + ) -> str: + cs = self.config_holder.config_settings + return super().build_editable( + wheel_directory, config_settings=cs, metadata_directory=metadata_directory + ) + + def get_requires_for_build_wheel( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_wheel(config_settings=cs) + + def get_requires_for_build_sdist( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_sdist(config_settings=cs) + + def get_requires_for_build_editable( + self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None + ) -> List[str]: + cs = self.config_holder.config_settings + return super().get_requires_for_build_editable(config_settings=cs) + + def prepare_metadata_for_build_wheel( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_wheel( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) + + def prepare_metadata_for_build_editable( + self, + metadata_directory: str, + config_settings: Optional[Dict[str, Union[str, List[str]]]] = None, + _allow_fallback: bool = True, + ) -> str: + cs = self.config_holder.config_settings + return super().prepare_metadata_for_build_editable( + metadata_directory=metadata_directory, + config_settings=cs, + _allow_fallback=_allow_fallback, + ) + + +def warn_if_run_as_root() -> None: + """Output a warning for sudo users on Unix. + + In a virtual environment, sudo pip still writes to virtualenv. + On Windows, users may run pip as Administrator without issues. + This warning only applies to Unix root users outside of virtualenv. + """ + if running_under_virtualenv(): + return + if not hasattr(os, "getuid"): + return + # On Windows, there are no "system managed" Python packages. Installing as + # Administrator via pip is the correct way of updating system environments. + # + # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform + # checks: https://mypy.readthedocs.io/en/stable/common_issues.html + if sys.platform == "win32" or sys.platform == "cygwin": + return + + if os.getuid() != 0: + return + + logger.warning( + "Running pip as the 'root' user can result in broken permissions and " + "conflicting behaviour with the system package manager, possibly " + "rendering your system unusable." + "It is recommended to use a virtual environment instead: " + "https://pip.pypa.io/warnings/venv. " + "Use the --root-user-action option if you know what you are doing and " + "want to suppress this warning." + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py b/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..4b8fa0f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,57 @@ +import functools +import logging +import re +from typing import NewType, Optional, Tuple, cast + +from pip._vendor.packaging import specifiers, version +from pip._vendor.packaging.requirements import Requirement + +NormalizedExtra = NewType("NormalizedExtra", str) + +logger = logging.getLogger(__name__) + + +def check_requires_python( + requires_python: Optional[str], version_info: Tuple[int, ...] +) -> bool: + """ + Check if the given Python version matches a "Requires-Python" specifier. + + :param version_info: A 3-tuple of ints representing a Python + major-minor-micro version to check (e.g. `sys.version_info[:3]`). + + :return: `True` if the given Python version satisfies the requirement. + Otherwise, return `False`. + + :raises InvalidSpecifier: If `requires_python` has an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + python_version = version.parse(".".join(map(str, version_info))) + return python_version in requires_python_specifier + + +@functools.lru_cache(maxsize=2048) +def get_requirement(req_string: str) -> Requirement: + """Construct a packaging.Requirement object with caching""" + # Parsing requirement strings is expensive, and is also expected to happen + # with a low diversity of different arguments (at least relative the number + # constructed). This method adds a cache to requirement object creation to + # minimize repeated parsing of the same string to construct equivalent + # Requirement objects. + return Requirement(req_string) + + +def safe_extra(extra: str) -> NormalizedExtra: + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + + This function is duplicated from ``pkg_resources``. Note that this is not + the same to either ``canonicalize_name`` or ``_egg_link_name``. + """ + return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower()) diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py b/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py new file mode 100644 index 0000000..abfe072 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/retry.py @@ -0,0 +1,42 @@ +import functools +from time import perf_counter, sleep +from typing import Callable, TypeVar + +from pip._vendor.typing_extensions import ParamSpec + +T = TypeVar("T") +P = ParamSpec("P") + + +def retry( + wait: float, stop_after_delay: float +) -> Callable[[Callable[P, T]], Callable[P, T]]: + """Decorator to automatically retry a function on error. + + If the function raises, the function is recalled with the same arguments + until it returns or the time limit is reached. When the time limit is + surpassed, the last exception raised is reraised. + + :param wait: The time to wait after an error before retrying, in seconds. + :param stop_after_delay: The time limit after which retries will cease, + in seconds. + """ + + def wrapper(func: Callable[P, T]) -> Callable[P, T]: + + @functools.wraps(func) + def retry_wrapped(*args: P.args, **kwargs: P.kwargs) -> T: + # The performance counter is monotonic on all platforms we care + # about and has much better resolution than time.monotonic(). + start_time = perf_counter() + while True: + try: + return func(*args, **kwargs) + except Exception: + if perf_counter() - start_time > stop_after_delay: + raise + sleep(wait) + + return retry_wrapped + + return wrapper diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py b/env/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..96d1b24 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,146 @@ +import sys +import textwrap +from typing import List, Optional, Sequence + +# Shim to wrap setup.py invocation with setuptools +# Note that __file__ is handled via two {!r} *and* %r, to ensure that paths on +# Windows are correctly handled (it should be "C:\\Users" not "C:\Users"). +_SETUPTOOLS_SHIM = textwrap.dedent( + """ + exec(compile(''' + # This is -- a caller that pip uses to run setup.py + # + # - It imports setuptools before invoking setup.py, to enable projects that directly + # import from `distutils.core` to work with newer packaging standards. + # - It provides a clear error message when setuptools is not installed. + # - It sets `sys.argv[0]` to the underlying `setup.py`, when invoking `setup.py` so + # setuptools doesn't think the script is `-c`. This avoids the following warning: + # manifest_maker: standard file '-c' not found". + # - It generates a shim setup.py, for handling setup.cfg-only projects. + import os, sys, tokenize + + try: + import setuptools + except ImportError as error: + print( + "ERROR: Can not execute `setup.py` since setuptools is not available in " + "the build environment.", + file=sys.stderr, + ) + sys.exit(1) + + __file__ = %r + sys.argv[0] = __file__ + + if os.path.exists(__file__): + filename = __file__ + with tokenize.open(__file__) as f: + setup_py_code = f.read() + else: + filename = "" + setup_py_code = "from setuptools import setup; setup()" + + exec(compile(setup_py_code, filename, "exec")) + ''' % ({!r},), "", "exec")) + """ +).rstrip() + + +def make_setuptools_shim_args( + setup_py_path: str, + global_options: Optional[Sequence[str]] = None, + no_user_config: bool = False, + unbuffered_output: bool = False, +) -> List[str]: + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path: str, + global_options: Sequence[str], + build_options: Sequence[str], + destination_dir: str, +) -> List[str]: + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path: str, + global_options: Sequence[str], +) -> List[str]: + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path: str, + *, + global_options: Sequence[str], + no_user_config: bool, + prefix: Optional[str], + home: Optional[str], + use_user_site: bool, +) -> List[str]: + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--install-dir", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path: str, + egg_info_dir: Optional[str], + no_user_config: bool, +) -> List[str]: + args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config) + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py b/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py new file mode 100644 index 0000000..cb2e23f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py @@ -0,0 +1,245 @@ +import logging +import os +import shlex +import subprocess +from typing import Any, Callable, Iterable, List, Literal, Mapping, Optional, Union + +from pip._vendor.rich.markup import escape + +from pip._internal.cli.spinners import SpinnerInterface, open_spinner +from pip._internal.exceptions import InstallationSubprocessError +from pip._internal.utils.logging import VERBOSE, subprocess_logger +from pip._internal.utils.misc import HiddenText + +CommandArgs = List[Union[str, HiddenText]] + + +def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs: + """ + Create a CommandArgs object. + """ + command_args: CommandArgs = [] + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args: Union[List[str], CommandArgs]) -> str: + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return " ".join( + shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg) + for arg in args + ) + + +def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]: + """ + Return the arguments in their raw, unredacted form. + """ + return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args] + + +def call_subprocess( + cmd: Union[List[str], CommandArgs], + show_stdout: bool = False, + cwd: Optional[str] = None, + on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", + extra_ok_returncodes: Optional[Iterable[int]] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + unset_environ: Optional[Iterable[str]] = None, + spinner: Optional[SpinnerInterface] = None, + log_failed_cmd: Optional[bool] = True, + stdout_only: Optional[bool] = False, + *, + command_desc: str, +) -> str: + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + stdout_only: if true, return only stdout, else return both. When true, + logging of both stdout and stderr occurs when the subprocess has + terminated, else logging occurs as subprocess output is produced. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess: Callable[..., None] = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using VERBOSE. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.verbose + used_level = VERBOSE + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE, + cwd=cwd, + env=env, + errors="backslashreplace", + ) + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", + exc, + command_desc, + ) + raise + all_output = [] + if not stdout_only: + assert proc.stdout + assert proc.stdin + proc.stdin.close() + # In this mode, stdout and stderr are in the same pipe. + while True: + line: str = proc.stdout.readline() + if not line: + break + line = line.rstrip() + all_output.append(line + "\n") + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + assert spinner + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + output = "".join(all_output) + else: + # In this mode, stdout and stderr are in different pipes. + # We must use communicate() which is the only safe way to read both. + out, err = proc.communicate() + # log line by line to preserve pip log indenting + for out_line in out.splitlines(): + log_subprocess(out_line) + all_output.append(out) + for err_line in err.splitlines(): + log_subprocess(err_line) + all_output.append(err) + output = out + + proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes + if use_spinner: + assert spinner + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == "raise": + error = InstallationSubprocessError( + command_description=command_desc, + exit_code=proc.returncode, + output_lines=all_output if not showing_subprocess else None, + ) + if log_failed_cmd: + subprocess_logger.error("%s", error, extra={"rich": True}) + subprocess_logger.verbose( + "[bold magenta]full command[/]: [blue]%s[/]", + escape(format_command_args(cmd)), + extra={"markup": True}, + ) + subprocess_logger.verbose( + "[bold magenta]cwd[/]: %s", + escape(cwd or "[inherit]"), + extra={"markup": True}, + ) + + raise error + elif on_returncode == "warn": + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, + proc.returncode, + cwd, + ) + elif on_returncode == "ignore": + pass + else: + raise ValueError(f"Invalid value: on_returncode={on_returncode!r}") + return output + + +def runner_with_spinner_message(message: str) -> Callable[..., None]: + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for BuildBackendHookCaller. Thus, the runner has + an API that matches what's expected by BuildBackendHookCaller.subprocess_runner. + """ + + def runner( + cmd: List[str], + cwd: Optional[str] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + ) -> None: + with open_spinner(message) as spinner: + call_subprocess( + cmd, + command_desc=message, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py b/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..06668e8 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,296 @@ +import errno +import itertools +import logging +import os.path +import tempfile +import traceback +from contextlib import ExitStack, contextmanager +from pathlib import Path +from typing import ( + Any, + Callable, + Dict, + Generator, + List, + Optional, + TypeVar, + Union, +) + +from pip._internal.utils.misc import enum, rmtree + +logger = logging.getLogger(__name__) + +_T = TypeVar("_T", bound="TempDirectory") + + +# Kinds of temporary directories. Only needed for ones that are +# globally-managed. +tempdir_kinds = enum( + BUILD_ENV="build-env", + EPHEM_WHEEL_CACHE="ephem-wheel-cache", + REQ_BUILD="req-build", +) + + +_tempdir_manager: Optional[ExitStack] = None + + +@contextmanager +def global_tempdir_manager() -> Generator[None, None, None]: + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry: + """Manages temp directory behavior""" + + def __init__(self) -> None: + self._should_delete: Dict[str, bool] = {} + + def set_delete(self, kind: str, value: bool) -> None: + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind: str) -> bool: + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry: Optional[TempDirectoryTypeRegistry] = None + + +@contextmanager +def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]: + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class _Default: + pass + + +_default = _Default() + + +class TempDirectory: + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path: Optional[str] = None, + delete: Union[bool, None, _Default] = _default, + kind: str = "temp", + globally_managed: bool = False, + ignore_cleanup_errors: bool = True, + ): + super().__init__() + + if delete is _default: + if path is not None: + # If we were given an explicit directory, resolve delete option + # now. + delete = False + else: + # Otherwise, we wait until cleanup and see what + # tempdir_registry says. + delete = None + + # The only time we specify path is in for editables where it + # is the value of the --src option. + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + self.ignore_cleanup_errors = ignore_cleanup_errors + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self) -> str: + assert not self._deleted, f"Attempted to access deleted path: {self._path}" + return self._path + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.path!r}>" + + def __enter__(self: _T) -> _T: + return self + + def __exit__(self, exc: Any, value: Any, tb: Any) -> None: + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind: str) -> str: + """Create a temporary directory and store its path in self.path""" + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + logger.debug("Created temporary directory: %s", path) + return path + + def cleanup(self) -> None: + """Remove the temporary directory created and reset state""" + self._deleted = True + if not os.path.exists(self._path): + return + + errors: List[BaseException] = [] + + def onerror( + func: Callable[..., Any], + path: Path, + exc_val: BaseException, + ) -> None: + """Log a warning for a `rmtree` error and continue""" + formatted_exc = "\n".join( + traceback.format_exception_only(type(exc_val), exc_val) + ) + formatted_exc = formatted_exc.rstrip() # remove trailing new line + if func in (os.unlink, os.remove, os.rmdir): + logger.debug( + "Failed to remove a temporary file '%s' due to %s.\n", + path, + formatted_exc, + ) + else: + logger.debug("%s failed with %s.", func.__qualname__, formatted_exc) + errors.append(exc_val) + + if self.ignore_cleanup_errors: + try: + # first try with @retry; retrying to handle ephemeral errors + rmtree(self._path, ignore_errors=False) + except OSError: + # last pass ignore/log all errors + rmtree(self._path, onexc=onerror) + if errors: + logger.warning( + "Failed to remove contents in a temporary directory '%s'.\n" + "You can safely remove it manually.", + self._path, + ) + else: + rmtree(self._path) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original: str, delete: Optional[bool] = None) -> None: + self.original = original.rstrip("/\\") + super().__init__(delete=delete) + + @classmethod + def _generate_names(cls, name: str) -> Generator[str, None, None]: + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1 + ): + new_name = "~" + "".join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i + ): + new_name = "~" + "".join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind: str) -> str: + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + + logger.debug("Created temporary directory: %s", path) + return path diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py b/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py new file mode 100644 index 0000000..875e30e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py @@ -0,0 +1,337 @@ +"""Utilities related archives. +""" + +import logging +import os +import shutil +import stat +import sys +import tarfile +import zipfile +from typing import Iterable, List, Optional +from zipfile import ZipInfo + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug("bz2 module is not available") + +try: + # Only for Python 3.3+ + import lzma # noqa + + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug("lzma module is not available") + + +def current_umask() -> int: + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path: str) -> List[str]: + path = path.lstrip("/").lstrip("\\") + if "/" in path and ( + ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path + ): + return path.split("/", 1) + elif "\\" in path: + return path.split("\\", 1) + else: + return [path, ""] + + +def has_leading_dir(paths: Iterable[str]) -> bool: + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory: str, target: str) -> bool: + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def _get_default_mode_plus_executable() -> int: + return 0o777 & ~current_umask() | 0o111 + + +def set_extracted_file_to_default_mode_plus_executable(path: str) -> None: + """ + Make file present at path have execute for user/group/world + (chmod +x) is no-op on windows per python docs + """ + os.chmod(path, _get_default_mode_plus_executable()) + + +def zip_item_is_executable(info: ZipInfo) -> bool: + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + return bool(mode and stat.S_ISREG(mode) and mode & 0o111) + + +def unzip_file(filename: str, location: str, flatten: bool = True) -> None: + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, "rb") + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + "The zip file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith("/") or fn.endswith("\\"): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + if zip_item_is_executable(info): + set_extracted_file_to_default_mode_plus_executable(fn) + finally: + zipfp.close() + + +def untar_file(filename: str, location: str) -> None: + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied on top of the + default. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"): + mode = "r:gz" + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = "r:bz2" + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = "r:xz" + elif filename.lower().endswith(".tar"): + mode = "r" + else: + logger.warning( + "Cannot determine compression type for file %s", + filename, + ) + mode = "r:*" + + tar = tarfile.open(filename, mode, encoding="utf-8") + try: + leading = has_leading_dir([member.name for member in tar.getmembers()]) + + # PEP 706 added `tarfile.data_filter`, and made some other changes to + # Python's tarfile module (see below). The features were backported to + # security releases. + try: + data_filter = tarfile.data_filter + except AttributeError: + _untar_without_filter(filename, location, tar, leading) + else: + default_mode_plus_executable = _get_default_mode_plus_executable() + + if leading: + # Strip the leading directory from all files in the archive, + # including hardlink targets (which are relative to the + # unpack location). + for member in tar.getmembers(): + name_lead, name_rest = split_leading_dir(member.name) + member.name = name_rest + if member.islnk(): + lnk_lead, lnk_rest = split_leading_dir(member.linkname) + if lnk_lead == name_lead: + member.linkname = lnk_rest + + def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo: + orig_mode = member.mode + try: + try: + member = data_filter(member, location) + except tarfile.LinkOutsideDestinationError: + if sys.version_info[:3] in { + (3, 8, 17), + (3, 9, 17), + (3, 10, 12), + (3, 11, 4), + }: + # The tarfile filter in specific Python versions + # raises LinkOutsideDestinationError on valid input + # (https://github.com/python/cpython/issues/107845) + # Ignore the error there, but do use the + # more lax `tar_filter` + member = tarfile.tar_filter(member, location) + else: + raise + except tarfile.TarError as exc: + message = "Invalid member in the tar file {}: {}" + # Filter error messages mention the member name. + # No need to add it here. + raise InstallationError( + message.format( + filename, + exc, + ) + ) + if member.isfile() and orig_mode & 0o111: + member.mode = default_mode_plus_executable + else: + # See PEP 706 note above. + # The PEP changed this from `int` to `Optional[int]`, + # where None means "use the default". Mypy doesn't + # know this yet. + member.mode = None # type: ignore [assignment] + return member + + tar.extractall(location, filter=pip_filter) + + finally: + tar.close() + + +def _untar_without_filter( + filename: str, + location: str, + tar: tarfile.TarFile, + leading: bool, +) -> None: + """Fallback for Python without tarfile.data_filter""" + for member in tar.getmembers(): + fn = member.name + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + "The tar file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, path, location)) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + ensure_dir(os.path.dirname(path)) + assert fp is not None + with open(path, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + set_extracted_file_to_default_mode_plus_executable(path) + + +def unpack_file( + filename: str, + location: str, + content_type: Optional[str] = None, +) -> None: + filename = os.path.realpath(filename) + if ( + content_type == "application/zip" + or filename.lower().endswith(ZIP_EXTENSIONS) + or zipfile.is_zipfile(filename) + ): + unzip_file(filename, location, flatten=not filename.endswith(".whl")) + elif ( + content_type == "application/x-gzip" + or tarfile.is_tarfile(filename) + or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + "Cannot unpack file %s (downloaded from %s, content-type: %s); " + "cannot detect archive format", + filename, + location, + content_type, + ) + raise InstallationError(f"Cannot determine archive format of {location}") diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py b/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py new file mode 100644 index 0000000..9f34f88 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/urls.py @@ -0,0 +1,55 @@ +import os +import string +import urllib.parse +import urllib.request + +from .compat import WINDOWS + + +def path_to_url(path: str) -> str: + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path)) + return url + + +def url_to_path(url: str) -> str: + """ + Convert a file: URL to a path. + """ + assert url.startswith( + "file:" + ), f"You can only turn file: urls into filenames (not {url!r})" + + _, netloc, path, _, _ = urllib.parse.urlsplit(url) + + if not netloc or netloc == "localhost": + # According to RFC 8089, same as empty authority. + netloc = "" + elif WINDOWS: + # If we have a UNC path, prepend UNC share notation. + netloc = "\\\\" + netloc + else: + raise ValueError( + f"non-local file URIs are not supported on this platform: {url!r}" + ) + + path = urllib.request.url2pathname(netloc + path) + + # On Windows, urlsplit parses the path as something like "/C:/Users/foo". + # This creates issues for path-related functions like io.open(), so we try + # to detect and strip the leading slash. + if ( + WINDOWS + and not netloc # Not UNC. + and len(path) >= 3 + and path[0] == "/" # Leading slash to strip. + and path[1] in string.ascii_letters # Drive letter. + and path[2:4] in (":", ":/") # Colon + end of string, or colon + absolute path. + ): + path = path[1:] + + return path diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py b/env/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py new file mode 100644 index 0000000..882e36f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py @@ -0,0 +1,104 @@ +import logging +import os +import re +import site +import sys +from typing import List, Optional + +logger = logging.getLogger(__name__) +_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( + r"include-system-site-packages\s*=\s*(?Ptrue|false)" +) + + +def _running_under_venv() -> bool: + """Checks if sys.base_prefix and sys.prefix match. + + This handles PEP 405 compliant virtual environments. + """ + return sys.prefix != getattr(sys, "base_prefix", sys.prefix) + + +def _running_under_legacy_virtualenv() -> bool: + """Checks if sys.real_prefix is set. + + This handles virtual environments created with pypa's virtualenv. + """ + # pypa/virtualenv case + return hasattr(sys, "real_prefix") + + +def running_under_virtualenv() -> bool: + """True if we're running inside a virtual environment, False otherwise.""" + return _running_under_venv() or _running_under_legacy_virtualenv() + + +def _get_pyvenv_cfg_lines() -> Optional[List[str]]: + """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines + + Returns None, if it could not read/access the file. + """ + pyvenv_cfg_file = os.path.join(sys.prefix, "pyvenv.cfg") + try: + # Although PEP 405 does not specify, the built-in venv module always + # writes with UTF-8. (pypa/pip#8717) + with open(pyvenv_cfg_file, encoding="utf-8") as f: + return f.read().splitlines() # avoids trailing newlines + except OSError: + return None + + +def _no_global_under_venv() -> bool: + """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion + + PEP 405 specifies that when system site-packages are not supposed to be + visible from a virtual environment, `pyvenv.cfg` must contain the following + line: + + include-system-site-packages = false + + Additionally, log a warning if accessing the file fails. + """ + cfg_lines = _get_pyvenv_cfg_lines() + if cfg_lines is None: + # We're not in a "sane" venv, so assume there is no system + # site-packages access (since that's PEP 405's default state). + logger.warning( + "Could not access 'pyvenv.cfg' despite a virtual environment " + "being active. Assuming global site-packages is not accessible " + "in this environment." + ) + return True + + for line in cfg_lines: + match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) + if match is not None and match.group("value") == "false": + return True + return False + + +def _no_global_under_legacy_virtualenv() -> bool: + """Check if "no-global-site-packages.txt" exists beside site.py + + This mirrors logic in pypa/virtualenv for determining whether system + site-packages are visible in the virtual environment. + """ + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_site_packages_file = os.path.join( + site_mod_dir, + "no-global-site-packages.txt", + ) + return os.path.exists(no_global_site_packages_file) + + +def virtualenv_no_global() -> bool: + """Returns a boolean, whether running in venv with no system site-packages.""" + # PEP 405 compliance needs to be checked first since virtualenv >=20 would + # return True for both checks, but is only able to use the PEP 405 config. + if _running_under_venv(): + return _no_global_under_venv() + + if _running_under_legacy_virtualenv(): + return _no_global_under_legacy_virtualenv() + + return False diff --git a/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py b/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py new file mode 100644 index 0000000..f85aee8 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/utils/wheel.py @@ -0,0 +1,134 @@ +"""Support functions for working with wheel files. +""" + +import logging +from email.message import Message +from email.parser import Parser +from typing import Tuple +from zipfile import BadZipFile, ZipFile + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import UnsupportedWheel + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]: + """Extract information from the provided wheel, ensuring it meets basic + standards. + + Returns the name of the .dist-info directory and the parsed WHEEL metadata. + """ + try: + info_dir = wheel_dist_info_dir(wheel_zip, name) + metadata = wheel_metadata(wheel_zip, info_dir) + version = wheel_version(metadata) + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + + check_compatibility(version, name) + + return info_dir, metadata + + +def wheel_dist_info_dir(source: ZipFile, name: str) -> str: + """Returns the name of the contained .dist-info directory. + + Raises AssertionError or UnsupportedWheel if not found, >1 found, or + it doesn't match the provided name. + """ + # Zip file path separators must be / + subdirs = {p.split("/", 1)[0] for p in source.namelist()} + + info_dirs = [s for s in subdirs if s.endswith(".dist-info")] + + if not info_dirs: + raise UnsupportedWheel(".dist-info directory not found") + + if len(info_dirs) > 1: + raise UnsupportedWheel( + "multiple .dist-info directories found: {}".format(", ".join(info_dirs)) + ) + + info_dir = info_dirs[0] + + info_dir_name = canonicalize_name(info_dir) + canonical_name = canonicalize_name(name) + if not info_dir_name.startswith(canonical_name): + raise UnsupportedWheel( + f".dist-info directory {info_dir!r} does not start with {canonical_name!r}" + ) + + return info_dir + + +def read_wheel_metadata_file(source: ZipFile, path: str) -> bytes: + try: + return source.read(path) + # BadZipFile for general corruption, KeyError for missing entry, + # and RuntimeError for password-protected files + except (BadZipFile, KeyError, RuntimeError) as e: + raise UnsupportedWheel(f"could not read {path!r} file: {e!r}") + + +def wheel_metadata(source: ZipFile, dist_info_dir: str) -> Message: + """Return the WHEEL metadata of an extracted wheel, if possible. + Otherwise, raise UnsupportedWheel. + """ + path = f"{dist_info_dir}/WHEEL" + # Zip file path separators must be / + wheel_contents = read_wheel_metadata_file(source, path) + + try: + wheel_text = wheel_contents.decode() + except UnicodeDecodeError as e: + raise UnsupportedWheel(f"error decoding {path!r}: {e!r}") + + # FeedParser (used by Parser) does not raise any exceptions. The returned + # message may have .defects populated, but for backwards-compatibility we + # currently ignore them. + return Parser().parsestr(wheel_text) + + +def wheel_version(wheel_data: Message) -> Tuple[int, ...]: + """Given WHEEL metadata, return the parsed Wheel-Version. + Otherwise, raise UnsupportedWheel. + """ + version_text = wheel_data["Wheel-Version"] + if version_text is None: + raise UnsupportedWheel("WHEEL is missing Wheel-Version") + + version = version_text.strip() + + try: + return tuple(map(int, version.split("."))) + except ValueError: + raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}") + + +def check_compatibility(version: Tuple[int, ...], name: str) -> None: + """Raises errors or warns if called with an incompatible Wheel-Version. + + pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "{}'s Wheel-Version ({}) is not compatible with this version " + "of pip".format(name, ".".join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + "Installing from a newer Wheel-Version (%s)", + ".".join(map(str, version)), + ) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..b6beddb --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,15 @@ +# Expose a limited set of classes and functions so callers outside of +# the vcs package don't need to import deeper than `pip._internal.vcs`. +# (The test directory may still need to import from a vcs sub-package.) +# Import all vcs modules to register each VCS in the VcsSupport object. +import pip._internal.vcs.bazaar +import pip._internal.vcs.git +import pip._internal.vcs.mercurial +import pip._internal.vcs.subversion # noqa: F401 +from pip._internal.vcs.versioncontrol import ( # noqa: F401 + RemoteNotFoundError, + RemoteNotValidError, + is_url, + make_vcs_requirement_url, + vcs, +) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ea397a3ccf8635db9626c33be97c91b90286659 GIT binary patch literal 549 zcmZXQ%Sr<=6o!)-JFOKF5uu=h=&FlOylh1TuPX%+7lSaQGqDXOlQEYNLIU-2@1|Rn2cfKdJE%$TP}Ojs;5aM1!e@ zQ=OY=AZjv7B3V!BvXM08d@?VaNfV z)Qq@Eoff_&=>tm#nMpN!bX+sZ3Oh+cFxv~hRq`@Ud109@sEEOgyYz`t?L$cX>TKNO z*00UllIhH8PK95e4UOv#m^NG$eseaRMwu$CRzim`t)8n;s}NPF176S=h`tr+E6Ip- zeJUl*$%)EbHI^ag++MgY+1=UcoY0}^T-|q$Rn7=221M{KDTlVNiv4(Zj~H%Qr=-~f z?J+~(P2}$r2z&xbq2)GB<8tU52U6uuutU8J_hVRQ1Mm@IjK@ucH%DlFgtkU#`zwfW L@QDC=33mJd9~r5a literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdda927bdfdf049d717a16a13b7281278bfc8900 GIT binary patch literal 5070 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0acd393d3170d74118cae2d9f056d807fed0741 GIT binary patch literal 19035 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab3380b05b0ab4ca46dc1a591b65d57ce8a87dc4 GIT binary patch literal 12542 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..577b4cda7792fff761dc8853ea5ea96964a76121 GIT binary patch literal 29015 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 K4+RR@TKPXx0z?}C literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..c754b7c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,112 @@ +import logging +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import HiddenText, display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = "bzr" + dirname = ".bzr" + repo_name = "branch" + schemes = ( + "bzr+http", + "bzr+https", + "bzr+ssh", + "bzr+sftp", + "bzr+ftp", + "bzr+lp", + "bzr+file", + ) + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flags = ["--quiet"] + elif verbosity == 1: + flags = [] + else: + flags = [f"-{'v'*verbosity}"] + cmd_args = make_command( + "checkout", "--lightweight", *flags, rev_options.to_args(), url, dest + ) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command(make_command("switch", url), cwd=dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + output = self.run_command( + make_command("info"), show_stdout=False, stdout_only=True, cwd=dest + ) + if output.startswith("Standalone "): + # Older versions of pip used to create standalone branches. + # Convert the standalone branch to a checkout by calling "bzr bind". + cmd_args = make_command("bind", "-q", url) + self.run_command(cmd_args, cwd=dest) + + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "bzr+" + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location: str) -> str: + urls = cls.run_command( + ["info"], show_stdout=False, stdout_only=True, cwd=location + ) + for line in urls.splitlines(): + line = line.strip() + for x in ("checkout of branch: ", "parent branch: "): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + raise RemoteNotFoundError + + @classmethod + def get_revision(cls, location: str) -> str: + revision = cls.run_command( + ["revno"], + show_stdout=False, + stdout_only=True, + cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/git.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..0425deb --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,527 @@ +import logging +import os.path +import pathlib +import re +import urllib.parse +import urllib.request +from dataclasses import replace +from typing import List, Optional, Tuple + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import HiddenText, display_path, hide_url +from pip._internal.utils.subprocess import make_command +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RemoteNotValidError, + RevOptions, + VersionControl, + find_path_to_project_root_from_repo_root, + vcs, +) + +urlsplit = urllib.parse.urlsplit +urlunsplit = urllib.parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +GIT_VERSION_REGEX = re.compile( + r"^git version " # Prefix. + r"(\d+)" # Major. + r"\.(\d+)" # Dot, minor. + r"(?:\.(\d+))?" # Optional dot, patch. + r".*$" # Suffix, including any pre- and post-release segments we don't care about. +) + +HASH_REGEX = re.compile("^[a-fA-F0-9]{40}$") + +# SCP (Secure copy protocol) shorthand. e.g. 'git@example.com:foo/bar.git' +SCP_REGEX = re.compile( + r"""^ + # Optional user, e.g. 'git@' + (\w+@)? + # Server, e.g. 'github.com'. + ([^/:]+): + # The server-side path. e.g. 'user/project.git'. Must start with an + # alphanumeric character so as not to be confusable with a Windows paths + # like 'C:/foo/bar' or 'C:\foo\bar'. + (\w[^:]*) + $""", + re.VERBOSE, +) + + +def looks_like_hash(sha: str) -> bool: + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = "git" + dirname = ".git" + repo_name = "clone" + schemes = ( + "git+http", + "git+https", + "git+ssh", + "git+git", + "git+file", + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ("GIT_DIR", "GIT_WORK_TREE") + default_arg_rev = "HEAD" + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return [rev] + + def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: + _, rev_options = self.get_url_rev_options(hide_url(url)) + if not rev_options.rev: + return False + if not self.is_commit_id_equal(dest, rev_options.rev): + # the current commit is different from rev, + # which means rev was something else than a commit hash + return False + # return False in the rare case rev is both a commit hash + # and a tag or a branch; we don't want to cache in that case + # because that branch/tag could point to something else in the future + is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0]) + return not is_tag_or_branch + + def get_git_version(self) -> Tuple[int, ...]: + version = self.run_command( + ["version"], + command_desc="git version", + show_stdout=False, + stdout_only=True, + ) + match = GIT_VERSION_REGEX.match(version) + if not match: + logger.warning("Can't parse git version: %s", version) + return () + return (int(match.group(1)), int(match.group(2))) + + @classmethod + def get_current_branch(cls, location: str) -> Optional[str]: + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ["symbolic-ref", "-q", "HEAD"] + output = cls.run_command( + args, + extra_ok_returncodes=(1,), + show_stdout=False, + stdout_only=True, + cwd=location, + ) + ref = output.strip() + + if ref.startswith("refs/heads/"): + return ref[len("refs/heads/") :] + + return None + + @classmethod + def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]: + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = cls.run_command( + ["show-ref", rev], + cwd=dest, + show_stdout=False, + stdout_only=True, + on_returncode="ignore", + ) + refs = {} + # NOTE: We do not use splitlines here since that would split on other + # unicode separators, which can be maliciously used to install a + # different revision. + for line in output.strip().split("\n"): + line = line.rstrip("\r") + if not line: + continue + try: + ref_sha, ref_name = line.split(" ", maxsplit=2) + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError(f"unexpected show-ref line: {line!r}") + + refs[ref_name] = ref_sha + + branch_ref = f"refs/remotes/origin/{rev}" + tag_ref = f"refs/tags/{rev}" + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def _should_fetch(cls, dest: str, rev: str) -> bool: + """ + Return true if rev is a ref or is a commit that we don't have locally. + + Branches and tags are not considered in this method because they are + assumed to be always available locally (which is a normal outcome of + ``git clone`` and ``git fetch --tags``). + """ + if rev.startswith("refs/"): + # Always fetch remote refs. + return True + + if not looks_like_hash(rev): + # Git fetch would fail with abbreviated commits. + return False + + if cls.has_commit(dest, rev): + # Don't fetch if we have the commit locally. + return False + + return True + + @classmethod + def resolve_revision( + cls, dest: str, url: HiddenText, rev_options: RevOptions + ) -> RevOptions: + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + # The arg_rev property's implementation for Git ensures that the + # rev return value is always non-None. + assert rev is not None + + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options = replace(rev_options, branch_name=(rev if is_branch else None)) + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not cls._should_fetch(dest, rev): + return rev_options + + # fetch the requested revision + cls.run_command( + make_command("fetch", "-q", url, rev_options.to_args()), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev="FETCH_HEAD") + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest)) + if verbosity <= 0: + flags: Tuple[str, ...] = ("--quiet",) + elif verbosity == 1: + flags = () + else: + flags = ("--verbose", "--progress") + if self.get_git_version() >= (2, 17): + # Git added support for partial clone in 2.17 + # https://git-scm.com/docs/partial-clone + # Speeds up cloning by functioning without a complete copy of repository + self.run_command( + make_command( + "clone", + "--filter=blob:none", + *flags, + url, + dest, + ) + ) + else: + self.run_command(make_command("clone", *flags, url, dest)) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, "branch_name", None) + logger.debug("Rev options %s, branch_name %s", rev_options, branch_name) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = make_command( + "checkout", + "-q", + rev_options.to_args(), + ) + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = f"origin/{branch_name}" + cmd_args = [ + "checkout", + "-b", + branch_name, + "--track", + track_branch, + ] + self.run_command(cmd_args, cwd=dest) + else: + sha = self.get_revision(dest) + rev_options = rev_options.make_new(sha) + + logger.info("Resolved %s to commit %s", url, rev_options.rev) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command( + make_command("config", "remote.origin.url", url), + cwd=dest, + ) + cmd_args = make_command("checkout", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + # First fetch changes from the default remote + if self.get_git_version() >= (1, 9): + # fetch tags in addition to everything else + self.run_command(["fetch", "-q", "--tags"], cwd=dest) + else: + self.run_command(["fetch", "-q"], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location: str) -> str: + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ["config", "--get-regexp", r"remote\..*\.url"], + extra_ok_returncodes=(1,), + show_stdout=False, + stdout_only=True, + cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith("remote.origin.url "): + found_remote = remote + break + url = found_remote.split(" ")[1] + return cls._git_remote_to_pip_url(url.strip()) + + @staticmethod + def _git_remote_to_pip_url(url: str) -> str: + """ + Convert a remote url from what git uses to what pip accepts. + + There are 3 legal forms **url** may take: + + 1. A fully qualified url: ssh://git@example.com/foo/bar.git + 2. A local project.git folder: /path/to/bare/repository.git + 3. SCP shorthand for form 1: git@example.com:foo/bar.git + + Form 1 is output as-is. Form 2 must be converted to URI and form 3 must + be converted to form 1. + + See the corresponding test test_git_remote_url_to_pip() for examples of + sample inputs/outputs. + """ + if re.match(r"\w+://", url): + # This is already valid. Pass it though as-is. + return url + if os.path.exists(url): + # A local bare remote (git clone --mirror). + # Needs a file:// prefix. + return pathlib.PurePath(url).as_uri() + scp_match = SCP_REGEX.match(url) + if scp_match: + # Add an ssh:// prefix and replace the ':' with a '/'. + return scp_match.expand(r"ssh://\1\2/\3") + # Otherwise, bail out. + raise RemoteNotValidError(url) + + @classmethod + def has_commit(cls, location: str, rev: str) -> bool: + """ + Check if rev is a commit that is available in the local repository. + """ + try: + cls.run_command( + ["rev-parse", "-q", "--verify", "sha^" + rev], + cwd=location, + log_failed_cmd=False, + ) + except InstallationError: + return False + else: + return True + + @classmethod + def get_revision(cls, location: str, rev: Optional[str] = None) -> str: + if rev is None: + rev = "HEAD" + current_rev = cls.run_command( + ["rev-parse", rev], + show_stdout=False, + stdout_only=True, + cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + # find the repo root + git_dir = cls.run_command( + ["rev-parse", "--git-dir"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + repo_root = os.path.abspath(os.path.join(git_dir, "..")) + return find_path_to_project_root_from_repo_root(location, repo_root) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith("file"): + initial_slashes = path[: -len(path.lstrip("/"))] + newpath = initial_slashes + urllib.request.url2pathname(path).replace( + "\\", "/" + ).lstrip("/") + after_plus = scheme.find("+") + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + if "://" not in url: + assert "file:" not in url + url = url.replace("git+", "git+ssh://") + url, rev, user_pass = super().get_url_rev_and_auth(url) + url = url.replace("ssh://", "") + else: + url, rev, user_pass = super().get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location: str) -> None: + if not os.path.exists(os.path.join(location, ".gitmodules")): + return + cls.run_command( + ["submodule", "update", "--init", "--recursive", "-q"], + cwd=location, + ) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + loc = super().get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ["rev-parse", "--show-toplevel"], + cwd=location, + show_stdout=False, + stdout_only=True, + on_returncode="raise", + log_failed_cmd=False, + ) + except BadCommand: + logger.debug( + "could not determine if %s is under git control " + "because git is not available", + location, + ) + return None + except InstallationError: + return None + return os.path.normpath(r.rstrip("\r\n")) + + @staticmethod + def should_add_vcs_url_prefix(repo_url: str) -> bool: + """In either https or ssh form, requirements must be prefixed with git+.""" + return True + + +vcs.register(Git) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..c183d41 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,163 @@ +import configparser +import logging +import os +from typing import List, Optional, Tuple + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import HiddenText, display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + RevOptions, + VersionControl, + find_path_to_project_root_from_repo_root, + vcs, +) + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = "hg" + dirname = ".hg" + repo_name = "clone" + schemes = ( + "hg+file", + "hg+http", + "hg+https", + "hg+ssh", + "hg+static-http", + ) + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return [f"--rev={rev}"] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Cloning hg %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flags: Tuple[str, ...] = ("--quiet",) + elif verbosity == 1: + flags = () + elif verbosity == 2: + flags = ("--verbose",) + else: + flags = ("--verbose", "--debug") + self.run_command(make_command("clone", "--noupdate", *flags, url, dest)) + self.run_command( + make_command("update", *flags, rev_options.to_args()), + cwd=dest, + ) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + repo_config = os.path.join(dest, self.dirname, "hgrc") + config = configparser.RawConfigParser() + try: + config.read(repo_config) + config.set("paths", "default", url.secret) + with open(repo_config, "w") as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning("Could not switch Mercurial repository to %s: %s", url, exc) + else: + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command(["pull", "-q"], cwd=dest) + cmd_args = make_command("update", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location: str) -> str: + url = cls.run_command( + ["showconfig", "paths.default"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ["parents", "--template={rev}"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location: str) -> str: + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ["parents", "--template={node}"], + show_stdout=False, + stdout_only=True, + cwd=location, + ).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + # find the repo root + repo_root = cls.run_command( + ["root"], show_stdout=False, stdout_only=True, cwd=location + ).strip() + if not os.path.isabs(repo_root): + repo_root = os.path.abspath(os.path.join(location, repo_root)) + return find_path_to_project_root_from_repo_root(location, repo_root) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + loc = super().get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ["root"], + cwd=location, + show_stdout=False, + stdout_only=True, + on_returncode="raise", + log_failed_cmd=False, + ) + except BadCommand: + logger.debug( + "could not determine if %s is under hg control " + "because hg is not available", + location, + ) + return None + except InstallationError: + return None + return os.path.normpath(r.rstrip("\r\n")) + + +vcs.register(Mercurial) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..f359266 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,324 @@ +import logging +import os +import re +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import ( + HiddenText, + display_path, + is_console_interactive, + is_installable_dir, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import CommandArgs, make_command +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r"(.*)") + + +class Subversion(VersionControl): + name = "svn" + dirname = ".svn" + repo_name = "checkout" + schemes = ("svn+ssh", "svn+http", "svn+https", "svn+svn", "svn+file") + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: + return True + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, _ in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, "entries") + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + assert dirurl is not None + base = dirurl + "/" # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return str(revision) + + @classmethod + def get_netloc_and_auth( + cls, netloc: str, scheme: str + ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == "ssh": + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super().get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing svn+ from svn+ssh:// re-add it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "svn+" + url + return url, rev, user_pass + + @staticmethod + def make_rev_args( + username: Optional[str], password: Optional[HiddenText] + ) -> CommandArgs: + extra_args: CommandArgs = [] + if username: + extra_args += ["--username", username] + if password: + extra_args += ["--password", password] + + return extra_args + + @classmethod + def get_remote_url(cls, location: str) -> str: + # In cases where the source is in a subdirectory, we have to look up in + # the location until we find a valid project root. + orig_location = location + while not is_installable_dir(location): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding a Python project. + logger.warning( + "Could not find Python project for directory %s (tried all " + "parent directories)", + orig_location, + ) + raise RemoteNotFoundError + + url, _rev = cls._get_svn_url_rev(location) + if url is None: + raise RemoteNotFoundError + + return url + + @classmethod + def _get_svn_url_rev(cls, location: str) -> Tuple[Optional[str], int]: + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, "entries") + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = "" + + url = None + if data.startswith("8") or data.startswith("9") or data.startswith("10"): + entries = list(map(str.splitlines, data.split("\n\x0c\n"))) + del entries[0][0] # get rid of the '8' + url = entries[0][3] + revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0] + elif data.startswith("= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ["info", "--xml", location], + show_stdout=False, + stdout_only=True, + ) + match = _svn_info_xml_url_re.search(xml) + assert match is not None + url = match.group(1) + revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive: Optional[bool] = None) -> None: + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version: Optional[Tuple[int, ...]] = None + + super().__init__() + + def call_vcs_version(self) -> Tuple[int, ...]: + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) + # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 + version_prefix = "svn, version " + version = self.run_command(["--version"], show_stdout=False, stdout_only=True) + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix) :].split()[0] + version_list = version.partition("-")[0].split(".") + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self) -> Tuple[int, ...]: + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self) -> CommandArgs: + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ["--non-interactive"] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ["--force-interactive"] + + return [] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flags = ["--quiet"] + else: + flags = [] + cmd_args = make_command( + "checkout", + *flags, + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "switch", + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "update", + self.get_remote_call_options(), + rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/env/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py b/env/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py new file mode 100644 index 0000000..a413316 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py @@ -0,0 +1,688 @@ +"""Handles all VCS (version control) support""" + +import logging +import os +import shutil +import sys +import urllib.parse +from dataclasses import dataclass, field +from typing import ( + Any, + Dict, + Iterable, + Iterator, + List, + Literal, + Mapping, + Optional, + Tuple, + Type, + Union, +) + +from pip._internal.cli.spinners import SpinnerInterface +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.utils.misc import ( + HiddenText, + ask_path_exists, + backup_dir, + display_path, + hide_url, + hide_value, + is_installable_dir, + rmtree, +) +from pip._internal.utils.subprocess import ( + CommandArgs, + call_subprocess, + format_command_args, + make_command, +) + +__all__ = ["vcs"] + + +logger = logging.getLogger(__name__) + +AuthInfo = Tuple[Optional[str], Optional[str]] + + +def is_url(name: str) -> bool: + """ + Return true if the name looks like a URL. + """ + scheme = urllib.parse.urlsplit(name).scheme + if not scheme: + return False + return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes + + +def make_vcs_requirement_url( + repo_url: str, rev: str, project_name: str, subdir: Optional[str] = None +) -> str: + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = project_name.replace("-", "_") + req = f"{repo_url}@{rev}#egg={egg_project_name}" + if subdir: + req += f"&subdirectory={subdir}" + + return req + + +def find_path_to_project_root_from_repo_root( + location: str, repo_root: str +) -> Optional[str]: + """ + Find the the Python project's root by searching up the filesystem from + `location`. Return the path to project root relative to `repo_root`. + Return None if the project root is `repo_root`, or cannot be found. + """ + # find project root. + orig_location = location + while not is_installable_dir(location): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding a Python project. + logger.warning( + "Could not find a Python project for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + if os.path.samefile(repo_root, location): + return None + + return os.path.relpath(location, repo_root) + + +class RemoteNotFoundError(Exception): + pass + + +class RemoteNotValidError(Exception): + def __init__(self, url: str): + super().__init__(url) + self.url = url + + +@dataclass(frozen=True) +class RevOptions: + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + + vc_class: Type["VersionControl"] + rev: Optional[str] = None + extra_args: CommandArgs = field(default_factory=list) + branch_name: Optional[str] = None + + def __repr__(self) -> str: + return f"" + + @property + def arg_rev(self) -> Optional[str]: + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self) -> CommandArgs: + """ + Return the VCS-specific command arguments. + """ + args: CommandArgs = [] + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self) -> str: + if not self.rev: + return "" + + return f" (to revision {self.rev})" + + def make_new(self, rev: str) -> "RevOptions": + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport: + _registry: Dict[str, "VersionControl"] = {} + schemes = ["ssh", "git", "hg", "bzr", "sftp", "svn"] + + def __init__(self) -> None: + # Register more schemes with urlparse for various version control + # systems + urllib.parse.uses_netloc.extend(self.schemes) + super().__init__() + + def __iter__(self) -> Iterator[str]: + return self._registry.__iter__() + + @property + def backends(self) -> List["VersionControl"]: + return list(self._registry.values()) + + @property + def dirnames(self) -> List[str]: + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self) -> List[str]: + schemes: List[str] = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls: Type["VersionControl"]) -> None: + if not hasattr(cls, "name"): + logger.warning("Cannot register VCS %s", cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls() + logger.debug("Registered VCS backend: %s", cls.name) + + def unregister(self, name: str) -> None: + if name in self._registry: + del self._registry[name] + + def get_backend_for_dir(self, location: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object if a repository of that type is found + at the given directory. + """ + vcs_backends = {} + for vcs_backend in self._registry.values(): + repo_path = vcs_backend.get_repository_root(location) + if not repo_path: + continue + logger.debug("Determine that %s uses VCS: %s", location, vcs_backend.name) + vcs_backends[repo_path] = vcs_backend + + if not vcs_backends: + return None + + # Choose the VCS in the inner-most directory. Since all repository + # roots found here would be either `location` or one of its + # parents, the longest path should have the most path components, + # i.e. the backend representing the inner-most repository. + inner_most_repo_path = max(vcs_backends, key=len) + return vcs_backends[inner_most_repo_path] + + def get_backend_for_scheme(self, scheme: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object or None. + """ + for vcs_backend in self._registry.values(): + if scheme in vcs_backend.schemes: + return vcs_backend + return None + + def get_backend(self, name: str) -> Optional["VersionControl"]: + """ + Return a VersionControl object or None. + """ + name = name.lower() + return self._registry.get(name) + + +vcs = VcsSupport() + + +class VersionControl: + name = "" + dirname = "" + repo_name = "" + # List of supported schemes for this Version Control + schemes: Tuple[str, ...] = () + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ: Tuple[str, ...] = () + default_arg_rev: Optional[str] = None + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith(f"{cls.name}:") + + @classmethod + def get_subdirectory(cls, location: str) -> Optional[str]: + """ + Return the path to Python project root, relative to the repo root. + Return None if the project root is in the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir: str) -> str: + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir: str, project_name: str) -> str: + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = f"{cls.name}+{repo_url}" + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, subdir=subdir) + + return req + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def is_immutable_rev_checkout(self, url: str, dest: str) -> bool: + """ + Return true if the commit hash checked out at dest matches + the revision in url. + + Always return False, if the VCS does not support immutable commit + hashes. + + This method does not check if there are local uncommitted changes + in dest after checkout, as pip currently has no use case for that. + """ + return False + + @classmethod + def make_rev_options( + cls, rev: Optional[str] = None, extra_args: Optional[CommandArgs] = None + ) -> RevOptions: + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args or []) + + @classmethod + def _is_local_repository(cls, repo: str) -> bool: + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + @classmethod + def get_netloc_and_auth( + cls, netloc: str, scheme: str + ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + if "+" not in scheme: + raise ValueError( + f"Sorry, {url!r} is a malformed VCS url. " + "The format is +://, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" + ) + # Remove the vcs prefix. + scheme = scheme.split("+", 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if "@" in path: + path, rev = path.rsplit("@", 1) + if not rev: + raise InstallationError( + f"The URL {url!r} has an empty revision (after @) " + "which is not supported. Include a revision after @ " + "or remove @ from the URL." + ) + url = urllib.parse.urlunsplit((scheme, netloc, path, query, "")) + return url, rev, user_pass + + @staticmethod + def make_rev_args( + username: Optional[str], password: Optional[HiddenText] + ) -> CommandArgs: + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url: HiddenText) -> Tuple[HiddenText, RevOptions]: + """ + Return the URL and RevOptions object to use in obtain(), + as a tuple (url, rev_options). + """ + secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) + username, secret_password = user_pass + password: Optional[HiddenText] = None + if secret_password is not None: + password = hide_value(secret_password) + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return hide_url(secret_url), rev_options + + @staticmethod + def normalize_url(url: str) -> str: + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib.parse.unquote(url).rstrip("/") + + @classmethod + def compare_urls(cls, url1: str, url2: str) -> bool: + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return cls.normalize_url(url1) == cls.normalize_url(url2) + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + verbosity: verbosity level. + """ + raise NotImplementedError + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest: str, url: HiddenText, verbosity: int) -> None: + """ + Install or update in editable mode the package represented by this + VersionControl object. + + :param dest: the repository directory in which to install or update. + :param url: the repository URL starting with a vcs prefix. + :param verbosity: verbosity level. + """ + url, rev_options = self.get_url_rev_options(url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url.secret): + logger.debug( + "%s in %s exists, and has correct URL (%s)", + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + "Updating %s %s%s", + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info("Skipping because already up-to-date.") + return + + logger.warning( + "%s %s in %s exists with URL %s", + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ("(s)witch, (i)gnore, (w)ipe, (b)ackup ", ("s", "i", "w", "b")) + else: + logger.warning( + "Directory %s already exists, and is not a %s %s.", + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ("(i)gnore, (w)ipe, (b)ackup ", ("i", "w", "b")) # type: ignore + + logger.warning( + "The plan is to install the %s repository %s", + self.name, + url, + ) + response = ask_path_exists(f"What to do? {prompt[0]}", prompt[1]) + + if response == "a": + sys.exit(-1) + + if response == "w": + logger.warning("Deleting %s", display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + if response == "b": + dest_dir = backup_dir(dest) + logger.warning("Backing up %s to %s", display_path(dest), dest_dir) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options, verbosity=verbosity) + return + + # Do nothing if the response is "i". + if response == "s": + logger.info( + "Switching %s %s to %s%s", + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location: str, url: HiddenText, verbosity: int) -> None: + """ + Clean up current location and download the url repository + (and vcs infos) into location + + :param url: the repository URL starting with a vcs prefix. + :param verbosity: verbosity level. + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location, url=url, verbosity=verbosity) + + @classmethod + def get_remote_url(cls, location: str) -> str: + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd: Union[List[str], CommandArgs], + show_stdout: bool = True, + cwd: Optional[str] = None, + on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", + extra_ok_returncodes: Optional[Iterable[int]] = None, + command_desc: Optional[str] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + spinner: Optional[SpinnerInterface] = None, + log_failed_cmd: bool = True, + stdout_only: bool = False, + ) -> str: + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = make_command(cls.name, *cmd) + if command_desc is None: + command_desc = format_command_args(cmd) + try: + return call_subprocess( + cmd, + show_stdout, + cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner, + log_failed_cmd=log_failed_cmd, + stdout_only=stdout_only, + ) + except NotADirectoryError: + raise BadCommand(f"Cannot find command {cls.name!r} - invalid PATH") + except FileNotFoundError: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + raise BadCommand( + f"Cannot find command {cls.name!r} - do you have " + f"{cls.name!r} installed and in your PATH?" + ) + except PermissionError: + # errno.EACCES = Permission denied + # This error occurs, for instance, when the command is installed + # only for another user. So, the current user don't have + # permission to call the other user command. + raise BadCommand( + f"No permission to execute {cls.name!r} - install it " + f"locally, globally (ask admin), or check your PATH. " + f"See possible solutions at " + f"https://pip.pypa.io/en/latest/reference/pip_freeze/" + f"#fixing-permission-denied." + ) + + @classmethod + def is_repository_directory(cls, path: str) -> bool: + """ + Return whether a directory path is a repository directory. + """ + logger.debug("Checking in %s for %s (%s)...", path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def get_repository_root(cls, location: str) -> Optional[str]: + """ + Return the "root" (top-level) directory controlled by the vcs, + or `None` if the directory is not in any. + + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For + example, the Git override checks that Git is actually available. + """ + if cls.is_repository_directory(location): + return location + return None diff --git a/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py b/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py new file mode 100644 index 0000000..93f8e1f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_internal/wheel_builder.py @@ -0,0 +1,354 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +import logging +import os.path +import re +import shutil +from typing import Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version +from pip._vendor.packaging.version import InvalidVersion, Version + +from pip._internal.cache import WheelCache +from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel +from pip._internal.metadata import FilesystemWheel, get_wheel_distribution +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_editable import build_wheel_editable +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + +_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) + +BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + + +def _contains_egg_info(s: str) -> bool: + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req: InstallRequirement, + need_wheel: bool, +) -> bool: + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + "Skipping %s, due to already being wheel.", + req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if not req.source_dir: + return False + + if req.editable: + # we only build PEP 660 editable requirements + return req.supports_pyproject_editable + + return True + + +def should_build_for_wheel_command( + req: InstallRequirement, +) -> bool: + return _should_build(req, need_wheel=True) + + +def should_build_for_install_command( + req: InstallRequirement, +) -> bool: + return _should_build(req, need_wheel=False) + + +def _should_cache( + req: InstallRequirement, +) -> Optional[bool]: + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if req.editable or not req.source_dir: + # never cache editable requirements + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + assert req.link + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req: InstallRequirement, + wheel_cache: WheelCache, +) -> str: + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + assert req.link + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _verify_one(req: InstallRequirement, wheel_path: str) -> None: + canonical_name = canonicalize_name(req.name or "") + w = Wheel(os.path.basename(wheel_path)) + if canonicalize_name(w.name) != canonical_name: + raise InvalidWheelFilename( + f"Wheel has unexpected file name: expected {canonical_name!r}, " + f"got {w.name!r}", + ) + dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name) + dist_verstr = str(dist.version) + if canonicalize_version(dist_verstr) != canonicalize_version(w.version): + raise InvalidWheelFilename( + f"Wheel has unexpected file name: expected {dist_verstr!r}, " + f"got {w.version!r}", + ) + metadata_version_value = dist.metadata_version + if metadata_version_value is None: + raise UnsupportedWheel("Missing Metadata-Version") + try: + metadata_version = Version(metadata_version_value) + except InvalidVersion: + msg = f"Invalid Metadata-Version: {metadata_version_value}" + raise UnsupportedWheel(msg) + if metadata_version >= Version("1.2") and not isinstance(dist.version, Version): + raise UnsupportedWheel( + f"Metadata 1.2 mandates PEP 440 version, but {dist_verstr!r} is not" + ) + + +def _build_one( + req: InstallRequirement, + output_dir: str, + verify: bool, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + artifact = "editable" if editable else "wheel" + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building %s for %s failed: %s", + artifact, + req.name, + e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + wheel_path = _build_one_inside_env( + req, output_dir, build_options, global_options, editable + ) + if wheel_path and verify: + try: + _verify_one(req, wheel_path) + except (InvalidWheelFilename, UnsupportedWheel) as e: + logger.warning("Built %s for %s is invalid: %s", artifact, req.name, e) + return None + return wheel_path + + +def _build_one_inside_env( + req: InstallRequirement, + output_dir: str, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + with TempDirectory(kind="wheel") as temp_dir: + assert req.name + if req.use_pep517: + assert req.metadata_directory + assert req.pep517_backend + if global_options: + logger.warning( + "Ignoring --global-option when building %s using PEP 517", req.name + ) + if build_options: + logger.warning( + "Ignoring --build-option when building %s using PEP 517", req.name + ) + if editable: + wheel_path = build_wheel_editable( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info( + "Created wheel for %s: filename=%s size=%d sha256=%s", + req.name, + wheel_name, + length, + wheel_hash.hexdigest(), + ) + logger.info("Stored in directory: %s", output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool: + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info("Running setup.py clean for %s", req.name) + try: + call_subprocess( + clean_args, command_desc="python setup.py clean", cwd=req.source_dir + ) + return True + except Exception: + logger.error("Failed cleaning build dir for %s", req.name) + return False + + +def build( + requirements: Iterable[InstallRequirement], + wheel_cache: WheelCache, + verify: bool, + build_options: List[str], + global_options: List[str], +) -> BuildResult: + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + "Building wheels for collected packages: %s", + ", ".join(req.name for req in requirements), # type: ignore + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + assert req.name + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, + cache_dir, + verify, + build_options, + global_options, + req.editable and req.permit_editable_wheels, + ) + if wheel_file: + # Record the download origin in the cache + if req.download_info is not None: + # download_info is guaranteed to be set because when we build an + # InstallRequirement it has been through the preparer before, but + # let's be cautious. + wheel_cache.record_download_origin(cache_dir, req.download_info) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + "Successfully built %s", + " ".join([req.name for req in build_successes]), # type: ignore + ) + if build_failures: + logger.info( + "Failed to build %s", + " ".join([req.name for req in build_failures]), # type: ignore + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..561089c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,116 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("certifi") + vendored("distlib") + vendored("distro") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pkg_resources") + vendored("platformdirs") + vendored("progress") + vendored("pyproject_hooks") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("resolvelib") + vendored("rich") + vendored("rich.console") + vendored("rich.highlighter") + vendored("rich.logging") + vendored("rich.markup") + vendored("rich.progress") + vendored("rich.segment") + vendored("rich.style") + vendored("rich.text") + vendored("rich.traceback") + if sys.version_info < (3, 11): + vendored("tomli") + vendored("truststore") + vendored("urllib3") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a8dddd285502ccb85150af29f635454e7396378 GIT binary patch literal 4568 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

    w<rR$fbOJ{2D57q3x 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 z-759 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a89f1d9583700e798e230b2b12aca8fe668e8f43 GIT binary patch literal 2665 zcmaJ@O>7fK6rS~t?Ty!V9FjmNNiaBt_z)WkY7uSIpEx9i;GhDPY9Xx_@8TbJz3%Lq z%2py7i3%zX1*uXv^Z+MR!GT`dYfqJ`UT_oSbd^Z0D2Lu6g7q8`qLnJj1#J(`PhNDYuM*y;gWy}4et7lOT5 zE(UT;5wGD~pVFsm+B3 za;0KevQ;uFW){}b4@jY=s}<{vOiY!4CUWl6Gt<)4?DW*BkFqnM5QzF&O*JhO`qUnl(*OxoC#<~q2Q>qvaXs{Ij@4cxBIH5lDz97n|OG_kK6nP zge7Eg-e%d2zPF~cg}qf7uzGnsaPM-+@_Tz_!IL_(7oo-Ox3MhfoT1VJ>R7Bp2(!rm z=>fehn5s3WUQsnWNWZvLDcJtZ^oQqX?8sS*sIopQR}}bAJ0vTLD?=QDMMrH?KjZ(9 zbkWe&v|cO9x-Ki}jFD$}nCY34HCwxwK78oVL`JTg6Z4lQrVK?*tCcHht#mP6ty@K- zawK*5jkH;^)Cq|5Wx1f5>1wH(maeE3#USZC#VhaNm6r0llB(A22zXwrO0L&r036u~ zKQjf7CR)Rx>+@IVzn)n-ef#tZ-oF+dY)2EVXkt0~dUFPL+jy{r2X7Ug;L%OEfnGq8 zBEpdT350GWEs8N4UgQ-HaveSNJ#g^^Bsz#~hpc;lkz3%(6oQwA!UI+wThS}d;1|xI z@^*-G($?D-xU(qf&z?*2w#Z^Bsg_(Y?GTWqBx|Jx;M-GFYougarF z!2~H8Bth_#&%qCK2y4X2u!6})>@>}{SRgJAjvxG8iD?h7Dv z!|j2*2m~r`K@W%A0pR-{@?CJD@)r2s8H7A500Pe1e2r+0p>stwe*WXRxMjpGQjY_h z;w);wEnHN!YLX|^D?1FdlVrEN*`X>eaCA-USb(jF!$BvO0*xizCI{g*6jEePzyksq z*|QuOX`Wc6nZK)rcir(n9-DlOcdg*}R>i)yINTD4m&MV?c=UhbGYNFxK0f~?221d5 zq5+ZIN=$Ig9bS1_^jTY^@Z!c%8f=r|i~Is#j(8S2^MbD&?W{Zrv@uWa%w5>=WtxsJ zjqPoD-jc9IlZg$5^R&>eP?z4&ff`h)7+gO^xM)lNl5r8kh?FMQ40l literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8b8881df2d86acc5bf4668456323ee1c4694cdc GIT binary patch literal 6483 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 Rog+LKzWe4Yf;F4we*vo|{lx$P literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bc18ccca2d51268d735a470f51ea049860b1a1c GIT binary patch literal 3806 zcmb_f&2JmW6`$eml1qw|WLZw!#I@I!T8oZF+O3neMiRu49h+z(2emI^QmjYZk+k-H zuro{9Bosg>bcoR!iqnI1^i}Y+|3J^Z#7KY&ixzEB^w66PDlm{!-<##9th6c65%lI` z-@JM6&3nIj{9~bzBhaqcA1^=35b_V4beoY3XnO+&Tf`w%;!r2$Q9o5pQ5vKO8P0Mj>ksAg~G)uXEp&CURkFX#JBZlh|ruzF~?M_jP zQe}m^=7mZ20t#H z|4~`G5udHI+8wscWx4Lw%l0Y{oKTe2W!AzV5}}t&O7&)}E%T^V=$Tl8>0wZ(JpyE% z{CV``m!nf(m{V;uYQCmp*J%NE)Od~fGq!(N&ig+ww6 zJvi~-fiFXepK(%<;F?NwKvIB!^dJDh98=#INPUW_e;M#frT+ZEarRSn&WpLfM(kdY ztkHW^0*<=`Rx#XE>jX+s6BszL?g8q>I$Rcm3&2!~vu@xoE8>bzdhG4H-1Ev;TJIsqIWvw?@}eE`8j&E_h)RiHl|S=bBcm^GF5F-EMw-C?;P?gY_r_b9p_uHs zW*a#Eqig8F&RHem)q}qr?6&`p%d~n}e*uXVj1I~%R$Ig*eER6Au!3r4}laj0z+8LASoh24fn(0J|x5o7f29gJ4m>fN&&i=)R^hP zp>DjU;1GL+L+lX_p;vGS{a#)(rV=DXc{TX&wNCKUwgpQANJs$#4ZuRcKq!YaEOwfD zF%uuT!Rt&w?7ka1&E5mWmLV;2_%v4nsOX@uTV=v!L39>o+*$-)toERMvt$$s?pVHi z52zbhcim`3G5I`V2y5Wf2G)j3T%Ado@Xau+7L~teJ@-zx+AN|BX336LP-l9c6@}KV zTaY+59z0XLb*q$9(r&IWl$@Rrd7N|`y>HBjaZ z0_b;8s7PCH^xX9eRkQRx0=K;6dVKJTOFd>~#S0)1n_VY;o8H~;?}6Uk^3WVE59f>N zfg0&&Xy7!GQ%F>~layNhBB(W9x&F~m{)33&G>aj7~PmoG8cK~iv@ut5tdj>4Jh`Y#1eRgaW?rG1wVF@G9eu`@t2Rl zcT6DS3-~cf1U?E$iKWm*9X_m3Y`&QkZ*PlBz>Ke*dXrB5s z6tzOJ)C9$9SZ!1@tDVqlFs_U0CUoSjpU{)HVZuP(#t9?5^-X3ElhUu!khQBcO>EUf zGh59%-q%ksTIvGDI^U;Q*QZ*Ee&WD_F5pfcv)-8InCV1fE*iNtz=WbxaXylmo)wt6 zIG^BHW-`t*^8&}*g;a*;-k#@#gwSVwg0%!RqAe7Q#S@`KBpwsS;Ws@O;suTkCAeTB z8PJLL8#k|>3l3jAH+*Sy{DNp5jz^gsy^t&{yjt#5V*P6md$`upKG{yZ3fU$4JK zVqI@wR8DK{>chN%_DL_y%acI}!tw->AvQv&qbSYO`w&^75+o6W8AvUEQj{`ri<*?? zzV=n>_uxHaD5s;SPvxXVZA!~(>fjf=wenjhzxDFlfbU7ebt+&?{{B^*8i5HhuU#93 zIfbET5-|BZH^tp!reN4(OeDsfnVaKcY~&tumWfX?*Uk?!M@}3++Gn*g@N@|<8M9mu z6Piy<<4RfRVdg@K=^h3a1`j_b`OwrX7fS?~Q;-4e1?Txl7yJ*9@=tJpo?!o<;0}F) zWAwxf0W1|Auq7I1Ly7RTXq@8X^K$~GLRlVr!Pi3|U{T=Xn|uA!@ma2ac78fEI~!vA zN8;gmY**;N5J_B|ztw;E(4pRu(1Or=WwLiT&T{=+>`p(d@&365;5>Gu@9;oBEH2Un&O21xyW395C(yb^Zj95bm4d`!N;Th@;l1$eRB(f2+Xu2SC=8UPd&3z zcIU&<2ct{jAC2EXSFky=Hh)&{hp=F;e)z_NH-7Zi{qqI7dg(CG+{uKN7gjsgTptD2 zez1P#lbajHjko{GlC_=9>d!uf3aKy#%7Yz;NAvW*L%2e5)Px3v8mxc`orRMASi2IF ze^;@(_YD(z&cHfY{rh@l({URFH%i17+4|i-WOGCX?3)+BBbdb$FEDbjdb8_$uE=AbMlc6xjB;t&~ zaZF@Vkw1(u9iNY~44EaC0SN^%sBb)6x?51p!I){D;=Wsh4rVA_jXbMFrLL zloo!;0uuI>?w&@lYN&(>svwV24yfb<2B`EvMUE6mRXJFo0^0F_;mOaT+>>8G5b1$d zcqhbo7X$$#Z-JL+Abk*R(SkXejAnFA! zI?1>==gO{g`PE1|zXZA{b2ihH;S>N4-zUIRbRTF$nHcyH!;C z!PU!ueDjZAU!PCwKd=@WI@0=0v#(I!_PBoV&#j-*km@LO3_R|*l0AAQt^eHI$~QsT zusV$J19>2mu>%nhg~b8aC}Qsopjp%|>K65jhDBpa%WG3Qp(-ISdkRj-lqLz{LZJuo zsNF|A>b^B!m(mL$I2ZLP!#xcTXEm#vQ70PMl%EvjPid7_rKwKo7fm2^^+}*f=}2h8 zaM7GHgQztm2gl?5EIE{jgnjMW7%t*4&%pu4gcu<-$uYON1#-Be2qyEJ?79+*E-;~6 zLOePTbRZ5vSo2UI8jauO*gghCA&Av>LDck%nxUlbWPg7^Po$7&Id?D2&5?7}fYiLG zpNU6e0gI>$M+LqCxD$<%@D?qq@D}wbyhQ^M-lAC%-l9!D=uvo!R+hsIj0?DC$zm#9 zQ1g5=2K}wDpyZq(C?&iP0mw)rb#!P$_=~r4=7F?#sV+0J+P>!d!cp_+=5}>M)_?xz z?wo%tUwt`CU*2)muK1VzKW<7J3!cW6E6Z2%p7ylmONYDQ_NGU6%~Y-bvG>@j?ql;u z=C!tU!&+mWIri8)v@w{r6>1tX-11wikz7sxdUvkoRNA`ZsLPt`o?o4~#>nc#eFUO{ zno-v$B*;%nU8yj`8c=ok6Oa?o@`vF?##g`PJV1d$qwHZVtW|B% zm@=|9)C|6@u0@jt^rMss>E3{mTQo0PQf3e?7Qw)R>`s|pft-{X+8nol>YXw}t=9c& zRr;fp{~)S|x~@~LR05S5^0ZMrDDw$oqF}-d&S2TY(kXQ$HPlV&gQdIFJ>5;}t_EtV zQi!3Z1`U<6@ZNoDvzOKOmkB&?$OCn>?aNJ7%9JwCR4ZkQ?@w`yz(aWa2ZhIgWBkT> zIOfg==x^N z){zT4X{=Y)+>&;(1wjua3Y|!anjTSeig!boc-*zgp3x}~VW<($$8N{scVm)BRw`iF z2#;3F9quHE-(>IQh(Oe5U~ZlxQhZN)W#q?4W26_%zT{AO4}%?NZgCI~SVbMEL85Mo zONa&mOf-BY_{f}SzQiq@2Of(q99ts;h>UhQW3&0hg z8!%L?fXiMzC}h>cEoshVs6c}ubCGN%Q&XaaR3Q2xR3?N#D3kM}&Y!ul^v-sDV`e_% z$5$fLQ1G?mKYyUm)Lm%qDR^58wQU8acN>V=jO{lKReo#M?Av81Z{y1A%df9CuXp}s z_kZo)i2t0=4_wRFT!-VK>tNcrx98mLo9@nn)3@Vc zwmcmCs)i-dga0=aqcdsipIo6OTRZyRB5? z!0u_v=}p`J@3UUYhd$&FHD`U%J1>b80-+_X!0V)5tNnhjL)frsg zZ-j#|)PGZJ9;UT_)8ijLto>WMdAQH;x4jw+4<9&38UD@_z;H+dVPz%n_h6;~azXnQ zYAb*4P`qXVPaNEMWe?i4vh7RF=*u$UXC+CWQkAnsT}pS~Ta>^vs7RMRtWJ^L8frnC zP-QY4`W4zM%3$Tx;r*2}~o|yM*N_tlN zd{$veenaw#RoQ}L@es>|6oUywGJ!yP&~$?RJse*@z(k5iqRD3cW!?KPp)=7vLv<34<}rutq@E!if?Kb3BR_(G21+cnfeK$=m^bH^d5}>28RR zA)I8C<(sU-@-LH0B&h=@Nl3I{+2ADbB7$@i=A#J#aR_OwBrC}o#7cvce0(-YN+uc7 zu@X5|PVsM{3gKf2z-po?+PyTj5?_wzZ0!Yi?T)8m<bNH~<-lzv84&XlyGb(>I?Fz8JkYgsgWdyi5EWei~CKoL!-A_dy{ zwh;p*n%A?|l<|&+f0eb7_n~iZi=|82qGr5B?v>aK4rAF<6o#ONe)~F5F>D;!1e&ho znLz-s>`_dHMNH+jzvsU1&~x{9 zsMVwP+L>~`*O0QNoJrWd`_5?1o*AW6*4rZ>C;Il83$N1JzU#g=1$8P%zO;|OeHOI8H3oUyp;t?!L_R5zwjAVu|(;J ze+mjomfYb=CBZ5Tf?3$YKsATTODDfCbr(4zXFbczaRA@NK(_(yNHTFCBI!&_7tvdg z7|l{96k{2LZJ`rr#}Y*+AnJ+9s>h6E*VTD`s-$wIrjwv%Np*l0Mko)cR;bL!bEG`Z zZL)EAp68J}=o51bF2eu=kCCdtJdGq<&qKNC7$*o!G&0F0BC}wlf+oYDX%0n@NHlTx z=D<=DUQ8_$kSe=hRHdwBl~&E4MjkuQurpxD0&C$CW+gThSb$VLaD&`I$)g*Ad7eb} zVUnfwQ(@$iruGPP8oN4(h06wu!8!;6(IVYi!Z73T!cCPl5dk;<2Cf%W42yaue-nSA zD#~*hoQD7)Q-ZgP4Oh=yyL@K+-1v>)wR0n**Uk;!2wuN&=EiH+&t2yc@*$e5Xk@u4 z2Uvw3$DGGgPBe!B3W>2HFw`+|YF5<2H1Me723$l_%{;^ zh*m5cOw7;0?Z^~XYm-M6m$hiZB0(ryO@NtM3P0I`c!Q9e{0stBG-bVbgiB;Pk9mm#tgQ17Pp31~#2N zDrc{3(x-rfud1paMjk|dbUUrvt~s#Uxz_Pff4*h_tN?(i9qn0jJA~Vg+K2BxcsG+= zYgs#-`PX?zUs}KIt;-z9Twfi0G?DjqrETg64zAzcG@k|I!(F>oeK1#jaP3&W`bgRY zW6;!`HP^%2UBA-3+?|Q!tGm*sf~`7hYbqS*%F<0Lcc-)8yY@MK9cZg+Go3m6fo*Tg z>an#Gxz?BR-lORY1&255XxVP+_%Qw`zBaXfYyIuD+xe!G8#i)IXO?W+?OkiGwM+T- z<5_2m3Rj%Xj{E@d3P9}LH7gy<9htg(b!$Zi3eHp6q3=J_Y3)@&T~oVqe))U`R!S$> zPBu^0#_Z6wnG-p>EqzI4`Rr$xHtDOtG2OIkdu;1gGcIq^!Ex5i?)nKSZew2fJ5nNJIdQjTTDZPBV55^5*)hw72ayq%)N3(@s*gCNJP2>DD z(1`kTH{j&4k52ZYUEg~dFV&OwXb2$H**F`SjBsqyK88OpD?eR8to-P`9sz4Rppzsa zk#8s%1BMcT#bZ0R7NXzixB`&c}jJM?4maDumBteievn07Mc{Oy8#p4)>lN zT=4qRwl8gt?L)(#jr?rvr(^j;-%nrIfsI(3b1;Seqw9A*d3VW{xsr4C>^PcMJ9Cae z;mFC2q1=&6OSY`PKj%EOOt8 z{QO-xE<#v)IR@V&eXJbYPX<64H$KrEfkX3?!f>2+wzWnej=E406 zCHx1d9#CpHUA(2B4TurD3q=cpFa>8F9uJOX$Ck4_=Y*qf?cRnv?>trTwe6ZHd&4tI z58|&1POhw@Sv^TwbI#V)(Y3_q&Otb&oXq}pdh*WGN}a#OI;Hgv=#Ki}9Fz4v0x=L| z=*$5AZLlI#l41m4NNuIHoiYG=&{EtBmDW0lvlo;tu44dXRm=ydaazkBRXiF2=|P*e zy9C08v^_R0*zB_1uc9uMFqf2xg=^3fyWb38tpQL2-FpLo4Ph&NfGH4cXa=v0${q!S z;2TO%7nxq+H=zQyDHVXeeGJwwLg7?JyyV-FF3Sr_6|n*Bz^1eUei)XN-w5tS-dO`iIQca~{v3}S~G|nZ11YEP6%BVrF_d_mS3g38r0sOR; zwkpN>f6rEvRr~K?7299Xs#~e2YzMjb>>xyi8j6@@#obf2clV^sh>|VZ6P*fYDLd;? zdI;&N(o<1N)THcxLb2XIRd>n$sEN`OBDDfatHpQ92B#LBo+itnOs_Jl#W$=E zStcm&-)%)LXz?%5m<(GL3;K-WPObU~Aetc?(%?m{65f~w&;qb5@L@#~nX}U7e*pO>nS(9F+94WYgqp9WlC=bilLkw{ zh0udNX$BWkv@(Pw_?m~Okq;JJH=uojyb-ky6Q4)^h|WX+#$=~b^j3dZLhfWF6hS~4 zTmxL{P;#)85WJ{m^-><9KJ_=z(!uOX5LOY}!oz_eO?(t%h_Lf>7^E?{4S{HsK+Ax$#IpN0nEMA9;O-_&iB3gh zR*X1)9`mLk5RKp(0xOn(8&e351@1oJsR}wh|A&|s!C(Ob!3lw~Ih1!P$^`XDv;6{; zNzFeCTUGco&|Cp!@>4B+j}MHkd$tab;x*0_f!KuU@)Xpgmi(KS%qY>a<6Rmxvj_fox4X+}&>1wP!oPp3HTe&esj4 zUoE&Bv+h8a4nVl=Zde&w9$G!Qc5ChJ)zf+Rz=M$;w+9>(t3cV$(*A;z$+ivVoP!uS za5(22*m9oCIZtjnU)grLv!1qW`%5{`(Y*86e><{~`0Epoog+JRHC*FvxdJ&?V6F2f z{h##bT_@oRS3$*qnY{g2TD#-$epg)W)W*W5c@&HVPhHv!H_QY`E7UfmFRIYTiB0+> z=6G|q=Dj(`H|Y~!*xVUCUOA(W%j&|WuL!aM?lSf~W&#Dk$sI<4c4VttwyHaF)g7yM z*7$t&K+ZOxwu*Hl9Y8V8EnCB5Tf?d`d+=nAIaz4%gXfK-dCSq7bAZjW>FC?8@5pu@ z+py$1&*tlgmrMnBeb(Kv-P--}&__e-$2JBw&aA(jZyoxqE!TQ}Y3!?prc7#WBHwU4 zJ@%D+pWZOA{>pmaXXb3(=qCND%0}NN-H&~^^59Bl6t2z98*QJ_pVOBC1FUi_`S40T zZ$Gfv{=J<2dupMVHtC~#3$=bup9Z|M%9E`H)U5M&TR7>F9j|X?a(OayGwFKJ;Atp$`~a#JJj`!xMpyN&hXOC!roNo3ui%D}d+hGp zZaSFletBaw*L^~J#U;r}fC{I6_r`7$t zom5qqWN^YZRUZ{#Nx}~P7jQB_Fr(DKl^ZU*iU(JN>)@d@r2&&xKT`?-$@CSS54062 zZED}th+-0sP!Ej{O=0kj4Qt;7V~lv98o_zoSjk;LDMid_FmF?)A8SAG>#4AA(X^-< zc3>cBQ~IDuX$<;X$@fSHO0Via1d0qe1%%-%1*xvP@V!m)$(0zW8b=NdGI#Owu4t42 zzZysZNDq#r1b+P^I{^YR6G{-O5L`MX;;Py*kD3I>#OHbCu$5dK@nbRgMhNv8JXE3n z>ChdZi@`mhTA1iO@|PUw{K;^4I367z;l>2qgqXY2@IlgDt`iEvhhe~3j6qZrZ`{;6 zrs4@uZRBpipc)28(ZjAYduE`r$AYaZS-Ebwo742SKv}-;WvO7{-G# zU@ku!$r_D}l^oxwj zbicr}?`KdeoPE{%->?+wo3`rv;i_WYl&?RYc6{k*+Hp6euRz(x-fTlJ_(krRYq!kJ zIdk)txg%%p0Fm6-F1bN&`3G|TfldG5GXvm9U-}1^N0!bky<=9e92pDTC0yAwzXG@{oYVjGv;l|- z;P%tO=CjAF0sZ)m@o^Y&R9%uz_4_;~MI6+K3WJzkJW8Oxq^tP#pF)B<%QxQQcZRQn z2ko13CVVZ?0NH>QCg46!x?kk~3{oHi7edk{f0Ot+5cDt*yvcuv=`}2Ti6|vPb#iTQ zLa7ks@(8j@bnenG42zAHQ8kuP$saAgPHxI8)LK<+9a#dG>v8a!!&OL_FJXeHZs<5p z^tW&5TMG#=DCEIIT`XxW@=sV6^>{-7PQgVU_g2EMVs%6l{8NnKc<>)V0I+JMG9({a z2srpF@Di=TAly03!^cZOkq!pmo)1MOPh`;)46^ZXFvz2g4Og0QKOxL=@Od6fKCX~@ zNUmkcR!spFe;)&)zy26we*(cLl%%8kF@aHnLl6lqEVazya@IH-dd=L&sHHMm}Z|LlXhTSfzsin}`xoh_us&?GoT?4$K(dq-cCXB(g zSo5w0V^+%1uxrB@P1PPC^q@ystDZVAZA63hAo~}z2JeoG*)?DUYJ&165;bE577|7F zB}%9as<4yPYx*t&D0v;bI(!eDChr|f%`*f1mc|i>P~Iuh`XXDPiQGP`8-whQV(@05 zh5ye`4rhCE9z056ws}1FiNPY8&`BMR0#OS#!7S3*xLNQ9?VC?T;PWIsrWnD497uQr zmck>M$1_fBhVL@_36vMa=_Q8A@n-R$MyVz7pMI=m#fsxO*q*eQ0@FxP8@|SwANZaN#{}+%33z-t`La?jTXf(gEYBl=b8YxZdKT?ig zQdPgCEWe~|zoOdyC-qW}dg<5H(Ep+?{favArOx>)ebcY?gTK-r`nCS}j-@_byJe}* zS?V*#^Om;z#vP;c{;fZpd2c4`x|}zT-`DLlb!DlBr$)18So43p!zNAh*A#|?vHuTd CE|G@- literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..378845260474e474eaca6d6e2c8ee809bc58269e GIT binary patch literal 4366 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 g??v}Gc7MK(!|&?n2wcrR9U-#ux>fK!hsRC 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87e84e444cf55144adf528c40b34e8af3bd651c7 GIT binary patch literal 1693 zcmaJ>-EZ4e6u&oi9LI^9kA|*m%ht7pVW4rx3Y3WXP~UiQSjPSPeoxlyiv=bYa?KKFe1S6P+- zU2C;ZcYjC%@Fx=ni|YY+@{odkU;qPJz=j%x3@5CF&1sy?YkVwoR?-$UA;!FwvPDgV z0CD&dcJE!GhoVN0IK`TIz9{CyBQTe|lLpCzs zCbeQ)QpTRL3n(zm=#Jxhx@Wo$Q4*ni_mhv;YL$((%I59rdMH&~%R+T#rQGp~UT>g^ z>v-6;ZW(&hLzt@5t7hGcO;ivu`m%+HN0{LQouGjsH+`{{q%DL^ z-7-4}SL;7Pf&H)#9O%P6=nG#%LR0M}2KGH60er!Se!}N` z-cS0eU*Mt8v+jvL_?#B^pUX)2;$hzd1m|$LQO*`n_^Of&Gj*1x8uIjA5=!LsN@2P& zxNDfN_p(S6QL9@zAz>jtrSDj%W+SiR8l;nIcwX~{s&+&M2t^8qQ#4e}q7Rd{+j2Z5 z9r6TG2g%q09%J?#+wyEHFs7{ciq(4+E;3!JuOn$H%?{S{mfCP_q}r{9Zri${uDbP> zjU11t>!!ES+EK49EiJC}+4V9Q4T5Rg|FZ5kR z)TY@~Yxj|3xLA#2?B8Ae3hT`#!sTW=%vOe43tyxmmFS;r)2$1l5}3JiaPz_K2b({k z?pjc~@>^-;=%tnJhrf?a2cjI5E(hZ;2F2;%q7qEK_DoLYgzkEj2g&qzcfPsvef!|* z5kD93Vk~tI-ag{zA7ygg%@gV#D5>h*DqBhsvzI>44_dgqMe|BqAHP7=o&0Gx&-$}f z*FkZrLw?6~tvKPG!dd$cD69sZ(ny~VOsq1U8L!<$+ryWq9r4+KGQlXb|DyCq@07;s z*_k*S)otRP`UnM#ycTxwG$kqHp;W8gYf%NN)iC>rg#vYNI=h&s0%nsC&eDRF`vofx z7p&ZGnO^%{I+qroi5oS{43RLKV$9ktoF7t;zT#{yF#G!c5A$@G2+lC(+_^r_Mlj1F zVBPgIz*7uQvXkPwwrjL3^d7!SMfP1G`*e#q2;pBMfb&nl>yN?v$6)ynE`Q7~Jmy!9 z`N}bW>zKb8N#OE)FgX(}yb`?pYVhVe!CN None: + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session() -> requests.Session: + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller # type: ignore[attr-defined] + return sess + + +def get_args() -> Namespace: + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main() -> None: + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + cache_controller: CacheController = ( + sess.cache_controller # type: ignore[attr-defined] + ) + cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..fbb4ecc --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,161 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import functools +import types +import zlib +from typing import TYPE_CHECKING, Any, Collection, Mapping + +from pip._vendor.requests.adapters import HTTPAdapter + +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import PERMANENT_REDIRECT_STATUSES, CacheController +from pip._vendor.cachecontrol.filewrapper import CallbackFileWrapper + +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest, Response + from pip._vendor.urllib3 import HTTPResponse + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "PATCH", "DELETE"} + + def __init__( + self, + cache: BaseCache | None = None, + cache_etags: bool = True, + controller_class: type[CacheController] | None = None, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + cacheable_methods: Collection[str] | None = None, + *args: Any, + **kw: Any, + ) -> None: + super().__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send( + self, + request: PreparedRequest, + stream: bool = False, + timeout: None | float | tuple[float, float] | tuple[float, None] = None, + verify: bool | str = True, + cert: (None | bytes | str | tuple[bytes | str, bytes | str]) = None, + proxies: Mapping[str, str] | None = None, + cacheable_methods: Collection[str] | None = None, + ) -> Response: + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super().send(request, stream, timeout, verify, cert, proxies) + + return resp + + def build_response( + self, + request: PreparedRequest, + response: HTTPResponse, + from_cache: bool = False, + cacheable_methods: Collection[str] | None = None, + ) -> Response: + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif int(response.status) in PERMANENT_REDIRECT_STATUSES: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( # type: ignore[assignment] + response._fp, # type: ignore[arg-type] + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self: HTTPResponse) -> None: + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() # type: ignore[union-attr] + + response._update_chunk_length = types.MethodType( # type: ignore[method-assign] + _update_chunk_length, response + ) + + resp: Response = super().build_response(request, response) # type: ignore[no-untyped-call] + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + assert request.url is not None + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache # type: ignore[attr-defined] + + return resp + + def close(self) -> None: + self.cache.close() + super().close() # type: ignore[no-untyped-call] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..3293b00 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,74 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from __future__ import annotations + +from threading import Lock +from typing import IO, TYPE_CHECKING, MutableMapping + +if TYPE_CHECKING: + from datetime import datetime + + +class BaseCache: + def get(self, key: str) -> bytes | None: + raise NotImplementedError() + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + raise NotImplementedError() + + def delete(self, key: str) -> None: + raise NotImplementedError() + + def close(self) -> None: + pass + + +class DictCache(BaseCache): + def __init__(self, init_dict: MutableMapping[str, bytes] | None = None) -> None: + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key: str) -> bytes | None: + return self.data.get(key, None) + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + with self.lock: + self.data.update({key: value}) + + def delete(self, key: str) -> None: + with self.lock: + if key in self.data: + self.data.pop(key) + + +class SeparateBodyBaseCache(BaseCache): + """ + In this variant, the body is not stored mixed in with the metadata, but is + passed in (as a bytes-like object) in a separate call to ``set_body()``. + + That is, the expected interaction pattern is:: + + cache.set(key, serialized_metadata) + cache.set_body(key) + + Similarly, the body should be loaded separately via ``get_body()``. + """ + + def set_body(self, key: str, body: bytes) -> None: + raise NotImplementedError() + + def get_body(self, key: str) -> IO[bytes] | None: + """ + Return the body as file-like object. + """ + raise NotImplementedError() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..24ff469 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +from pip._vendor.cachecontrol.caches.file_cache import FileCache, SeparateBodyFileCache +from pip._vendor.cachecontrol.caches.redis_cache import RedisCache + +__all__ = ["FileCache", "SeparateBodyFileCache", "RedisCache"] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0724d9a0ba81b222ab4503c7488ad795afa2568 GIT binary patch literal 454 zcmah`Jx{|h5Vez(LPRITe;}a5Ev%?RTRtX`U_lX*<;HGf5yz38RLa1>uV826x9|@l zvB1QJ)B%YJyDc9ZH$2_*-SfNCJ#{)hFmZ&hrw9V@YRPvvt7N`ol6yb_g&7bqhQf&* zXt|TQ!izl!rhvK+FmBae(0a47z-cy)dB%n$Nm;Xf$qJ%K$p(_vKhFVd{0m08UNi-+ za*a@V7Fq_*g0*J1;6;RIET>XMiTx{)d8uT!Bs!WH54-b+djbB&{;mSDR)Ua~Ghu47|G# U!Ve$7EBFisFMj{7t?c=}01BjpUH||9 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4763fad362ac17d2add9b1478a38a00613a0313 GIT binary patch literal 7782 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 QzQGLwt&Ia7#?G_<53kg6W&i*H literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bafdc2540076483ef0050466aae0a5f70bf798b GIT binary patch literal 2752 zcmbVO-ES0C6u_0o$|K9M(5KN@rwF262QKMK6 zCw%Yq?1|TmzzJz@(aK-8#%W*_ouXl0p`PtCBad)_@{sv%JO~Vi$eDa4TP#PaX*!-0 znr5Ya&BbhUavR#30ya%nI=W`%uTpgwkPQ$Z@En3Z=q!*bnM9FIG}*YG_0v`1t`Lte z5T-#dBXV#eX`F_4M79;CBIzMz?+nW4!8MhumEh9f_*PzcU8RG2m*nWN!Z9D0_TK@ri!Kn`yxbb zoF>&~Z>+gr?-GG>L$0qUr5bc@q8GL^k>H8M?T)Dpx?yl=2^5BB-0F zDujqAr>Zj9+3c^icN^WNjettymJyYg(FFEw*qaeCZ4zO{@y7g&)`*ILhEap%vhr>YU;b?1J%z5Ck=-IG6`EO&%vmTjz?_Ha|Q! zJb!NPTF-W2?L0m^w9>kB{`%bYd#yby zySu+NzA=94s2NMU-@K7r>DW^nU+n0a9c-R>e(rp&|91PWi}!o_7JK@ZdQL5Mzy0&Y zWv%~FLnoKG)%iouvUZ#Y|BLhW6j=NJ@)hrQL&hcmD1e&rM2u@&3{?+8wQXIt#)3E< zpfDt?s?De7Quo!aMYXHezO3$xO>UG1kRb$bny2eE=)8={%@7?Rm-a#ULv?;(ae9`( zs4S+n;v|qS56Gk}WW>twS?U%k)5mwYYej>FG`ihgoX5#5E@!FRYSy%f+u$486i z(OSLe`!2Y8O!s`hIdptYFgtPw9(bNv0p6d^g8=;i*-d`HOcq1}#D1DQ zQZ;U2M&__oG;YWzqvenWm!brtVTpN>Jc2(5a-6kN5HfZQc2_hmrdM@bj^k40G7L2^ z9ayAr8P<*RJD?tbbo0NXxe?D|y}%k8;@xYrBG(p6r10VNtO7O7sKqo3zFl&$ubJlO zCCiOhSR0;*wUuGXh;JD$kKyI9qsXv!$Ekwv07Hhmf+1itq%I1|u6jaH4z8-?tnj|D zDrw4zmG+%+d*E=~8Uwt2luFkXSg-FDl>PODtQ>rziAp-wfhUh-wxG3RB|sCbWmv9x z8I3DwA}kl-niCKx_z-1JR8Me6AonKSGy5W$cL rUIDf$34-ucCBmV<6GS-jkm!GsH-4Ae9?E;3By=HtW7ksx4LAH>uQxxe literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..e6e3a57 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,182 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import hashlib +import os +from textwrap import dedent +from typing import IO, TYPE_CHECKING, Union +from pathlib import Path + +from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache +from pip._vendor.cachecontrol.controller import CacheController + +if TYPE_CHECKING: + from datetime import datetime + + from filelock import BaseFileLock + + +def _secure_open_write(filename: str, fmode: int) -> IO[bytes]: + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except OSError: + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class _FileCacheMixin: + """Shared implementation for both FileCache variants.""" + + def __init__( + self, + directory: str | Path, + forever: bool = False, + filemode: int = 0o0600, + dirmode: int = 0o0700, + lock_class: type[BaseFileLock] | None = None, + ) -> None: + try: + if lock_class is None: + from filelock import FileLock + + lock_class = FileLock + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + filelock installed. You can install it via pip: + pip install cachecontrol[filecache] + """ + ) + raise ImportError(notice) + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x: str) -> str: + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name: str) -> str: + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key: str) -> bytes | None: + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + name = self._fn(key) + self._write(name, value) + + def _write(self, path: str, data: bytes) -> None: + """ + Safely write the data to the given path. + """ + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(path), self.dirmode) + except OSError: + pass + + with self.lock_class(path + ".lock"): + # Write our actual file + with _secure_open_write(path, self.filemode) as fh: + fh.write(data) + + def _delete(self, key: str, suffix: str) -> None: + name = self._fn(key) + suffix + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +class FileCache(_FileCacheMixin, BaseCache): + """ + Traditional FileCache: body is stored in memory, so not suitable for large + downloads. + """ + + def delete(self, key: str) -> None: + self._delete(key, "") + + +class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache): + """ + Memory-efficient FileCache: body is stored in a separate file, reducing + peak memory usage. + """ + + def get_body(self, key: str) -> IO[bytes] | None: + name = self._fn(key) + ".body" + try: + return open(name, "rb") + except FileNotFoundError: + return None + + def set_body(self, key: str, body: bytes) -> None: + name = self._fn(key) + ".body" + self._write(name, body) + + def delete(self, key: str) -> None: + self._delete(key, "") + self._delete(key, ".body") + + +def url_to_file_path(url: str, filecache: FileCache) -> str: + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..f4f68c4 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + + +from datetime import datetime, timezone +from typing import TYPE_CHECKING + +from pip._vendor.cachecontrol.cache import BaseCache + +if TYPE_CHECKING: + from redis import Redis + + +class RedisCache(BaseCache): + def __init__(self, conn: Redis[bytes]) -> None: + self.conn = conn + + def get(self, key: str) -> bytes | None: + return self.conn.get(key) + + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: + if not expires: + self.conn.set(key, value) + elif isinstance(expires, datetime): + now_utc = datetime.now(timezone.utc) + if expires.tzinfo is None: + now_utc = now_utc.replace(tzinfo=None) + delta = expires - now_utc + self.conn.setex(key, int(delta.total_seconds()), value) + else: + self.conn.setex(key, expires, value) + + def delete(self, key: str) -> None: + self.conn.delete(key) + + def clear(self) -> None: + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self) -> None: + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..d7dd86e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,499 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The httplib2 algorithms ported for use with requests. +""" +from __future__ import annotations + +import calendar +import logging +import re +import time +from email.utils import parsedate_tz +from typing import TYPE_CHECKING, Collection, Mapping + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from pip._vendor.cachecontrol.cache import DictCache, SeparateBodyBaseCache +from pip._vendor.cachecontrol.serialize import Serializer + +if TYPE_CHECKING: + from typing import Literal + + from pip._vendor.requests import PreparedRequest + from pip._vendor.urllib3 import HTTPResponse + + from pip._vendor.cachecontrol.cache import BaseCache + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + +PERMANENT_REDIRECT_STATUSES = (301, 308) + + +def parse_uri(uri: str) -> tuple[str, str, str, str, str]: + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + match = URI.match(uri) + assert match is not None + groups = match.groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController: + """An interface to see if request should cached or not.""" + + def __init__( + self, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + status_codes: Collection[int] | None = None, + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301, 308) + + @classmethod + def _urlnorm(cls, uri: str) -> str: + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri: str) -> str: + return cls._urlnorm(uri) + + def parse_cache_control(self, headers: Mapping[str, str]) -> dict[str, int | None]: + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval: dict[str, int | None] = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse | None: + """ + Load a cached response, or return None if it's not available. + """ + # We do not support caching of partial content: so if the request contains a + # Range header then we don't want to load anything from the cache. + if "Range" in request.headers: + return None + + cache_url = request.url + assert cache_url is not None + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return None + + if isinstance(self.cache, SeparateBodyBaseCache): + body_file = self.cache.get_body(cache_url) + else: + body_file = None + + result = self.serializer.loads(request, cache_data, body_file) + if result is None: + logger.warning("Cache entry deserialization failed, entry ignored") + return result + + def cached_request(self, request: PreparedRequest) -> HTTPResponse | Literal[False]: + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + assert request.url is not None + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Check whether we can load the response from the cache: + resp = self._load_from_cache(request) + if not resp: + return False + + # If we have a cached permanent redirect, return it immediately. We + # don't need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if int(resp.status) in PERMANENT_REDIRECT_STATUSES: + msg = ( + "Returning cached permanent redirect response " + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + max_age = resp_cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires[:6]) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + max_age = cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + min_fresh = cc.get("min-fresh") + if min_fresh is not None: + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request: PreparedRequest) -> dict[str, str]: + resp = self._load_from_cache(request) + new_headers = {} + + if resp: + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def _cache_set( + self, + cache_url: str, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + expires_time: int | None = None, + ) -> None: + """ + Store the data in the cache. + """ + if isinstance(self.cache, SeparateBodyBaseCache): + # We pass in the body separately; just put a placeholder empty + # string in the metadata. + self.cache.set( + cache_url, + self.serializer.dumps(request, response, b""), + expires=expires_time, + ) + # body is None can happen when, for example, we're only updating + # headers, as is the case in update_cached_response(). + if body is not None: + self.cache.set_body(cache_url, body) + else: + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body), + expires=expires_time, + ) + + def cache_response( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + status_codes: Collection[int] | None = None, + ) -> None: + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) + + if "date" in response_headers: + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + else: + date = 0 + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + assert request.url is not None + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + expires_time = 0 + if response_headers.get("expires"): + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires[:6]) - date + + expires_time = max(expires_time, 14 * 86400) + + logger.debug(f"etag object cached for {expires_time} seconds") + logger.debug("Caching due to etag") + self._cache_set(cache_url, request, response, body, expires_time) + + # Add to the cache any permanent redirects. We do this before looking + # that the Date headers. + elif int(response.status) in PERMANENT_REDIRECT_STATUSES: + logger.debug("Caching permanent redirect") + self._cache_set(cache_url, request, response, b"") + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + # cache when there is a max-age > 0 + max_age = cc.get("max-age") + if max_age is not None and max_age > 0: + logger.debug("Caching b/c date exists and max-age > 0") + expires_time = max_age + self._cache_set( + cache_url, + request, + response, + body, + expires_time, + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires[:6]) - date + else: + expires_time = None + + logger.debug( + "Caching b/c of expires header. expires in {} seconds".format( + expires_time + ) + ) + self._cache_set( + cache_url, + request, + response, + body, + expires_time, + ) + + def update_cached_response( + self, request: PreparedRequest, response: HTTPResponse + ) -> HTTPResponse: + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + assert request.url is not None + cache_url = self.cache_url(request.url) + cached_response = self._load_from_cache(request) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + { + k: v + for k, v in response.headers.items() + if k.lower() not in excluded_headers + } + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self._cache_set(cache_url, request, cached_response) + + return cached_response diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..2514390 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,119 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import mmap +from tempfile import NamedTemporaryFile +from typing import TYPE_CHECKING, Any, Callable + +if TYPE_CHECKING: + from http.client import HTTPResponse + + +class CallbackFileWrapper: + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + + The data is stored in a temporary file until it is all available. As long + as the temporary files directory is disk-based (sometimes it's a + memory-backed-``tmpfs`` on Linux), data will be unloaded to disk if memory + pressure is high. For small files the disk usually won't be used at all, + it'll all be in the filesystem memory cache, so there should be no + performance impact. + """ + + def __init__( + self, fp: HTTPResponse, callback: Callable[[bytes], None] | None + ) -> None: + self.__buf = NamedTemporaryFile("rb+", delete=True) + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name: str) -> Any: + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self) -> bool: + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + closed: bool = self.__fp.closed + return closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self) -> None: + if self.__callback: + if self.__buf.tell() == 0: + # Empty file: + result = b"" + else: + # Return the data without actually loading it into memory, + # relying on Python's buffer API and mmap(). mmap() just gives + # a view directly into the filesystem's memory cache, so it + # doesn't result in duplicate memory use. + self.__buf.seek(0, 0) + result = memoryview( + mmap.mmap(self.__buf.fileno(), 0, access=mmap.ACCESS_READ) + ) + self.__callback(result) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + # Closing the temporary file releases memory and frees disk space. + # Important when caching big files. + self.__buf.close() + + def read(self, amt: int | None = None) -> bytes: + data: bytes = self.__fp.read(amt) + if data: + # We may be dealing with b'', a sign that things are over: + # it's passed e.g. after we've already closed self.__buf. + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt: int) -> bytes: + data: bytes = self.__fp._safe_read(amt) # type: ignore[attr-defined] + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..f6e5634 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,154 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import calendar +import time +from datetime import datetime, timedelta, timezone +from email.utils import formatdate, parsedate, parsedate_tz +from typing import TYPE_CHECKING, Any, Mapping + +if TYPE_CHECKING: + from pip._vendor.urllib3 import HTTPResponse + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta: timedelta, date: datetime | None = None) -> datetime: + date = date or datetime.now(timezone.utc) + return date + delta + + +def datetime_to_header(dt: datetime) -> str: + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic: + def warning(self, response: HTTPResponse) -> str | None: + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response: HTTPResponse) -> HTTPResponse: + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[index,misc] + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw: Any) -> None: + self.delta = timedelta(**kw) + + def update_headers(self, response: HTTPResponse) -> dict[str, str]: + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response: HTTPResponse) -> str | None: + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + + cacheable_by_default_statuses = { + 200, + 203, + 204, + 206, + 300, + 301, + 404, + 405, + 410, + 414, + 501, + } + + def update_headers(self, resp: HTTPResponse) -> dict[str, str]: + headers: Mapping[str, str] = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) + last_modified = parsedate(headers["last-modified"]) + if last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp: HTTPResponse) -> str | None: + return None diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..a49487a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,146 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +import io +from typing import IO, TYPE_CHECKING, Any, Mapping, cast + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.urllib3 import HTTPResponse + +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest + + +class Serializer: + serde_version = "4" + + def dumps( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + ) -> bytes: + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) + + if body is None: + # When a body isn't passed in, we'll read the response. We + # also update the response with a new file handler to be + # sure it acts as though it was never read. + body = response.read(decode_content=False) + response._fp = io.BytesIO(body) # type: ignore[assignment] + response.length_remaining = len(body) + + data = { + "response": { + "body": body, # Empty bytestring if body is stored separately + "headers": {str(k): str(v) for k, v in response.headers.items()}, + "status": response.status, + "version": response.version, + "reason": str(response.reason), + "decode_content": response.decode_content, + } + } + + # Construct our vary headers + data["vary"] = {} + if "vary" in response_headers: + varied_headers = response_headers["vary"].split(",") + for header in varied_headers: + header = str(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = str(header_value) + data["vary"][header] = header_value + + return b",".join([f"cc={self.serde_version}".encode(), self.serialize(data)]) + + def serialize(self, data: dict[str, Any]) -> bytes: + return cast(bytes, msgpack.dumps(data, use_bin_type=True)) + + def loads( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # Short circuit if we've been given an empty set of data + if not data: + return None + + # Previous versions of this library supported other serialization + # formats, but these have all been removed. + if not data.startswith(f"cc={self.serde_version},".encode()): + return None + + data = data[5:] + return self._loads_v4(request, data, body_file) + + def prepare_response( + self, + request: PreparedRequest, + cached: Mapping[str, Any], + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return None + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return None + + body_raw = cached["response"].pop("body") + + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + data=cached["response"]["headers"] + ) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body: IO[bytes] + if body_file is None: + body = io.BytesIO(body_raw) + else: + body = body_file + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + # Discard any `strict` parameter serialized by older version of cachecontrol. + cached["response"].pop("strict", None) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v4( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return None + + return self.prepare_response(request, cached, body_file) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..f618bc3 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations + +from typing import TYPE_CHECKING, Collection + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache + +if TYPE_CHECKING: + from pip._vendor import requests + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.controller import CacheController + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer + + +def CacheControl( + sess: requests.Session, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + controller_class: type[CacheController] | None = None, + adapter_class: type[CacheControlAdapter] | None = None, + cacheable_methods: Collection[str] | None = None, +) -> requests.Session: + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..f61d77f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2024.08.30" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..0037634 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from pip._vendor.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/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d2245a0ca87f7713562a34342beef1aca398fcc GIT binary patch literal 337 zcmYjMJx{|h5Vez(mPTbmNG!nEA#vI=Fd!C+V1hkDoYL5BEMhx2POC7%KVaiG@LO0I zQ5KMx*pRw0;YuL!hIb$DPVery*XtsS6S$mR+4!+4{^0y3%Uzp1B8n)^k-#w)PV8Vr z9qP`U*ri_V)vf;8C$?jKr|G0h8YWHIv=$lDOuM$PJxjOUVKm$iql0i1o%dUfm#Y7A z(*{WL9H8+5=1iAdNq{G`w5#a*hGa@GBC0GABB5lg(n_ps$SF5x)r1V9C>SSo8C*<* zV?`NZa!ztSAw_L6B}d_4NJ?&4P$cPfGGiqvctNa@q)L;NX~UjG=TInG n9Bb*udVE6`iN literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbfe903b6779d19c2a57aec7df060cdff10b0f80 GIT binary patch literal 664 zcmZut&ubGw6rS1NyO>rCLhuv>(TJOA_1X$zL{HVD1Yw!(Op}e-oppA$lH#EVqSA{u z{S%bkl_n-`tk?lu<(X5RO{@4YwQ%%?`f18Us~9u5Ag_@hYbWme$$ zK!LY_00PILUqo#TW38{ndS8b?0~Cy$x@i%o73`bT95ohvjfhSRVt%xy`UwMps#~tr zMLeD3P-kQ;_!{vg<-k>2t1GAQM1x=gD^35O*0FyTg&Q4BIw4C0O++Tmr$fr=j^>9u zp6{R1UM3i)f#5mqKxyGnL@eoe(!qR?VxCdiOrx|LY}14=-VG@i(N@HZxADTXT)M>v zd91E@P*ihim0et(!Gr{ANU2G$WQ#nLMtPbkj}q|#92ZvqJV8SiQxxYz9LJcT9t+FH z4Bd^yy?hg`uB`YyJjwj~TmEfED5A+W8b_NborobzZgf|#qbw5CPjUDd4`_yzZB*Gt zm2DIRF^-ZT=%y3tti_DvV|tUHQx1x+%^s@bw+QwdQVn=C=3Ui@Vk# zu;!pS1I;(Rch}xO`wW@~VC~Ru%7&-6`uVgmlVmBM2eEF)FNcNHf@u%9ksR5)`jD^5)f4qY{jSvH;c{gN?Mxa zva=)0a+N}dps-I?k)qZi2zpn(ED^}XdTMJei` zeZ;)?I6E^t^S$rA*?-34Q37&Vy|Mh4Aws^zKY1|jqSj1HBhN~jpBgo|O07`!G!ix`3#UE+-}tT5pFGWfA| z{=cjj>8%%q_2R`uMJXyjT5q6ly;yfWZ@+`ZLC+2qhrq_m!^ksp zZwKH{aRf$0jfDR%9U&27j2enLVhoyTV+fuNL&LK~jpTf6UicOTiYJ7!cj zDYKTWd~H4Y=bl8Piz}9sso2J9+00OrtzoDkfH2TqDPiv(F(B*)dF(&o z$U4b#b6MUUP%mA)bot7ndTH_ZuB@u&ZHuYuBhtb7uPcQWyJ8k9t1DWiq8Wv^ZGE+Z z8!Jp(Y-aWS!kN>jb8l!HSQlqUxF7*YnM6z}Q%)L$mws{}h zypQec=nlKGQ8yNZd*R~Z48?uX1SnT7*;citu@#DEcLj%0Hv((`8d6ntLmI=-xH2`D zEeHC%$WX+@ivW$_ENN}Uq$b5&8-eD`g4!gn21#tJJ}~hrO~xlbJz78h>*nNz*5q_! za{7x{bMoEh!E1Nlc|LyV<3F_~rWzAd&555k$A58m_IYgh{`|f9kLSOPo%&80ugl}! zt9FGGLx!z$4HSga4;F#?7QnP`GV}sh>V+B>@Wl{56NA|RtTacVpc0A!a3#&rE$b2I z%4Su!4Xe7G6+8qfGSrPwQ!`Y+itWWl4pN$CU|=4agQW^Mt)%KBCz{I1mNL~)rk>nr zDsQ!v*@iM(zxIc^GTT(%tIO~CJg3O6mk2xXT=e2K0e^O3B0`6U$tU3KqWD`o6vz7c zn1=x%8qa#_gff-Al1OgW)ejZg~>mxtp{UiJp~d5{xS^n@sIdkRpR< z8r3MOF;rLz_5ka#%~R*#p>qLLALYi#_~H8DbN@KiJUIP-ldM-W4#DEPNoMdKSrBfJ ztAvh&dBjl+%HEA;un*N0XdPq|27j!6Apa!x`P!Gtd|jUJhM9AvcdKwo+!?T)`~oE9 ztaa0L!+r_HBy{Xm3JH!Iazl`fHg)t~%4!F_}t;((1*zx;&5v`N3IhNe(U76aGk7iS$>ZG1m2$&T+yzXRWC}eh$)hl zXcnH(6R7YM^du-(G&H6;h<66Xt14YA5l{`9a|{#&I7Sk~e>?iov4=BX#dA+m&yu4L z&j0oNN5A~HKoa>@Johx7d+lHW{`=r*;fZuUynl+^g%SNJQu2=l-96b44u$}G5)k`? zzG}ShD*L3<29_!RjaMO~=e!z|m0aF-=p-!fh7F5WwTg*1GhSv;ibbr{Shh@{SJnTO z@bstn_T86($8=Bq5g%gMf*OXzgint<(kffZopVEQ*H}8sj=Eu0HEbQuC^+j*H|;Uw z-PkRYI*<>lRb8^(q*bZel)*^uXWE3x&O z>9`> 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("pip._vendor.certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +elif sys.version_info >= (3, 7): + + 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("pip._vendor.certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") + +else: + import os + import types + from typing import Union + + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where() -> str: + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + def contents() -> str: + return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..bf0d6c6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.9' + + +class DistlibException(Exception): + pass + + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + + class NullHandler(logging.Handler): + + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..293712c9c67608bd803fb31054b881479932fc24 GIT binary patch literal 1288 zcmaJ=&1(};5TCc%Y_myQ`=PbgwpR2KB-yGL1rfv+TPX2t5SDe{Gg-SI>Dx`)EgpL4 z!Gl7@L;V*@{|dpIClRqM2!bbXp(!GsoY^F%iuexm=FOX#-^{$=KCVWssAU8}T*7A3%)3UR;0wU6c9%o-b~|X66BG zuww2Txm32Y^X2R1n|9wHpj#5ODcc^FUS%ArO3aE%GP2-=k?TBK+_Xg_ast0n%p^I} z^es=AW|B8eFW^m=^g+{HYg%sSW*^!F@pH|n2c9szX5I2UiyI4p-SmVXg~mN6T53Kr zuFlVw7OXfd-G5xV8*pI=f89VpqY+2-z`tI;dd&!(NR%3uy=v7&Xf&LLVXh0G2h!l3 z>I~C#d?zx^awC>1;--Sy39~46;84v;y=O17q)=(P?vmwmSIB?QVivvov*2t8su`}J zRO#`n*;p-RWdWUR_mxBqh5Im8Jx3Rn}g%ybvyxp2O3EQ_%QwZT=gOk(G z7G5l;RaA%{Ws4$G$QAuuqQ(uP9Y!{9-#`N9z7;tOlhStO{iIL5*QZ|J_@H0j)(%1Y1f%a^^yQUTrH?T8qjdpt<3~_nGsmi)o!PDJ f1uui|fNCp?#-Hg_UTJp}c%w|+xsZ7?%TWFTmX#9N literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30ad3fe685f7060de4905db042e70ed83028a3ed GIT binary patch literal 45545 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 ORd%#Y|G$>L3jO literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54d62d5bf6f027d21d3c55c8f83d81538f841d5c GIT binary patch literal 65600 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 M+-f)TJ~jaV8(_=(zyJUM literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fd52a2311c3c5202225f799dcac901b6f0ea225 GIT binary patch literal 24335 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≫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 X>+o$BEyw$WU-a2V%gX;%6tVqpYJ`nb literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a85afe255d451ff6dbb7e626101fb33ad617f1a GIT binary patch literal 15095 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 ASO5S3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588a02f75a34f7d5c45560ee50ed7b2fdf3f3aef GIT binary patch literal 7673 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 ChQ4?J literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a373c3c418c93229203596310779ff94774c65e GIT binary patch literal 41579 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 F{|`&iw?6;? literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7334cf6f50c7aa4e7d0da361f5ba1b3ab6aabe68 GIT binary patch literal 19772 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b53de23e23e9dc0d8440e73622b779f71d81baab GIT binary patch literal 88054 zcmd?Sd3;+(ekX|gAOHd+K@z+{iWel2)O}EwDN>guQL+x(q9xN10ZOEJ=>arF72rj=thc6WNxpUEZx1gc4)x%ns)Z)ZB0O=QWL@p!T` z`~B5BK|V?D>;7cpoxe?=GKVG>Rr)|)k& ztD1l&pzYIi(66pf+pp`;Y59Bl4n2Ej=rG_{-)HPMb(n=`mJSPhX6>-D->i--_G{~~ zv0rg;f`J2@RW>^HX~m;L5-KfznAQ7| z*je&#aP0?L{;Fdg@;G|CzY7m z@W2OpzJiXY17&E*LH4X1&ngtp4h6h;c9=b@#Iq{Jv-U^!%L>eu@5o;xo_(MbYCIaK zMybyPE(B`OE5`zTfm-|?57goAi9kKllK~&nX9FvdKKICaR-v9*v2^)Ys^`=r-&`$? zTnAdwfZAVpWZp(8@997j+H)qb2I-4|wMaVy>pETvtjC!@umR~=)>9kNQ=1e$)y3{^ z#@#K7y8(80EABQc?gj(fI=Tb>f$eD1xxfyTc|NeSqle|)g}hHG^7cNm%`H-!FFZ2O zZYfXSBlEOMdHMrwXp1SZ2kAi2$!)@Fv=^(AZ#g2>pTn9%h3Fg;6v~qv2y7%Yu zh=^y>oC~p>2axmW;E;58klj6qyN7~U@%_B{6wkgE@Z;Hd;4ISD z0$oVI9tZ@2f$qS$_w*hAB5)peULV!2&;(u88qNgVq3v*<(!}(a_l{^T=}&1!#Ag-( zzZG^Au;)9(=e~hoP)D@;v}t1?cyTyLCq3u-2G9P2umY}JZ9SoIU(eY+m%4&O;hw<( zpF3?2g}I)AbDiPQpGF4- z4|aBQgZ-VM!C|f|m^Ke{eS<^60d~?m*n^Yv;qVZuOIt7X_i;mAbZXmw;>6MY{((SW zkW0IE`$NIj!GZ3cbHkiJJjkVOFZ=s?0-Zg9;6ONS#iOvlX8<|vT`bp-p9|s2a`M=r zJsgMp=8m4By*+)ww52-~2zCtys2u|rhX=#Bg$A(~BH1t2zi@iwbYsJrRld`ql@XV4 zy>gX!r})MC?K^fwcj9lyE9+LTAB(>5YUP<7EceP6>*=8{T93!RjOWpwf#|?s_;hGh z&j8D7d2x_CeU|F5zKD^zLl$1G;dqow5#&fm!7Jwd9ij! zbo5LdBZTFoiKFk0=m~NZ|EoV z-P(X2XSxX;&I~xy>NJzus772Bj%$2Ie-MRdd2t-2?)3V-{eJF3kn{30!Haf#xnOvh z8^EJLPZv!TKR4>d5YT8~vdFIlFAZ_QPzX61vsjTQ&Igt6jP&&Ni7$FD1V=;Os==YE z)!wSU^PwtMQx!*N-GiKWU~r%z9OU|Y2K;>?Z_fZLFO2f!O1$Sde?MBg+Kc>rb3={Z z7O~|*3xff??PZey<%GQ9LGRfhE3Ib$6`;joWbuda8GSvt;qMa)Sj}4G7mLHlifvz7 zq@NY{vY+empY02J>qEm`=c&ZOQ0IWZKj>>@&of4m*2X*<#s3vp^{OU}Q~v1Hi)Zq$ zJYr+osFqt9)%F_Yr{bANCj_)bxHYDWYLE{U^U_1grzzHqX`;y2tvjxXYC^WKRm>aE zeIU%auVcOlCF-O4fc|AIm#xTWh-xCB&*j_!eXmU{MgGN`MiH-%;hlgfz}K!nryVm! zHQc`xYl-SF)N3@HcHmvCtt5X;73Hy{s~BBHCSiWKw=u+>}vzs=s7P+G&$ zRF0GcX$2=p71kXA7AX%EEGz|7G@pSU__ESj2io?upE$7hz@B4iW4}M#bv|u6#|;h- zh0=PoA#FQ8igoIefFHQvP@f;z$>bjbZVIIB$4?wP(7vy;b^posgJ}c9Q>H$uV8~|% zt_$|_OI%vppEhA>8}19IwHMR6!Ha1lkV!a{)`mg^VzhqZ__Dw0{9u2usekx9txSQY zw!yC9eqgUq)4rbY{^7GtYuBu4X!DPT8jf@~v;sjj1qWVk0xE188V#Qx99ZADc3o2l z%TU9Rzw3hkTrku$)HBr7`7&BN$TbCcjNL@2xN&GSoyD)!omhGzUWVN|`8$o<`v$wP zaPDlBb3BE1hQa{ram}apf_Zys(q0-rm9p1OXz$wW3;6|CpPzdE?T%^f)R~FB3!cj9 z%J*w-)O@#Yx<27qHF4m6v&K~r8%;R935)l$t(x4D#oV$)`Q}vamV|xFJy%h@a>_o@ zvfy;Zjgzk~7E~sxns1#-R_#p{>`S=zE#wqjEt@KfU!1N=<&l6!fj@n@#CPp`e5SH0jaTF5VtUz|EUee8CA9WJjPnmRO{JLj%m@cL#dXR4+h zQwKivRL^@>COs=>wx&EAV=Z?}N*Bw0iIw|);!CbPo+>|)@SG4|&3WH*!}HzZnU))6 zbM7Wq$VW9dYd)x(sZV&<#|}Iw(&UxiFV*B1UfnmfFTUsP_L!D^$F^JkWYw-z!BYv> zQw#Q-D~Bcz#d9tnSwP0;rk;zReEUVA!{~eFJ*$(R)hSOSKFpafcGyF7z9s_$(6nb5 zfQIB-x~o{dxM##QFQ8*<-T~li6YfE-QLO0|R%9wkJVa;|q5CudaZC%?6xQs3;lgID zrrBW$s|2vxE?F_YLis2Wc!2N(T7(rcqdpzg#~lj`^u9);hIQn3#(+mc+JWY%zE{FG z;`acP2&V$h0j@wk6^tU~V|YZRRYtVR0PJQAnBLP9HpJR`EUF_6%72N^%&%K%Z9Q9q z(puk_r5P&?APTU1J{al=(Qp`ug^&nJyCaw;x<*JaRt%qBV9o%!Q^T<)I zf^K>#sYK$la6o7pZY3pKDDhE(VbO3~k)%yLh;nOi5waj*ONn=UoNJ=THUWZ(?uk@B z7RV_}fJ!0W?Tc~EU7I^zG`;p(=}g}3qSbf3wbP@sIkUObWAk;}l6Bisbvshtok@Gy z#NHU@swbW^8I6Z-JFD2Ff9m6{$*M!Cg2M^dVF_3jll#6$xgO+e%IjyWsj_vG?GvrB zBEa&ZyX@+bsUy<|Qtrl>_HLnv0kmR~iRl(fYo`702X6$wdv5xCqO>Vyy<53z=0K`) z(^Pg$A3L>BRxzWWZA}(ziRm9W2{>Jvf+E103|HJ*d};<6Q}NG7cRQ;u3D$8abL<+J<)PE&%NNvzi-jF@?r-jUQJla?wd75RZH;1-Lm?b zqEy*>ej+Rsl~0Fe*C%r~PqaR8Xq=w=+4AfE9~(T~ASaHU?#Qtx4&77K^O-}(ZNt4t z>EnR>>-3g1UMm1zMU9H_%Drltvc!v0t`%Q>yy_HyyHHd%-8H)+nY-yx<8>2EW7;7s zN<1ybn$6Mou=&WZWbDhH!oe?NcI8KLdy$u>d8h`-e;e04a90^C|6#v2$5{D!t<_lm zc>$8o3N-fISVPL@O&Gk(=L#VYLTeBI1`G(H&&MH1#yI7G2$v8c-V~02R$Lr7?Wpbv zXiUlrl%mUE9Q0A`62z)|EaEaSHVtoKF;QV`Bm}1eo2CuuE@{UM_%q_qG-d`HcsB~B zp2`Rq8L^PW*Ez*+l7B(Un#7P2-Sjis4*sD zJIA!=G+^zl+~gB_P*N2v>p^SOx}*mUYAgu)>v04D>l1NA!4z7*LjR&>kR+?4R-s3; z1hPpYPy)7PZL@@aK@W@p2v<6L4Z=cvaB5echu3XgBZw!HEpvrlKIOZut04L zo(O^3Fi}tJSTZAw3@4ye0p_*KYAjq>@e96u}VxJ zl-9nG)}GNW7WWu8x#;4MKn-l}Umj_M98aj`(ez`j=y zF=z+2TdWb_ZvB>2=0Uf4e<0Oc(edb7%&2NGd@sL2E z4>B~G&d^RVEz@f6%R!EG7T)miP#=JxryGL*Q7?G^Wrc(=!+W}Wf`QfEU>`uIeQ+Si z!+}^0{R-mHJaL8!z zvEv7hw0Fv4PbPlgs;OL(Mi6n13Ogm)B@;KKEkYwgOz@D_zASMbUV%P87Yswp$a*3a zspF}2CAdoxMPk?oT!zPgR{rl%7~9ExW$|+WvQ+p1yePa9q3K@m_acbI#<>JTqgS^Q>83 z=-rCdvknOG);#rb>+LoB7D_8wp4qdB`mOWzPbKT0O4aXf*+L1(bukJ`|w?zuYNulUkwtPYIBrc#{nhkxVSqu2XY?(}Jy!IyT+Z1*9^3p~o*G^}J!nC4~^n}lIL`?8}D#@^9nN`}* z-2*`clWx(>N?Y48=Z+t3Y2CvSnFn<+6u#7gfnXStX6^{Rev}g8?6_J=h+g%%ASnx8 zJ5Ikk4uUuORu`_6 z5J%_yG|pKzak)NZj^Qsf1Kw|3b3aRy<0h%b+qUroBq6i%LamwObDp&e&b&oS?!3j5 zw0OWpTULy>KsLUZU6d$pn6)O0x2Ce26P9KOxvyNBy!2)yUO727zJGy)-`8ud)x295 zuTQvEj2~E7*_bdij_*Y>aSBP?Gu?XE?24UY^6cZc^XnJv`B&N}+vDq}wJCemgm%GZ zpSbwOMkZ6=bgL*?zB`rMny|MbU(6rZPP8M7yDaXXuDlkEcPHF6^X}D2_i6~&CaeoN zc@w6)+0I2*@x05Mba|(9L;(O31VDr z%-QP~Tsg7It2I+KZ`Z}@V>VHCfbWduOon5jH(n8Bf@_miZK;Ai3D+L>N~|hoylS7a zznwkN@*rR1bb)7g6)faKNS8Ld7Hsa=Gn3on>u=l2?~y`biF|y~Rdm%k<(#&rTq{|X ztdjM!J+ibtH}7iwRQ=m4p%!SEXkB!9;(2d7CR#9v&{yn#YyUKa`oHE8-s?(MZA}$4 zCtS@-)fe-gbxF^FVWDDb>nyKZ)Cs&+@xwIXJ@=DP>cW&2e7 z^!gcX%DoZ`S)My~@vV)E#WjiAwvR`XwMSFM&m`Q>@B^ZaK~KO$nKP9)g45lJ(guDN zOOPS9LVucxFPk2*|6S*>vkt;^?VF=h?&%H)jha459z}K(A>ystpn4`=?pG3JOm0(ue{MeQurM{OjezC38q zT)vLKlmQwYSe_UnHG6?%yn$dS3?mP+D+w{n59nE$4H2$j%M;2NegjI%!{5U!HvH-` zKiHcIM=#}Ha`Xy3mGU+ufa1^){VRNmGRHrwOwh1usxFzv59yxPz|cY~Q~B~UrutKn z56V)@eg_O!OiXXc0-g_0_iHVpa0=hOO7aEN=6?&j$qL zoXJZ$8zu}utB<_@waKr=!*kB+grz#+tVYgvTH}Vd55%5MI4kCzwMl2~bSULqm9VU0 z#8o>tgsPxayNDn55j?d)Bc0X{4GytB;6ik1;uy)}%T8y@UqTJ2YK(+uih;Q&YD3Goz-c_P$Y5 zQ4O7;-IFjB^1^(4mUIwMvUUAeZ~_Kh0znz@WFX}X5T=5WJg$+Ss)4$^%F6iydih-K z9nq?jgh6~AK0`Z^(tgZ#HVsasZ8QgjE1v`O>X|x;;G{I zM!pxCIs6Cf|FHRYn^P5glR0}QObfQ0@x#mel0bp=wd3i&Q`yeQxvaFPcKLTtTkQ4-(`Vq({Wj7Rod7$I1=PwUxa04uzx6= zcKG|~R-m)%JVbhFJ2QpC^kNUqfnc|v*&PiDOi@>e2oqrm;nxo{GIs@o0q#9K*-f43 z$H};6!IC}RvXGU%NKC|=hrmMEb7Ae{bWJ_C;3@>k4Z9zr{HF|8v!=4%=FN9vhm+1q zQuLZMcE|XBK(DJ5E5mflbaeLF#ER`n_x70fe!j-$}KacXg{ z$IH{kv>@yteFI?xy%w2`L^UsC4qb-qDXJ$~8~R+&h>IK$6);ZWh|lxsxwr7cQ7?h% zh0SpoK&lO-4P;o3?A6a4gP6iQ1{JF`hQH z@r+6yT#6BOjAch1Y(%ra@`yU55#1$l6@o45F9@=}G!BQm8@3Q`3I_*B#2boa^LCbv zkT?yJ{iazs`BLxQ;ZGluF~a>)Iy)r``tl5nh?F*A=3Bs>gG z{Q*WjVhwu(Ik|t0ge*_}f$kxnF0Jbt0%;n?b$q7Q`dJwUB!*2t&;ai+7Jo` zFL3$vs=bvtcrXnYmo7To1E+$4bH|}x!XWNvHSrd`#;!i7u+kQCR2kv?=pA^`pyaeA z#AgoqoZN4)){rbUZS18V9tRkioiJtq8qx!A7wrWmW#qA}ku{I|U+^kNhGg6gN}i{Z zjId)K4u;6og0P3;;1P*k+5g+vvOurDren<>7Fg;%C^aEZ|)dxTXf{d0&jv6y05btix*u?d-_>ObR5YxuirYoy% zv?ScMux|C#&p`6DDrQ_LEKL+bc3F>fp{y!qj%(k_`pl{+s=u$-R5aYTL##L9_ySU! z2O6!h7=*>sNt5VkL@!j`zCZqSRB`>x+ zZn|TsKmmpGwzWyy+6Nkg(M!eHC+(NB7oCMy7$cZ+R!|{WdmQ>7+qFnDmJLZjRS$aS|1q>KBWSJc4A4vD z<&r~OoNbl!H+K7yl|(wIpN-hr@(i6C-=tI#)4OS zr+TL=@7Sv$x+w6%z%|Evzd&O&e`Eh^`zM~gV{k9$w+Xkez~967kQ~%#GpGeM*|P{H zL|sQUzpA^c1^p&b2x=6)Ol1>20gCY}=N2i|-_Va}dG^Ra=(2x^38~Ee7Xoy_k)az1 zjeg*9@)XsD14>@qOnCx59CruVzC!~`#+(0wS<;?J&;4T>kZ4N zSlS(vj@a2dmZC2%o22u93=u4TJ-@}SjT_c!-YdY#Zx*&#^`BVvIL)xykUEx-=r7f= zS|!)7CgxFgXh0kSd>DVIz9Fr-!VrAr+{=eR&!m^|R0@W>MnD~Pok!9V7V$lwWxwK^^u4)iy!F1$U@TY!cvvPav7F1cpIIEA3RijGbbN7H z#~$GHA0N_chTgB##*13an(r6j>=ScgOS%4&ay`!ff71V;q6fP!1jFeZ41pkF3HS5| z2jSP8gC#NZ7AS8smeaw30O_B@gUZoKXY(a>3a@j2i4Oig4b)zFpj`7=RmrTXR8}=V zR<(!@qYIY-=I>iwG!*sy#zV(K6-n%a8T{pXD&eD9(>7KB& zp5+^E zgj|o$38e>mmp^({6t${CI_<9jkbEY80 zc*!UZrl6#qeL2XhV@E@v1r+Z6R0_G(GdU~0P}hV4q1T1uulFpRSmAJwnSCA+1^nk= z`?4A#bP){<>kwV9(z-0tZ`fXm|*sU)~t@#5&5C#YR?e~WI z{Gs!_=^;~y@*ddm9KzGOnou3JlOh(Jg?;bY&|n|Tdw=mia74FEiCL_XS@26IxbC zx&lp)TVu)k#>=n09LxLq*n+cg!g&{lB=oyrcE+@?y%OuXZ7y2O_9Tin->Od*?M`L4 zCM>P=Q1@Ci7P@UNW)HXA+LA14O=Y(wEN%DfZr-{oWv>|Dv&d6QvEgJ^>4L>UB8PX5 zT|G5*YR*yt1)I%5bX08kc2?fFy$v~6$wKHTll)r zZ0V3NF+r^Y6XyaKYk`Y(z{rG;H62ET;GhsZc>yDym;>&B8NU`1AtNZ66=_x=3#lz& zLuwD$kvanT0S9tr2eNVHWMQgYEKF4n3saRlYVsAN?RxRit!vox(A~VU;Lc?4T&hKR_ZH{v*v1GEoFBEG(ZeT(&P37Qa1ACkqz)yrn2{1-bI*mn{O3^_CG33|9tXBVV^SXH0^ zrtelTQ`~>Yb)+csiy8gIm-&CvSC=6VzPg|UA8T7I^S*m>!Z2qkUM#J6ch7_YEEWIJ z(qJJwHIn`wo#AQtZF#8BY@O_oIxB|S__l|o6g}s zr_&!2dnQtz@zKkkKcFwKLODeHIInDbW7~q=HE%CZ+RNwdRY`l*^oBcjl1JJF0|IGW z@Qw+8{O6;TC(#~{|J=|j*>E7Bqzu$Lj)>YNhfJDgTB`wUq^o3^A0p30d>MbJ zN&4hk)u@6eyerkC_U?r?@<8$F{eOlAoCqR@4@~3$^b*cCJ@Gqz{tG7LyX)$z5~ zv8X?fC`!!Z4GacD19f4QmUJUJ25ZXML7+_54Au(iRWyfv3Xw$!#6dBJMhAxn&INg7 zOif|mD}D;RYzX1QEr$YkfX1Q8&f|P#E2%}G0K$BgiiWi#N)?qDMnZMN@QC#+vI2F& zAE67_7fVVrPltJh1x6%2LTIPdM?AC26LLJQLxVzJQiV^cl3f-e9$LFVF>rOPujH1U zfFw{du_8-z8YhmRENuowK{y`#Ah;l?TEdG#oVgIiXDHX`(yJb=0A3R;!GTU zHucnV$raC~a-UDwpC_cP%nr8cQ~p-$pradsP1OnZ0!e4^DB2J@!z>S zVcE?uqy|(g9ugb+pV&&G&VI_)3~I8XUKPw4m0;`x0gk~FNW6v`XTd@R=oAd8Mh!Yc zZ!ynO1f+OEn@C}`k3cKK6s>zW>}0Ui|)xAMcyncxa(`!|X`1cxMcyt^-V8#{(W*wRpgT zl#u&<He4%iXcbTqN`xuRh4vAO>dbwHRsxlAYtV1Gv}(z1h_9i)8`b^qdTt3 zFPXIQhb0BAd72;P<+j%7Glawvo!^blVQdb5mmW{RKx)`o((cG`gjpuxXSs$D#j_O- zRot&4Ba~@#E??#_)v&po6L2hHZ1|{4CPy2YC8V16UB;p;D6A%+Ff+rqsNr4dt9hN) zS}>|3VC_ypi3tsM2_I?}rb%2mdfAu7&vS_^_Q2(Wv?z=VA`5YT|8kIhE7TzzX)NdCD9&yyN&Uu(+ZRO(IKFEyg6{3emPq7P08KmFQFu;j{t;1x170 zrEHy8(y30q(^vps)}^Hx>%)?#>!?GCK4Kjze);r?_g}d2!mKA%(|pIWZ8@PVeJ_XB zJqaoDV)~HM@mm5TR4g1q+`B0SB2=PbF&8iLAB*Z?wlV@k6U5n4)8=r6Pav@2{4V$Q z=7(0AYIWHW5y@cYe0|(qlg><=y-=eRFNs=75WN5Ick9Djs5{` zLDo7LA~%&@|I7YJ9_+^li1Q@Q86;#kuvnx>EmI8&@Xxf>H zze9nfrp7O#-u)bng`-Rl>?aNV{?LWAk)~LP^HFvK^idEFYhf6zi=#_|llGo| z^i0qHz65A~6a=p$=n+2b@qqs|rl3S)I#hE;OrNt{OuuzXh1V z$MJ`%JkudQm4D^8nYFnN4h5>ADwJq6ED^VA=#xlkrHGGNX}jeb#j{Yp0>V`c)#R43 z52Zy7q{zl|<4!i>jnyIr63C{x6iwV{wF=*D!q#kL{Nb zv_@DAf#B6rCOwi2Y((}e{G6t_NAS;UlZiZz6lP!`nWJr`Dg6=h1M~$kj%*4FL2xWg z?rTZg3c>fR{bu{E4RfmziPc30%R(UA6La<|C4K8o<<(BMO|(p0q2r3?edz$ZeJR!>Cct zp=R|dwlh@x_@E`A0Z7gea##&bQ^j!QOozVzk&&jzEhJ4nG_rV z{JR);xO)^KnGup`h>y!5%6QUwM@PGaxI@f?`7q(h93jRByTefD3BVgs6bjVJsAh7V zW&XJwEoaQ+Kb-}!3SU!@_hZ_LOt6UGzo+%!p0>{YEywq#&0+>dVp|zPX7pg%GKj4l z`gFSyNGxn5gBeP!N#XSu(;n|aOmTdx^4oOeka6Ri<*7Sy% z{5en4-NG_>oKEe(S5k3(*R@?Uo90T^CEV*0CF^ked#y93?;e~!l&Dw>uhX)MiT1nB zs_%__7)fk9I#>71Vj*HrZ~X1Z{N|I%%_rvypIuzJVSeTQFD}YeN@OufKQ^AznDn@6h;7AzY zknU3DiJFi{Srd-~|2cibL5)AA8-P%2O!tIdqKMNH?e~~|l2C*CVkM3WE8)@oq(Tu0 z{iO2btMwD(DyTc#jE;MKFGtXLJ{<*Ja5@$^I$ zEpqU!<5xf0jppp|IiAy?8Ofz6(b99GCwL(Osh0(H63^!nwVbI)$`&XH-WDYgDN!RY zgooJINfROpN8&E7?3~;gufAie5J`@)$+7r}IcL>}>pt3ibMr?#Z|=NRJ-2EXL|7Ex zCQ-KiR$$K6x=>hhHTqVR*oebZho`IOu#|uc+4j~pJc)_*?s>{%EmDOIGZ$y8AvBY!EVz1L>Oeg3 z&XLR-*Cs30CJWcH8YvL|yk~9Fvv#)nj%PE~xQ^9$zfxltLg)%)0XjpYAu5e=2oG>V zh7v4nBtu5@7?IqSx%pd9@MYubWU@z%Cx;`jP!3905wD4B3=6jhmtI9~wYEG~*v4Fj zd07EDYojzcdV>^$3o*ysg(2jERh%r&WfK;=Lv(dv8=JJ@xy~a8nT#ug$X$u{!*|I#92t{P9~-*D!E>Ct!R3~hq)gW z-YiTNt&N$;B|D3`VSR4Z6nJRsfvcTUozo{$`72pW^tk(tSCQ$SGk?NCqh37GMp4s? z;L$|RTRgprFP0AKP&WKzyzwZL5rHODoeEfxX$mblx+%!Ms(wQu!PkPa(ng-m637d0 zE8;!&gh}}iyBb*IF|kE3v>H+Qu=UVjcen5eYtm|*(p~9YA+M~B!+5a;g_aS1RUxAr z(Nu*7FoWraA0t&B$;((m_?!QN1`DwuFj&<4%!?#}*c-1bj`+* zn7JU-yYO3uCHc@Ovjp$#WEPx0hoCm1D3#2}YRTfn&?8w`kjW~W+G#W8C7!$%pN+^i z{dCUeJ1?md#B#VB;vG!j|AjZwx=>)bn2sCl>m#e(CE_RX_BRO{ev3haC}7WrujYL5 z>SXcipXN8frBtD>t-O<0O#(K;TmEkyf_r5_BOFBC#q`FiWbvxm6LWdZ6Ky}sFCt&m zVn+Y3eb*5)-p%tYlz6AlOdq*jvOeKnpD0&t0U7+@TPX}P3;N6a&hlo81v;Z8+q>U@lo7;O8%M> z>OZEy;24iqN()IHB_xUG8Ym$-UOJBim~s>o#_jQPlLM5eos#2}oTTI>O4_LCwUjhb z@}-#k91la}@Ataqp+RpfeUPO$Rz1kl8GR2dImTA)!&;}Y{$Z8FSpT5hY^-^Zt2J(a zV9GMqe&*4Xv}qAm=Yb*1xcZ?d$C&@1HqW@_!OARS!2^%QSn$y8GM4gnQgs;|jI^0F1v(?0oZjz+sFf-iFa~0LxN4=p~!Edr=K~i zck%+U%cz8d!U04B_GRH+DwqX^Eiee%Pk7moS(F}6n2R~rK>7bCB+CE|O8~60u?k#3 z+ouVtMv)B!fjRe`uB#WOE+oyBiwJ;oVe&$JRWiGFQvYeTCti}uu7S_9IX7W0UdVAH zN|2p7E8n+ja!Pq|)%1##s}_8A4k9JSgV%em^~`AB?MvmXnlSwg#74_verfz!ctYpb zP3{GekXr~pb1^&#S|A-n8_@A^FA{}aGxIPCA^?+O`&uKjZ#FUeW^>S@wz79vM~&2J zdzgpl9`gO~BHmd%s5(Z9kSGU8F~ek+LhE!2V+}{JM_jINW-TYS z40wlq;clE{2nT-&(n_4aqGytx%^$^gV(;t>W8)vAvPh2dLzp}859lij*;jn(EP#ad zm8n!IX1N!m?(0^9hVt^GWZ@+f=JLRl#o>gQd1`;0X!bsT-CY%)47vfrlr? zZ(Bhrn%X0d?TWAPax*A|`w1n_B1vm^a)bDEZprtPdloi*DZ*BO)ZNI3qV@iZ(#+a&v zI|>M1YM>@si5g*d3l|bbjMKydBf!fTO`V;=ix{w6 z#drh!=pJpB8KU)vO4P_-;FB`ssWeBH915xe znz&FglpJt@WkJG#py(F{q!N}x4WB~cY}lLC_B z0AVAr=?=jKhrDQ&1&kyiL?~9u*ed&umGdRHhz(mLh?6@{e+Dz+y<13SXfT+DQq0DiBQz~fv~FaYlN_o zMHV))u(fjskeP+Ih!hKI6gU#H82epJd%}F#*ea5?h!d4x^=TPqf%G{-?c6~m2%T@i zW}wGTbspOT7AffGy3X?!>sA)(hjuT95d)0)!#p{6hTbID@!8UjjC%P!`eSJT5)8#OOBv)*P$@_hcwtD5l>aCyYwbjiJHQKywxZ~J%zmccThKsWaa^jL3cn z)m<<-O0ia5vEs=woaC^;k@42ID_Fe5*fVgbDXW~`5JRX7ENAf?it1g966+fm*6ctX z^*d2V;V#_C*>$h1@_NU$jv4*Cod_bdH@24o1=dYvA>xqDHL+vCnH%d*I#*1GX8N&} z;A6^h7fkNCSKsiF?WS$Eb*_F(%DpvNzh!!D>=}|^ed|=Be#^w3gnR2^PHFta^ro3j zvl~-6TUm?85C7K(MooS*qn>}HEo@zBP+u&*hpr__$~f%<@dO4&Ffm$(K%f{D{!l}_ zSUkLn94bgwbrF!ZBgTG16;F7d=F5@;+azO#(2?PjtX8`UILc}dZihk)3r1+^ks*ea zj2z@#BB99y!cAc;0sPUcB4Y_49;TQd0qr~)u{YG@CJL*=fSJ{>GAwCg)#B=i%MAMD z@hzcUpJ-*kkzpdD)_)azK4nU5hxq<+3bP`aVju`#8A^P7?bt^xVE)i5n*P8FGiywD zN^|+5WNB>o|IcV1Lxh4GHu)F{(I((79pe3una?rwx6r40xYIMDM{7NNthr(2>@bLoG*-wzZsSp$4J6o&nw; zo2o?!+#YUlfVM4ykoSCWfG?M?J`}>X$;>629GGP#6z{&x9MtiEis9w(at?W?BHFE) z7YU&)6F^^~_k@MRwiQ8+<#8D*`n zd$rDoM^9)YD~j3=IRI-XyKzFgK^@jR3>PrUBUh;$2;S9h+4uYT`4GUi_FO;faQ|6& zlQ4HV<~&X%5}7DsTJ$r!|I$l*(Ce38;(IM(5l20(Lqt8hay%oBYUU@8eY9CzJ?*QJ z`Zh^ZC^+?DPbvBg>QS;cB_fkT;hu=(ogAPGGDGBNDd`Q#!v0bh3oN)dvZ9TTdds}= z88i$J42S5Y)k3G^4VS`x5njh^I`LKzi1C<@ z1JEj@E&curL3A~OLLNEJ9QU{+76@@F z6E+%2lF!1&I&XTjyZ_7l_=bP zt9#C}N9hc2nl`0ubqPb=7oR&cuEGZz9Th25vu3vT;|&w-bN2mU%--00--w4_hG^mZ zk*ToFr}-n_iak#KkF&K%GX#-D6cdpT8e|FSFRbWzCLL;aQ`o0ViE-85lH~bPL7*Bw zKz(!!(CROoOD2Lkg!t5{VtPnAL|g$Jrn;H60{^S9)AE)IU^7rc1Z@ZyC?%^SKM9`M zs?f>@Pk{586w3k29=uioKZ>=H2Wnc?DJ%sdWcYcsA*{}{w)p$b4FVF+_fr<~xNXj2 zHLPg#Di?3s{_3Td>YD3bdP#II4R90z1ken*NuR$G- zyO!`Mo0T8P@0aN z8tOt$7PbOVg!mBiwz8zH?EA00clP?ZYv-;HUK^YV%$2YIi6Lb>{94<1%lO5+X3K)z z!6K@5#W$wxl_1wG)+^RY>pN9fYo}`C)hSB_0(H|CK$9C|Tavbtgh3^)0V?MqWF1bJ z=1`cexRefAcpgF=oPd^}PZUUr8$>3y&LWTqE%`7;Zp1ATS7?OqwhLAjEWQZ$HlFzC zlLg-ZoBc}jWOJ^*+dKBfLaA~{L_&ncfs+5-SFo>35Y zfS;kAJA_(z4)Z5C!-m}0PJ-qZ&pQ(DjTvqO^KU`uRfH?)F zA4P_s5VbvUKa;9zw}1wOxNt%ROLoku}$ocoxf{#F6I@-x1{o_CoCBk3%0!2 z^YNDxwwi>YhL>leV(Fm1Wuw-C6Qw*;O`t1JG_YLKXsYFumsOH1qIY%ezaWGFh5SYQ zq>aPmMX+p#0E*2JX70qI?P4h6HUpnWAA6FU+H z514pK^%GfN|AN0EvZi5cC**i9G&Y=}%TAWEn=2v4Ymo9Zu7bGF7jZNUjn_wvk8+>=%n9&J;g4DOID0aG)KP&_3NSaQe=Jn!s|S_LwOeOozN zt-^qdt%f-?eVMTsPzJdpBPD1<&Zxc{mW!B|&0&chS9KuF?8y~R>d8kumt>VPwR=!_LjqYI$PS?#8RN{w2*})LkxDT zV-!4)ce7#~gmGvTZRNM;)DA4u5N9)F!~7ws1nxt$=>$RjXQ&mt1VUlw0`BcD#J7S9 z?^4R?op;tJo%J($GhHd?y7B#smV$XpS<+G#KcBMHLCy#=MDTOezDyps6S@n^0- zckQ`%PbKo|2v_92r;qP{*YTl#=1{7B>#de#{f^t79mFr}pWM#}&5B1;`KxD!lldF4 zHIRK5_7h>dh+H*J8Q(Tfv@GP8#m~ks#!kcOw`Ep)bI;7)#ESK^ClmS2uu?NS#$R2u zSI^s5ChaR{wxsME`1cXc7t+A^GjDfbN58@wg)=$dEuO(U>+p`eN;OC-4rm;_Sfy4m z-9o*fj6iqpgz6*Yqx-&Ub%Nv;y6=}%EGU%-;1QHAKeTI?+M*L^t=$Ce3CM`^a7p^qe?r`P2#S%+$Zv3djm@~13bVJpz`M8&?JR3AFRJ-gc z{KlCYtN;WzzHI3slW-u+K>kMDOqHtv@pA=dr2Nt`H5T!}lF~{pMHvzPaxsW=75-W_ z&*8S9JU#OxA_rJ4$a+s$QbVi30Aj%yl+cD&!gPr30rbox+^8iq51YI$n2LP0TG+l# zA7BLNpuTwG*G>_k2Z)3du68B&YczGJgCg!>u&Z4N?1E_xl*Mmz4i5EC@sPJ|Xa03B z(k02CxCtbP(~G@7K;9u1WFT#YGj9*m$?~EmEe8%`V8lOwhf54q(pf|!vwA|@4^YzA zY5v|u;Y1v}-aLujvs`(x18*If&P}9MsD1UyeqJ{`OG&BF^&JDr|99bYl$C|@Y_#B<`gvEhmRhzk)P1p*=y z_UtLR*KE9HNme{H=R)9!!uY1!w5wDB1$2*}zvHUA=XAxb*l9|UTbr!dI)}|$<(lpn zX|fCN7c+Gi4?Flq=^)UjS^bd6%Bvdqre(zamPs}ue$?i_1Y?-#Y9lVg2a#WopWUG+ z&E*Vd^C*}DY~v*9aMWDN1JYcUT~cAtmLqz9%9kndks_F>QBlW zTT?_OC{GbR2^8AX$B(o_oWy25$%Waz2a(#nnEQYo0hbZg2iCfeZH3KVs|itNkZ;s? zEYeC^4fsizFFVJm9jbY=O&=9ur zW1Gu_u+t8DU*a8#VTP z*tDPtENnDwYn>=+`FQ-0ZdXT*7=?tC~r6l!j28W|aB#2VKSfNlXXpZc4IMu&Qu1S&Vwq)vOm1RQWm zObSsnY9b&JB6&M9vKhlJ99o(EmRUhr(}(90-jNw7f_b8tgq<}=z!GtY4Q!;TdD8&N z1LTVwM+(w(A+4iqva#W08+~?SA9aq#6(j}4NsuQ@CP~3IHWEpEHW_}5m;Mb+hIM!i zOnO!A^u-%>?>F3N`1PjW+>prHGTyqFl{1&?n^~XAYQlx1Vp^YaRD-0K=-mvCT3YOQ z1H50Z6Qf!(vir6P!~`vv>`-*2Bt64(xho~f7(;W+M3%)Gj#!(9SdhbDL&V5>lKY|D zMQO7@$g#ds>n8qP9%jf>`rlGFtwEd6O*KAjqW#?aXKtMN_0Hc6{NBDqR@>5!vX#ZV zQnspup=!AROQftGR--tj)v6SU7jfq*Zyay}UB6YleLcgCEO{#1 zRrNHwm>V?COl9H?ofqc?DQ7_~@}Ws8*(5Nm~ZM!;!Xxi=qnA$BNFCK32R%bv6Sv$(H)x6X5qFCzvhx zsPPd$MMq3gM`@U|m(lsYNo>^h=HYpJWzt?b-Ilc1&pdP6)+p&6$wAZJO5Py*ruJPu zGIiv8yWih;W8ZxBhGg}I*%PVi=9GJzwDUwpOfdtRK+EF8QY1d2Spf1ub z4WFQvgN{l9Sac$76s@Y56GGOrk&?#+Dwr$iRQ!;7NwAIOjmzkM=JM&_izl@d6jG5q zzBe;&E>M@!R7RJA=%}17n0;Z+*^;odEGM5O=>GyWT?JDKM2a*1P?zJY8A^#W9Zciz z5c{Zr8kKcGO$?%L7A}YHBwx@clxh>(E&s|yb4aNcR%??)hO51eRYvX=HB%}HPeT5` z;R)?jS!LvQA~>A1rl^I=kaL2${Q($Ip1hZ2x-e35gL&1exuGfFg-Oy+B@$j6sgkF3 zAB-mD1w}DU9sHv30(yeMIq#KSi~izWy9?;SKhPyxGDrZ=J9ZPz%@H;h=62eK#RfL{ z4Be%5-2<6Z92+{K35ZogIJuEs`~^*Eq6;DPv}g*8CTxqahgdnaGJfLvscWZxnp-!q zTe%5(fH}S7rgBzK(Ds9lI;Bfm)m&Z;?^F9x`OWfMx;fuA(L?R*w+@RTMbAu~nO--S zUn}}~SIxO=z5w-|SARbjAzsdTB?TN6C+A9UmwE;wYuT)USdfBKhZwztJwMI@ot>F-N7T3Jh@R4X8D}@hwv^)%2I3{ zAVthK;GTF;^{feToG^8|_(bsw#vi&Oh^kyNbHIaf6Qb)Buo&O~axCEjtfq>VK%}s<3M*Lu~(jXt;Q97WEb1u*h?6yKA zi=c3FW+Dve5c0}}@-N8OgwQaU2=@;XwVp)FWQ>h-P#}!vm72#Fn31w3km-joJAwh9 zys!vW^JX5+-sjHqTg9M0{uZfnfZ)gogsn@NZSoI1s$yn>Mzp))1@d}j-9;3W&|hLp z+o8)}An2kA!PcvE7TEda7s<;7LnC8E6@E!tH2B%6UcEg%$ zL5N?u@{X(K9?nUc)_ce098}wmhv(-j6w=_|GsXk%;u)t8&b}V3CqUi-A-~4 z;wc{zf@ah)MHv-354WU4=J`MYdqDvk**@>asP-J#hhNkFh6%_`Pa((P7o=*N0CB5O zF6g={gVNqXg{~#8mdphanoWR5Qj0J_uQY8y2^NFnr8R&ZYIsH#Zo^PrH)aA=cvPYa z4gMF=Bx!aWnhu z^MngXj9^91E`Y241BQ+XyLn#y_vo@3^ME7CIEYVaeM=jtz_f`ki?>8#OWu!>d%4it zEHnkKnexgf+$$$oo4{*W`U+sM3v?a~mVRb&fJ zQh@-sE+N3VIqD-ud^7bN<78MjQdEYeWcW|%9wmPd1RL_A9wNhaAj2(MW5q*Lu5smq z`YdDJ1CP0!3pSiqJS_DUCWONR)r4@tJHq{l&VL-mT(5U@RpBFFY&*f=bhMH`3_ zdqhWv4cFL8OuDv@X8G)C>v7R`Oq~YbiC0N~rli5y6~2)_WH(B&Xcf16+87H4d(cwi zH#FSU6=G^nTntc5V0H36S8AI?y*JZbB7y_ddja{_!?~XQEEW{K9fSgx$aGUmiVZ@t&h|&i32{d4$iLeEv9Q&|{;uFMsyXX^0KZj31h;mp6 zFo!=dB4vErslDPsA_=;FxCP~-?aIml{N+g=K!M2ZibA)xgSw-9LaJ#VB@J>e)8wb z@T<7Jo96#Lyp8#f5WX9(ZkyVcw3SmVUO1kJ0XOID)pxPuV!kKtzFu;zTRl^OxV8f?R%G-v`+l9Q)iWZeYNc6(B7v{?vlVy#m zvNb>TterB%w6V46LJyF|b=x)Dbj!7D#0@A~_el)7W#CLo>~H2F-tg69&yp zSs}$y!`-Ea>WtROkR#1Y0b!_-bINrLb5BLFqFRggm#js}?g=|U8rcj3S1j$D&0D)L zOiEKu6#W?pH(=K=!VJ_yAh>wB7UPl~@(T!UmiE%Sq0nfSrOqq;4!C+*wVu^VZ&u6>jiNUWh&(Yj?XW85Ufoa{VMN}Tz4q(~{gmbRHhkhvlT1tOox))9g1nEExPGg zOnau~#1rGZp0wSaO#9_c@~SA&RW2(t^gO52J$au`utcV9_hkBgf9Gyh#RVrbf4mDi zb?>?7oO{;a`JLa|UatGFDu0_MQQeJ}G6NGN3ihZ?A3}Y_MAcWHY0p8k#*-?(m*)tI z6tCw<@yCw`EJAr?*bX6MHV`^HmvF{5F{OinbKZ2N=fx;Db$tVh!?H{xlg$92!L;(* zX^+j0&W--y;?0Y}>NY&xa)03d>6s7D1UEkxG#`2pU89<^*8hpH=Dy-&?Rg}93Y;q~ z{&Ww5GEi?-g%T6ipN_wxzDgC*MP_JR4+N|R2FE$Zdxiy3HIc=5^MObqOH+u$fuHyk z!v{bSkP#L2G+$i`W`+u1N>#!irn)3F2?&i&&8tB?H3F1u?(&s5CwwwgVxl!(>*K>` zhDXMRiIgS?h;*P4U?Kk#t#7vK846N?SY|j);1RK%K}Ji+yCfvY+%dCg7tt+ZCgfKH zXM0gVYjngtg3V(9{D@UHh#Pj?RwPD-Jm5J$zzz$gb z#aa#=n|nM|)D+HW4%(Wd=}sJA9qB&(q9fx~xEvO@75@%+;r%!@gG}(Qn^_lVe|>|m zgY8e#6OhQy%nhu0ZBsPfI6|efG7wFo5JNH8p537>F17zb65Kf66S+5 zZP`+Z#^Jp00^A80!;X@mS@c4U=F1mNGq#+jaPx}x72PZPR}8NhUopL6Cgq!x+$H@< z%_UgxzhuCl4);d&ZS9iQr}gQ4dY{2(^qG9-6DAx(&6mv6THwOKUC9y1wBb1p7DLTi z%`_|?NZSrbSLu4qG+E5o2{Km+XHD8o%IWyFBQITwv?r&rXr>{>NGC|DFKUhhF3E#Uo59E_M!l`^Ocn)f zpgk-Xe%W`Wr9$!a<;#^QBZbKy*Qw+(J|x#x^ovw7T1)j}Qq{W%XrZntYG6Xb`A~12 zYJ26S2;i@s5K82Rxyv>2CJ&|2nbc2PR7;U%OzHGHPST?bdDf}>0Vqi8A@`I2I z1@$flx02GW;UwR8?o`YGlM(|LVs`d}l(60dnN0K0$QT(R_Xxm&)O6se(hl8$k>QhK z!OW2yBkD~Fmw;?K(Lisr0vm)pD4Ep;)I?9?MrPc=v$-*$yjKZ!c# z^6Pv%{1wxCqeXRdt3yQ%P`>P$?uy!=c^9@7&T^1c!LN*C0N=Q0)Y)CpBDk`?_Ow4` z*{CV5@mr$K!r5IRXZ_DJOJ{2rGV2#BYvyw2E5M)5{h&6qeqXq9zkgSt=e4eAR`G1* z?W}5?RH|ylBw4q{L+f{kEB6RV?xmwhP~ZS9^wZDJX3dUXFSzZfk5<)So4%W!A9Yo} zWw~zouGPOgnpqvmYz$>K&W$f*u8-!pW;<@@)I@WOU`{fp0GLiu8T=@O3tRn`yCS?A zypvXQFH4iw@cI1$k^ha>l)RQgY;Tu9b9=|I-LCnG-MYO%_mg}MA%t599fZHBUts35 zIl-r55O@a#X%wVWP)Bbw=#GZSLox&|*H+;Yw6ZfE94l|(qegOyhU`fc^gltCG-~n- z0y>`^JTy{%%JM-SitY&36Kuv&(`Wd#zSL5?q(QLU$!TC(j=+0h-EBwt$7w|Yc!4R$ zSuragG)r}x+Ei->i6Myrw2ojevxbf6;>mvc$rM70KS>Z7&Jibd4<01;fQqCyxlZ7lgH+*9+#yjBv@kwrxU(fUw zUbFw3(Ld@57Ps9=+whrAlUGa=!G(#Cl_zF|&^A%At7ki|HQuq+f?$#5x(hQJ_G!Bx z#Or)AnLIu{9>|8SUeN4fSaBEMM{C2LOps=@=zpNbEm6QQrhi0z1vOTjv7FCC}J!XPs)%o&Q8jj13~yL5)ur4*}S7q^tp8MbH&%$6%CNk{!T|^rXon9zB%Qp6@&>m7Mh=XV#^JVy zq%}!9GSZrn)`GMZ4@oN<<3n02(%O(Vb<`@g-EB|SMFhD4+JX$XXpE;sx@{6B!-P|w zgy6{|=#Z192@{|L=#7)W@gUY>mg)?cV$*Ae*M5Z#isl8``xN_L3BH#l)mr(LF`TdX z9&6KDOym=B>dU!GIntdwl`t!};|wi?gZQRwQ%p($6Vc)=+P4Yqvy2u=?_dzISh`n! zM_tmr)Ppz>6|1K`T`r|ne%)zO-%VJ0xYz=x6bp2^+nmq7gXb9_7;=4 zkQ1m$M&kgL7q3whcQBLZo-|8e0;_FO`@A+zxlZd{f9O2K>-u=oD4~6ntO4NkQ|}_v zYJ4AQ4logi3$U4rbCl}|Qr%`0*Dk1(n#7#36eVlS+R2Jg$g(g(GRl*6o3jIFj}P#I zjU*kETLa-qAQdX`e;B43HzMr{8 z_ag&tYO|7;4dDs=YqWr9#qcB~3mpaMdXtz6Ur*Dh9B*T0(1a-3!;Jp(KcIA^O)GSR zM_8Xs=Zh98UrrgDXu83m9P0^4Kr#>R;IF5N%Zqx3*?ZtCD5X)Dh9ruE6=g7VM2;eD-w5r$j$*39j84D%u&&*cF5h zqqf>m2;DaS=xfnxc-agmPB%ELb)~J+&aJElfqJe$H$p)$ag2R z0+@DD8P2;o#aD-BhRBjcPdK~nt8xLv6qUiV0e$QZPo!jJsAT0l)Qg+uAG=-B3P(PL z<&lDhP(j1b3Re0}a2PmS{Z{?;`gbjNa@wNhb#HCFzA;kX8Y*v{9}Aan@$Y2LOA1#l zr5Y_Opp04B>N72vOYfQ;qU7GX1#`t`P`Y$RZA_Bo>jzK+oAdMOwTTgeVEB&5RT zG=JgPgz!JQvO3r35;k8GCImY}zJzg&-+I-QGNgSU${X?qtkA;Z!B4Umc?BG)@#U2= zfGfGd1xJl0^^=Sbj+n!EGR0{U%Zga2yLhQ>y1*t)(gqD9*3jm6Yhi51^1o1$C9b3t z(8$zOE6fuq($|2yK8^G62|a+k8(&pSh7t3Gfca`zLL1X^n!_3n|0wQ)?yzQzgHUT7 z_9j=ntv%)pZ*UkgW_>Pl4(i!`z%_E5EWGd~7_=@3%WDTmVkYsO;NO#A5d&8-{aD}7 znK&Jazs4IFp|)T*M-e0ZxJdJM1DwRP-V^+J%6beX^Q{yxkfA?uerPDB;|GTL=keM@ z7?cbxBqGe%B%XFKKq!&l;foSh$N39Rv-@$2GW zZ=cHy=QPs!S#+<<82O)BaCpYLE^C1#bV@NKWl6dD*AC_WO9uPiZr`-6Mfc+t!?w*P zocRe;k8yir-2NE1GsgAAxP$$Ok}tH6UCYnmCtjEeqEvQJu{j7+=^!#C>VC#6Hw;)v zm`YknM^f;dAXG&nRYz=yO^Hio$Fnu=Id$Atn;J92n950rDTC{$ebEHsEqCT921dI_L*`^IfYaB@T0#NtG2p^QWM0MdiJRV0dF&!XAHCQM z#3xEAg98C8rT*zeKjKUW+zJ*N;i#tX0=akZBWF@E)4)*QIhciv>D{2kN<4cbh`JE$ z1bWbS0lx`IfuMhpF11*e->RT#29i6b8OiHCKbt+*db@OW(7Zb6SRE~{2%0M()MfU! zd}AGU7rKR$L;ToaOoIJnBJ%5&2f2pS1Zwf}FA$*j)Cp(Y8Ia3laSLf$Acu6lnEo(s zYFtk0PdTr`H&+v#k|qu#<*5i>Oo5#cKRV-#V6S!x^5W2)IC28-Rv0z@F;s{@h#;ni zm)`;Y5IuJzkVgx{N~5I%Q!ZhsV6T=e^$vI)@@NSW^)yz;(K7-=?85W~W~n1+E)Bw7 z2MAV(2|7w(n7!u*Pu+a#b~#B)2OVp~fm=+?xH33B`05$BC9*oMY@FU0w3b8*ihUhl z-*>m5cs7%)6JnpG=Lg4=<|`Y|F5D0g+#SCX)Oo@Wk+<-o1PPa>BQR_X^5_^6B!8NE ziFyt9G;ttnKHSeIaJ(%P!}Ptq8FB~7ajn!xWys0;$p5uV<3V$-Z(QODc3j;xvnwz< zbKs7-LTIDBVv$E)@x(x4b2k1h;^@LmrphK=N_&|3PR7L-n?sBE0eQ+BDA}7T*Pkuy zHmW;qJgB=Mi0EhaB|9$;r%#lmjIWYh;b)QSVTAGNtgPPR2ss-l-$&D%}s4r z4<;|0*le77R2l}Z@94-muRX41Bj+|#!^-h_Gz>Fu-Sj$|d4hZy z65mL=r|K{7LGZ9fPTADQg?aEnzT``iw9vBl#7yS}=6Lcr#Y}*ugJ;j5^`^-!5@WVg zqlgRzvUExLn-{KK2$rn$jndINXx=p6^WIbMJcXM_%(5RM^TXQ1lLsQ~Fs%OaASkVv zg4Yz`J=h7VOasKyi8<*asO3e?)qCp^d4REitO+ELs3^jh$=$kP^{Q2_N^k~>XFf(XJUi3|+cjwV7tfho|9Jc-~h1%&c`Fc|wz4tSk%uPc!|spC%| z8#*4dY5k@3(X2wa6|xC#g{&~PN0vr|_97u(b~lus4cW!qYq{{Awd?w>P+ol~tzka% zz1(+lZ*}}=*ZaFdt2;tzJD6F#S#IVibJQw%1&tp9>Q*)(-^C3EkU$}}F`lL%Vv?^H z^B&sS`sB1Cx0wc)*+hxk%v3fj_{E^}2fI|y1u|7#!mNc-B}*$_^Oh}b?7!DsxvQ;m ze_LfYu#Uvh;-5m>V`d!4PtZmdGoCz4ztT2lhB^eJm9gPW97%_8sP2`Lcys09OnP&O z#&ka#0tjKt3~-nB2S&vuHQ(~yx_8#y8vW6Q_b=RT-Wkm*!B|7I3ofLfItp7lqygOa zHWO&NwJyA}Bb>D(Vd&yv2|gnX-2`GEy7nAw?Ww|fuof<}m8ZJqrUd50MfCx9>xta& zq3NKqG7+mX#FPUp4Lz|m6m|mAs!SdA5@^LsK%IvFU-ESZEkM4fe6Vtgl8`%oDF}0q zK@_AR%QYmdqC)LeggCy%{Q+5RHg(1H9Y9{a`W-#(E`A9mF(g1V{n_S%U=f2Igfk^g zNeCMajr5K3LwF?tlNYFfQwS2Lpbn*bZSu6k)6+E7zK4Wy;G+N&23%!$51(!a?-^bK zI~9B?nwdSrk%ykbnZnuh+v#Pqqi$#!qTA4Zp(bSx&oy&ToA%7{& zY-n7{)WY|yS!>8#GV2U^0Gh-n<_w#c1wJwEFxe@N{LTt-xLe9Jfq|UCUZlZPf$#!% z_bOPN#jt|K5l?vqYc;Ef*Lw6KyxC12gA=()Z{E|-tUP+O{^GHtbw}$aC=enhk9pId zdHR`)$LfwwP8_|+(m%xd>)U7(C~63WOC5)mKpUS%Ks%1EhC^W@!zYemMC&K%QfO!> z39IIjCCMCUB^SxkdE0j|=}3_GPY#V7KTc|bC(aKuN<66l;Bt6i#0>tRJ+8VsDEGTv z7e~&GuC7PWL_zapqjxPk!w(82fFsfdB~6?ZJ!G_s3U!s$)s?xCcl)j#+xNl^+xEu~b?<&+ zNAJ#k2et`Tm5C@HbBYP}@9y5;-m`sIZ}*NKXo(F{U23&43v<3e4}1Y8a{Nh+C+Nb0 zmuZSVh9}UnOob6sdB{{gyL-XZ7){;l(=EbVt}`%xtt6aU8#LE0n(`y2Qux$`e3hv_ zn%enb3J{BHVYW4>7aS!gfJfRx%kj5No_hC!IQZ352%Jx(r7LmRrKtsA+JTll6+b29 zcg*Oj$Fv7%phR0B$`B*L!gDf{YF3$UknI)m5`a;FY8Z=@Q91WRv=i_1?K zIaHp0pS#L|bZQ3av`&w6HJOKm5M@?8-jI|FqC-k9&^lBPif)6_L!y;^P{IUkh9?mU z?Sx5u(!oiXX}D~{q=o~yW#I%8TTo45k?IG6wakK7v(2vH6X?GuMUuA>-Wx5W*p!4z z&FH3@aDyU64TGEVD11dZG6;~q2HeP~kh!IHpmsDmDHAD5KVLpfqw{ZdAXle!F?@%= zfl`=bL`FLGYU}Fw0ooVH(l9gR7vqi+(fQDBtU$IxzfCz918tmkf+{>hVsq3jtW3U| zUVn{(t@N6)qW=noLEhVoh*&B=*nf(#oO{{gW$4piQTjMnS41Y@XGHf-AJ-*CE|68Lv94_-gM=@9g1uE}Ydg)wKv?wwuGI{J>+kO~nw~ z_HPb5%4Yj+JF0``wR6Q`^V*=JI$B)MEZh2Z{wJcDIm|VE|L=E!!<}0k;NKj(Ha2IR z*Uz5_R&NTIZ2np97Dn5CJ%t3mwsHuw$|3P(OY@J1tggjez>}Zl*2kr3z~)y{BRGMX zZx0u@P9K2t#GSO`XIz?y<`u$!ha)>sc4;!2Uo>Mv>VmR28?QCaIbrU@Z;IxZvZu^& zek1r&6;))yY_9VU4}{WOe!U;wV?^?LB&Rx*Q$42-=QQ~Bi}|h_8APpTu0Y)LJHw?L zf0n<=zb%?y`1&qXx?nRD)+$@RV3Kh!?Xc}g1ydtt+tt%^uzMG_j3G$WrZTYJduqhP z*rKtt?GP;+JVCZx1(tF@#!$X62<%$M85PiQKy!q1YmPuvi}aQyLOZP2=wlA{6&On+ zSzmCEyLu8pD~43SJnI43zlztTj$I;F<>+&Q4kZM*ldd?h4BS(=$e1ShK_W=ybBH|L zE0>9KWUwLSP$Y?;L{P2j$KL)MOlL{pU__5P6G!{zLeCb zX)Ka1vgqBf?UlK6@nGAncWdM}S3%8$I4nsQ+D_!CqzkdGq$oT}J6+k9aL|fpraY47hgwUI;Vbn?Mc|P?2qBY|QasYgVSI0rk2oeLvbH zJ7L&_hsbyON)@0GJ*?tCS03EIYstRj=uKDV6dYhh4WRvC^G1;~!e$CMl)z zE47`|yrf91S-N7j-qG`bD?`#CKn7f18TfX9~miJV4qOSX8sc8G67E~ z#RL8lZKDp*A)pgM)$c#m2c3#nDb@@dB&<2)37Nh1#O&L59O?m@{n+EX5AEoPSy}bR zdtnE5AeO~S5o4G=Q2Ij5ItHzZUaI8)d^!qJVD6E#^qH6GGggSe;Cu^WDL*Qh4`JrC zf0tFkbL#vk{Cf_=pv11n@!^gq4+$bLqRph&DU}JD6x3G!Z)r!Tbw*5SL3oAU(LUhK zN!k@)LYlpJkGA-W$Ou_9XI{j)BII0wNOJi`>ZjRxSBGbYZ*)g0*M%zAg|pZDb|U>ZJc0cr-jx?S1?1BU7Oi-vkj~xxNBKq|joQE@t8ymj6U+fsmFFV5zImC9ZeCB*pSE zoHjvhb7*MXH9m5_+MQ4oGwGC&O)#B}GTkG+(1REjq$1&*n0z9Wdtyi{o@b>oC`ZDe z2_>R1GW9Ju1!lf>;VBldi46KmzUJZ2(gPo~pmo4P_ZZpXKGg@B2}?~LZ4wGZlfck8 zPx3piF=mOG64z5c#WM4Oz08X!6;DxB!7k*5)H;miC=YyrRyQ(D}6?~Qi&eib6M4IGF8ggowAW95#4tcbri|083&lz`}V7@lI zb&5Y`0bc-RkFXYY=6+z@hZSvfifrIb`l{<6y~ZGmhDLtgokCfRZZqT;qd4nkTK0sLjJG|`K?{`&+A#CU;sR(MWAtU&tb89P2I$7HH!s5(hADGw8i?XG zJdIa8%{FGC0Tl*1Ke^^?u-UucQa=?UFZRETe2hlh9^$7%9sP#F4O7@eUYHMz5)1B!aa7rh-!rD`RoOc@uHaR1KCYWL=^OCEzvk zn8?Ef*L^J?5G|CTvFnDJzyLxZdg&y$11wgvC;6iYps2ROHzv zM-VZ_or-A(PQ~;W)~s5eWa}p8pe-)$lNn5ecyD<}h!zi-i&6|t3v zY~>MKeaKcn*E7HIj&19M%MKX@82{gK!x;9`u7PLiQq->FmYv?C1$j=dzQ`s3>xcw~ zx3sX6E^%?Hyb%@+Tbz|_ank<7E-X%&tD!1Rq;@8whIz&>MgBj~t3RWF(J8P+XxOnuIKa|`_7)|M zTGApcqQQF+*{}!;U6I1ZP$Bu_Dr}kF?`!w*{??D3dC|NA5d2*gZ`rQfzz0|lNqQWE zBhK>M&T=xC6j`|?v~tS_TxjLC+tu4(q`|KzgtWZ+?VL#M)==%%57IyA2-S9f)QKQi z-c7GvLJ1+1&<>rcpiQtD-Nk=MjrlPJ9n@k46=Bnpf*h(c3DO7~VLP{MHe0HNl=MDf zDM}OS;b@4po1uvigt;)DfPqkFTJg7RLm`-*S~bKOBzKu)%w*oB4>HG-FYZ$3j1q9h z>{Yd_6z>NfipP49e;B8x0tIU0C?t-AYtjf(FRUO<7(hNo^XWoOzWmbGVh~# zhiasM(iUWMn;pTKRI(|4&c26l#taPGg^djMWEqt(3#f>Wp%%hqCd$5G!jX+71FioT zatmm{M|4Nv2eu!7K`BpAK+{^t-A9kCc>QQUyw0D(vxg2HY{DZD<~)_)&5RpU8BW#F zyqU&pOm#S%&%d5Ow|jmRT&AFTBOwd^F(A@5XV6;wDZKyozkY0XH9XYe3R&Dx>^w`x<71YuogWz;07V7NOzJemL3xEt*(Y!u(OJUQ ziLPKtn-*7D7V`v+Je?>} zS3waVV$Q<=-!Ti`V!9w3nRKXP$9kxlpXh^eaStEGm-tU8=%9)y`^#;LqhKF>qXsWu z*8CiXTAi;y^|APq58FB4s{PEQPcu&KTC#D5%w;2I5JYWQ)`Uq!{ZH3&83JVz;T)#e z#bzYn0RyH7ysE`4Xzn5At}|h*<&6jy5>XHxfI(5&Ow!eCBZ+rbh59F70$Kw}#G_~+ zsGG|2RpU6T`fFvvv5I2WaHc}dK`jha3%6`71KW*Ws)J&`L(RA!5HtedNf+Z!YSctq z2)RP(G!@we1sQBbY(i1H1zC~r(H&0#Y16}AlLBexDfS%-SRMi;&>{0Y$Nw2p@{4$s zs6A}kp+qWZaE3fe^44;crVMcmF)gi5|8pTLBre71A0^?KL*_Hh0>>>+z$GW_c4nbVNPEVy0} z%HBM$f6xAo9XE;@acQ=p5?F5k65xR4Mvw=~EwN=R?j%~qe~g}CE9HS{NlX?|C{4Xy7cLej0*t#doWt`>i1VD)ReVcw~b#Cc>pUn&st z@2HmlmByIr6~la>`oND@2fa`rJZT((?%UA&m49WNuO~(O3S)$77BqKnAp~wG5Lu3|)Xk<)W zvCu&u8Do2f+KT;uk%hrWag?OY7ipB9MbBcC9$cqnny>wn+yY3qIe|Oe*uCIvj24u< zx#8M|*|9LJHgrGea9@AD1$+iWb}qDUaDR4 zYW*d}QE;BBC{V7J^jgCf9G49OJ&e6hSfSG7UZy6!61PSPy&cf2(LN-&4wZCnz~E+( z)NS%Ce=bf2O?*l%y_HeYDmZT<^1s)=c3+n z40gStWyk*mbt&ucuOT@fp*iV)%uNt;xSd%IyG6UN?f%wYMITgdIdT!uVm%bYRDVVDiVeo+ zY#0e?5(oiB zM9-Hfa>f(-4oJ)P!zy;amKkz0!04?_u{=GaB|~og+DTb#4kf@)?iHh$2d2{?w=7fc z6lrD{{&h@%Zi3Rd2_vDeQfp6WQEHJMbQ9#nOcE|gFH3!7Cc(N1J!pMqCX!%*b?FrV zeRe6W@+-|L;49eh7`~D+X;mmN6PAe-RtKw8x+KU5K$s6eXz51lIM%{3>CQMt%0dZ< z7!5ng8!k7Zk`Fg?rl4IXWR479jq`v>s>a&cYHp`z$qsiJb%%Q2V)+U_{R zQxh7+8j3W){3_C%#@WR=ZBR8kE)RoH8c4k0b)fseCz{l;8bER}ez-6cI)=Js(7w?P zi^*yOp|ndVSL{@{7=Y&Xm)e?IoEq6a!MuuCu%uv`VEo(wj7SXjkH*r3Wet{LZ$Bg% zM$R(nFalDw#uzsuV0jGR`w4oI|0jYHzrY<6RK`B<63v;hH{QmCm7iR6oNY4!4*ouY zgtt%{fdm*fD}BR#V@KfFf@4KA&-F%Tpzm8b@AQRB*S*s>pMJf1uJn6#^L?Sxb>Y1A zej^++X6F0$-*;+Y8NB_C(S`I1kX-|-XVyoHN+U&0uoOPOI$X5I-wE?2l=7ZcQ|$70 zeo|B%;6AQcG1orVceCTW`vb?WtjOds3Qh2C%xLIkFo6uJ2N8(jw6ykLjiR*Pm`Db4c+~F+`*W~z-Zqn z?0MM*Lg0OR^DTMm6HqVO-sDwWNWf3J{yeC?Uu;~#}ZWFNQa0NLsCMNwKW@Yw4Ps7S-eaLPtP*tqZ5^eWz;fu^;aJi2Dy+{?eHzp-b0(?Ql4&`gVHFe3j1-OxsH*gn`!!e8!K{ zGyEOFbfRUYm*dfz2Ghsn&*0m3!9~nsT28k;D$nW(ixxY$nn8N~ihj$f}}*ZSCy^ zTa@%UaQ4kjmbRstrOuI^0wjYAU8n)9aJL&&yfuoyKsm`&EyM(3*8Fu7+;B z#(P%nYE=ph$`tE}!@9f)s>$pS4a%*3TPJN?YXGs84Ni@QqYUn(4zm0BCw&X38YJ+N zEm*yPIMITY!CTiMknu=#gWxZudq|>(M7@A5wyj(VH@hRFBmE;ojRGdmh(RuNEo@l{ zNO6$nN7YOivTcBPd^>V zn$^vnykl>@Rk{ev%!g+V2fp??>@L98RO(u`dVg(@?gTqiAC_fr)9QY#HEgq)1hmzf zd{kiTA_LWlrNO+;dB&y}deI|bwX|kC?TXn&47Pt@XsEXr%$d=w0ekgPJqWZ}{tej#A5H_nT3 zm!MfmFcZ*{<|I$ElRVn=xfuiRRlJHBg?#*9_v+&nbbaV-#>UqMh?MFcFk; z_(sIZII+a9CDOY$J9(nh7YF$NMAMwU3Bkz}_@%kJX=W3o?=!Nm*3Z=YOfUmV*p_3) z5l$=hwSVl)jKUa!BPU314srwOft_%o_w$_MMW{&bnb{M`tO#XR%y!?&to<}0<}tEL zF?TXt*}9Oqb}`LK_?zI56^?7}<-l>xy(^7&w{R;exqJl8jh9qZ+k{E|DsG$B zBVW?>=(ld}4IH%C$ur)>jS9IEm{Uqp(Rjp3l}JHJmm7vCu!)Q7md@d76mw->D@R7P z75&gJ6U0io-1>ws1DZVg%c#GsTBj7H)C@JxQsSk%xc84V;?C5$NEkTjdNC7i%1MgE zBlN#zwwHjuARQ66lP*v-WVJ>$q)1I^(Jj*)gp$EqhgAVue59w9N~<#+0pwMQEhwCc zDAsEr%ZH6IJxRoSjqD+%)&b9kGOURi4w9}xOn-3q!5uNn=qXxm*!p6|9(F6RIjD5O z1_u>O);Y1pgmFjYG) zTa+7^*xEF`DQK-AgKdJ(jMfEP9dTRIeP(c8U~cQ^rK5{B2b~$kx*uM!RYx6ZJ~IO( zwc1VSUTC=LzYkaz)xAE8t{yS(haH8+w2MUMhkMrNew}5j#g`ap)hSXuEUW3wm zsW83-)q>Gt!GksQCLqF-dZl%`)n60XKARb~Rzyku0HP_Pn2daF0*lHVOF1}xaQC6@utPrJEn&h>IDMQyN9u}==f=+sHi9g) za%kXWU;p?@=vX2q5sQ=u;M?rG6Wr9MIKVH}N~$G()w=yFa;O}w73meASQ5C0JV89q zp5d@mKXwUbSAPe?;x)0B@%>oqjQ&kWDFGn7LKAk5f~OHDp|*_SMG-2ftyAeg8LKs+ z!lL?1)N1#&Ev7rK=FH@fb*VRwzj^Z7$w=|4Q1PmHXSjIH{CGIM-M1~8n-7+lJ?hK` z_A4x@gn5pMAt38%*lEc*I1aRk5-zpPDd-Str^t9<@(S>Op~lCrH%Yj+81pCarmSg3zw4w)@G9yEvMA z717)$jHii8n{-KSa_dRP7Bu*rN2ddkxkjMGPnb?>&R~V|7Fcc}50>+816)$Uq!z3| zlAD)5q_09k%{WN5Ayr#6VZ@FqPI-_mn36nGBv%<7a7@TWw!CL64Z)j~6FPjcNu=n* zt_r@VW^}*^mowt``0R((NlAl6XlA7BM(_os`xcP3jcx;LyNed4+FWuQP7pOMP5mv} zDwO*=?ijCQLU85GU4Db!(Ll*D-=h_Bc@AGi&$_LwuLt0^hrDd6wh@+Vq&7Mq)UYp6)u6QPE~<*W_fRHB+SxIaJ?MUgea(RQ}?OW zer4_S+AEuc|hAy6vdC>#BMy<$B88hFgxXYnR_1UEdj5 zzYop_Kk8Xne<)mVCba(0+;hPvjz*q19(v+<_z8FL)amdOrvshj3g!>Gg6j|Y&B1~* zQD;Gbe{J*KoTAxWc=?D{)XlC7nD4=t9?8)xZ|5}SD+0!7S>0S`u(TO>4b49|a`VV7 z;|D3>hP_~yctg2_2d><3t0S_pJG8Mo*w7Pv@|obX?#Q!z=vhAageTgtWm(5Hv~$G7w%KpF^Zrm|zob`Oidbe?naC6T}8NuEu zDxW=ZyRd#f{{www>yx3aPX-V72DdyLTK#Oad2OV5PpElMpmTQP?ZQ>CSU&qy2>vSS z!o?du$o|L{YJWUVFUrc0xBB=pNDo#*svnUGQZq^_g|<$L z0TSp1)!l%4sF0!*W;q9aTKXsDA!(UpTKl+6Y42h{FAi=oF((THKztp6F9xV+xyP&o zR-jTzaE1R%#PEMbK{gyej#5(Vp%v^Y>pq7U(0OLtfU?FCQS%djWk%ptt|nn6a%?_v2E- zwmK8I$X#G<{yjDOA1Js-K`nLD3JU&?9vPH=8c;C#C|62JD9};^X_tLjb2qOosLzHE z=BfS5dc7fM$<_=*l&85AN!pmwCt$jG7M8{y+{7;p?1$nGjTiFuwmd=AFkWft;5?`G z?qt-)LjdGN8h6pSz$yWe*oh4zO79R^5w-+GD~>SpczoO?Z>@p`Jq~l?>43GE?pdeY zqlt0_)rMWPe(P~- z6}GHev(!9EN?it2lN$%`?tilckk0-$OEAUdCuAh)0s?D}>kSpMCtBisbP54IhFptW zwra0h*nuWZfzC>Lx9q#ellE2hRU}%~h=fxAAH~^x5@`CQU_?{Z>!*}f?GWg;#(C0& z%A#r-yE|2y+N$rZZin<9`>4j9=1$MoxHH&61qx>{ckLjLzGTo^e(Pj!w?U04lMWs3 zET)kVb7xO#+&QE2Ayj%V9kAWG%<{6TVdZ}<&2r&WUpnBlj@Vvf7_R(3{_a#8%p#gAPv1JguOJKUf1~7a~4wH2c@W*JU zfsqCt5w3GXeWS#@YIM0ITRhCVFA=z5W@mJSZBVq^prrGIo>Ov;29YJ!4_||WLvHLy zf@doF0x{U6k`vPjTwf}WAB2xWY;7L;G&Un*w~dpi!O(g5tz?xv&@B=*Q5=}O9<~wU z9t~jCV!raA(1qp>xN5{LatPMhXosvG@if8{-r0eg+Ui;urx^mV^!&+Ftl)tQF#QwH zwqwPK-$qjgK*4u=$i4;j)q(B}u7Q({^tf+u`22->77J@LFf1q6Ymh7ov0~1_Thd_v z`Jq0Z+5>0x{Al0sXk!X{x#L3LSvccF*(YE|gT@K9WfB9PHkJS4_>*cy`ZppEVOJ1D;IOrPt*y4K#-mU`E2D7X#L&5r%8Ej{(Ffzf`s z5-6&<3CZ!T5%d=CaWzQXQZ}UZj2|k^1{aJyN$su`s@n;MD$D5_9vN<+^Y~Np0RWw+1qI!Z>*imF~t$4^yT36?Hzrt2HL04s$y{PaqV{uN;-FkCo(5)B2d|EL?Ze)x**-;$i#UE5hK73i0lt=Mb5Q!U zs`cPlx@^Bgst11rYUO&|tP0hM8GCdOLpKT7OR!34-hEi9~>*l+| zsq3e9-Zj~M$9-R$^7@~=Z7N(cYYIxQR|lE1fx8w`?@jmR`^RousKNf#(`^AK^J-8G zDpGb4{IWhd_t^C#-z}M69fHZhlehYA9iKlFbZrY|Z}aU$l`2+zkQ2(@?b`{zm;UpC zu^XPZE?&PFDrpYoz>Q$@^iJg?=WkmI|Hj<#v7_MC=Y#M@C4c?GZA(csJr81n;9}&@ zGcZWWucz7Ah5)+BIsjM% zfIT{Zqkc?Q`9cEWbTyBgf5y=RRDV82QOc4~m<05i07lZKb{J74geHMtD%KES)m{Ay z@&RE&L&zX;D!T+wobg2W_Wd2b?T2>u_U!Dz@Ah31hl>FtT4(~`d7oCZqqhf1cl7l3 z9ANMlP%O8fAMtpIpM7o+kP0Y3FWeDg$;O}fZ1GTpKaN8GlveLfR0h0laRFiNE;?K= z`3;jbizTIRdarrkeE!<=!NzUjlI^hSA2pTScp+qJRT5eAg9XhYYfDhyBCv;7qvTrd zR}PfR4y62X)SB-Dkf{A#o(3vrg?!|YK(F!eG={Mhz%sISIy88kXZmY;X8N4aKK^;+ zeP|O1>3>g=PHGbE7JM;19;Dy^1#J{;r(g>O&r(2$ zIp0aa5C#8=g5RUybqd~~;5!ujM+*LL1hG`Ht0DOShB(jPp*K+qeon!!DENOU_?&_- zDL6xwIg21>dSb_+Z3nt{@Lr1g6MA`>?)((IPCZK*66=@D~((M8RKD@G}a2i6E9iD}wxA?0BkYM_2dm16|$BX)|-i$`b~`yqxfp zbT>x91q#U4Ju@B0&(Yn>6fmoL%zWZJJ-$l;vjy@I-32Ki4Sc3#%9PUtl`AIfK#YDy zCS&vZV-t_J3uez_(Y$&Y}9ZWNXK3~KG8Vt>2+MqCwl1rYdG8A zYKniY)pAY0);t(2QyjLGlmcH)#F8JfEsOli(y+i(mV2eys&rg2s=8bY)i%`Ij(eRR6EXbqukO3 zT@IJK)MDZ?mNFe&#&U(7voE>WV?E-Y;nKLQdsP~(EyCr8xctww1}=YDr_o}U!X4Cq zl{ZF?T<6dm+`(&(^kxaqRq~sv`x$l)g7o(__*ru0a<2QW@Lyc$Z@sUf-=$H5jmx-S zoWqs)tL|&?bFT&TKVQ?8w&^yEk0BrXVqq~^Xj!)CZPioerPM-Hd~+37vwVn4MG0l_ zy}o3#aaBvjI<&!N<}&VOYYM9ZO_U23`Ks4N*Khby=KGmo$P{h~YI5(U7x*)1*M=l> zIK5#C6CfLzS~Sigf7#W#8M4P%yq*mDwM{ve%yw?&k}DHMuggHHI!!?b7u4h|8TE)t z)p6zbZM7U6Y2620F1Y^`x1Hm%{n__5^n3r1wo}WM`i=KB^n34!UX%Sea%U_X+d0&I zm)43RD>Rm>DZ_mlsujNH?rZ4x-h@_z>A_}$|M{@33WJ+l7SO(#axEoTz9pQyHK@so zX1n~y$#g)lbWJ$BHK=he8O>bLQg$9!^w~O%-t=GeM??Cf_iZJH{6KXC_+0+#`x-pl z-^L*f=2Qz$JrLGz4s4t&xUa#@{Y)!Y?zcqJ%0p@8_ceIIc^1)PLl*bOGh~!xAK139`p}&BmFKN(dxPSrBsevx0HF1;yK%Iie}4zq6g7f#Ww|r3sNW|5;y6Q8iyOx14{X i-`}eF(4p_rYyPU$)WzxkTEkJOw{)fJ{yL3A`2PWRvK4*+ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8331f713ac43fc55da2782c5100984c7317ed002 GIT binary patch literal 30363 zcmd6Qd30M>df$84HxdB%UEnH$6e*J0sm;_vEtcp-vTRe7F%Ta}QRb!xP%<%~!*P8w zpygIz?TMhV=a^0=Gvt{`EjK5%COxNPCrzC+O$!Ke1R=_aJei!vO;0O}YCHBHo&LW2 z@E#U|v^ANN(B@$QT3RnU&C{VYe%(Xx_%wc4ReC-xA}g(iu3U2ZE}IByT|w= zUV7>`sklR&pnsJU3?B23)X7u}OEn_Z*S}@ z{YNS(-d`Z(zsmI&dJ6lCSjkqDZ1dzR^%Vp%qpV6LSJfK1s=rpQ8YS1dHOg`*xoX$QRj1^tUn5t8lB;n@ zHDu~9TNScRO3t-lw*G77YF2Ws)z7a74X08T+BKx@FJH9>EppEO3ZWG9K!YW>^3qW(Hz zJL;+zb|7qEWp|_OooO{TveaEj-JMor6HDEL)V*ozeLdQ--c#f$^;F5Lk)^Ej)C!Ni z%4MWAc$z$wa*ELNwz|LB(=6;O2Lix-|1R8x189|VTID?Gf7x_oY;x2y<{9_7eIpa& zj)@_M+c7lid1>VAsK;^9BYKfKGCu6^4xU3c$D}xMaYSGVQTMgG7@I_yRE&FEaCkjq?s4D9U|N~&rq2j1^?gQ|(a9$)UZ04P zUB2l_k9Ubr*eBhh*W(gB7p6u;)<&lxVegv|$K0bMevfcUYF&ELakmfc6cc&JJj3q6 zX*oyoQGRPZk!+0oUP+L1ls+@=mHMYtb5Il~#Dryzn8*>XA4@?YB(U5vK9vbl-o;tg+ zv!kQ!fP328_QX)z{t3ae(KCK=^8dPjVown_Kki|%2McjM&9 zh|-91o~`jPIalnHqalN4ZycA59H*1ypi50{`Lxz?Hq9=A5cNk-Fg2 zC$zLgCKGy>v{VvWwnP#-7w$f9!ZhL?8Tb0!^OTb0gy;K9|dHOM-xLag3y-B{&3H0FGmd3b1$>` zkuf6F6gDDdh+O4-3cLjcuCMTbfxia*aeFdJFU^z`v#Xo<{!i6@HpqQuq0-gYNP137>;u zQqkk^YZ)eWsuCJPkqP5Tgz0@uXeWHYe(AkT*j+$~gD<*L=-6K__j$#uX0*z?9s&Aq zwuUs9yWcJfd)}(NX>R!Ig33Q^_(&V6>Wvi~idYWaS96xem4KnHF~FQc1j~!dwY*XQ z;VDP@^2AqkVOi!#eG%6wsU@99d zw+%H>Lrr+japkGhL$xt)`Swix?>hJRP037C0^WwTh3OF z1GT5OlAb$|dASGyT3J|nb?5xf@Kmg@F=B0u82-uOjWI}eL+o0u6QhJT(m+km)Z;Zl z{meT9*9M|iXT;!K1JuV*%vXc@CEjai^GI1%_$+y)W?E`MRN@Z2U42xBvpPi2Sht+F z4gp4`sO;+F^N%lRV?|9ji*_wGyw|$adfgLi*%h(wju>{Y(VwFz;Mdh3d0ciL19D@qcz=MK=XvJqD=UiAtM!QLf5_&!7_MT(N1*?~chnI>^5leav;HD8v zDW!+9+7SSKS_?x5Xr9EZj)=jrvXL5OV~Da35jH7s&%Sas_buomfHdj*tP5{IMNV)| z&<<7edcSJDb4i^rx?GGrx?CdhreY-p2M}a+O7u*MnVphSSXTN7bEdlXofodXaJzbQ zta|fx;e*lNAB|X31TuXLD9*Z9fyipzOQFb|jRKnsHV198rVu$xID|5nNm(OJxTVbw4mPb3(ypav1|vj|@09;h_hngjML?ZKCHE zitTxzb{QC<$tc?wFmiSwGx%;r0NFor(7~8yc|GMx&R=t|HS+g z>rae7vHb$mkKxWVVs9HD9uT{)W$eC=nEige$3WUFnOBF10BsgT1RFv#(_>i#=&&Fn z6e7$QiV#|-d1rA#pA_@@25E}O7cm@c%F@iDDI4HlOe2586`!Yo z;l-TQ$ZHZE1V;t>sU`Zkvb*Bft(2I(Wtza~qkEzA+R%3=7Wu`VC2e@(S82wt+IO1O z;=tN{Pa9muO)@4;S}b3;w*+{3MA6&t4z1D0Uqf{?m`ub5a4#(MeD~rS)vY?RzbZ&i zKN?8EC&`S-Bh6YiXfAo=pyuIsCHOsGs&?)EQnd$vyLW%7-i<)@GX83Je?9pz#r(-_ zBH>-cuxH2%A_;T;a(UgZP&&COKMCnX)g24=n6*A)sFwzTaE5#-GT{cKu14}^&FRvg z%zC`SL*U7wS&(sCmR^DAzl=}i+Hp_ycSaRZdGph1f`sWu`_k%Domcb`sUo25P+EaH za^yI#Xe&}*$*siKdO3BNn^6Z;xhx^#rQGQUxHIQCZUC^G(LmF}pD&clO5Fvu+yk*S zpb<0|c`?10+JGjjmr%k9x(ZN}8QqK)JxXU$lEntJa+y3gUbspgMH3+ySV`*hgk7_) zfF_^~=!TRw^4#lS(|o0Jwt(^mkRrsuF6eiR&}}4H5bvaCaAauO;g*$x4#vFs^Pt&q zT!h|J=yo)UepP!5xaMILAf89yuV3HZvfe?;0{7_X#3hfw)Uu5tbO+D}iS7|713&w} zzx?GdPxd?`d5J|XToU>D(QoAI0F`*qCg&HxTnwU(eE{-R3;GBj=Uh>j}fgXx3 ziBD-jLW-)%YA6AzUMofq9G}^G+gu$rS4Yf^cMGZ_)w^Q_dm@%SIn+}Y+igo-)Ka(5 z8M8D7`8!q{J_x%OFGQ<5Vg;QMOJ}^O_-gNbFH~1XlD2ou@3^{mes8Rh6kLY5tstn4 zn=My%zqb2cdBr=`Z&%N2L#j|uys+qM_k4F)xK&smFD+lFik7zBt!ci`@h#o)U3)%P z^DTRqIey(^Jd(;08o0Xpg-r|l7D^V2!n)ADdqripi<+WEO$*{DMJ@EY>2~d=Xzix! zJ+a!YH?))|ZY#cOnYV<`F4QdyMXK9Av9;f?<|@`dtl>(l!Ux|N4Ql?mc?~So3ut8s zKfF)DRhO8`jJa1l^meO+0 zXw!6L+8nL3r0GUEtkY!sv68jkrhp2XGin{_>$0v~c;_wtd+HgTPr)hyoxJW};Z-O- zzz5U;jchp)`PVP-+_Xx=O{<+6|DTzpIqGoiCvBQzWXJ(cThbbW)s|dPjxlC`@UoX_ z3#HwpeBTZF;vSPf=yse$G4j{G38?^wdl)O$>q9YQFGy;1+f!wb`cM9<+i`-KO&qYp zbTeep{f(q3@{Jtd`imKwP;{tCRMC6VX%a~^5H%ExQ$X4^SRqKLaQh}iZ$b^@M?#Ol z?emG^Vamfq%JqmP*Ly;r>`cNSf0r<&AR+pxOnxY#9`g>bSo{esgP%W7rp4^>TlmEL zTL@;khxwePBsBbX;FftqyrklGNprNMd9gHB(iuDy-_Y^i<3D~pYH1E04xL|Uirb2= zTIa2|ZS_%G{lejxtu5F?%IVs-2X0wg?iN*s4=mKiiW)-vox-A@)weF5eD8&&7jCy5 zxY>5#zM3!VddvQ>A*PI{pk!m$&t_)weX?7&FO!jwQxZV?O+WR{OJYz{0j>` z(c-3HZ`@iO%v%GqNnlL}sSLifG=*Z5&fQy{8&IpLnehd*^a@^NT6*YKprz+Cwe(^O zflV#8;wDZ~uz`YXbsQ7sQyk_Bwfpz*kr$N$ZrN)0Ma_H0CFAvHKInhH|7P>v99nqi zWBf{3DO2!ul*)L~^a+YIx>8vF(be!T@nSjqiqJ*Y1*qmom6Z2P+ycay`d-9`Z04HI`SL826#DNX&ASBwn1B@u{Fmll3U7I5$F&_%Yr{?JfyJWtDwis6Xn$(?i6!b( zR4%y%hbENy)j(1-$Rf32Ws^xylip;~=Kn6`q>){TB?v?eOOQC3L8x=C{Tx#~rxH-k zM~GI|XsSh8lwu0p2k@At{$rY?bf!yEXD(4Lq6xA(^YHxP%P)UlBdy|?qcdvlj2JrC z=-RJQw+Sm*Qn#7ln-jcKJVaf}?g(ka(mNulFn>%PNvbd_*S)jn+Me5$U9rlp>jyqK z_WQ>o)}Dx=XJs#F#jpXAg=*rovoBe)d>k)UwB{HR{npeZX3ER=DCcnsNQ7|OvQ>bL z^pcW{$)%D;@Kt(zl7eqjz!nd!5Rv9wmL4!$@%J=kp@6i4-cbavk_}___~!;Lzy3~M z-JSe4_P^ndweeGmH+)`bD$vayeNe?~8y@H?we=6W3$;b}TbPbdqb*_DzWY!fmOQY? zYQuw29+KV=K^JKU_wmc5BV?Uq)%&l!aB*+*fY4g&WVhylc04#+oXySdfO~ZEoI7wf za2C8pU@#yK1|T2M-^CHnB`1C5+)JOeH&0G@eE~6mH>u>)?XI>ndz*#yw1L*<)9yBZ zPh0u7(R_L3f5rF{?S*XGPE^>I*@fq#Sk;DajU5 zbBXdwO)8&R`4(Oh0XQHMRnH}c3yJ~xfT9$YvB8YmXO+uIiJ^j;+ziBq02~<^XQ5-< zM-`r-h^>GKzs6U_tgrajtI#?fmE%Q3gBYo&YvU0QiM zl&4e5)1{TCLwU*PwDOX9)5_BY^l9bkQJ!8Y4_+)1Y*DWskR%{Vf=oJzsjSvb`3Yp{hs;~pESoO z)KG>jsS>L84)GZjl)>g2cMW^SJugj)d;IHMlb%TzyxLq)dqA5%G3Xxk?rB#t{5$%# z6v5wfznJABwyn|HE#aOw3qwy`EkX2)Woqs##icxByc2x;XHdWVk}=?)(W}o0<$Ok% z;WN_ZeMZW*&ny&>iVglQeGHSs9Lc-IYm~$%cs~U$1lpmIardax%oH{WI~?$+rKb)) zed5RyeXgeuim&1e=7yEf4T}>~lU}BpfdkRx=!j3^`QJd6gnq;;j0_`bimEV+b(F}D zi9evbW_)T4E<>KliNSLTHPCTFL-;qL2C5~k5I`c+O|TW!oOSo!*%bjyIy#!c1z5*HD=yAd*H4qFDP7ghTN~ULCPz* zc6gEh?r~VWL;FKd2d9IYhiVR@Nmh=xj>Dj3DG1fRwj*w{&uM>dD-899JLivt2g72h zFJ`NUHppZP*+ZSd*4h1WvprNB>Iv?gJwT}ip?$$Nq@sYXxudfO<9btY^rpTdo^P8| z-$QK|=C%g+#0!c;?)j#0ZOA#d|DN>lc71qoq4wI)Tdk3T#^C_BqWx zc;WDK+k$(coeJ~w+rmAe?zsc^q=&cnFK8B?dRPC}u}EQa@W4N!M$7CBlwEV$drae1 zRL&e6)PGsj5Ig|ol&$CrOsucJ94{+>dsEo=){fB2^O}2Q<>Aet>5wLFv0phhcPw1= ziKXVgohxp9Sisp!LY_A)LG2xL{-@T$YwCLimDJs`;Qmj|RubP(xT9 zKDn@IQ5!M0MKo;^Cx$tqT(n&1TJA=$(stOdfj6uc9{B3tRu+H1&Z8%LqKy3d4bxhu zPNe1LJ_63J#{r!NTwC3vGP+6XXbw$G2;C-m7I(IH$x%nWgB($TqTpHSfU2erFWWon z((|@=q(8Yk)1TTmxw|r-&t|74r_{C1T$UXM89 z9!>weebZU?m?2RqTof(w44Fn57&t{LnvI;iQ!1xApgyl~PAD*W$wNA$Nx4@FJa{9G zq#4PjbW9lzR`Nzr##6i56;Lr<$*-O4i2oABi*F)GCpRJ~O#Ce?Jeu2?4JrrCsld!l zqd5&nqg#$#=f8hq(f-3zh<+hnrE0*za$*<(97e6Kam8Pn2${$vQbrsI!%O=5A0mdF z$!S1Vfhn)YsZA;H#owg7Bo8vW;3d@vn?91xz6y^-!m}K+rEU~Zn@JFa6lo{(nY})! zduZbFYHnNVqn7%Go|vU6$j9vkSIg$h-l%}uXkA0J;pp{KH+tTG{sY(ht`AS#+Hxe; za5T2=Xi#&@P?gdTp^fjNmO*X^-ZZZo=5mVM zE2j!3hpI25a4MMbB)y1yhgZ0gGD-91wHFKl${*rw<-;o$NVu0!owbAUVPN*tjHp0cNEUU=yipqU4xRwKO>ODE1c; z7gNyt{^{%dAN7PfLr=|b4sX6)*&3~Ey;a!y{^>864f>zyYx&D1wP<8Q?H-?&v^NJ( z08=M?Luw64n*McP(VBHsHNZsN)6cC1v4Y;~CqFp-uTLWqv-U;|y^Id@IgQx@av{E9 zJ~9b4wi}55mL8dGOx0#fzl1*+*5{}?Qp~-|eXg=;4G-#!+LF&pxWbZ~C0((CO|y^R z)8>&g%b}Dr%OOd##=g(Mb2RE~O3^~fz;h|dFU^rTrD!7;a>?sLVh&;QUJoemcRAXSk6h z@?1>IPOeNa$ccY~)-({T_9KENYcL0UF6)RrOGe^)L$K$Si{PfnG`4GQSD1f&Z`@jx z%3!txpPJho+BCN_qA6KP&57HkYk2@cikf@W@bQ6`6}##*0)#pe3UL(W9n>HuUleCk z=^i3bJgCJIC<#;-d1zQ+@PsZ^&Y5d%Z{gNCZ`W*$)@;14iq>q3RBXCgarB1%r};n0 z|4@u>KN@`ej=3amE0s)6jZs_U!r)>jj82R0sI4Q|ld@LXVh}LvmFTK(7;ZUsRc+^lC)Q2kK=7P|9*s9`%W%2U*+vS_0<(q;KR_s^K z&7E7ykCkp)%3tVwTOIECo^CNeTDmQkzdfkFTj*FQg{`o#Jz{N-7}~#hpytZ9FB7A5 zqoAk8kg?|fvEvJc^#5<;E8ap+#ZM@>jbMdoSNt=it}!;lzLOXm@vo?Wy9hGiMNnkx zVLKwf!g>I_l6rdhbJOfw(&R!eURr~MN+d4kKjLYP7LR%cXf`z=*IKg)>%0XfDeReA zxz7Kw{lYqz?GJy0W{CF?WOd@tk+eo9hCSaPuzyNl7bD0Gc8O2}%_DF2wF(+id-V(z zH3N}o0&q%CIipd!j3lIYl4edNAqIvBlCno8B4AQTw(Rkr(4aLs=(!-E(cXQ?wZR!}=33)wNxqf5Yk!V<#J@w3J$U~aX=@DLxMza8b`ZH9eef#QFI>8Aik0t-6z^Ph z{1i<5zfs2{f`TY5rZ>aH6bIcy9G;iCscsr0uNZ2Q1{nA)!Z4zN$pf5kPF`vyZBEf# zg%ana&7_lMS2}G@r_4?ri4HW0CBBR)4sAkSN{4{Cv1xU zzC^?N8gj2OtSLHNO40tC=5-*+Sez9NGEpY~l9yxVng#n!b6vc;b#edV(~;_qVBc3# zYim{b*@eLv+v_KhYQ{%?WH0F1YUp!Xvt>@=ge0e^0L2&w^QROevL+Ix5DC+YgpEX6 zw<1k#kpPk{k+&l!ZUaxdu-$EacEktb@9A1`k!B({BNyAPATSfJ82(vA%TI+$W@JYMJ!TeexWt!&w|di=W6?X7KR8WNn}@WSc#Gq9#Q{hE&U zflj{`&uwS?rWXd9o8eJ9;B5F(h2+8)E;dV!KF+-Z-WFzl^{WQD{MHx5W*AvhiF%ax z&8`hIO!V|y2hKLTM~7g}g*DeXa5kZ3c3poN(ji{9NmgFOSOgjTMm)4jnT!L?Wc@`O z5*mu2Rj0dOZg-*St$x$#4J~!f=FAl+Omeq;5L~;2Y3``mf6uaR02&)g{x8eDS)lPFG>wxwO~eP$^y=^h{1Rt$A%0vJ(Bv`#$}LQ)J{2RcTnpUA6t82Hr3H_#Pvi0RX$C?4 zk1!$WlJLlkc1EA(EvaA`LBlW|Ot85Og@Qukcy5ia`PUt*yltix16-v!4=86}N^i+H zts6fesLzuKnsvbh3_M!Ft>`OBnCuE<^%e4rlJa%xCQ%dyO)c~kgtcK{&fSh*tp#K< z&BbcTy+_SD(c!B~b_V_YS~F6S%w}|KM(VsU!_M&IHkf{Oa3+K)ew>GYJIuHN1NAVV zWBufP>*ShJ^Aocf-;!%#QpVF?${BMS{jG}B$rI40O`U~$yziOg z2cJH&-vym)?~&&u1M3gyn;%l}1_cfZrVu35AJQ=qaT`iq24Htzk#_UaV zI_&i?ss9w(5qlX^-5bkp8>*v*>hMs^(8w&c>`mNW`kL;Ztj7=c%vayGH$?3X3nyZB zXHa*it{L}to5D}MSs!wLr)i-nsEgR0ck}I`rpqtlfQShgPp=%GJ07mRWvK%D4PKVL zxIFQ55c-RkcZO?knk(bQmEoRu4qiL>)}ip>NO9v_@4e!(tIy3pw|Mco`})}>f2^i^ z$-h_&9=P*+7Z?4}n(kQf&KpA?KK1c4A3gKO&wlt^WKUnTxDPxbO4=8GD%6iCdJOBs z($-i-*V5JnH|(4jzPEL8YqX*(X5SRlp=(#G=BwVQK{xby{|8J+``nS>{!mdIbw4}* zEbNzCW5q3Vy#Q53`{!gw#wT;Sd&L#up?TNb;9`AHjg)ZxeAR+3YDd@anu|iGZkem% zP5cYn>HcG&yRX;Of)7mKtCs;<@L!am^*}CH3>%CDKJxSy`8Ya$qLOLNk0$ z!bd8pqylJ$5x$giDA#r(QuhL>P!Di{JSuE$&fGxjkB}QG?y5(ENwrY(2xYGm9O=0;R;QvMASM5b)rlhoh5Q-*dG=0Tqt06Q-(zu| zP-y75Vse$e7_ePz!s{VQOZ!uXM{tCb@`_aFL=zcNJu>8&o|uyD{4zO}vfx{{59d@7 zT~*v9nn&6_?T(aicS@2FSYg71hh-iec@f9+_?%SvI4gf_WcZxVaTdM=bPyPth20}` z{8gGOMKg#!YqgV=rBo=lX-J%a69esp8JZd&B&UsJ7uac9RJFsMba0^K%e-uB3pTk( z)@bJCfekt70FipR!EqL+2??xHI{EA@oE$DHr=TTk_c{irL=hezqtkTS5bWX(qa(rzWMLxQVUQx2Ms>I)+T9~>7K6(zh2wi)6ed6~i6V>h4pkm0j2s`{5IM5-E zu)|*hN9D7FXW;bgJU!4hzy$PGXMjs8*b?)i#SKw3fp>7ic z2nX6lDvN!EJnfX!<*GJU95Q z%?vI937*ad2`EKWhZtxJw53<4ZznfH)K{KtQve={fwTVfJnR*KDSL?r+LTu52GOOi zJ%0UUviZsKIIkN7zye}urPk^CT4*z~5E5J!f^|AW*_ z^=zV2VYX#l;}H~g8{8H57sPJ=SBc%O(`fVV8sNis%TN)w+Jc5(+%?xd;COA`9fJki z&9r%6LbYWwUn!j{y<9%KZ&{};ZJIL$H9-Nk$9&tB{<;3JCM?AA>gQDV^YHRv0cWyY zDVZw?>BFT9bunY(?7q83b5;r*ZKPZgn{#p7^?fnpw%L6T4N79$;!8IQV#ZxaMD?t^ zh^=nn;9^(I*gm@tZ8Dg?J@c)Z(1~06@^~J+5ksorsh}#Y+*EEQF_gbxOqP&VY}?}W z4YYH2MqRZ~v7=QRGZGsYUb>D}ZO%xnUD&?(bj;Y1kyy8|Z&4L9wj$A@w153##dYM| zjzk$q5!;5v5xJ-NO3t)Ix%(kg_-L}o`x>>jfJRMq%TNhWSn_9&{NkaOv((eb6~y!G zbE>#GZ}!N2EgrvQdu3j+Sh*|4O7(a7O7+Kf^Pw8<;~Mj!Huc9Fc!d4}wkzRGYXA!{ zfaTG4#>tS8U&mHQTY`TKlk~@!Z3#UlH*J3q|0hjLhSJEliLD!kb}|G3(oYc^y&@!EO zCG=iNraiq3SzG{1qY{l--|(;FtF)4&%?6KFlJpHLDVMmC+S&le?&4nX65O0RNtb8T7aM@hf})F%OIm5)3W*p+Li2aNbBYZx8dfPEC? z00M)6ssbvNmsBr8F(E?5#O}r8FsY9h0Q_dT)YLt-17t=u4&_upMXCdG3dkj$q(A~- zogx)wu3Un$O~^E4i9CpBHw2VsqTLas?gtZJg11C2uY- zbncd6UCK#OG-E=D77DJRNq)TqsD4 z{_0nI;H#46!>y&g_#&wYa(m;Iu_Dq8u8NE$?}X$Tj8+~2L%LLdVaB1slK1K`fzyJw zWLvEWcV4DbOr>4`*vh4-VQ8EP`;w#IdF6E~0;I5!Aq53{;$&DFQg+Fz6Ci=2+?ItD zhDIKofgs^%#5V{yHAPyYw3L~zRc~tQodn=$k9XQ0f0}Y|Dy^kdHog7`v5XbR4ifWM zW`ZTdrIbva-UIlKc6^tRo~-z4<(rkXwg9ZRM?bN(Ugtlsyl=U2;**Y^58Z#-{Kup5 z^6HQdr(3WUa^J`mRMQ>3A|S zh)JiDAtqVH*bG8O<&pd;LB8QwQTt`8?7AxzbVN%+rfm6J)8g(d%Hx=B5sza5Q>Pri=lMl;OlF6ZS}8 zm%||3;3eJuhX8a!H#z}>g_zJ^a*K2hy0kA!CraC>{sdWaJ1R<=`#QYOc2H#F?O!J? zsw@w+l!ZJ%lbNVDC|Jt+9kk=6L2)b$e@pH?iB-g7CE5Agq}Jv0*RS6E9A6*vsq68 z?F3=x9*_mRcJ}zE_Ttd6bf^a`1+z!vr7g2ZgTAPy=$^eYRB*Loz9Lf97PGg{9$nU$ zwbIeCB9-LtV@n4TE0g$=x8^q5^xM(4L)id~ILyh|bPT~30`O`tGxrA5bf>@N4G7@m zgHXD1EwL1`>a)@YZR?;0}Em_lkhKS7drx8Gf?`J21rJX&NY9`Je%jpj)uVIoEBxV%WOih~Y zSd+$GD;_P14~mAJ4Wz|sS@=y9U=1AdPNv$F_i!>bDOJepf5yn{kJubKqz)JY#v!$0 zVT7pyzA71%pSVxPx&I;Set?^Wo_&biVBu^WpdWAHDsp%d5CZ z0UdsY?JjkQU#8KW>F}?$EVE3q5Ziz0n!1+V!C)T6rv1d_3ucMcy`5$8qE&s`}lQo-%{@KM+gs zfzK#~F)ZjjTMkT1^8-qK0|Cw_qRxwrgjSX)#$GXdD9#N!j~{2yLVrj%*iQ$~NkX*t z?9|Ap;3XWvK*Iuwb>#5PxjpNd)6MGWg!;xFn5YlVbbbMwps zJIF}JA9S7%_yBpyPzhoaEe<|wGg1<>(ykzXb#^N=xY+B|+6va%d&y(5JLg^wyQ4Vn zaetKkl7U1F#Zm%95mi}CK?wx}S{D46ib*k`jwA!hYnzh{C}PrgY&7tha-mpuW&L~z zF`ziHRwa@I(ud`5!(FsfKuo4oHId@%Hc@`|(H~HoNDD$Fw*FhkrTXc0?g=H0gYxqw zU~6B+PnfWu=D>N2U|gYAK!`&T5bDu3Lqh%ug%j)-V)`;%h-q}#__ia$xK_@Em~=t) zk@o8v@R{OVl%HMG(&_n-PeeQ?^o*|qA7)G%D&R7a^x>xW;$|9`EeJAov|MTA%Uh88G!K$OW1*br8T%&;^lQXTQ8r1Dr3!PkeT&{@Z?p_2oiH1vFs}+ zTcC)dFzh7>6b$lIBD-LaCzGFQMg@}}h?i{g!@da|*{GH}$VQr0)lyPyt3#Yofef)N zVZ-cZM=8kaXn##62(sV*ltA$q3WH;aN@J`fJ`;PoZ(Ew8mZpUZw=7Pa(xrGtlM2+f z9x6~|EUuW7&g+5-)L8i?6O~`7uI1h}cc|avJJh-1_cW?X!cU(0NRcm?Op~b@uu|s6 zYOoTw;WI22HW?W4*iJKoMhs|QLi#DtBxlsBph>>}m_V}wMPz~|Y=8ZUM}kRVDRWz zGG&sbBrg}80qSpBWin>v`!59fPE^3Wl_11)&vl0evDeUM57mddLOSfKvKHR9HqiD8 z942RvHg?CXJ0pgjD_1VTiLKnjh%ir3+_SG)cwx(|W3Ew1%}Xg4b8ZLOA-p55oND?c zs!~pdPvW0sa-6!?hBgqxWxcXzZcoHqn?9w;>#E}F3v?`AEb~}AsbWJmHE2L#;tpyI z8xh*sCO$?%7QyPGGzxw~O^^uIvPuo#ViWTtW`SP2Yq>xxYfLD2#!|+!1W+9!G;QUL zD6Fn#BzjRe)}2HnpF^A-SpK(Er3O#4+@DFiYq2ralro?};AV>5gh6Il#eJwNp%*+u zZX8OO+vf2Y3Zzk`=_p-UCj(=xWFEVe${Aprv$0C>3qz$-<1da+TpE{u?Tk*prSo>N z+u7hcvHvg}0#Aq&r~#usiCek^myc(Wf`6bcLVBQq)tlek9@SUg%`c0TcU?ajE#DE# z?~WL{@0#)R5EyYyIh(7_7Lml5gr2kwq-Ef!&pJsRz)s{$Xr_E4qwGj9{Q8p%r~Kkq z!AK!~jOiz&sZfcpSo4wxzf7Dx?}30$9G)bl)1K=De?&S2;C)K|0}6;gko@`$6uVEs zLkb>HKnf@F7K7Q8f_w@{)6A4^O!^jU>5=j5j8kMB5o1BvR6E2zqf*%9P&lWAVVCp+ zXM4makOlua?*jl2=1`vh+@j_+%O;Mu{uO8ZJI?XfT>S%$+PryI57$LgWw7+Nu_9`$ z2yc%W8)kJ6bt>K%KL3!z?V+iiKgb7%9&&Vlc$Rnbd=)*?{r+J!SG+E?k5t_EIh6w% zl0!#6_I>1A)~bq+^AXPez_gF&+wUJ$afRz7ew{A)|yN*$Fx=9;fSUwm86ep%ffXLO?4_MFQ%W1v zLNYcN-&2}riD|3D7g6#3Qj1+Rn|Hq^)f@IsjA-hVQbMeqs)(jOm1K%(E5j!un%Y#- z$|i+$F>PtMAfl7ybeL!`3fdff*N?>EG3+h+4{m`>bU5I5T6raUOKa1>Zo?V+Io1@}J04*8PLpX51g`m{zm_r)DMm(_gX?oab8!;ddk zN4Fn|{s2VX1|&~4Sv;Q+VPaWlvo;FpN_@p`}FKLwJ(+Z zruC(<-}Jt8_G{=fuwP@Jk^N@$Ww2jUpNajN`^=n%(~eojGy5{fv-+}7zJ^N~vyR*P zY~$H|+2i&;`*==Y&UkKLE{oHR<&Ed}MyCea`VMeOp-iw6U7;+P>QHy1qK4LZxt} zj-C-aO8#{ujUMWTPF}UdS1>Y`bIB^KKYk3iX|d% z2J%{y=jBWnsuc>PF(ZwNv-E96-L}y&xg^oYWr`*CwYpl}nOqi1oDyT@UrxnY^AvL_ z3PoQlXLGgAA*yeuYirE63*~RYlwr^4Ow1Ga!)0@J@w=18=g9GWdmh=^T&cBft~S2K z)t0oE^2Ahp1yUqyO&({FTH}jrX3WcFizRT1T!i(tO{8=AUsd$&L(BGw-`Usp0=*kX zUrJI!0m8rXa5zH0`f%u+PN5Ln(|6#JWfp$!GCLkwW|8=%eVva?Q!J%9$T|ADxRSnZ zSK8<|9{vull+8O0SBAbiG@<6o>Gu&ciuEj4aRIA=*RpkexbN^p8mH;NK+G+<`h?p{LgT8aGyo` zXQlL~UwD>l;Of7s?0arjLeMaLD!TAVNPu{)jjJToSYaM z8IJ1uMy3uTZ&W|z=3G=sG}Ys}AxMHe1hx+cPjW=HjS4e&pOVD@z^K zA9Z;KxB<^V)PB0Vv-3#*(auxt9qp&u`w#XU>FjMk+8NC`(%IF1;Q5DRoM}-5Reo#= zU*(zPqXx7JP51Oq4S3E+QxBYc_JnJIbMef3ny0UiY7Yzyo_9q}gY?7oPw|t;?U{{c z47)u2EU^FFfZG){@W|Tlx->P(d)!f-$2C61ji3rjHZ?Zj8JgtB(OH&W{0@wb%(=K{ zg-(mwpP6t^PfMV)U4FEBNIcDQPtE`R5LnoaUiN1osFso$3~*6k*TO^ za4Kq!OFJ>iO?u`u748c6uL$TO-)vM_7ghF0mGx2W$z$#Nd*<|mQ?s7)lM{7=H16U< zGmHK{c^$)x{Z8o-V-&+GpTZNHc?!iS_QS-7Q;92vw|Et!Slx*arxsHv6&}49%PHCV zx#D5_Folj9#5nmEt3s2f@F~4YPRmx$7a!A_6tOO!%By-w#p&qxkuB4Usg(-UkjiR! z>M=E>iFtf#ubNAzuW;ME>X*vnz9d8b0@24A*!MoFkEGoWdv3<4Ma(7tdKF^5ClyXp zFJFeJsQ&nDe@Ey3XS$+Fj;}z7Q}rtvtzS_$M~$a@PIdPmfBtCukt4?roQf(j8~J*~ zFehq4=4X0)4jk*~>_6Gl*ZC_N-I0I#C$l1|oQ^7-snN7&J5ThVeCFW6p67U0qObzk zy6(R?z(-RCrlwpITr{oc=<)vJCpwWZs>aff8bt8Grf}N$z@->~!Bn0cnQ&^N+Nl9r zHL8mvQT5E!cvLm*c2ff!cpgkNoSz(bHH=T69~d7W;2Jt62dBqf6CQU%*NCTk`dmX( zV`E*%z^uFO*ihX8fRqN;#Ki`{pax-nZ>?`?Zg68U*G&x!UH}MlH%yI8HDF;)aFcuk zCjhL5ne#5!SUuKBdOtwG$VFHGz_}6r09vsNf9@4HFDW7x+c)P{&873&jdbgJdRZvF zEO=-wy&+<-ynN)!kwDg(p>QMJ7O=jbUbtbgu3Jh%mXcs;uxZs&F~2`zviJ{v?MoZk z#p~Jiq3rsl%i-*Oesv@(+rK-KSL8qNVODm;ntScY!jWLsnzbU5WecQyWA{dG>3VKc zD7R^~`9L_g!@oab&ka2NjhSF`aMyRszE}Tt{q64en~y|t3a=X$4Z)LZIZo8{^30VP z|Mb_tys9t!1Z`K$&81cEJHBUPeD4cisC%)-nN~-y7bo_f;c6&ki!-g71)Ylva_$q7 zP0j8-GgE_<)o1Djj}z&Iu; zzHo*=Gx6dUcOgQ)P|d=sOJDdx>5Da`-ZLj_oX#`un(F#3&T==+&ax6=@ZG6#FEdeP z!(a?GMX*9aep(`*0KWsU^D0g%ZYg_j!HFs--4yHK_rs0q_lymUpW_Dh@`v#{gg-Vv zUs5bu_zt{nDwSp~E0wZRsiX0AB8(mn!DaR&1*A$5Ey4m<_41ua=~PE`ybF8Dpew4H zbYpF~ruZI2#5I&Pk2&WlA`8w-ih$*M?qcri%{N2K;=5NBV+MsohdOg@{meC|*_!s)q6RB0#?nU(P8Bja*P&P1PXOhyL|Y@33c- zIz8bTrLjwRP9mq0<(^@EK@9*_p&l8Z61G?O^w7}AC6_yziXd#GSo+b_aqQP46E1!> zn%Vi>sm|V$J;!=u;H&c_Fbt(TuG^xWNKQ~H{CVmteZ+hrqXrO_K<1&s($-Fe5_TNo88o} zzh`Jq(G14-ois~w(6^gM{A#6Efq~D{b<$>3O7$ zdNj#K=T+=sIY!M7morMUGvV>Zp$A^|Nd@191kN=6Y5YVDW0OF!xY>z;@sUCPBn4@J z7mh{k?kU%xjF|S1O%4taz8E!+Pjb^^F`ShW@dV4GIw9B{O`#Hj2D3G$odU28}i)0V)_#Q(TKUM9$*RJq+h1#ouApm@?N*#UWF1P!r_BrkYiK z4Q9#9U%v8XVU8?wD;;4|`@Ckul6S3Wp=jOG7_u}jTf>%?`IJaO=~ea1=~vSI9U*;g zL~kJfy1qE1FAk=x>8m0p+q_YLKB!N6#5wj!ErPBoT#7y=rvQ;c3G`phso-ijHC!#H z1H)feN=aJa(V(-?wfiqpKS zpY5vds0M4&4XCPdyT*p%7oNVqe`I3B)89X5j@4Z+hWr+4a1-)_ZMU#^UbCjpi&(Sg zHNTxId^EL5e8|t*_#8X{xheo%F)r@ct7Owrkqn59(lSkWS^QzkvSIaaB-4s<%O-`}Ca%x#0@slWr zCqhe9c_FI2$bciQsMwN9;a%gC7hQ81ViyVTFC&AS#tyw?%U!osg=|&pwwjQwW~n=D z+diN6Gi%Y6j`{ZaFGfsef5)|+g`Tf{IbzKrPheo-$VXa*t(f&*?_hjqNOPMoVRWA| z`MkNP;5A-!4S^&s_AAT=rSNf@*aR4w9vh;B%Jy}2c}#a&Sx4zMo^}NWYG6GwY_u2(-Q;d z##|21q=Ux6A+25qj_r;LH}6D7o|?i_KRZ*|KEl690SpkN_b|+Zo!fa1!O^sSwmGg2*MYb4Y)`Q#o3UldLz4Jwe-O4^P$q- zaQ3lP^RW$EX>iBVskffL_5AXsP~B5uTRUc%qkR4#4mJ^M!L?%x$ASlzEMaTSd?$7{ z|MsuX1=_LHDz+>&-FVKQvSu!oC#A4N^icqLS`_FB^osBy@EiL3zc@X>mP>y>Pc&No zi{xA+hv=;Qzapob9E_lXtsZ`eeB}Ha{JHbtd{yzWMy0iXtXF9(KGtirC7&3y+U!p< z(zV$_K1w}^Kj{(I$|wH`LGfE8ZIHA*Vsk7IHb<9^w#PSOS^M;O*Tuc3;$0v2p5{vD zQsdqYTpBi4BSO>TLNho6LQPyDXT%0<<}&bR;Y@HdIWycWu86ZB#>!>l&BkTH&E~9d z?VJs64wnr#m$Spof@cq9ow2)o%Jj$=ml&AkP}UDpC4%6-qJg$ zk$P33AV1rT=HUvvu#73trqU01Bs_o*ihgk%6dphd;TfiIsZ37A-l<0RaBB80rIy!w zG6Yi`HIx_!dtP#IT7*cHCN2eU>0%9l|2d*x{zVE2_RMNL1!Bx-vFMY3<2F`}SHnN; z)r^+Nv7(QYw_mLns2GDxajim_p29}U#2oT3m&&DyFmF@awOo3v9I0oY=zAo@eY9Mz zMf8nUi9Y#P{zir}r1+GcYBBcled5mW)QG7$L*hQ+P2tNupWUK5F}M8dm1uqFk+{*0 zAGv?oNIbTuwVaWSSd#wYGQ@olrAV_IV{Ce&9Mb$p4)YV`kX8sFfMsq!TfemYdw^?? zfc)%sVd)Die`3((n0Aj$3_AuK)fW-RIobLrh%GF9%E)g=U*ljjIpK<`2PS5Fqgrly ze0+9J-B{lgRZW0qcX5KJNx;+hM^)!0<_dZySa}XA%7KlPzzX?yIVyO*lG4(?inO3& z5AaSqjt3*d6H%l4{N(f)N0jf8q1mXOfhxR2wa1?a5faqGS$b20J{Q#t@Pp_1UMeO9 zNBF@RE~*3FooeCFQm8IQd<4fKR(mv+u`eh|)I=PEeiX{c11CD8+VKI;Ab0`8{3LMu zkwFiC6r~90oL1Py(?w20|A|hX5T2-R;GCOKf2U5sabKk@3lx(gd;{M^FB+nM@{91g zDI0Yw9${Of?QbrFL0{_&E|OEV=&T;*0YgzukM+ zT)b|s2$?H_=fmcP`SuS@=7>Fq@Q7gZE0_J6NP#10T|DI1d^7b$7q=FuBRm#f3&yF=y@zb=ro zVJ%*_R)nlnpS8iS{Lr4Wk+HZ2FtnW01!TfUD*V-cX zyuc}1mLdC=E8TbOx%1r-bJjKef<9oqp0}76HkZ$9BN>*L&tEx@li{U>OW_R1ygFja zeEHIqO99RG)Wy`WsdQd*Co}t6?LzH(W@RX|GU&#X&TO35MVxhS<-U>ocGsUh_rvM` zF!=t-)2pWER`t&@M0pd{hjuA8rI+A|Cr>6jK_;c0D3TF)F$t1Qt{A=oJOZ@|PttlM zJWWi6^PGf9iR8i*wjVHf9#0=Ys7LYR6;{cYtnrBZPt?!$C z^PLfU{H|~z{z&}1FPjLd-f_f z%|)6qY%YEkWA#67E~0aj06GSmlJcitRsNnDpcqsVqI~$`s1eCdCo(78r}1QoBM8p3 z1TwcP7|^tdaq_QMD*|zF(X+*Hk92YYr#=OADxEh4Q{fr3MW3qh&{>&1$)*fWXL<=# zr+T%c#AZu)ys2WXXjz&{;njF${&%`ZItzKz-;~;iHt6{DR8Y<6pICzu6MrH}=+)C2 zg;(b;^w1Jv50}E}l0p{=-``ASdblR9?j%-R6G)dcU?V+`nz0nNUs6A>m{FD~JdRjJ zigL(}QT)}#8HE_TIoD;BB*ZxNy$sELV5o4{69c)9P`d}(Y0psIj;N9(SabwuCeMw| z?GUlx89Ij7I?lNU2d064kH-XA93yVW_=uY@@Li6v$;k^YI+BCvG^eU{I5Qs!%lNZs zIop<^DI`cU2>ur^U=l-d@jM-YqM5|hV%7GGwedtDglWdNz6qz!xQ(PkE-T|qUxauH=|}n zRYMabI3!5y$XK`P+)z|CGvp@L5q3!F5$L0OF@v~Yiti7Q+`XOQ!*{c6*IE}^ukBgb z6V%)^+%PP0Z;js?4`=O}*GGyH!^e9GfP96 zrNP#4X3e~A!)WzC7jUl`%YuBwU|u(rg$!lE{cDD*Pt6Kz&01~8YG&vB0Y-ZLS$3{p zbx)_SKT+wcM@C{D+0*!4t2(5KwKDIG0P; zO11}5KFlwP6qMXgRpf08`@PWQll3f=dEmWqz;>K_(VbyRA8q|WKc)BPx4PyR9$!hclB{PiX9zniD+C`*60 zSclkmD^oj~b?-J%ns=L&#SyXa%ss{}D<8-Hrs@_&RNe@ec$$@%x>5GD}S z(4iHGEW>a9oPt-#d54_;m7MRBa~lrWpn^yr6POSep>Q1i6U5Ku2)p~kKqL=i8$(<_ zbFmdvT<=}%UD~mHI$Y4U3Ld7>^z!K|r&n#2YsRXj=7?p>H?w0RGF4&AmZj#frG9?@ zMt0SbDx6(2-*sQB$f*7l91p9%>+8N%eF2ut=70wbhWtQZwO^(Fp-Q{orrU%#NV9Pb z-}65XaggU2wsVPBk4=;CH6xmm@W^aNpE_|?5z8rY`?`#<*o=W}$Xh54ln0`LB*S^x zR>0GMiijOSah^?$S@R37 zvlE6mY7%qEzhYgSIv0VAD4+vTKtp((SI6E#QTA$?4+m!A#U+ytN(v7fMU1StM{fdUYVLp@uf|e(LZ{`>Z!gw1tcPIQig1OD&ka})|V#tfH#fOfRYQB z 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 'user[:passwd]', 'host[:port]'.""" + # global _userprog + # if _userprog is None: + # import re + # _userprog = re.compile('^(.*)@(.*)$') + + # match = _userprog.match(host) + # if match: return match.group(1, 2) + # return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + from urllib.parse import (urlparse, urlunparse, urljoin, quote, unquote, + urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, HTTPBasicAuthHandler, + HTTPPasswordMgr, HTTPHandler, + HTTPRedirectHandler, build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + + class CertificateError(ValueError): + pass + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" % + (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" % + (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if os.curdir not in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if normdir not in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + + +import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections.abc import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format( + filename, encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format( + filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, + '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' + A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[ + key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__( + key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union( + *self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover + # {{{ http://code.activestate.com/recipes/576693/ (r9) + # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. + # Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % + len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args), )) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: + _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__, ) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items, ), inst_dict) + return self.__class__, (items, ) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self) == len( + other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + # If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext': 'ext_convert', + 'cfg': 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int( + idx + ) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + # rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance( + value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance( + value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/database.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..c0f896a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1329 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, read_exports, write_exports, CSVReader, + CSVWriter) + +__all__ = [ + 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', 'EggInfoDistribution', 'DistributionPath' +] + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + try: + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, env=self) + elif self._include_egg and entry.endswith(('.egg-info', '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + except Exception as e: + msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s' + logger.warning(msg, r.path, e) + import warnings + warnings.warn(msg % (r.path, e), stacklevel=2) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + reqts = getattr(md, req_attr) + logger.debug('%s: got requirements %r from metadata: %r', self.name, req_attr, reqts) + return set(md.get_requirements(reqts, extras=self.extras, env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and self.version == other.version and self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find(LEGACY_METADATA_FILENAME) + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % (self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + # base_location = os.path.dirname(self.path) + # base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + # if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException('dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + # sectioned files have bare newlines (separating sections) + if not line: # pragma: no cover + continue + if line.startswith('['): # pragma: no cover + logger.warning('Unexpected line: quitting requirement scan: %r', line) + break + r = parse_requirement(line) + if not r: # pragma: no cover + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: # pragma: no cover + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO(zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % (self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + # otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + # self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if label is not None: + f.write('"%s" -> "%s" [label="%s"]\n' % (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + in finding the dependencies. + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = set() # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + seen = set(t[0] for t in todo) # already added to todo + + while todo: + d = todo.pop()[0] + req.add(d) + pred_list = graph.adjacency_list[d] + for pred in pred_list: + d = pred[0] + if d not in req and d not in seen: + seen.add(d) + todo.append(pred) + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/index.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..56cd286 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,508 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: # pragma: no cover + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from .util import _get_pypirc_command as cmd + return cmd() + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils. This populates + ``username``, ``password``, ``realm`` and ``url`` attributes from the + configuration. + """ + from .util import _load_pypirc + cfg = _load_pypirc(self) + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + """ + self.check_credentials() + from .util import _store_pypirc + _store_pypirc(self) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): # pragma: no cover + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, keystore=None): # pragma: no cover + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): # pragma: no cover + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): # pragma: no cover + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): # pragma: no cover + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..222c1bf --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1295 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, queue, quote, unescape, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, ensure_slash, split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.org/pypi' + + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf', ) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl', ) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.org' in t.netloc, is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, params, query, '')), + 'python-version': ', '.join(['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, params, query, '')), + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + pass # logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + # urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) + + +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile( + """ +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(b)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.daemon = True + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + # logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', pathname2url(os.path.abspath(fn)), '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', pathname2url(os.path.abspath(fn)), '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], + info['version'], + summary=data.get('summary', 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': { + dist.version: set([dist.source_url]) + }, + 'digests': { + dist.version: set([None]) + } + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 440. +default_locator = AggregatingLocator( + # JSONLocator(), # don't use as PEP 426 is withdrawn + SimpleScrapingLocator('https://pypi.org/simple/', timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + # import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..420dcf1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,384 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + + +class Manifest(object): + """ + A list of files built by exploring the filesystem and filtered by applying various + patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + self._exclude_pattern(pattern, anchor=True) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + self._exclude_pattern(pattern, anchor=False) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + self._exclude_pattern(pattern, prefix=thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects

    ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((? y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + if ((_is_version_marker(elhs) or _is_version_marker(erhs)) and + op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): + lhs = LV(lhs) + rhs = LV(rhs) + elif _is_version_marker(elhs) and op in ('in', 'not in'): + lhs = LV(lhs) + rhs = _get_versions(rhs) + result = self.operations[op](lhs, rhs) + return result + + +_DIGITS = re.compile(r'\d+\.\d+') + + +def default_context(): + + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + ppv = platform.python_version() + m = _DIGITS.match(ppv) + pv = m.group(0) + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': ppv, + 'python_version': pv, + 'sys_platform': sys.platform, + } + return result + + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..ce9a34b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1031 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Summary', 'Description', 'Keywords', 'Home-page', + 'Author', 'Author-email', 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', 'Obsoletes-Dist', 'Requires-External', + 'Maintainer', 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', 'Obsoleted-By', 'Setup-Requires-Dist', + 'Extension', 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +# Ditto for Obsoletes - see issue #140. +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires', 'Provides', 'Obsoletes') + +_566_MARKERS = ('Description-Content-Type', ) + +_643_MARKERS = ('Dynamic', 'License-File') + +_643_FIELDS = _566_FIELDS + _643_MARKERS + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) +_ALL_FIELDS.update(_643_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + # avoid adding field names if already there + return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS) + elif version == '2.0': + raise ValueError('Metadata 2.0 is withdrawn and not supported') + # return _426_FIELDS + elif version == '2.2': + return _643_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + + def _has_marker(keys, markers): + return any(marker in keys for marker in markers) + + keys = [key for key, value in fields.items() if value not in ([], 'UNKNOWN', None)] + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _643_FIELDS and '2.2' in possible_versions: + possible_versions.remove('2.2') + logger.debug('Removed 2.2 due to %s', key) + # if key not in _426_FIELDS and '2.0' in possible_versions: + # possible_versions.remove('2.0') + # logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + # is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + is_2_2 = '2.2' in possible_versions and _has_marker(keys, _643_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_2) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.1/2.2 fields') + + # we have the choice, 1.0, or 1.2, 2.1 or 2.2 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.1 adds more features + # - 2.2 is the latest + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_2: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + # if is_2_2: + # return '2.2' + + return '2.2' + + +# This follows the rules about transforming keys as described in +# https://www.python.org/dev/peps/pep-0566/#id17 +_ATTR2FIELD = {name.lower().replace("-", "_"): name for name in _ALL_FIELDS} +_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python', ) +_VERSION_FIELDS = ('Version', ) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', 'Requires', 'Provides', 'Obsoletes-Dist', 'Provides-Dist', + 'Requires-Dist', 'Requires-External', 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension', 'License-File') +_LISTTUPLEFIELDS = ('Project-URL', ) + +_ELEMENTSFIELD = ('Keywords', ) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + + def get_fullname(self, filesafe=False): + """ + Return the distribution name with version. + + If filesafe is true, return a filename-escaped form. + """ + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + + # PEP 566 specifies that the body be used for the description, if + # available + body = msg.get_payload() + self["Description"] = body if body else self["Description"] + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning("'%s': '%s' is not valid (field '%s')", project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, scheme.is_valid_constraint_list), (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + This is as per https://www.python.org/dev/peps/pep-0566/#id17. + """ + self.set_metadata_version() + + fields = _version2fieldlist(self['Metadata-Version']) + + data = {} + + for field_name in fields: + if not skip_missing or field_name in self._fields: + key = _FIELD2ATTR[field_name] + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.1 + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + FIELDNAME_MATCHER = re.compile('^[A-Z]([0-9A-Z-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy', ), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy', )), + 'version': (VERSION_MATCHER, ('legacy', )), + 'summary': (SUMMARY_MATCHER, ('legacy', )), + 'dynamic': (FIELDNAME_MATCHER, ('legacy', )), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + # import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + # author = {} + # maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + ('extensions', 'python.details', 'license'): 'License', + 'summary': 'Summary', + 'description': 'Description', + ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', + ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', + ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', + 'source_url': 'Download-URL', + ('extensions', 'python.details', 'classifiers'): 'Classifier', + } + + def _to_legacy(self): + + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + # import pdb; pdb.set_trace() + for nk, ok in self.LEGACY_MAPPING.items(): + if not isinstance(nk, tuple): + if nk in nmd: + result[ok] = nmd[nk] + else: + d = nmd + found = True + for k in nk: + try: + d = d[k] + except (KeyError, IndexError): + found = False + break + if found: + result[ok] = d + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: any other fields wanted + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = {'requires': requirements} + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, self.metadata_version, name, version) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..fef52aa --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,358 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + # See issue #146 + _finder_registry[_fi.SourcelessFileLoader] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..b1fc705 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,447 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys +import time +from zipfile import ZipInfo + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, get_executable, get_platform, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + +# Pre-fetch the contents of all executable wrapper stubs. +# This is to address https://github.com/pypa/pip/issues/12666. +# When updating pip, we rename the old pip in place before installing the +# new version. If we try to fetch a wrapper *after* that rename, the finder +# machinery will be confused as the package is no longer available at the +# location where it was imported from. So we load everything into memory in +# advance. + +if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + DISTLIB_PACKAGE = __name__.rsplit('.', 1)[0] + + WRAPPERS = { + r.name: r.bytes + for r in finder(DISTLIB_PACKAGE).iterator("") + if r.name.endswith(".exe") + } + + +def enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +# Keep the old name around (for now), as there is at least one project using it! +_enquote_executable = enquote_executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or (os.name == 'java' and os._name == 'nt') + self.version_info = sys.version_info + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + elif getattr(sys, "cross_compiling", False): + # In a cross-compiling environment, the shebang will likely be a + # script; this *must* be invoked with the "safe" version of the + # shebang, or else using os.exec() to run the entry script will + # fail, raising "OSError 8 [Errno 8] Exec format error". + simple_shebang = False + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''\n" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + if os.name == 'nt': + # for Python builds from source on Windows, no Python executables with + # a version suffix are created, so we use python.exe + executable = os.path.join(sysconfig.get_config_var('BINDIR'), + 'python%s' % (sysconfig.get_config_var('EXE'))) + else: + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp and + '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError('The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError('The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict( + module=entry.prefix, import_name=entry.suffix.split('.')[0], func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') + if source_date_epoch: + date_time = time.gmtime(int(source_date_epoch))[:6] + zinfo = ZipInfo(filename='__main__.py', date_time=date_time) + zf.writestr(zinfo, script_bytes) + else: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + variant_separator = '-' + + def get_script_filenames(self, name): + result = set() + if '' in self.variants: + result.add(name) + if 'X' in self.variants: + result.add('%s%s' % (name, self.version_info[0])) + if 'X.Y' in self.variants: + result.add('%s%s%s.%s' % (name, self.variant_separator, self.version_info[0], self.version_info[1])) + return result + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + scriptnames = self.get_script_filenames(entry.name) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s is an empty file (skipping)', script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + platform_suffix = '-arm' if get_platform() == 'win-arm64' else '' + name = '%s%s%s.exe' % (kind, bits, platform_suffix) + if name not in WRAPPERS: + msg = ('Unable to find resource %s in package %s' % + (name, DISTLIB_PACKAGE)) + raise ValueError(msg) + return WRAPPERS[name] + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe b/env/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..52154f0be32cc2bdbf98af131d477900667d0abd GIT binary patch literal 97792 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

    XMwe#*Lv$g8jIpIBEV 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 w+IyK^N3WCD*(>mhAj=irKyR>D9b+D<@QBhV6U zn+fzX7~3)sOAFm5Xl;|(y7dCB>5YKxZjfzPz*^h>S`*N2Lad5_WK_)m^L@`b$;l9u zZSDS_-}Bo%&*Yr*p7-*7zxVh1Ue1SZ-mJVzsT6*LgGxQlRsKTy|J(mF4W-5w{AjG& z<@;sfa za7w@bRv^Lk%`@LB`Ucm^=(fNaeXS{y>zijxeXWfCvrez7T^W|Pl6&@dS1EN%JWU;$ z{L%{N-79LE%J7Vxsvf7K0e<`~Eau;MeH+p#a_>QCG;#!yYxMnrkc9EJ?8c#(UM3X-fGQdz8FB*I$J93oX#CEKeD# z(*kwWBA2bbb^Ti2%={sR1R&|V-4CaLU#XhQ?!0CB+T}`p>poJcQ+HnUKMlR z&nDmOX;!}3US z^hfQdK5Dd|Ug>F1toF9Qu_mSc%-yN&XBHW;HGdasU-yx+_D|Q8x7UXkwcmZmmF>#| zp+rcP0?$?Cy^=DEC|gb)W$h=H{#%>W{kN#of!C{y0}aa4|3tc~e!@_@3RNVr%&(5q z$M`fvZ-p8^-|rvHs`2m1TA|GOe#O0#do_QW3YBmzarfV;*SVHQ)NyaBs+Q}@6jfd5 zk0i>Kar_CdsxHk8y^4rcH*l>nRJGs#+_e|;D-1;vg*A~xjlbpETlkeL&+%!4gVifM zm(NFJbNwlyho)tgJ#=wy`9qgZS@ck$^2CP9q^O5hWEv0MlIwZsV^h2jt>m4QU-1^@ z)#dc%xof4~6)G^_-^zWf-23PI@8JFpxt}EWncQdowS5;H09#YxD=hqrZTt$J3t!nWAo%ry zYd3y7!Ed25XfJfFTrZaEE87MNU)egalII$~x>l~Ya20&r55C5MYv4a9I2K%k%Y%Y< z!M{^ha4fhMoY#PR2iNz5YiUR7ls2XQ`@wl(gg)}~x02Q>Y5w_zA=3Ey?;!0CNt-mk z&`%ma(x8RP{7Z2*_=Iur%-sgExsYS z^~R6zOBo#8*6q!S_jq%8&Wj)QPK+-_es4s6KaBkTJ@Wfeiaq$^XSNjhy}xc<``pmG`v(W-@$TSW zkNT$idd+oeO5t^??T$})C|7Q(s#c{Agi<0+!fQg4o-vIF?!P#+exFjsg(>Rz_mIIC z2M6;d?TFL`uSyy9X4zILGY0P<6=MpYD}&Am%<#m5QolMr9e#WO*o6-r*zYAx=zi4e zJ>c$x=Z!(y+j!tXEMEQgU~^F zEjm!vqQjM2-LMNThv;C_SM!e00o&rvd&Er#V7}kRu|o&xlfw_vr~An-G>8lg)8LOu zG#Ff@4r<$t%|5=%bv(cw|9Kp1AoA> zN_52;-o1KeaGS`eyDoWuLpr{}n)mj~caK)i zT~9?;=+#zmYL=;kyY~?HzIpXlp;huvw^3-fksI1l{>I=g!S9SygVoZu z*vGvmEn2wSaqgGF*SAel)r&4t@mDcF>0behmVrz?}j-ssI1Ob1pa>{rlg=_sVnO*~aHN>2<#N{%h%F)8SnG zKJWhimGsoIgS|y=4!U_CJzTvEo-f3vxzm^PEa})T?c=Y)Z=`HY(q6Mx=!Lxp75r`pR?=w6ZNE0-}CsEM;juC zJdwzu9_pOsSIwr1WEUv3>?4uM!}afT)eqb6}o)8h^U`b$UPH4?TjC4=Lx%={GoPobUWW2wVm;?|8%u; zV(CvU`V(Jp^VnW%8r+xf>Z`yi{fI`vm+b&njIt zdw9MKz_VDLITj}S4RTEUlTthVxr_EIxS`W2R*0-UxYLmyeMA{L# zm3E7Dd$~b@F3UgyJ9>a<6`^kNe^FY!Lcek)X@!n z1eU0VCC`Q>r|G@ZRCDiluPl9FYD7M(OVo+Rg*dJNMT`fH-K7z<-XNoE=rkv1N z^JZCItY@Q&2|r$12(O^$=vz==dz|N`UNukdb7*7vhP>Dj_+}z_33=46-yr|J*`Wmb zK;Y#$95m=VSymMtnU zRb52<;aqh?K`Q02p8-R?qBfN$YQTfsd(cxA@V7TRQdMX~s(kg?*&08-P@;0Y>JVJ` zX~cRB4gq=jBJXjA9O3nive54>L`^p?ERH>d6s zW6B1c`km{ErS!w@i|~=Du){rhv0ivV^pVu_@8Bt-1{QoAnU_3LC%S7(H+JfenrAE> zbYiIs{!#QGIIr4A9Y^6&;TeJJXFQADm9|1W|A^<`^SmcbJtA!hZufX{`@fyN^z}%l zs%{}&(po%u{hueTJ40|_r8SUtOLq0^A<{HHreY6_NVed?c^;5et0m4^sB-9r^vH*g^CH!w19^d^e4v~ zITZb3Xuw3z6--c%grP~zTZ^_{iO;cyc>>AjMZbwI7drj}Jf-_kq+^P)R=?#ZfYTca zvQp~W9GYGgN{Fu^I0Ek2vv0twA1$X(Wyp!83lV?($YJ|BxM-S=VM<&=w^12N2u}%b zz)M=!L9eGK?wlPnxf(n3Vx2doFyCR>AMrzY|4I&eLYL19B|2}qGV%OI6%(Byey!*Y zfvFY!-8((hA$(a-=BWz-xA3d3*O(alH|h#w!=#+l;gt2I=FZV|qjPGrEuEvwG)|0l zP^R|*6)X6xYVX!pqrKp>9)4baDg08~3udc?E^k=;*8A~LM?q@-osEn;bowZ=CiHT6 z%gG~h?(mPux6tPo_&65)`LVA7i|}Ztlh&9Yi|MqS_>Y~m!b!1v1!iD4b$CqsiEC8C zG$zgI{kZCoe)N7+wd?k72qngV|1^HsA?!?~O2!G69m*fF3lWc+r}NKq$xrc zI=ZnNyV`bhSwhOyAbU=^t=QJB#B@a-PeId#ww*T`FN|$4#P`XKpOi6z$b>OPe55)V z`-tC}3+(r;P_b4|sJ;`Pm$qK^VXwIt-WMA*#P@|$!GCUi3}qfm$5*~Aw4OfcGTmM? z*h9Gx@$fKpoq*qZUGIKp)j2OrnJ{^3$Rlk%ZMTJwSigokg-`cTzXj_>S{LoXf7I~e zL-wNQqLeMzr0N>MjkG22x!7XsO`}-~Xz0=>r9)-Tkv&IlZF2~)UMwBjO*GM!Nw9s|hONt{ zMS%Rdj8Sx3m*}xXmCW}*_d~*CQOf&16FMyI)zJ27-g&8e8#pcU5f4qrKfSAHeUNci z#e_gf_XFc&KLTGCJqm~YX7IS4^i|m@u?A0ie;)PsqI1i^yDzVEVd*?o2Y#zdi!5KS zz)0_3Wc$u}*dO5oU1#AmO_N)xOT#=Xlz70CvxN60U+|+tRx0>3CocTu|7pvx%=b(a zSc33HozV0~%7;JKu(hDjJicLqs_vs)L2c3c6I^@ej-+QWiJoD>33w~qIXzbJW$Htg z%BU|Dyhytu4^z)oX8Fajf-hKQij&HWPb$;1Na=B;_=o+DUM{<2NG_xw)2U+spIYO_ zxHMMawd~zg(j`sVJTE@_s~0hspMrl54IBOFhK*+I*Hct8cznvdu`D6aLi09cq7OL{ zn(u@@W$;+*1{M2}N9&P?jlCBQ(N*RJ1rCGuMCN>+$RStm~@~Iz3pN4nHJIAeR0e-7NxipeZR(esBIw5VrrEF??-_z!;69A+0iGWA_Pi(dU)1*} z+Ij&vBrddpa*g~1|0~HS*WaU`kgaCLU$&lyVO<3CFZeTw5IVDlwGz&}ilh4#Jb}#U zSec9o?ED?w-cW}-zk595r>>hA6MWxL&ELFOHMesW{;j=4HRmX$eG?p?W^;;K+U8Zo z7YJ>{=Isr}ZYFOFzhI$i?!@l4a{ohq5pb^a>@1AcQunja>^JAKlcd-4yOcIYjK7BBgw{F~>GK!t zJ_VRhL`PKZS)@vCAuR{EiiuxF%df*HLKm@CBTU}{BbSnHEYA>s;3*G~;A~qI zDybm87Ke6Dy3oJIgRkt( zj?aWP_Y{`IGVrx3&MfN+8*2BGGrq2Nk#AsYFwB1JZMEdl@3B?R`#taX{@NTI+zsxA z#^=(vGq!v=?O|g!S4^lc5g(?A_eDl@a^-}Qk|V(PL*ajL1b#KIN}Cs5YNbW(w4aeD zL7lp8cO1YqKG!_vxvNBQ873COxVH}Zs$NH5BSL%Pr2&bfmzBgm4?nk3w|?GP5{vLG zd88jKTcs{*IwFmj7`&0s=B{ctf-dEzl@j|{V`G{9G zRiQ5*#`eSl2L6DNzS>~D%ghgiI)Zy=Hf6-4RTTzf1|ws28DoZu+2omJ))5b^&QQJs zMdS$-h3ZYi*Oa~-`<=yoYUI$&B6CMPLnW3Onf)PXRGAg(XecY{e*k-2;R|*63}1#k zZ{&ILPW()8NM8=Ef`-yp@ii(gA-1Rn=F4*$&(a^36z0ma<3|eriT-ozIg#s&z-=dT z@tBQEv#=yqaHge8_`Hna_k3rb>*~h$@MC{_SvwBR{b=jTXSRe1DtS)E2@7@S)oji>r^Yk%BVZuJviyxZa=zFq{G8KmJNz=%9()ZKQ zmQrAg8tNmav1xl0zqQXBhzqWLsS@LUqRrvY0_LIT-2dFHZ_H3?u6-3+3w;IWR_rUP zuTox>y-(}jfRPfj;4OGYr#HTDXgFB@F@F=c z$Y6otTU|&T#k?ZaAu^ZV8EC3R?n;rn<;agCcZS@50k}$39lTjxkq{XfIks~5gMMyS z_$Na9K;bZ+-0?%P7hAC(MP4;2?2$hER_n3QWbTRm6w+qxv`|L{ONoh{FDdY;I`l<# zuc0QD8s_R&;1D`#KDJ|tk0O6L;B+hF;NA9pKQgd#&F$U()U6k&&^HW=pPAQV-p!$t ziQi-{zamEc56^47B9>FgIE!C_k=HMNJqrk)T1)(B7xu4fMHx1eaRs=HU>_xpI3539 z;IQV|-1B>*w6oK0XYae$j_`wd!BrOD;0ro@BXpj1g(Bm$qNBe|x~l zIK~`RwaL45>e-aFxJh(ufVL%n5ov+Xh7NDas%Y}FW~5Tuv~1p?tGRzH%X3{Oeb`JN ze84YuC|ltF%9>A9(YCaI9d*5zUmtyuepCX_V)`O*Wf*_4d71TssMKae+BpSSL06fc103iYQf74@UjY?1{t5em427IccXIMW791TY1>K=Gl`q3q2(cMzl&&|+XqW?4CHRAsh zgdV+%RmXnn5}Jtpo3^N^X(@P+{z+Ye1F5IQ<6C{q>kA%bJ)h(goBGCd<^@NrdAHUa zi2fD5>*(9x;SaifT$y`((3RH9{p+Lnw@!Jd><`HI2Yy!j!*Bl#e_l8f~8B@|Gfh%mK4;u7=FLMg>H+zekRBk9Skv3&L z^;mu;_A+Yt=le)6Cf<#Iv@42T%kd43t*|ZD*h*rU!jsAVhhv}o%37=D^fQ}w6zgvs z+v=oeN_y*XdM7%=WKO^|-cMZA><_^MU!AOS9XsHZL)Xe!a+gzI6=NgFVy$y=*~5v{ z)g^W~Rm~PZQsFx+q_17<@G*B9w%?=U$q$=*QzZTy>?FVAzey~A5A$py<_UvXfV>Zcl-6sU%yf#w4nZOXrb#hQio_@ z3LYj~aTM(fx#n#hx(iIo_<#lba;vPK7dY8irTY(D>Ex-Xy}m=>!bhG^Sv#&H89s-f zMw=H9o;keg`i{fsWN9y#_5{|v#?)9oV>8AJH?+U?Tvtt1{tjugi@daR!~Rv{I_5IA zmUadHc@r z@7%sgv()1THDp-5EGgLS3?^ zWR>{Hj0B=7CzfuF_O>Cw_kQ zvJ}gYmi&@8cq&v9XKzZ6cZ{B^2VpWE%pH2)(^+y4@Gkd++F$0~I5n>6$ z2tQ_+?y|2V!FsrVourzXGY$5FAHmK0!OdiF;{!M0yYCuE2RAaFoKcv*13hu5lHYo8 zR4_)>&Bvz^9EbH7J2x&g^Wmon9`Sb%)PnCYc({?+LL2KCZi3bk##ilQpV|IF@|F+L zF+X?*{V!0tdc9-~_-*JJ2iN8WX-j*N-=XJ1Q^$_R zg=Fqh<$iKnq+=K-@Dex)_Jm5(jq&r(35#JiIsNX-dS-iI+%wyWogDBRxzKFiIqm$J zyMH`1pMQF#mwhs)@LA9uOIl`NJ!qqtF7MG-%OdV!RTVYo~?U zCqqNQ1%6zR7{GzxnaU=!!J_wE=$!|>bA{e_tsD3-vGPsRChsU@jwu72Ng9hhSm)Nhpsj(1iUqmmbfcvAs=TRG~dZt@33k8iV8cc)+lY*xiKh~rS{IC~4 zaS)#=6W^hayfe!JO~<%qP{(N*Q={|7qL;tS9FN4Gh}l$E81NkPK{9^EU)R1{MJj2` z4edn^7N@G1`1vOMuz!E=!o~O(_-?TVBfnqX?ZtoVrHu;uukg?9_|ulbF`?K`PYiBL ztiBSTe-UF@XU&1-Z&gfDIleRA2|?<85j-q|*8(c@fC)_K+*lC#YcY)emp0zBUEpUN zc<3ekg6Jio^$+o0;9H&7w0(~;wqN$-)Fc`X<8$OnnZAwD?eO9u#$Jc|qzrRj0;`l! zxsmP54Au`*Mr_5SZ^<4T45xjq4p{p#hU|xH-J=1$mC0O3z=~I|LGHw^`vpIt4Tsix z%%%p`_C)Z_*6mZV4>K3R8k#LX*e7!q6LFo1Xc6n8wv)1uWHX1QwG|q{$b%B z&y@8)oHk|Q59jbJpR&-LFg3faYRbZ{eZi(mY@PVA1qoGBny2bk0(%>E78tqxh2UTM zS_Mp^*R_2b+Ry2p_Z&IS7yix>o^Zh}ev0@*!h;jBiCx%2@jDc@aQ8GLChL|2Z_>_u z+LN}<@<*I?BpPp)Uc}c5?nw{Tt)%Y%z@H0%7ZZES$mrwgPz!+jd~StrzmCzY85ON$kM1NjrkbJ2LQy0q=Yt z+l)@FGmr&*h+>J0w<3!T>8z2X&o!*=5}6Ef6?p@P*;;QH9_@39Zr1(_^}`!gQa=+s ztQ}Fgx4H1YjC*Wr2YK*G&R%niSg7;DOWC>bV$ok{(ET3Pj?xYS(*ZrJ_T;M$p=X1~ zQ+E&j%!Q6$``wy>`ChfV5E@2)2MzJ3^*jW46q;4;P3>6svB^u}$zU^i+Q4bL*i_2S zfL7Sis&EhUN?ec8p5z;iw}j_^gRGuJCU+4JZedMYD>RB8(Q`QSWy~bwAdORK?u;4a zJ#?Kv^p1Wz?{?=f_C`jCPv=KH%#A`%l<2QPW(pUIcW#IwgsN5+D}_So9})#ZCLL2 zazBFaMp>ufj0;#7I=ctn-({EiiL0JT!uy`#{^K{Vz90E`JD#0^EZ5TiTKvBn`i~yU z{b#%G2VHgF#2Al0Y!SJz;#WTzS_d!t>>c=Wu&LoA*K1$R3|aFqtWm716}mnWoy;1A zL*XOiIu!ofPnjc|BysW6W7xwRIrM_enVr5y<~(sx-IiN-`tUv)OJ^}I zvi9V7J;7?|a}m7ZjN|?j-&yD-6E@+sm^whyOi?W{o< zZG8D#SH1UGILQ{76hB|at9nc^FKa12U9rG=D|C0puixWd(r(F9%}u!y^BI^gWn>Ii zLyWTqdp;HVHcXWDTsiSWI)5(uoH@Y}<1tz9Jv{z$#@&y)U|VU!CiHU34vj@-XJSv7 z|7U#CK^w1u&pI2oPjGeMy;G;<245b5Z>wD&^B28?EzIwmtLJhLKC4TOl)8P$l9r3B z$`Zc%+Vy@TCtc(=_oFjr1kHnaqzcZ`wxRBeWyBMd}+Fck$@GZ@cj6 z{LEhtvW`n=>mybowlc!FSy{Bzeu2Xa?^Ms9?RtLf8LsCgEA6a$WM7uEUR=hPGPYdv z3S-JAvJc8ye4)!pkxS-02E3_SKF7Ft^>N?>C)uU&Ni{Msk9n6K=qK~cYiR#Bo`zQk zw;GRsJ3aLJ;9+BZFYDn38&pZ}N>$SL0CUZ>cWNo?p4p4n`(aN)_D1y$rnC>PRvm*+ zqzw!%8Z$8HHR=bq^1RejGI%|CmU{YvR@z>TM$Fe?9hRTHlwH~Gm3fXJxQbl{&PI+KEjzOoSg;w{;Fd| zrh?-I3&qbLjSdsufesJ)hxO!5HXTBv&|$*6MhEae=Iv>5=&z?m{aLiQE3jT@@eASx z=R=DFFaHI!NP`wV1?zALGWU5!T6fjm7T_t+*YH%O5$A$2J)dk=^npU2e zJJ4_#-MqWOGyeD{@Z;5_-c^Mdn=bHKS`6gdC!ZQxwSekqCNFUwSQ zS5CV2E*ZBkE4Jn=15?ye-daw(+9;vV5a`ul9 zi>c*4fGx{VpLe2Oq`v!wGIOv{p)$6;wJORCS`)Z6Bela>9pLJ$=!X&OE zYoaoVL4}C{WnQdA=T|Xr7dIC&hhWf$XG3?j0+UJX-CU?T%JHKlz8N(4O|JZc=fWQ5 zD+7Dggp8>wr{M)v_hsM-=VfIOvz#!4H1=SMZ7T6`EutMCZO9oVo0vQE{hjJaC%uAr zkV(3OhY|4l-SCzl4y2k*nXJElJ9xX#2i^~;r2=oe3tr-1IZH?vSi{^03{@}i`)E(# z{x9H;64#WqwgS8TE++2;_7QN8g6Aw7&spRjtMQx_zaAgmh3nTlU9evd%>>so%>Ue8 z`-O2kWR5ieT+4*7;vX>Y z8R5Oe2pT*SSI@u(iatw@qn%jl8n<3Jtbfl1>+Qgrz?VI5ct5C?e&aILTsqyq`Y(Yu zaUpxlhT@f$jkomh@P0JMX5cpkTfndQQG#DNb3pKWJGx5N##?*OC&uSxsb=u1=Z1%I zl)IXB{T7Z!i8l<<(-mKN$M)#E#C1#llJ;ElwlZF8SfNT9;ei1A$HU)I?K0miKC#(Y z*3pIj;)Kav#9YYE$L{(}wpEc+g_4+^Yd>dM7e zmodUFXdg}sCGxO2-Q+V!-;eLK>N{oa;J9n4L+gj2iK5x*eDq+#W!8#N%UUhN%TMFZ6Dm4((wvoIq~JY7nLXOW9;0! z5?_)$ZQ@IMNBWZ1993R$KQL;)a#42d>-6Ik^iSUZIJD2x?(Y}R(ckr>^!LkuO@BAi z&wqdWJ|8fK`}~pf?DM^@K7VwSJ_lrd=VvAU)mb9+xR!Y!c&xaO{WQJIHI%X*M`XvG z(z#I5!px;+q%gi{`o@2W>c|Uc?M@CWUZjTEw>^W9!f{4d~-?{MP7L_TetF_7Exh zcMRFYu69Hy3to1Ag>n(fm&-d;yt zI^Lwu=^SnS=IHR=aX#>3XP-=hcg5cf-jVzBYvz|H{Ap?zlYDx;RYe;71zw`5YFGHq zE4A&by)&hw)W;miSUoqjId?Dn+NxAX!)2=D7W5$YF}5lg>Zk>O$1(>N+?KYtB-&`t zVb>aUz2G)V{MFZ}4$ipXvxo1=Rc927G3dB9TjR3FZ=0_={(~`hcuuH;^?XZK@$54$no~PRbp+^}*pY_!sgB8Z z{qSP-@*~JG{>{1S4O6f97-7nZKOTM`YaEGX*Yey?If41}^j&;+q?n|t9)5zhVTpVuCw^X|Hh!^moV4b zBz_^*#X5nUIEyDVuDUpja5;Rs;(qM+{S#s){Qo}S8;wtjZ9IPzK6x+q$$WB{SX2?| z=c4EN@QLt;@QIAOrT+g8pIAJihImBgz@)FMT|DwNn@6Irp3Nh*ZXN-*QeVmi*W9)9 zmBH#{y6&`j#w}azk9GXy(9)vHPk^0{aKDoig zCx5j0q~e6bC!zYZ6JRiRJ&V|Ez<-;~# z+%*bcL`Kmo%aZtFF?!`M;fqZiq3Y-rH*bhu5#A8JV%ec#-Vi@tbjT{~31ju3=#sqj zch)7?%~5&eMfTjjo4VxP;*o_e9+{hJ$wKdtE*a*L{h~`89&zas1HF-~ON>!?=6kj- zF;n)I6f|OwiH*p^7@2xHT+vlD8AR?I?dT9|wBZIj2DZa4%6@mXrnsbTn8w~-Vt zaoXK)w|f_3TbX++D74}a=i7F2yV6JT$)pecqQ4o_T4M&rt-q~VA2ud1pRVn5RTq1M z-wrkhCr<#|JK;q8ON>V>e~CCHxZfyiz-=F=SkIeTV}kR+pZFBgkJ3^5v3x{7dKvFI z{ztFLI9`0WBv@)(uuOOxSezJ*54kD5z|iXn8S5mXnUfauK~vvM*0Es26gCW-ky~0~ z=(S9eC!8^9fsZkifu?DAz{Nj7H0gKG#mp)?m;h>@SAC>-rXJ9YwGwNg?Oc(inO};4Q z4s#XUvUXX+tNTiMcV9R0Uih|_s}GnQ9ul2X;P?L87{9@9U?9(jewUzw--&)tvyRB& z-7owv{i^@R>4zP0%U_#I{=Q_>Z#n$nmcOV={%FVChQ@rM!eXR>#!^&RA|XGs3A zYmWRO7mobNI`v9;l5g@1$)EVOB7Y0ys^yP8ghTR2J?E4^-nr$EbJiUByM(&TQ!VV( zxBYWl1}l(3lf9A2GAQT0pN|YaZOfqSXC5hoz~acD-QTy9!L#J=ZRmIEJm`0l_3DoN zJ$TyEpZ`n0vvugZO~2&zV>(WbEly80ZdmpQ^nMQUy&N?@@b~e@eVjk-#F3o1z%Ir; zVk>0a%zROEp?&|cG}U~OeZPZriRVbH$7f8@F`hEyMb`OAxeWYbnHQ+#eL(hd5H}1M z7t9G03u0|ym8@-&HAe=%#Yyg^oSggN<2lUx+G%5oWF4B+HJNtB7p%y_*YT82B%(hCu6N8#YWzez2sfV z7>cuCf(9_^cnrQyvX5udPsjhn$J?!aO(QQu{9NhtE#;gouIph9AFxS1Gx4i5J+iz@ zrF?*WNyG={4YddSlJ7-yt-}ky0QXXNfHgLn)|A2DEgmXk!}uI!#GVVDl+ZG1JtDLn z`~tR}b%**Y&(2TM&-ceZS6$wnf1F+Z^eFF~eD3ziuAH`=bV+maI@d|0nf&O`&^xDn z#!f?N+1$(DJIP&?^TvGH=a#!?kSRy*K8b!Uq-o**D6-_p-A_q>JGq;M?7mxacZEH+ z?cz)(k-LhF|F`6hZ+2`OO^#keCeBBW?sUn~2hLNDZaoh`zSp z5W2rzY!@(y?F!Tf*SFZVt0mcXWvH0EUp!>H(zWescn90H5x?)RvR%L?HtFBbQ|3NS zdyeheg8n)m+jTQ#+_vk{7tWrS7rx&JuL|GG)h&1Oe7-;7`{cYLcakP@m;BCocDGN~ zv)Y$5C$DpL%bk1 zoHt+BxNP7QYt?rVS`#Tz!y}6wFUdd5sXnS{xtIibGChsK8L)vocT)Dy*O9ggm zk2O&7=_wUW)5!C2_WsM-wv!pE<5v3gG4O#;kvK3Nc?Cy4d;l4*$-0Rs_I^2hR&y!q z;*irJTurrb)kFWCGMij^zfRs&lvzUjx`Fv7C!g$NUq%0X#$-MIm-pdI?D+D1%pX%< zpT~+Xhm~5;K%CtvyLxP-YBlRJeDzbZWqpX0KAZ+t4bmv^3;XPA2 zUW}|2YI*x_@CQ75O#GjB;t%qjFMqtq*#iGp@JISEe=K?j{wNdvaB%ew{4xG-#UISI zzbpKaw7%7?V-G?*kx#8(^_jNvEvS(?dS&CX^&+Q@E_p=fYgzOlgSUuGl^d}rXUqGk zL+fbPRmt9Mw?3GOKG18YlIjmPKDRK+T0l#;59<)Iqi#KN)_i5sIm)6J=TT-II)6y# zB(loFEC2~yU=f9*)Nc~=i;H-|K*{fb(`?+dGQc?_^VdINA>66p&Lix zq58Msq3JFj`Z;CK%|px~Ci4($gl!&TZN}L=bd!sR#<+NBwEZ0qH*S9T+x(sS_QT&! zUhgToVKn(gZw}l&4IPNC7ab+K30bPH^^Vj{tAddZ&J#)a;AiM$DqhpRg4xv$qY zvp~m7;7=| zRyVQ7=iYPlS?r#(&cV#J_F+XQ*@; zV`6e1P%USvWOBa7%)-naGVk&|!xxLb&{-mO+$npmGBfNl|3aBC=iK!YUu1q_Xuh_@ z<~gZXcv5&z)@cab>G%PaJ45Zn8T%W7sbYDkqz&6sp)6UfRKshnD!4bvugEi=y4-oB zo(dm!0(@2aIAd3y!KHz1$lzYu4f8DTYmMRkk^ckjGpFckUt*rF_LJk&--3sR#-&wd zB>~Pv6TO7rQ};{O*sR0$<6tET>s9P^)&cwZ=D-ooOgkcb zT4X(&Ypt0nc6E4-n?2X((Q|#GE1dX_)F-jhImFkbeK~tp&fn!5HPyo3roHw}d=IH_ z1$mYO+xfO7zMj*Tw8Qx^%|as?o81ZylJ_ztF2= z0-QLoIQ`yCywTlnIS)?8`%b@QUR3%l<)q&$nIDyYY@nRekGZ4tW2ApNe7;8*S~E8{ z&*{S~&M0>Jz_$pq2UrWJeP}sXL(Z`PPht2? zk6infbi4*!LGK}4x#@i_96ilCXa`5Pqi1@+kF!Ql&eKTl>-o}qp$mTZSv^B^cI~^Q zeK{i|C}(6e^G((L5|`7uFTH;+{%`=jW(psR4{YRS$oe@sf6$NK+J^lr;B3OY+1s|u zp3vw2Fu3hW%2$X^GxGR$fJ*3R(Sh=e4%E-o8Rd*4`QBxOHZ=d@JIMM4X{X&|X4LYm z{o?c7Kl*O<`r_; zKke1v4{YtpW-6`DqcU+lfqBD>pd z7zvXe6DAIKBlTH(?nXcFYV`B$t=O}ix03_xvJX4~u1>pfb+3)99QxA>uYStL z)q*i*Q>izUM< z!#fGi1$y0^7GE$%?b;1a#Ls^^&HDaN3AkX-|E_9&^37m$QuXPvs`&-)WWHG)>UiFJ z0cSVqvz+4hbB3FoCH8w@k#qF+V)I@kFTSDPgSrzxsh4Ng+H_2#-WTk8CMMP6d?RZ= z^@Qy+cBH;C?1P-4UdZ(sSG_$vAL1GRr$hEcM3^H$ACyQLgLembSHT)48H@4Fk0E;3 z+jtipJK7m@!Z&|QJU$34Z->Wz7aq5h*Nw-o@$BGnt6k5z@c3K7qnwWeKIDuXHy%Il zs#oyHexqbO);oBt=beMcPjTN*%|V#yjRJgRii@(4wQvA6WWQd=)u2bs1;T z_*q-*oXzI@y2N6At7NUelU9&gaHk>9*_N-*S-{nD_Pm^_A?H5!%6B#xt0kY|YMuMo zSyIH=tl<|rOM3B(JbcqmuZLuO&_-WF-hm%Vz4yM=aM;%wIMC$bJ6>lRIEUE!W<^-v z#xe;Y`_`*hHb*p1#3tGFHmt9B_HQn=|>sjFsd}c-;r!&}Wvg4pGKMLv5|& z%q~}3S-|1YsYsvO=1VU~wdbGgI!ycQZ|3rF|_hSDXm}G1YjJrdOFVF?`z2GLu^+kAD zzNwPVb3fNU)|@tQHedwUHq8pH@8^7lTIf?to94{W`Y7jFN_o~k#VZ(#7TI;kISfVA zk;Su=>DBdQ>3X8N9_w6&C_EwcgsDg1E4Ww@8&B^CwnS)x_5B?OPe*`vwF^H}=okGt zBxBk#Y-|nhE9g%zXIaWQ9!?D6ZO+;2cm)0l<2NY2Ga@o5ve#?NVG;2XIYU`uCqcyg17Fde%2n@E1Bn58^Xa&!RkZ z?T~X{oO)z#KzRoiXgD}OSk8vsfZV>Fj&R^x%$aw+OC?U=EfOE1m$Avwm8=imh&^4S zVm}o*qW*DqyZNqmyZRkHX~oP(i4z7Zk71AD@l)VvIq=IFHdCoDeuQtQMgFr zI}1d=ihZas%H@2H`F`@2P+oLqi2M26V_W;X8F!0*ox^if;#fVy-#}rp#XOzn`YsCP z(aX8PW8gW8AKLD*zTJ=xy#joTL1J8$#H&hsR0;k^vC!hjnfQ~?$1MZNaydK>we*a@Y1C9TQco+TN{UmicI_z$6b{H9*1`de(C6?lc(x=2pcu>~26j^p8UW~un$20q! z>chZ9P?b-q59Xs=_4!!yiCLAw%W@{qS9%AxwNghXZGE4%qBehRwXV6APct$83S-(D z;v3Q?errN#A#mOdoEHC$JmWlt`n}{~?flUBm6fcw8HLVq77qxI$LI2GpIm-Xk9?0e zH!iRT?C_$Yp!3nzTlLlzpZnR zzzOG1AiKr2UkMGo1Wv-_^D$2JgCm<>heVc>=_TKhmp)DB8guE>Zt%9;MWbw+uf=Cm zlPr7S=my2#Xy+~N{ypDI_Oea_960BZo}}I-u6o~uUqwIPM!lBbkQ*OMxdN5fzY;lU z@u+&)tI$P%)IWz3o#^I!Set{47Wbc)eLWf0zWZC*A1!jzs3t@ya}VF#4x(e>*Qy(- z+vz8?%NE)je)c zbW%;ZI=FDW$VG0DZ(ql*q7S2;(JB03$p_!bb$ypp_&{`loJ%ZvwG^N7$VzLBB69vo z^lI+|R$TiS=i<1}1$BRqO6r%`@8Dodw0H2isKi1UB!U8^{!AMyz>&~h#*J~l7ct}F z(E1A2o)o|%mGB2^d2hJ3ans~l?jT;EH1|nD1U2kx7c^bZuW{j<1DT) zx}ux<<-8h4e=UIzn6k-sZ0K|JL*xV+aC~R-cbMJhnpw6?bflawbOOAHZrtdqyV$N< zc#JbiIbU^n9N5EnQSkU@YCLu@Mk2DmxlO^FY{$G_*- zf!>$}UY|kN$hh>6*gbdzop|nV!aYVg;(%LB-?Q5ryk`FSB}PP5L}_Nfh384VZiI7a!t9My5``$qfg)G6bNrgXJS z;B?Ao=y6cSDnH}(PcxoCXBD4Lm-BZQ^p{iTY2v> zdK}r^b^o)2+k~!1h!Y6hp91DS&WR9Q>=6HrdYj7^99Tv9n-?u$Jx>0Tin0Ywtmn{U z0QBHtIp?>foNpBqM>xiJs#-kh{ps-ihZ~zG?}wh1$d8;I*_*z9vhNSR3r|C9fol

    qx{CqlSNQ_YhQ()VtG-D; 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 z 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 bB!6W7g#4-b3-g!cLzth+PZapSNrC?c%T_@< literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..62ab10f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,1100 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2023 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +from email import message_from_file +import hashlib +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, cached_property, get_cache_base, + read_exports, tempdir, get_platform) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp').split('-')[0] +else: + + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if IMP_PREFIX == 'cp': + vi = sys.version_info[:2] + if vi < (3, 8): + wpm = sysconfig.get_config_var('WITH_PYMALLOC') + if wpm is None: + wpm = True + if wpm: + parts.append('m') + if vi < (3, 3): + us = sysconfig.get_config_var('Py_UNICODE_SIZE') + if us == 4 or (us is None and sys.maxunicode == 0x10FFFF): + parts.append('u') + return ''.join(parts) + + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile( + r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + +if sys.version_info[0] < 3: + import imp +else: + imp = None + import importlib.machinery + import importlib.util + + +def _get_suffixes(): + if imp: + return [s[0] for s in imp.get_suffixes()] + else: + return importlib.machinery.EXTENSION_SUFFIXES + + +def _load_dynamic(name, path): + # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly + if imp: + return imp.load_dynamic(name, path) + else: + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +class Mounter(object): + + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = _load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + self.get_wheel_metadata(zf) + # wv = wheel_metadata['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) + # if file_version < (1, 1): + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, + # LEGACY_METADATA_FILENAME] + # else: + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, archive_record_path): + records = list(records) # make a copy, as mutated + records.append((archive_record_path, '', '')) + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + # hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + ap = to_posix(os.path.join(info_dir, 'RECORD')) + self.write_record(records, p, ap) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # sort the entries by archive path. Not needed by any spec, but it + # keeps the archive listing and RECORD tidier than they would otherwise + # be. Use the number of path segments to keep directory entries together, + # and keep the dist-info stuff at the end. + def sorter(t): + ap = t[0] + n = ap.count('/') + if '.dist-info' in ap: + n += 10000 + return (n, ap) + + archive_paths = sorted(archive_paths, key=sorter) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 3.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + # Issue #147: permission bits aren't preserved. Using + # zf.extract(zinfo, libdir) should have worked, but didn't, + # see https://www.thetopsites.net/article/53834422.shtml + # So ... manually preserve permission bits as given in zinfo + if os.name == 'posix': + # just set the normal permission bits + os.chmod(outfile, (zinfo.external_attr >> 16) & 0x1FF) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' [%s]' % ','.join(v.flags) + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True} + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(self.filename, use_abspath=False) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + # data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message_from_file(wf) + # wv = message['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = path.endswith(LEGACY_METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', prefix='wheel-update-', dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + + +def _get_glibc_version(): + import platform + ver = platform.libc_ver() + result = [] + if ver[0] == 'glibc': + for s in ver[1].split('.'): + result.append(int(s) if s.isdigit() else 0) + result = tuple(result) + return result + + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + class _Version: + def __init__(self, major, minor): + self.major = major + self.major_minor = (major, minor) + self.string = ''.join((str(major), str(minor))) + + def __str__(self): + return self.string + + + versions = [ + _Version(sys.version_info.major, minor_version) + for minor_version in range(sys.version_info.minor, -1, -1) + ] + abis = [] + for suffix in _get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for i, version_object in enumerate(versions): + version = str(version_object) + add_abis = [] + + if i == 0: + add_abis = abis + + if IMP_PREFIX == 'cp' and version_object.major_minor >= (3, 2): + limited_api_abi = 'abi' + str(version_object.major) + if limited_api_abi not in add_abis: + add_abis.append(limited_api_abi) + + for abi in add_abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, version)), abi, arch)) + # manylinux + if abi != 'none' and sys.platform.startswith('linux'): + arch = arch.replace('linux_', '') + parts = _get_glibc_version() + if len(parts) == 2: + if parts >= (2, 5): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux1_%s' % arch)) + if parts >= (2, 12): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux2010_%s' % arch)) + if parts >= (2, 17): + result.append((''.join((IMP_PREFIX, version)), abi, 'manylinux2014_%s' % arch)) + result.append((''.join( + (IMP_PREFIX, version)), abi, 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version_object in enumerate(versions): + version = str(version_object) + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version_object in enumerate(versions): + version = str(version_object) + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py new file mode 100644 index 0000000..7686fe8 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py @@ -0,0 +1,54 @@ +from .distro import ( + NORMALIZED_DISTRO_ID, + NORMALIZED_LSB_ID, + NORMALIZED_OS_ID, + LinuxDistribution, + __version__, + build_number, + codename, + distro_release_attr, + distro_release_info, + id, + info, + like, + linux_distribution, + lsb_release_attr, + lsb_release_info, + major_version, + minor_version, + name, + os_release_attr, + os_release_info, + uname_attr, + uname_info, + version, + version_parts, +) + +__all__ = [ + "NORMALIZED_DISTRO_ID", + "NORMALIZED_LSB_ID", + "NORMALIZED_OS_ID", + "LinuxDistribution", + "build_number", + "codename", + "distro_release_attr", + "distro_release_info", + "id", + "info", + "like", + "linux_distribution", + "lsb_release_attr", + "lsb_release_info", + "major_version", + "minor_version", + "name", + "os_release_attr", + "os_release_info", + "uname_attr", + "uname_info", + "version", + "version_parts", +] + +__version__ = __version__ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py new file mode 100644 index 0000000..0c01d5b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py @@ -0,0 +1,4 @@ +from .distro import main + +if __name__ == "__main__": + main() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c11976dfeaaa0bd7550d2b36133445055122cd8 GIT binary patch literal 979 zcmcJNzi-n(6vxkwo1{tH{A`nUK&%-W?5zPfIW^oiN$G$VJFLUD) z^O58`Tid4j>UNI z=vL0aX-5{JdlhQJWX)^5V{Oy@`2up-A zp-NaL(2nRjp+Rs7D}*MYMQ9T`gf5{+SS73x`h)>tov@MPV7Ot*xBvIA)hp!qe_JpW zA-o_E;tRXZtFd1(KZ{Uu%+5SS&*$UlI71nx34f*1*V&YBZ*7gn-YgkSPDU^DE#We} z;DMU*c$S_;;p5HiM?6uf9L3)8xpyiP9;=w=&l&oW=C{*wAylYRAvWWgsXoQX&jR^O sKg=7TO;2`mT$L=#y0O=l6mU-OW~YI_W3fT9PF4pYc}5&@Tp@*TF-9Wc$$TFn zmnBHx*R>I&mb4^Ke{g8zxJwn2y2~hyOzCw_x-Bk!?TjPA5f#mpp!5Z;;)q`hrBMP@ zQ!=F(hq0M9O6c0drL3=-35uik z!h@9-=t5|29Q^Nw%{>F#cGEWI1eWcmr#gd@3 I@3J8O0YYR`V*mgE literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50259537a4604002eab2f69928b4aeb5551efaf7 GIT binary patch literal 53811 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 NN2_dqxz2*?{{titF4O=3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py b/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py new file mode 100644 index 0000000..78ccdfa --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distro/distro.py @@ -0,0 +1,1403 @@ +#!/usr/bin/env python +# Copyright 2015-2021 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 removed it altogether. Its +predecessor function :py:func:`platform.dist` was already deprecated since +Python 2.6 and removed in Python 3.8. Still, there are many cases in which +access to OS distribution information is needed. See `Python issue 1322 +`_ for more information. +""" + +import argparse +import json +import logging +import os +import re +import shlex +import subprocess +import sys +import warnings +from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + TextIO, + Tuple, + Type, +) + +try: + from typing import TypedDict +except ImportError: + # Python 3.7 + TypedDict = dict + +__version__ = "1.9.0" + + +class VersionDict(TypedDict): + major: str + minor: str + build_number: str + + +class InfoDict(TypedDict): + id: str + version: str + version_parts: VersionDict + like: str + codename: str + + +_UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") +_UNIXUSRLIBDIR = os.environ.get("UNIXUSRLIBDIR", "/usr/lib") +_OS_RELEASE_BASENAME = "os-release" + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + "ol": "oracle", # Oracle Linux + "opensuse-leap": "opensuse", # Newer versions of OpenSuSE report as opensuse-leap +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + "enterpriseenterpriseas": "oracle", # Oracle Enterprise Linux 4 + "enterpriseenterpriseserver": "oracle", # Oracle Linux 5 + "redhatenterpriseworkstation": "rhel", # RHEL 6, 7 Workstation + "redhatenterpriseserver": "rhel", # RHEL 6, 7 Server + "redhatenterprisecomputenode": "rhel", # RHEL 6 ComputeNode +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + "redhat": "rhel", # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r"(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)" +) + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") + +# Base file names to be looked up for if _UNIXCONFDIR is not readable. +_DISTRO_RELEASE_BASENAMES = [ + "SuSE-release", + "altlinux-release", + "arch-release", + "base-release", + "centos-release", + "fedora-release", + "gentoo-release", + "mageia-release", + "mandrake-release", + "mandriva-release", + "mandrivalinux-release", + "manjaro-release", + "oracle-release", + "redhat-release", + "rocky-release", + "sl-release", + "slackware-version", +] + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + "debian_version", + "lsb-release", + "oem-release", + _OS_RELEASE_BASENAME, + "system-release", + "plesk-release", + "iredmail-release", + "board-release", + "ec2_version", +) + + +def linux_distribution(full_distribution_name: bool = True) -> Tuple[str, str, str]: + """ + .. deprecated:: 1.6.0 + + :func:`distro.linux_distribution()` is deprecated. It should only be + used as a compatibility shim with Python's + :py:func:`platform.linux_distribution()`. Please use :func:`distro.id`, + :func:`distro.version` and :func:`distro.name` instead. + + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The extra item (usually in parentheses) after the + os-release version number, or the result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + warnings.warn( + "distro.linux_distribution() is deprecated. It should only be used as a " + "compatibility shim with Python's platform.linux_distribution(). Please use " + "distro.id(), distro.version() and distro.name() instead.", + DeprecationWarning, + stacklevel=2, + ) + return _distro.linux_distribution(full_distribution_name) + + +def id() -> str: + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amzn" Amazon Linux + "arch" Arch Linux + "buildroot" Buildroot + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + "midnightbsd" MidnightBSD + "rocky" Rocky Linux + "aix" AIX + "guix" Guix System + "altlinux" ALT Linux + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty: bool = False) -> str: + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + Some other distributions may not provide this kind of information. In these + cases, an empty string would be returned. This behavior can be observed + with rolling releases distributions (e.g. Arch Linux). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best: bool = False) -> str: + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best: bool = False) -> str: + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best: bool = False) -> str: + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like() -> str: + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename() -> str: + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute: str) -> str: + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute: str) -> str: + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +try: + from functools import cached_property +except ImportError: + # Python < 3.8 + class cached_property: # type: ignore + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + + def __init__(self, f: Callable[[Any], Any]) -> None: + self._fname = f.__name__ + self._f = f + + def __get__(self, obj: Any, owner: Type[Any]) -> Any: + assert obj is not None, f"call {self._fname} on an instance" + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution: + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__( + self, + include_lsb: Optional[bool] = None, + os_release_file: str = "", + distro_release_file: str = "", + include_uname: Optional[bool] = None, + root_dir: Optional[str] = None, + include_oslevel: Optional[bool] = None, + ) -> None: + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_uname`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + * ``root_dir`` (string): The absolute path to the root directory to use + to find distro-related information files. Note that ``include_*`` + parameters must not be enabled in combination with ``root_dir``. + + * ``include_oslevel`` (bool): Controls whether (AIX) oslevel command + output is included as a data source. If the oslevel command is not + available in the program execution path the data source will be + empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + * ``include_oslevel`` (bool): The result of the ``include_oslevel`` + parameter. This controls whether (AIX) oslevel information will be + loaded. + + * ``root_dir`` (string): The result of the ``root_dir`` parameter. + The absolute path to the root directory to use to find distro-related + information files. + + Raises: + + * :py:exc:`ValueError`: Initialization parameters combination is not + supported. + + * :py:exc:`OSError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.root_dir = root_dir + self.etc_dir = os.path.join(root_dir, "etc") if root_dir else _UNIXCONFDIR + self.usr_lib_dir = ( + os.path.join(root_dir, "usr/lib") if root_dir else _UNIXUSRLIBDIR + ) + + if os_release_file: + self.os_release_file = os_release_file + else: + etc_dir_os_release_file = os.path.join(self.etc_dir, _OS_RELEASE_BASENAME) + usr_lib_os_release_file = os.path.join( + self.usr_lib_dir, _OS_RELEASE_BASENAME + ) + + # NOTE: The idea is to respect order **and** have it set + # at all times for API backwards compatibility. + if os.path.isfile(etc_dir_os_release_file) or not os.path.isfile( + usr_lib_os_release_file + ): + self.os_release_file = etc_dir_os_release_file + else: + self.os_release_file = usr_lib_os_release_file + + self.distro_release_file = distro_release_file or "" # updated later + + is_root_dir_defined = root_dir is not None + if is_root_dir_defined and (include_lsb or include_uname or include_oslevel): + raise ValueError( + "Including subprocess data sources from specific root_dir is disallowed" + " to prevent false information" + ) + self.include_lsb = ( + include_lsb if include_lsb is not None else not is_root_dir_defined + ) + self.include_uname = ( + include_uname if include_uname is not None else not is_root_dir_defined + ) + self.include_oslevel = ( + include_oslevel if include_oslevel is not None else not is_root_dir_defined + ) + + def __repr__(self) -> str: + """Return repr of all info""" + return ( + "LinuxDistribution(" + "os_release_file={self.os_release_file!r}, " + "distro_release_file={self.distro_release_file!r}, " + "include_lsb={self.include_lsb!r}, " + "include_uname={self.include_uname!r}, " + "include_oslevel={self.include_oslevel!r}, " + "root_dir={self.root_dir!r}, " + "_os_release_info={self._os_release_info!r}, " + "_lsb_release_info={self._lsb_release_info!r}, " + "_distro_release_info={self._distro_release_info!r}, " + "_uname_info={self._uname_info!r}, " + "_oslevel_info={self._oslevel_info!r})".format(self=self) + ) + + def linux_distribution( + self, full_distribution_name: bool = True + ) -> Tuple[str, str, str]: + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self._os_release_info.get("release_codename") or self.codename(), + ) + + def id(self) -> str: + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + + def normalize(distro_id: str, table: Dict[str, str]) -> str: + distro_id = distro_id.lower().replace(" ", "_") + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr("distributor_id") + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return "" + + def name(self, pretty: bool = False) -> str: + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = ( + self.os_release_attr("name") + or self.lsb_release_attr("distributor_id") + or self.distro_release_attr("name") + or self.uname_attr("name") + ) + if pretty: + name = self.os_release_attr("pretty_name") or self.lsb_release_attr( + "description" + ) + if not name: + name = self.distro_release_attr("name") or self.uname_attr("name") + version = self.version(pretty=True) + if version: + name = f"{name} {version}" + return name or "" + + def version(self, pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr("version_id"), + self.lsb_release_attr("release"), + self.distro_release_attr("version_id"), + self._parse_distro_release_content(self.os_release_attr("pretty_name")).get( + "version_id", "" + ), + self._parse_distro_release_content( + self.lsb_release_attr("description") + ).get("version_id", ""), + self.uname_attr("release"), + ] + if self.uname_attr("id").startswith("aix"): + # On AIX platforms, prefer oslevel command output. + versions.insert(0, self.oslevel_info()) + elif self.id() == "debian" or "debian" in self.like().split(): + # On Debian-like, add debian_version file content to candidates list. + versions.append(self._debian_version) + version = "" + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == "": + version = v + else: + for v in versions: + if v != "": + version = v + break + if pretty and version and self.codename(): + version = f"{version} ({self.codename()})" + return version + + def version_parts(self, best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r"(\d+)\.?(\d+)?\.?(\d+)?") + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or "", build_number or "" + return "", "", "" + + def major_version(self, best: bool = False) -> str: + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best: bool = False) -> str: + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best: bool = False) -> str: + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self) -> str: + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr("id_like") or "" + + def codename(self) -> str: + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info["codename"] + except KeyError: + return ( + self.lsb_release_attr("codename") + or self.distro_release_attr("codename") + or "" + ) + + def info(self, pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return InfoDict( + id=self.id(), + version=self.version(pretty, best), + version_parts=VersionDict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best), + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def oslevel_info(self) -> str: + """ + Return AIX' oslevel command output. + """ + return self._oslevel_info + + def os_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, "") + + def lsb_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, "") + + def distro_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, "") + + def uname_attr(self, attribute: str) -> str: + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_attr`. + """ + return self._uname_info.get(attribute, "") + + @cached_property + def _os_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file, encoding="utf-8") as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines: TextIO) -> Dict[str, str]: + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + # Ignore any tokens that are not variable assignments + if "=" in token: + k, v = token.split("=", 1) + props[k.lower()] = v + + if "version" in props: + # extract release codename (if any) from version attribute + match = re.search(r"\((\D+)\)|,\s*(\D+)", props["version"]) + if match: + release_codename = match.group(1) or match.group(2) + props["codename"] = props["release_codename"] = release_codename + + if "version_codename" in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props["codename"] = props["version_codename"] + elif "ubuntu_codename" in props: + # Same as above but a non-standard field name used on older Ubuntus + props["codename"] = props["ubuntu_codename"] + + return props + + @cached_property + def _lsb_release_info(self) -> Dict[str, str]: + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + try: + cmd = ("lsb_release", "-a") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + # Command not found or lsb_release returned error + except (OSError, subprocess.CalledProcessError): + return {} + content = self._to_str(stdout).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]: + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip("\n").split(":", 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(" ", "_").lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self) -> Dict[str, str]: + if not self.include_uname: + return {} + try: + cmd = ("uname", "-rs") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except OSError: + return {} + content = self._to_str(stdout).splitlines() + return self._parse_uname_content(content) + + @cached_property + def _oslevel_info(self) -> str: + if not self.include_oslevel: + return "" + try: + stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL) + except (OSError, subprocess.CalledProcessError): + return "" + return self._to_str(stdout).strip() + + @cached_property + def _debian_version(self) -> str: + try: + with open( + os.path.join(self.etc_dir, "debian_version"), encoding="ascii" + ) as fp: + return fp.readline().rstrip() + except FileNotFoundError: + return "" + + @staticmethod + def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: + if not lines: + return {} + props = {} + match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == "Linux": + return {} + props["id"] = name.lower() + props["name"] = name + props["release"] = version + return props + + @staticmethod + def _to_str(bytestring: bytes) -> str: + encoding = sys.getfilesystemencoding() + return bytestring.decode(encoding) + + @cached_property + def _distro_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file(self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + else: + try: + basenames = [ + basename + for basename in os.listdir(self.etc_dir) + if basename not in _DISTRO_RELEASE_IGNORE_BASENAMES + and os.path.isfile(os.path.join(self.etc_dir, basename)) + ] + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = _DISTRO_RELEASE_BASENAMES + for basename in basenames: + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match is None: + continue + filepath = os.path.join(self.etc_dir, basename) + distro_info = self._parse_distro_release_file(filepath) + # The name is always present if the pattern matches. + if "name" not in distro_info: + continue + self.distro_release_file = filepath + break + else: # the loop didn't "break": no candidate. + return {} + + if match is not None: + distro_info["id"] = match.group(1) + + # CloudLinux < 7: manually enrich info with proper id. + if "cloudlinux" in distro_info.get("name", "").lower(): + distro_info["id"] = "cloudlinux" + + return distro_info + + def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath, encoding="utf-8") as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except OSError: + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/python-distro/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line: str) -> Dict[str, str]: + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info["name"] = matches.group(3)[::-1] + if matches.group(2): + distro_info["version_id"] = matches.group(2)[::-1] + if matches.group(1): + distro_info["codename"] = matches.group(1)[::-1] + elif line: + distro_info["name"] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main() -> None: + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + "--json", "-j", help="Output in machine readable format", action="store_true" + ) + + parser.add_argument( + "--root-dir", + "-r", + type=str, + dest="root_dir", + help="Path to the root filesystem directory (defaults to /)", + ) + + args = parser.parse_args() + + if args.root_dir: + dist = LinuxDistribution( + include_lsb=False, + include_uname=False, + include_oslevel=False, + root_dir=args.root_dir, + ) + else: + dist = _distro + + if args.json: + logger.info(json.dumps(dist.info(), indent=4, sort_keys=True)) + else: + logger.info("Name: %s", dist.name(pretty=True)) + distribution_version = dist.version(pretty=True) + logger.info("Version: %s", distribution_version) + distribution_codename = dist.codename() + logger.info("Codename: %s", distribution_codename) + + +if __name__ == "__main__": + main() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distro/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/distro/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..a40eeaf --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,44 @@ +from .package_data import __version__ +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 + +__all__ = [ + "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/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04b431248d8e54ca62092a2736b08626f488650b GIT binary patch literal 900 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f61bd4d7f5a12ea1ca57cdce4f4127b2ef8a80fd GIT binary patch literal 15810 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 Cdd5%y literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bbdc3408c0c139421670bcd7d80eace767eb14f GIT binary patch literal 99495 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 C@mInC literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc529dd41e5b80cc906cad10320bb454973519d3 GIT binary patch literal 2652 zcmZuyO>7fK6rTNaf*t42B7~ok34t~XiA`cas0yvrq)_oI2%t7lEgSFHS+d?WvunVq zQ_`x3q(y3^B4KXkX2d1EaqO{DFZn^OwLN3CPQB1KvvxudBkj(6^M2;doA15( zEgB6Y7@um_GhZ|z^fzM~BUC5W?*s7=8E66-f+1SMgaET-iCJkv%E}Y6fDD;PMA->? zhC*bb7@@StxU_6EeJ4+ZjAmHd2A@KdbjS$9T9XmsJZQsOL%Rhe%|;X?t#A4PyKP|C z2GVdrRNM7!0z%{{+M(HS zf4}SL)EgSW#5RW10UYqdoF7(kJRVo$`0^Bs*LLr~=FId~p19oAzB{^$@8Y`quxWF# zL(Pn7>lQ!Y$NL~A?3r1DFZ5eZroWHJt*Y_xOLkG`RneEvLMD9Waz1AfUtwv{{17Ex zp4#ygWNc$J10}(?-VUn|k+&f$qNjCwR>+`P(GX@Ok7@GZDGjP9H1rzt82a)mLbGyF zHpCfFdzbFCh!E{83PqWLgUx|12aY%cP@L`u4dMR#Ad>=FLuVJ7Rf^(G0O{Mq+tyeq zDu%>8D~3?_38JU4D;teS1yq!0rTd@D$cqFLh(&Bj$B`=QyCDge8n+EM|2D!fTo-_e zzy;bV!jM39J44(L!x%;#4BBCS``Y0RIA{SrGzJichym>8Q&Vu)y0_)Rxt9i-u}%pl zclDHK6+p{z2_R+Dj^j=<@yH2S9%1kU1~7?T2cTlc!`#^=9$w(ePB{iK*b!XQ&RCmR zuY(qkjNs%jE;3&bqV0H0*JGe^H z_)!g#1Y2r>OyQo?5M^NUBY~mDG7MPdVftZ92k73Rrbm3i^rNXfrBHT(1DEwBmS&9q za}rZ<%0xClrDvh$6Jt&)p9M`famw^Q%TFeT4j&#I(+lq4h4kPk#E>BN?Sy4cCUONx zrJalq4JTaKW-zCxrggZ%M9$15H0UdaLldT9>j}7rAgp+<;Kw#NElr&)51V#DKnzK4 z8GduB=38flroxR87hTfDZ` z(YqSyt+wqd4J~|K-d(v^x%FgxrFUqlccnME+Lo-gcUQan%BL&09-m$6SQ`2{w%mPm zK3Z*V{V}=_eUL4m1I_(Mma@NmvU2Ryue~eB&a8EvecpVoy1i>5T#KUC0}xS5$70tH zCzj>zb%+u93Wtp^!8ud)@?h(T(Y!Hq0`U+Pq2td0UleAb@Srrr^Di+-o&ZI=fuO9+ zTxNwa-Od(T8$S$$+X25hRE6CyEu1MOS0a0t<-K$Vtoj1o(vsM&d}o%;`p!_;5P>)Y zNK1>byL6uJ2C2pLUf+9tPeODLkg7o6gUMxp459$c8DtZ4vLsx?S zCQOe(!g{@po>uRA&<9yspR)77xDM%^m7)8|MTqLIIK2z3l%m4BsaTMppGj}@z>Ut# ze-IW#+^f@d(YDHnfH`zQIy*1E=BPblJ1$UjQfLe4sZA8a#MADFcze)%Dd)Jp%oL%i zn3*Zh7c`e;iWNQ#jyAtzvmW8~_H@&xD(HLwpZg8`=FmUUU8N)CjFHqSIbw|!UJ=owGe8K%wPQW&WoU`ki$|VEdP)aY zBR$pFj+%s8Ft@os4)t_xwW<3>XHPj)b{|L9ItLb-z)0st-;aQLHPX&urAGWFO*5R7 zrqO*66&$jVgWgLSrYM7oFR_C#bOr^)0PD+>j$`rjaF}yf!Lgf1vW}6r$VW5|iVP?2 zJp5{sAPE18iXgAIBBAv!w6`Y5gq0mLqJxpEG3^wOUIvR>x``(6oj5qtcGAJ zC;3!Kt~0I{5`=-pakey2x>8P7r1J4cU<7QfxlQOOjn)uMmF*RGX|!_pNe^eAU4F$@ Hd8GdXh%u)C literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ac34e7d15bc239a6ddec2bab752e68e2e8b00e7 GIT binary patch literal 235 zcmX@j%ge<81g`Nh>7qdTF^B^Lj8MjB4j^MXLkdF_LnWgoQx&tZp1GeU<1Oy^__EZZ z;>`TK`1q9!pFygB73pW>=celCmS!a8<|d}-yW}UA=BDPA6zjWZmUxsV=^Gjt=(;3U z7VG+_={o19r0S>UmFeeXCg~ScmSp7T8S5Du=@(~~r0NzVCTAz6rxxoMWESWHEy_#D zFVfFU$xGCS%EYH6mL%#GRNmsS$<0qG%}KQ@Vgot>(=#VgYgi Du^T|+ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6bbfece0dc51d17ac9f4829f3cd2d6e695d1951 GIT binary patch literal 158867 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%0DRor6V{h*1 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 z⩓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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/codec.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..c855a4d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re +from typing import Any, Tuple, Optional + +_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, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + +codecs.register(search_function) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/compat.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..786e6bd --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,13 @@ +from .core import * +from .codec import * +from typing import Any, Union + +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/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..0dae61a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,395 @@ +from . import idnadata +import bisect +import unicodedata +import re +from typing import Union, Optional +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 = None # type: Optional[str] + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {} 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']): + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + 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 = 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 = None # type: Optional[str] + 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/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..c61dcf9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,4245 @@ +# This file is automatically generated by tools/idna-data + +__version__ = '15.1.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, + 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, + 0x10eab: 84, + 0x10eac: 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, + 0x11438: 84, + 0x11439: 84, + 0x1143a: 84, + 0x1143b: 84, + 0x1143c: 84, + 0x1143d: 84, + 0x1143e: 84, + 0x1143f: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145e: 84, + 0x114b3: 84, + 0x114b4: 84, + 0x114b5: 84, + 0x114b6: 84, + 0x114b7: 84, + 0x114b8: 84, + 0x114ba: 84, + 0x114bf: 84, + 0x114c0: 84, + 0x114c2: 84, + 0x114c3: 84, + 0x115b2: 84, + 0x115b3: 84, + 0x115b4: 84, + 0x115b5: 84, + 0x115bc: 84, + 0x115bd: 84, + 0x115bf: 84, + 0x115c0: 84, + 0x115dc: 84, + 0x115dd: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163a: 84, + 0x1163d: 84, + 0x1163f: 84, + 0x11640: 84, + 0x116ab: 84, + 0x116ad: 84, + 0x116b0: 84, + 0x116b1: 84, + 0x116b2: 84, + 0x116b3: 84, + 0x116b4: 84, + 0x116b5: 84, + 0x116b7: 84, + 0x1171d: 84, + 0x1171e: 84, + 0x1171f: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172a: 84, + 0x1172b: 84, + 0x1182f: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183a: 84, + 0x1193b: 84, + 0x1193c: 84, + 0x1193e: 84, + 0x11943: 84, + 0x119d4: 84, + 0x119d5: 84, + 0x119d6: 84, + 0x119d7: 84, + 0x119da: 84, + 0x119db: 84, + 0x119e0: 84, + 0x11a01: 84, + 0x11a02: 84, + 0x11a03: 84, + 0x11a04: 84, + 0x11a05: 84, + 0x11a06: 84, + 0x11a07: 84, + 0x11a08: 84, + 0x11a09: 84, + 0x11a0a: 84, + 0x11a33: 84, + 0x11a34: 84, + 0x11a35: 84, + 0x11a36: 84, + 0x11a37: 84, + 0x11a38: 84, + 0x11a3b: 84, + 0x11a3c: 84, + 0x11a3d: 84, + 0x11a3e: 84, + 0x11a47: 84, + 0x11a51: 84, + 0x11a52: 84, + 0x11a53: 84, + 0x11a54: 84, + 0x11a55: 84, + 0x11a56: 84, + 0x11a59: 84, + 0x11a5a: 84, + 0x11a5b: 84, + 0x11a8a: 84, + 0x11a8b: 84, + 0x11a8c: 84, + 0x11a8d: 84, + 0x11a8e: 84, + 0x11a8f: 84, + 0x11a90: 84, + 0x11a91: 84, + 0x11a92: 84, + 0x11a93: 84, + 0x11a94: 84, + 0x11a95: 84, + 0x11a96: 84, + 0x11a98: 84, + 0x11a99: 84, + 0x11c30: 84, + 0x11c31: 84, + 0x11c32: 84, + 0x11c33: 84, + 0x11c34: 84, + 0x11c35: 84, + 0x11c36: 84, + 0x11c38: 84, + 0x11c39: 84, + 0x11c3a: 84, + 0x11c3b: 84, + 0x11c3c: 84, + 0x11c3d: 84, + 0x11c3f: 84, + 0x11c92: 84, + 0x11c93: 84, + 0x11c94: 84, + 0x11c95: 84, + 0x11c96: 84, + 0x11c97: 84, + 0x11c98: 84, + 0x11c99: 84, + 0x11c9a: 84, + 0x11c9b: 84, + 0x11c9c: 84, + 0x11c9d: 84, + 0x11c9e: 84, + 0x11c9f: 84, + 0x11ca0: 84, + 0x11ca1: 84, + 0x11ca2: 84, + 0x11ca3: 84, + 0x11ca4: 84, + 0x11ca5: 84, + 0x11ca6: 84, + 0x11ca7: 84, + 0x11caa: 84, + 0x11cab: 84, + 0x11cac: 84, + 0x11cad: 84, + 0x11cae: 84, + 0x11caf: 84, + 0x11cb0: 84, + 0x11cb2: 84, + 0x11cb3: 84, + 0x11cb5: 84, + 0x11cb6: 84, + 0x11d31: 84, + 0x11d32: 84, + 0x11d33: 84, + 0x11d34: 84, + 0x11d35: 84, + 0x11d36: 84, + 0x11d3a: 84, + 0x11d3c: 84, + 0x11d3d: 84, + 0x11d3f: 84, + 0x11d40: 84, + 0x11d41: 84, + 0x11d42: 84, + 0x11d43: 84, + 0x11d44: 84, + 0x11d45: 84, + 0x11d47: 84, + 0x11d90: 84, + 0x11d91: 84, + 0x11d95: 84, + 0x11d97: 84, + 0x11ef3: 84, + 0x11ef4: 84, + 0x11f00: 84, + 0x11f01: 84, + 0x11f36: 84, + 0x11f37: 84, + 0x11f38: 84, + 0x11f39: 84, + 0x11f3a: 84, + 0x11f40: 84, + 0x11f42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343a: 84, + 0x1343b: 84, + 0x1343c: 84, + 0x1343d: 84, + 0x1343e: 84, + 0x1343f: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344a: 84, + 0x1344b: 84, + 0x1344c: 84, + 0x1344d: 84, + 0x1344e: 84, + 0x1344f: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16af0: 84, + 0x16af1: 84, + 0x16af2: 84, + 0x16af3: 84, + 0x16af4: 84, + 0x16b30: 84, + 0x16b31: 84, + 0x16b32: 84, + 0x16b33: 84, + 0x16b34: 84, + 0x16b35: 84, + 0x16b36: 84, + 0x16f4f: 84, + 0x16f8f: 84, + 0x16f90: 84, + 0x16f91: 84, + 0x16f92: 84, + 0x16fe4: 84, + 0x1bc9d: 84, + 0x1bc9e: 84, + 0x1bca0: 84, + 0x1bca1: 84, + 0x1bca2: 84, + 0x1bca3: 84, + 0x1cf00: 84, + 0x1cf01: 84, + 0x1cf02: 84, + 0x1cf03: 84, + 0x1cf04: 84, + 0x1cf05: 84, + 0x1cf06: 84, + 0x1cf07: 84, + 0x1cf08: 84, + 0x1cf09: 84, + 0x1cf0a: 84, + 0x1cf0b: 84, + 0x1cf0c: 84, + 0x1cf0d: 84, + 0x1cf0e: 84, + 0x1cf0f: 84, + 0x1cf10: 84, + 0x1cf11: 84, + 0x1cf12: 84, + 0x1cf13: 84, + 0x1cf14: 84, + 0x1cf15: 84, + 0x1cf16: 84, + 0x1cf17: 84, + 0x1cf18: 84, + 0x1cf19: 84, + 0x1cf1a: 84, + 0x1cf1b: 84, + 0x1cf1c: 84, + 0x1cf1d: 84, + 0x1cf1e: 84, + 0x1cf1f: 84, + 0x1cf20: 84, + 0x1cf21: 84, + 0x1cf22: 84, + 0x1cf23: 84, + 0x1cf24: 84, + 0x1cf25: 84, + 0x1cf26: 84, + 0x1cf27: 84, + 0x1cf28: 84, + 0x1cf29: 84, + 0x1cf2a: 84, + 0x1cf2b: 84, + 0x1cf2c: 84, + 0x1cf2d: 84, + 0x1cf30: 84, + 0x1cf31: 84, + 0x1cf32: 84, + 0x1cf33: 84, + 0x1cf34: 84, + 0x1cf35: 84, + 0x1cf36: 84, + 0x1cf37: 84, + 0x1cf38: 84, + 0x1cf39: 84, + 0x1cf3a: 84, + 0x1cf3b: 84, + 0x1cf3c: 84, + 0x1cf3d: 84, + 0x1cf3e: 84, + 0x1cf3f: 84, + 0x1cf40: 84, + 0x1cf41: 84, + 0x1cf42: 84, + 0x1cf43: 84, + 0x1cf44: 84, + 0x1cf45: 84, + 0x1cf46: 84, + 0x1d167: 84, + 0x1d168: 84, + 0x1d169: 84, + 0x1d173: 84, + 0x1d174: 84, + 0x1d175: 84, + 0x1d176: 84, + 0x1d177: 84, + 0x1d178: 84, + 0x1d179: 84, + 0x1d17a: 84, + 0x1d17b: 84, + 0x1d17c: 84, + 0x1d17d: 84, + 0x1d17e: 84, + 0x1d17f: 84, + 0x1d180: 84, + 0x1d181: 84, + 0x1d182: 84, + 0x1d185: 84, + 0x1d186: 84, + 0x1d187: 84, + 0x1d188: 84, + 0x1d189: 84, + 0x1d18a: 84, + 0x1d18b: 84, + 0x1d1aa: 84, + 0x1d1ab: 84, + 0x1d1ac: 84, + 0x1d1ad: 84, + 0x1d242: 84, + 0x1d243: 84, + 0x1d244: 84, + 0x1da00: 84, + 0x1da01: 84, + 0x1da02: 84, + 0x1da03: 84, + 0x1da04: 84, + 0x1da05: 84, + 0x1da06: 84, + 0x1da07: 84, + 0x1da08: 84, + 0x1da09: 84, + 0x1da0a: 84, + 0x1da0b: 84, + 0x1da0c: 84, + 0x1da0d: 84, + 0x1da0e: 84, + 0x1da0f: 84, + 0x1da10: 84, + 0x1da11: 84, + 0x1da12: 84, + 0x1da13: 84, + 0x1da14: 84, + 0x1da15: 84, + 0x1da16: 84, + 0x1da17: 84, + 0x1da18: 84, + 0x1da19: 84, + 0x1da1a: 84, + 0x1da1b: 84, + 0x1da1c: 84, + 0x1da1d: 84, + 0x1da1e: 84, + 0x1da1f: 84, + 0x1da20: 84, + 0x1da21: 84, + 0x1da22: 84, + 0x1da23: 84, + 0x1da24: 84, + 0x1da25: 84, + 0x1da26: 84, + 0x1da27: 84, + 0x1da28: 84, + 0x1da29: 84, + 0x1da2a: 84, + 0x1da2b: 84, + 0x1da2c: 84, + 0x1da2d: 84, + 0x1da2e: 84, + 0x1da2f: 84, + 0x1da30: 84, + 0x1da31: 84, + 0x1da32: 84, + 0x1da33: 84, + 0x1da34: 84, + 0x1da35: 84, + 0x1da36: 84, + 0x1da3b: 84, + 0x1da3c: 84, + 0x1da3d: 84, + 0x1da3e: 84, + 0x1da3f: 84, + 0x1da40: 84, + 0x1da41: 84, + 0x1da42: 84, + 0x1da43: 84, + 0x1da44: 84, + 0x1da45: 84, + 0x1da46: 84, + 0x1da47: 84, + 0x1da48: 84, + 0x1da49: 84, + 0x1da4a: 84, + 0x1da4b: 84, + 0x1da4c: 84, + 0x1da4d: 84, + 0x1da4e: 84, + 0x1da4f: 84, + 0x1da50: 84, + 0x1da51: 84, + 0x1da52: 84, + 0x1da53: 84, + 0x1da54: 84, + 0x1da55: 84, + 0x1da56: 84, + 0x1da57: 84, + 0x1da58: 84, + 0x1da59: 84, + 0x1da5a: 84, + 0x1da5b: 84, + 0x1da5c: 84, + 0x1da5d: 84, + 0x1da5e: 84, + 0x1da5f: 84, + 0x1da60: 84, + 0x1da61: 84, + 0x1da62: 84, + 0x1da63: 84, + 0x1da64: 84, + 0x1da65: 84, + 0x1da66: 84, + 0x1da67: 84, + 0x1da68: 84, + 0x1da69: 84, + 0x1da6a: 84, + 0x1da6b: 84, + 0x1da6c: 84, + 0x1da75: 84, + 0x1da84: 84, + 0x1da9b: 84, + 0x1da9c: 84, + 0x1da9d: 84, + 0x1da9e: 84, + 0x1da9f: 84, + 0x1daa1: 84, + 0x1daa2: 84, + 0x1daa3: 84, + 0x1daa4: 84, + 0x1daa5: 84, + 0x1daa6: 84, + 0x1daa7: 84, + 0x1daa8: 84, + 0x1daa9: 84, + 0x1daaa: 84, + 0x1daab: 84, + 0x1daac: 84, + 0x1daad: 84, + 0x1daae: 84, + 0x1daaf: 84, + 0x1e000: 84, + 0x1e001: 84, + 0x1e002: 84, + 0x1e003: 84, + 0x1e004: 84, + 0x1e005: 84, + 0x1e006: 84, + 0x1e008: 84, + 0x1e009: 84, + 0x1e00a: 84, + 0x1e00b: 84, + 0x1e00c: 84, + 0x1e00d: 84, + 0x1e00e: 84, + 0x1e00f: 84, + 0x1e010: 84, + 0x1e011: 84, + 0x1e012: 84, + 0x1e013: 84, + 0x1e014: 84, + 0x1e015: 84, + 0x1e016: 84, + 0x1e017: 84, + 0x1e018: 84, + 0x1e01b: 84, + 0x1e01c: 84, + 0x1e01d: 84, + 0x1e01e: 84, + 0x1e01f: 84, + 0x1e020: 84, + 0x1e021: 84, + 0x1e023: 84, + 0x1e024: 84, + 0x1e026: 84, + 0x1e027: 84, + 0x1e028: 84, + 0x1e029: 84, + 0x1e02a: 84, + 0x1e08f: 84, + 0x1e130: 84, + 0x1e131: 84, + 0x1e132: 84, + 0x1e133: 84, + 0x1e134: 84, + 0x1e135: 84, + 0x1e136: 84, + 0x1e2ae: 84, + 0x1e2ec: 84, + 0x1e2ed: 84, + 0x1e2ee: 84, + 0x1e2ef: 84, + 0x1e4ec: 84, + 0x1e4ed: 84, + 0x1e4ee: 84, + 0x1e4ef: 84, + 0x1e8d0: 84, + 0x1e8d1: 84, + 0x1e8d2: 84, + 0x1e8d3: 84, + 0x1e8d4: 84, + 0x1e8d5: 84, + 0x1e8d6: 84, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 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, + 0x898000008e2, + 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, + 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, + 0xa7d10000a7d2, + 0xa7d30000a7d4, + 0xa7d50000a7d6, + 0xa7d70000a7d8, + 0xa7d90000a7da, + 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, + 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, + 0x10e8000010eaa, + 0x10eab00010ead, + 0x10eb000010eb2, + 0x10efd00010f1d, + 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, + 0x114000001144b, + 0x114500001145a, + 0x1145e00011462, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b9, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x1174000011747, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011907, + 0x119090001190a, + 0x1190c00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193b00011944, + 0x119500001195a, + 0x119a0000119a8, + 0x119aa000119d8, + 0x119da000119e2, + 0x119e3000119e5, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a9a, + 0x11a9d00011a9e, + 0x11ab000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x11f0000011f11, + 0x11f1200011f3b, + 0x11f3e00011f43, + 0x11f5000011f5a, + 0x11fb000011fb1, + 0x120000001239a, + 0x1248000012544, + 0x12f9000012ff1, + 0x1300000013430, + 0x1344000013456, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16a7000016abf, + 0x16ac000016aca, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f4b, + 0x16f4f00016f88, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x16fe300016fe5, + 0x16ff000016ff2, + 0x17000000187f8, + 0x1880000018cd6, + 0x18d0000018d09, + 0x1aff00001aff4, + 0x1aff50001affc, + 0x1affd0001afff, + 0x1b0000001b123, + 0x1b1320001b133, + 0x1b1500001b153, + 0x1b1550001b156, + 0x1b1640001b168, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1cf000001cf2e, + 0x1cf300001cf47, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1df000001df1f, + 0x1df250001df2b, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e08f0001e090, + 0x1e1000001e12d, + 0x1e1300001e13e, + 0x1e1400001e14a, + 0x1e14e0001e14f, + 0x1e2900001e2af, + 0x1e2c00001e2fa, + 0x1e4d00001e4fa, + 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/env/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..6a43b04 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,54 @@ +""" +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/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..ed81113 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '3.7' + diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/idna/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py b/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..6a1eddb --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8598 @@ +# 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__ = '15.1.0' +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', '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, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (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, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', ' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', ' ̈'), + (0xA9, 'V'), + (0xAA, 'M', 'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', ' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', '2'), + (0xB3, 'M', '3'), + (0xB4, '3', ' ́'), + (0xB5, 'M', 'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', ' ̧'), + (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, '3', ' ̆'), + (0x2D9, '3', ' ̇'), + (0x2DA, '3', ' ̊'), + (0x2DB, '3', ' ̨'), + (0x2DC, '3', ' ̃'), + (0x2DD, '3', ' ̋'), + (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, '3', ' ι'), + (0x37B, 'V'), + (0x37E, '3', ';'), + (0x37F, 'M', 'ϳ'), + (0x380, 'X'), + (0x384, '3', ' ́'), + (0x385, '3', ' ̈́'), + (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, 'X'), + (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'), + (0x898, '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, 'X'), + (0x10C7, 'M', 'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', 'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', 'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (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'), + ] + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x180F, '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'), + (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'), + (0x1B50, 'V'), + (0x1B7F, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', 'в'), + ] + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, 'M', 'д'), + (0x1C82, 'M', 'о'), + (0x1C83, 'M', 'с'), + (0x1C84, 'M', 'т'), + (0x1C86, 'M', 'ъ'), + (0x1C87, 'M', 'ѣ'), + (0x1C88, 'M', 'ꙋ'), + (0x1C89, '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'), + (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', 'ɔ'), + ] + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ỏ'), + (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', 'ự'), + ] + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ὕ'), + (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', 'ἇι'), + ] + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, '3', ' ̓'), + (0x1FBE, 'M', 'ι'), + (0x1FBF, '3', ' ̓'), + (0x1FC0, '3', ' ͂'), + (0x1FC1, '3', ' ̈͂'), + (0x1FC2, 'M', 'ὴι'), + (0x1FC3, 'M', 'ηι'), + (0x1FC4, 'M', 'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', 'ῆι'), + (0x1FC8, 'M', 'ὲ'), + (0x1FC9, 'M', 'έ'), + (0x1FCA, 'M', 'ὴ'), + (0x1FCB, 'M', 'ή'), + (0x1FCC, 'M', 'ηι'), + (0x1FCD, '3', ' ̓̀'), + (0x1FCE, '3', ' ̓́'), + (0x1FCF, '3', ' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', 'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', 'ῐ'), + (0x1FD9, 'M', 'ῑ'), + (0x1FDA, 'M', 'ὶ'), + (0x1FDB, 'M', 'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', ' ̔̀'), + (0x1FDE, '3', ' ̔́'), + (0x1FDF, '3', ' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', 'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', 'ῠ'), + (0x1FE9, 'M', 'ῡ'), + (0x1FEA, 'M', 'ὺ'), + (0x1FEB, 'M', 'ύ'), + (0x1FEC, 'M', 'ῥ'), + (0x1FED, '3', ' ̈̀'), + (0x1FEE, '3', ' ̈́'), + (0x1FEF, '3', '`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', 'ὼι'), + (0x1FF3, 'M', 'ωι'), + (0x1FF4, 'M', 'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + ] + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, 'M', 'ῶι'), + (0x1FF8, 'M', 'ὸ'), + (0x1FF9, 'M', 'ό'), + (0x1FFA, 'M', 'ὼ'), + (0x1FFB, 'M', 'ώ'), + (0x1FFC, 'M', 'ωι'), + (0x1FFD, '3', ' ́'), + (0x1FFE, '3', ' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', ' '), + (0x200B, 'I'), + (0x200C, 'D', ''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', '‐'), + (0x2012, 'V'), + (0x2017, '3', ' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', ' '), + (0x2030, 'V'), + (0x2033, 'M', '′′'), + (0x2034, 'M', '′′′'), + (0x2035, 'V'), + (0x2036, 'M', '‵‵'), + (0x2037, 'M', '‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', '!!'), + (0x203D, 'V'), + (0x203E, '3', ' ̅'), + (0x203F, 'V'), + (0x2047, '3', '??'), + (0x2048, '3', '?!'), + (0x2049, '3', '!?'), + (0x204A, 'V'), + (0x2057, 'M', '′′′′'), + (0x2058, 'V'), + (0x205F, '3', ' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (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, '3', '+'), + (0x207B, 'M', '−'), + (0x207C, '3', '='), + (0x207D, '3', '('), + (0x207E, '3', ')'), + (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'), + (0x2088, 'M', '8'), + (0x2089, 'M', '9'), + (0x208A, '3', '+'), + (0x208B, 'M', '−'), + (0x208C, '3', '='), + (0x208D, '3', '('), + (0x208E, '3', ')'), + (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, '3', 'a/c'), + (0x2101, '3', 'a/s'), + (0x2102, 'M', 'c'), + (0x2103, 'M', '°c'), + (0x2104, 'V'), + ] + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, '3', 'c/o'), + (0x2106, '3', '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, 'X'), + (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'), + (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'), + ] + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, 'M', 'c'), + (0x217E, 'M', 'd'), + (0x217F, 'M', 'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (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'), + (0x2427, '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, '3', '(1)'), + (0x2475, '3', '(2)'), + (0x2476, '3', '(3)'), + (0x2477, '3', '(4)'), + (0x2478, '3', '(5)'), + (0x2479, '3', '(6)'), + (0x247A, '3', '(7)'), + (0x247B, '3', '(8)'), + (0x247C, '3', '(9)'), + (0x247D, '3', '(10)'), + (0x247E, '3', '(11)'), + (0x247F, '3', '(12)'), + (0x2480, '3', '(13)'), + (0x2481, '3', '(14)'), + (0x2482, '3', '(15)'), + (0x2483, '3', '(16)'), + (0x2484, '3', '(17)'), + (0x2485, '3', '(18)'), + (0x2486, '3', '(19)'), + (0x2487, '3', '(20)'), + (0x2488, 'X'), + (0x249C, '3', '(a)'), + (0x249D, '3', '(b)'), + (0x249E, '3', '(c)'), + (0x249F, '3', '(d)'), + (0x24A0, '3', '(e)'), + (0x24A1, '3', '(f)'), + (0x24A2, '3', '(g)'), + (0x24A3, '3', '(h)'), + (0x24A4, '3', '(i)'), + (0x24A5, '3', '(j)'), + (0x24A6, '3', '(k)'), + (0x24A7, '3', '(l)'), + (0x24A8, '3', '(m)'), + (0x24A9, '3', '(n)'), + (0x24AA, '3', '(o)'), + (0x24AB, '3', '(p)'), + (0x24AC, '3', '(q)'), + (0x24AD, '3', '(r)'), + (0x24AE, '3', '(s)'), + (0x24AF, '3', '(t)'), + (0x24B0, '3', '(u)'), + (0x24B1, '3', '(v)'), + (0x24B2, '3', '(w)'), + (0x24B3, '3', '(x)'), + (0x24B4, '3', '(y)'), + (0x24B5, '3', '(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'), + ] + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, '3', '::='), + (0x2A75, '3', '=='), + (0x2A76, '3', '==='), + (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', 'ⰻ'), + (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', 'ⱜ'), + ] + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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', 'ⳇ'), + ] + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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', '卩'), + ] + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '牛'), + (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', '而'), + ] + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '鬲'), + (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, '3', ' '), + (0x3001, 'V'), + (0x3002, 'M', '.'), + (0x3003, 'V'), + (0x3036, 'M', '〒'), + (0x3037, 'V'), + (0x3038, 'M', '十'), + (0x3039, 'M', '卄'), + (0x303A, 'M', '卅'), + (0x303B, 'V'), + (0x3040, 'X'), + ] + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', ' ゙'), + (0x309C, '3', ' ゚'), + (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, 'X'), + (0x3165, 'M', 'ᄔ'), + (0x3166, 'M', 'ᄕ'), + (0x3167, 'M', 'ᇇ'), + (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', 'ᆅ'), + ] + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', '(ᄀ)'), + (0x3201, '3', '(ᄂ)'), + (0x3202, '3', '(ᄃ)'), + (0x3203, '3', '(ᄅ)'), + (0x3204, '3', '(ᄆ)'), + (0x3205, '3', '(ᄇ)'), + (0x3206, '3', '(ᄉ)'), + (0x3207, '3', '(ᄋ)'), + (0x3208, '3', '(ᄌ)'), + (0x3209, '3', '(ᄎ)'), + (0x320A, '3', '(ᄏ)'), + (0x320B, '3', '(ᄐ)'), + (0x320C, '3', '(ᄑ)'), + (0x320D, '3', '(ᄒ)'), + (0x320E, '3', '(가)'), + (0x320F, '3', '(나)'), + (0x3210, '3', '(다)'), + (0x3211, '3', '(라)'), + (0x3212, '3', '(마)'), + (0x3213, '3', '(바)'), + (0x3214, '3', '(사)'), + (0x3215, '3', '(아)'), + (0x3216, '3', '(자)'), + (0x3217, '3', '(차)'), + (0x3218, '3', '(카)'), + (0x3219, '3', '(타)'), + (0x321A, '3', '(파)'), + (0x321B, '3', '(하)'), + (0x321C, '3', '(주)'), + (0x321D, '3', '(오전)'), + (0x321E, '3', '(오후)'), + (0x321F, 'X'), + (0x3220, '3', '(一)'), + (0x3221, '3', '(二)'), + (0x3222, '3', '(三)'), + (0x3223, '3', '(四)'), + (0x3224, '3', '(五)'), + (0x3225, '3', '(六)'), + (0x3226, '3', '(七)'), + (0x3227, '3', '(八)'), + (0x3228, '3', '(九)'), + (0x3229, '3', '(十)'), + (0x322A, '3', '(月)'), + (0x322B, '3', '(火)'), + (0x322C, '3', '(水)'), + (0x322D, '3', '(木)'), + (0x322E, '3', '(金)'), + (0x322F, '3', '(土)'), + (0x3230, '3', '(日)'), + (0x3231, '3', '(株)'), + (0x3232, '3', '(有)'), + (0x3233, '3', '(社)'), + (0x3234, '3', '(名)'), + (0x3235, '3', '(特)'), + (0x3236, '3', '(財)'), + (0x3237, '3', '(祝)'), + (0x3238, '3', '(労)'), + (0x3239, '3', '(代)'), + (0x323A, '3', '(呼)'), + (0x323B, '3', '(学)'), + (0x323C, '3', '(監)'), + (0x323D, '3', '(企)'), + (0x323E, '3', '(資)'), + (0x323F, '3', '(協)'), + (0x3240, '3', '(祭)'), + (0x3241, '3', '(休)'), + (0x3242, '3', '(自)'), + (0x3243, '3', '(至)'), + (0x3244, 'M', '問'), + (0x3245, 'M', '幼'), + (0x3246, 'M', '文'), + (0x3247, 'M', '箏'), + (0x3248, 'V'), + (0x3250, 'M', 'pte'), + (0x3251, 'M', '21'), + ] + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3252, 'M', '22'), + (0x3253, 'M', '23'), + (0x3254, 'M', '24'), + (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', '名'), + (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'), + ] + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ル'), + (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', 'グラムトン'), + ] + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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点'), + (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', '大正'), + ] + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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ω'), + (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日'), + ] + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ꙟ'), + (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'), + ] + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (0xA7C9, 'M', 'ꟊ'), + (0xA7CA, 'V'), + (0xA7CB, 'X'), + (0xA7D0, 'M', 'ꟑ'), + (0xA7D1, 'V'), + (0xA7D2, 'X'), + (0xA7D3, 'V'), + (0xA7D4, 'X'), + (0xA7D5, 'V'), + (0xA7D6, 'M', 'ꟗ'), + (0xA7D7, 'V'), + (0xA7D8, 'M', 'ꟙ'), + (0xA7D9, 'V'), + (0xA7DA, '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'), + ] + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'Ꮇ'), + (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', 'Ꮮ'), + ] + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '濫'), + (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', '雷'), + ] + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '閭'), + (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', '玲'), + ] + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '離'), + (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', '晴'), + ] + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '禎'), + (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', '塚'), + ] + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '調'), + (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'), + ] + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, '3', '+'), + (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', 'پ'), + (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', 'ى'), + ] + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'قح'), + (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', 'يي'), + ] + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC5B, 'M', 'ذٰ'), + (0xFC5C, 'M', 'رٰ'), + (0xFC5D, 'M', 'ىٰ'), + (0xFC5E, '3', ' ٌّ'), + (0xFC5F, '3', ' ٍّ'), + (0xFC60, '3', ' َّ'), + (0xFC61, '3', ' ُّ'), + (0xFC62, '3', ' ِّ'), + (0xFC63, '3', ' ّٰ'), + (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', 'ئج'), + (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', 'فج'), + ] + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'سى'), + (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', 'صي'), + ] + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'فخم'), + (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', 'شحي'), + ] + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, '3', 'صلى الله عليه وسلم'), + (0xFDFB, '3', 'جل جلاله'), + (0xFDFC, 'M', 'ریال'), + (0xFDFD, 'V'), + (0xFE00, 'I'), + (0xFE10, '3', ','), + (0xFE11, 'M', '、'), + (0xFE12, 'X'), + (0xFE13, '3', ':'), + (0xFE14, '3', ';'), + (0xFE15, '3', '!'), + (0xFE16, '3', '?'), + (0xFE17, 'M', '〖'), + (0xFE18, 'M', '〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', '—'), + (0xFE32, 'M', '–'), + (0xFE33, '3', '_'), + (0xFE35, '3', '('), + (0xFE36, '3', ')'), + (0xFE37, '3', '{'), + (0xFE38, '3', '}'), + (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, '3', '['), + (0xFE48, '3', ']'), + (0xFE49, '3', ' ̅'), + (0xFE4D, '3', '_'), + (0xFE50, '3', ','), + (0xFE51, 'M', '、'), + (0xFE52, 'X'), + (0xFE54, '3', ';'), + (0xFE55, '3', ':'), + (0xFE56, '3', '?'), + (0xFE57, '3', '!'), + (0xFE58, 'M', '—'), + (0xFE59, '3', '('), + (0xFE5A, '3', ')'), + (0xFE5B, '3', '{'), + (0xFE5C, '3', '}'), + (0xFE5D, 'M', '〔'), + (0xFE5E, 'M', '〕'), + (0xFE5F, '3', '#'), + (0xFE60, '3', '&'), + (0xFE61, '3', '*'), + ] + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE62, '3', '+'), + (0xFE63, 'M', '-'), + (0xFE64, '3', '<'), + (0xFE65, '3', '>'), + (0xFE66, '3', '='), + (0xFE67, 'X'), + (0xFE68, '3', '\\'), + (0xFE69, '3', '$'), + (0xFE6A, '3', '%'), + (0xFE6B, '3', '@'), + (0xFE6C, 'X'), + (0xFE70, '3', ' ً'), + (0xFE71, 'M', 'ـً'), + (0xFE72, '3', ' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', ' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', ' َ'), + (0xFE77, 'M', 'ـَ'), + (0xFE78, '3', ' ُ'), + (0xFE79, 'M', 'ـُ'), + (0xFE7A, '3', ' ِ'), + (0xFE7B, 'M', 'ـِ'), + (0xFE7C, '3', ' ّ'), + (0xFE7D, 'M', 'ـّ'), + (0xFE7E, '3', ' ْ'), + (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', 'و'), + (0xFEEF, 'M', 'ى'), + (0xFEF1, 'M', 'ي'), + (0xFEF5, 'M', 'لآ'), + (0xFEF7, 'M', 'لأ'), + (0xFEF9, 'M', 'لإ'), + (0xFEFB, 'M', 'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', '!'), + (0xFF02, '3', '"'), + (0xFF03, '3', '#'), + (0xFF04, '3', '$'), + (0xFF05, '3', '%'), + (0xFF06, '3', '&'), + (0xFF07, '3', '\''), + (0xFF08, '3', '('), + (0xFF09, '3', ')'), + (0xFF0A, '3', '*'), + (0xFF0B, '3', '+'), + (0xFF0C, '3', ','), + (0xFF0D, 'M', '-'), + (0xFF0E, 'M', '.'), + (0xFF0F, '3', '/'), + (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, '3', ':'), + (0xFF1B, '3', ';'), + (0xFF1C, '3', '<'), + (0xFF1D, '3', '='), + (0xFF1E, '3', '>'), + ] + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1F, '3', '?'), + (0xFF20, '3', '@'), + (0xFF21, 'M', 'a'), + (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, '3', '['), + (0xFF3C, '3', '\\'), + (0xFF3D, '3', ']'), + (0xFF3E, '3', '^'), + (0xFF3F, '3', '_'), + (0xFF40, '3', '`'), + (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, '3', '{'), + (0xFF5C, '3', '|'), + (0xFF5D, '3', '}'), + (0xFF5E, '3', '~'), + (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', 'ツ'), + ] + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, 'X'), + (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'), + (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, '3', ' ̄'), + (0xFFE4, 'M', '¦'), + (0xFFE5, 'M', '¥'), + (0xFFE6, 'M', '₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', '│'), + (0xFFE9, 'M', '←'), + (0xFFEA, 'M', '↑'), + (0xFFEB, 'M', '→'), + (0xFFEC, 'M', '↓'), + (0xFFED, 'M', '■'), + ] + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEE, 'M', '○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (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', '𐐶'), + (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', '𐓡'), + ] + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '𐖱'), + (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'), + (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', 'ɗ'), + ] + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '𐳭'), + (0x10CAE, 'M', '𐳮'), + (0x10CAF, 'M', '𐳯'), + (0x10CB0, 'M', '𐳰'), + (0x10CB1, 'M', '𐳱'), + (0x10CB2, 'M', '𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10E80, 'V'), + (0x10EAA, 'X'), + (0x10EAB, 'V'), + (0x10EAE, 'X'), + (0x10EB0, 'V'), + (0x10EB2, 'X'), + (0x10EFD, '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'), + ] + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (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'), + (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', '𑣊'), + ] + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118AB, 'M', '𑣋'), + (0x118AC, 'M', '𑣌'), + (0x118AD, 'M', '𑣍'), + (0x118AE, 'M', '𑣎'), + (0x118AF, 'M', '𑣏'), + (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'), + (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'), + ] + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11F5A, 'X'), + (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'), + (0x14400, 'V'), + (0x14647, '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'), + (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'), + (0x18D00, 'V'), + (0x18D09, 'X'), + (0x1AFF0, 'V'), + (0x1AFF4, 'X'), + (0x1AFF5, 'V'), + (0x1AFFC, 'X'), + (0x1AFFD, 'V'), + ] + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFFF, 'X'), + (0x1B000, 'V'), + (0x1B123, 'X'), + (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'), + (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, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', '𝆹𝅥'), + (0x1D1BC, 'M', '𝆺𝅥'), + (0x1D1BD, 'M', '𝆹𝅥𝅮'), + (0x1D1BE, 'M', '𝆺𝅥𝅮'), + (0x1D1BF, 'M', '𝆹𝅥𝅯'), + (0x1D1C0, 'M', '𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1EB, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (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'), + ] + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + ] + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'σ'), + (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', 'η'), + ] + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ε'), + (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', 'ω'), + ] + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'χ'), + (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', 'κ'), + ] + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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', 'ж'), + ] + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ұ'), + (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'), + (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', '𞤯'), + ] + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'ش'), + (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', 'س'), + ] + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', 'د'), + (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', 'ذ'), + ] + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, '3', '0,'), + (0x1F102, '3', '1,'), + (0x1F103, '3', '2,'), + (0x1F104, '3', '3,'), + (0x1F105, '3', '4,'), + (0x1F106, '3', '5,'), + (0x1F107, '3', '6,'), + (0x1F108, '3', '7,'), + (0x1F109, '3', '8,'), + (0x1F10A, '3', '9,'), + (0x1F10B, 'V'), + (0x1F110, '3', '(a)'), + (0x1F111, '3', '(b)'), + (0x1F112, '3', '(c)'), + (0x1F113, '3', '(d)'), + (0x1F114, '3', '(e)'), + (0x1F115, '3', '(f)'), + (0x1F116, '3', '(g)'), + (0x1F117, '3', '(h)'), + (0x1F118, '3', '(i)'), + (0x1F119, '3', '(j)'), + (0x1F11A, '3', '(k)'), + (0x1F11B, '3', '(l)'), + (0x1F11C, '3', '(m)'), + (0x1F11D, '3', '(n)'), + (0x1F11E, '3', '(o)'), + (0x1F11F, '3', '(p)'), + (0x1F120, '3', '(q)'), + (0x1F121, '3', '(r)'), + (0x1F122, '3', '(s)'), + (0x1F123, '3', '(t)'), + (0x1F124, '3', '(u)'), + (0x1F125, '3', '(v)'), + (0x1F126, '3', '(w)'), + (0x1F127, '3', '(x)'), + (0x1F128, '3', '(y)'), + (0x1F129, '3', '(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'), + ] + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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'), + (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'), + (0x1F8B2, 'X'), + (0x1F900, 'V'), + (0x1FA54, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x1FA70, 'V'), + (0x1FA7D, 'X'), + (0x1FA80, 'V'), + (0x1FA89, 'X'), + ] + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FA90, 'V'), + (0x1FABE, 'X'), + (0x1FABF, 'V'), + (0x1FAC6, 'X'), + (0x1FACE, 'V'), + (0x1FADC, 'X'), + (0x1FAE0, 'V'), + (0x1FAE9, 'X'), + (0x1FAF0, 'V'), + (0x1FAF9, 'X'), + (0x1FB00, 'V'), + (0x1FB93, 'X'), + (0x1FB94, 'V'), + (0x1FBCB, 'X'), + (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', '免'), + (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', '咢'), + ] + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, 'X'), + (0x2F869, 'M', '嬈'), + (0x2F86A, 'M', '嬾'), + (0x2F86C, 'M', '𡧈'), + (0x2F86D, 'M', '寃'), + (0x2F86E, 'M', '寘'), + (0x2F86F, 'M', '寧'), + (0x2F870, 'M', '寳'), + (0x2F871, 'M', '𡬘'), + (0x2F872, 'M', '寿'), + (0x2F873, 'M', '将'), + (0x2F874, 'X'), + (0x2F875, 'M', '尢'), + (0x2F876, 'M', '㞁'), + (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', '慎'), + ] + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '杓'), + (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', '滇'), + ] + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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, 'X'), + (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', '𥃳'), + (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, 'X'), + (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', '𦉇'), + ] + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '䔫'), + (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, 'X'), + (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', '起'), + ] + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (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', '鳽'), + (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() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..919b86f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,55 @@ +from .exceptions import * +from .ext import ExtType, Timestamp + +import os + + +version = (1, 0, 8) +__version__ = "1.0.8" + + +if os.environ.get("MSGPACK_PUREPYTHON"): + from .fallback import Packer, unpackb, Unpacker +else: + try: + from ._cmsgpack import Packer, unpackb, Unpacker + except ImportError: + from .fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04013a04ddd1e3a7cb02a655d92016680714fd51 GIT binary patch literal 1760 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 Oy3TRz;C%)u9qzxv-=Ay% literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43098b4b9cb42815cb97361c66724f547f089f7e GIT binary patch literal 42062 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..d6d2615 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,48 @@ +class UnpackException(Exception): + """Base class for some exceptions raised while unpacking. + + NOTE: unpack may raise exception other than subclass of + UnpackException. If you want to catch all error, catch + Exception instead. + """ + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class FormatError(ValueError, UnpackException): + """Invalid msgpack format""" + + +class StackError(ValueError, UnpackException): + """Too nested""" + + +# Deprecated. Use ValueError instead +UnpackValueError = ValueError + + +class ExtraData(UnpackValueError): + """ExtraData is raised when there is trailing data. + + This exception is raised while only one-shot (not streaming) + unpack. + """ + + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +# Deprecated. Use Exception instead to catch all exception during packing. +PackException = Exception +PackValueError = ValueError +PackOverflowError = OverflowError diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py new file mode 100644 index 0000000..02c2c43 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py @@ -0,0 +1,168 @@ +from collections import namedtuple +import datetime +import struct + + +class ExtType(namedtuple("ExtType", "code data")): + """ExtType represents ext type in msgpack.""" + + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super().__new__(cls, code, data) + + +class Timestamp: + """Timestamp represents the Timestamp extension type in msgpack. + + When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. + When using pure-Python msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and + unpack `Timestamp`. + + This class is immutable: Do not override seconds and nanoseconds. + """ + + __slots__ = ["seconds", "nanoseconds"] + + def __init__(self, seconds, nanoseconds=0): + """Initialize a Timestamp object. + + :param int seconds: + Number of seconds since the UNIX epoch (00:00:00 UTC Jan 1 1970, minus leap seconds). + May be negative. + + :param int nanoseconds: + Number of nanoseconds to add to `seconds` to get fractional time. + Maximum is 999_999_999. Default is 0. + + Note: Negative times (before the UNIX epoch) are represented as neg. seconds + pos. ns. + """ + if not isinstance(seconds, int): + raise TypeError("seconds must be an integer") + if not isinstance(nanoseconds, int): + raise TypeError("nanoseconds must be an integer") + if not (0 <= nanoseconds < 10**9): + raise ValueError("nanoseconds must be a non-negative integer less than 999999999.") + self.seconds = seconds + self.nanoseconds = nanoseconds + + def __repr__(self): + """String representation of Timestamp.""" + return f"Timestamp(seconds={self.seconds}, nanoseconds={self.nanoseconds})" + + def __eq__(self, other): + """Check for equality with another Timestamp object""" + if type(other) is self.__class__: + return self.seconds == other.seconds and self.nanoseconds == other.nanoseconds + return False + + def __ne__(self, other): + """not-equals method (see :func:`__eq__()`)""" + return not self.__eq__(other) + + def __hash__(self): + return hash((self.seconds, self.nanoseconds)) + + @staticmethod + def from_bytes(b): + """Unpack bytes into a `Timestamp` object. + + Used for pure-Python msgpack unpacking. + + :param b: Payload from msgpack ext message with code -1 + :type b: bytes + + :returns: Timestamp object unpacked from msgpack ext payload + :rtype: Timestamp + """ + if len(b) == 4: + seconds = struct.unpack("!L", b)[0] + nanoseconds = 0 + elif len(b) == 8: + data64 = struct.unpack("!Q", b)[0] + seconds = data64 & 0x00000003FFFFFFFF + nanoseconds = data64 >> 34 + elif len(b) == 12: + nanoseconds, seconds = struct.unpack("!Iq", b) + else: + raise ValueError( + "Timestamp type can only be created from 32, 64, or 96-bit byte objects" + ) + return Timestamp(seconds, nanoseconds) + + def to_bytes(self): + """Pack this Timestamp object into bytes. + + Used for pure-Python msgpack packing. + + :returns data: Payload for EXT message with code -1 (timestamp type) + :rtype: bytes + """ + if (self.seconds >> 34) == 0: # seconds is non-negative and fits in 34 bits + data64 = self.nanoseconds << 34 | self.seconds + if data64 & 0xFFFFFFFF00000000 == 0: + # nanoseconds is zero and seconds < 2**32, so timestamp 32 + data = struct.pack("!L", data64) + else: + # timestamp 64 + data = struct.pack("!Q", data64) + else: + # timestamp 96 + data = struct.pack("!Iq", self.nanoseconds, self.seconds) + return data + + @staticmethod + def from_unix(unix_sec): + """Create a Timestamp from posix timestamp in seconds. + + :param unix_float: Posix timestamp in seconds. + :type unix_float: int or float + """ + seconds = int(unix_sec // 1) + nanoseconds = int((unix_sec % 1) * 10**9) + return Timestamp(seconds, nanoseconds) + + def to_unix(self): + """Get the timestamp as a floating-point value. + + :returns: posix timestamp + :rtype: float + """ + return self.seconds + self.nanoseconds / 1e9 + + @staticmethod + def from_unix_nano(unix_ns): + """Create a Timestamp from posix timestamp in nanoseconds. + + :param int unix_ns: Posix timestamp in nanoseconds. + :rtype: Timestamp + """ + return Timestamp(*divmod(unix_ns, 10**9)) + + def to_unix_nano(self): + """Get the timestamp as a unixtime in nanoseconds. + + :returns: posix timestamp in nanoseconds + :rtype: int + """ + return self.seconds * 10**9 + self.nanoseconds + + def to_datetime(self): + """Get the timestamp as a UTC datetime. + + :rtype: `datetime.datetime` + """ + utc = datetime.timezone.utc + return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(seconds=self.to_unix()) + + @staticmethod + def from_datetime(dt): + """Create a Timestamp from datetime with tzinfo. + + :rtype: Timestamp + """ + return Timestamp.from_unix(dt.timestamp()) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..a174162 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,951 @@ +"""Fallback pure Python implementation of msgpack""" +from datetime import datetime as _DateTime +import sys +import struct + + +if hasattr(sys, "pypy_version_info"): + # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + + class StringIO: + def __init__(self, s=b""): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + + def getvalue(self): + return self.builder.build() + +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + + newlist_hint = lambda size: [] + + +from .exceptions import BufferFull, OutOfData, ExtraData, FormatError, StackError + +from .ext import ExtType, Timestamp + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + view = memoryview(obj) + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``ValueError`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, max_buffer_size=len(packed), **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise ValueError("Unpack failed: incomplete input") + except RecursionError: + raise StackError + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +_NO_FORMAT_USED = "" +_MSGPACK_HEADERS = { + 0xC4: (1, _NO_FORMAT_USED, TYPE_BIN), + 0xC5: (2, ">H", TYPE_BIN), + 0xC6: (4, ">I", TYPE_BIN), + 0xC7: (2, "Bb", TYPE_EXT), + 0xC8: (3, ">Hb", TYPE_EXT), + 0xC9: (5, ">Ib", TYPE_EXT), + 0xCA: (4, ">f"), + 0xCB: (8, ">d"), + 0xCC: (1, _NO_FORMAT_USED), + 0xCD: (2, ">H"), + 0xCE: (4, ">I"), + 0xCF: (8, ">Q"), + 0xD0: (1, "b"), + 0xD1: (2, ">h"), + 0xD2: (4, ">i"), + 0xD3: (8, ">q"), + 0xD4: (1, "b1s", TYPE_EXT), + 0xD5: (2, "b2s", TYPE_EXT), + 0xD6: (4, "b4s", TYPE_EXT), + 0xD7: (8, "b8s", TYPE_EXT), + 0xD8: (16, "b16s", TYPE_EXT), + 0xD9: (1, _NO_FORMAT_USED, TYPE_RAW), + 0xDA: (2, ">H", TYPE_RAW), + 0xDB: (4, ">I", TYPE_RAW), + 0xDC: (2, ">H", TYPE_ARRAY), + 0xDD: (4, ">I", TYPE_ARRAY), + 0xDE: (2, ">H", TYPE_MAP), + 0xDF: (4, ">I", TYPE_MAP), +} + + +class Unpacker: + """Streaming unpacker. + + Arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and `.feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes. + Otherwise, unpack to Python str by decoding with UTF-8 encoding (default). + + :param int timestamp: + Control how timestamp type is unpacked: + + 0 - Timestamp + 1 - float (Seconds from the EPOCH) + 2 - int (Nanoseconds from the EPOCH) + 3 - datetime.datetime (UTC). + + :param bool strict_map_key: + If true (default), only str or bytes are accepted for map (dict) keys. + + :param object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str unicode_errors: + The error handler for decoding unicode. (default: 'strict') + This option should be used only when you have msgpack data which + contains invalid UTF-8 string. + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means 2**32-1. + The default value is 100*1024*1024 (100MiB). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Deprecated, use *max_buffer_size* instead. + Limits max length of str. (default: max_buffer_size) + + :param int max_bin_len: + Deprecated, use *max_buffer_size* instead. + Limits max length of bin. (default: max_buffer_size) + + :param int max_array_len: + Limits max length of array. + (default: max_buffer_size) + + :param int max_map_len: + Limits max length of map. + (default: max_buffer_size//2) + + :param int max_ext_len: + Deprecated, use *max_buffer_size* instead. + Limits max size of ext type. (default: max_buffer_size) + + Example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like) + for o in unpacker: + process(o) + + Example of streaming deserialize from socket:: + + unpacker = Unpacker() + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``OutOfData`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + """ + + def __init__( + self, + file_like=None, + read_size=0, + use_list=True, + raw=False, + timestamp=0, + strict_map_key=True, + object_hook=None, + object_pairs_hook=None, + list_hook=None, + unicode_errors=None, + max_buffer_size=100 * 1024 * 1024, + ext_hook=ExtType, + max_str_len=-1, + max_bin_len=-1, + max_array_len=-1, + max_map_len=-1, + max_ext_len=-1, + ): + if unicode_errors is None: + unicode_errors = "strict" + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + if not max_buffer_size: + max_buffer_size = 2**31 - 1 + if max_str_len == -1: + max_str_len = max_buffer_size + if max_bin_len == -1: + max_bin_len = max_buffer_size + if max_array_len == -1: + max_array_len = max_buffer_size + if max_map_len == -1: + max_map_len = max_buffer_size // 2 + if max_ext_len == -1: + max_ext_len = max_buffer_size + + self._max_buffer_size = max_buffer_size + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16 * 1024) + self._raw = bool(raw) + self._strict_map_key = bool(strict_map_key) + self._unicode_errors = unicode_errors + self._use_list = use_list + if not (0 <= timestamp <= 3): + raise ValueError("timestamp must be 0..3") + self._timestamp = timestamp + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError("`list_hook` is not callable") + if object_hook is not None and not callable(object_hook): + raise TypeError("`object_hook` is not callable") + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError("`object_pairs_hook` is not callable") + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size: + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[: self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython + self._buffer.extend(view) + + def _consume(self): + """Gets rid of the used parts of the buffer.""" + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i :] + + def read_bytes(self, n): + ret = self._read(n, raise_outofdata=False) + self._consume() + return ret + + def _read(self, n, raise_outofdata=True): + # (int) -> bytearray + self._reserve(n, raise_outofdata=raise_outofdata) + i = self._buff_i + ret = self._buffer[i : i + n] + self._buff_i = i + len(ret) + return ret + + def _reserve(self, n, raise_outofdata=True): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[: self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + if remain_bytes + len(self._buffer) > self._max_buffer_size: + raise BufferFull + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i and raise_outofdata: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xFF) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})") + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})") + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})") + elif b == 0xC0: + obj = None + elif b == 0xC2: + obj = False + elif b == 0xC3: + obj = True + elif 0xC4 <= b <= 0xC6: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + n = struct.unpack_from(fmt, self._buffer, self._buff_i)[0] + else: + n = self._buffer[self._buff_i] + self._buff_i += size + if n > self._max_bin_len: + raise ValueError(f"{n} exceeds max_bin_len({self._max_bin_len})") + obj = self._read(n) + elif 0xC7 <= b <= 0xC9: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + L, n = struct.unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if L > self._max_ext_len: + raise ValueError(f"{L} exceeds max_ext_len({self._max_ext_len})") + obj = self._read(L) + elif 0xCA <= b <= 0xD3: + size, fmt = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + obj = struct.unpack_from(fmt, self._buffer, self._buff_i)[0] + else: + obj = self._buffer[self._buff_i] + self._buff_i += size + elif 0xD4 <= b <= 0xD8: + size, fmt, typ = _MSGPACK_HEADERS[b] + if self._max_ext_len < size: + raise ValueError(f"{size} exceeds max_ext_len({self._max_ext_len})") + self._reserve(size + 1) + n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + 1 + elif 0xD9 <= b <= 0xDB: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + if len(fmt) > 0: + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) + else: + n = self._buffer[self._buff_i] + self._buff_i += size + if n > self._max_str_len: + raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})") + obj = self._read(n) + elif 0xDC <= b <= 0xDD: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if n > self._max_array_len: + raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})") + elif 0xDE <= b <= 0xDF: + size, fmt, typ = _MSGPACK_HEADERS[b] + self._reserve(size) + (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i) + self._buff_i += size + if n > self._max_map_len: + raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})") + else: + raise FormatError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header() + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise ValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise ValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in range(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in range(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in range(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) for _ in range(n) + ) + else: + ret = {} + for _ in range(n): + key = self._unpack(EX_CONSTRUCT) + if self._strict_map_key and type(key) not in (str, bytes): + raise ValueError("%s is not allowed for map key" % str(type(key))) + if isinstance(key, str): + key = sys.intern(key) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._raw: + obj = bytes(obj) + else: + obj = obj.decode("utf_8", self._unicode_errors) + return obj + if typ == TYPE_BIN: + return bytes(obj) + if typ == TYPE_EXT: + if n == -1: # timestamp + ts = Timestamp.from_bytes(bytes(obj)) + if self._timestamp == 1: + return ts.to_unix() + elif self._timestamp == 2: + return ts.to_unix_nano() + elif self._timestamp == 3: + return ts.to_datetime() + else: + return ts + else: + return self._ext_hook(n, bytes(obj)) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + except RecursionError: + raise StackError + + next = __next__ + + def skip(self): + self._unpack(EX_SKIP) + self._consume() + + def unpack(self): + try: + ret = self._unpack(EX_CONSTRUCT) + except RecursionError: + raise StackError + self._consume() + return ret + + def read_array_header(self): + ret = self._unpack(EX_READ_ARRAY_HEADER) + self._consume() + return ret + + def read_map_header(self): + ret = self._unpack(EX_READ_MAP_HEADER) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer: + """ + MessagePack Packer + + Usage:: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param default: + When specified, it should be callable. + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. (default: True) + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param bool datetime: + If set to true, datetime with tzinfo is packed into Timestamp type. + Note that the tzinfo is stripped in the timestamp. + You can get UTC datetime with `timestamp=3` option of the Unpacker. + + :param str unicode_errors: + The error handler for encoding unicode. (default: 'strict') + DO NOT USE THIS!! This option is kept for very specific usage. + + Example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like) + for o in unpacker: + process(o) + + Example of streaming deserialize from socket:: + + unpacker = Unpacker() + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + + Raises ``ExtraData`` when *packed* contains extra bytes. + Raises ``OutOfData`` when *packed* is incomplete. + Raises ``FormatError`` when *packed* is not valid msgpack. + Raises ``StackError`` when *packed* contains too nested. + Other exceptions can be raised during unpacking. + """ + + def __init__( + self, + default=None, + use_single_float=False, + autoreset=True, + use_bin_type=True, + strict_types=False, + datetime=False, + unicode_errors=None, + ): + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._buffer = StringIO() + self._datetime = bool(datetime) + self._unicode_errors = unicode_errors or "strict" + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack( + self, + obj, + nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, + check_type_strict=_check_type_strict, + ): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise ValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xFF: + return self._buffer.write(struct.pack("BB", 0xCC, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xD0, obj)) + if 0xFF < obj <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xCD, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xD1, obj)) + if 0xFFFF < obj <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xCE, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xD2, obj)) + if 0xFFFFFFFF < obj <= 0xFFFFFFFFFFFFFFFF: + return self._buffer.write(struct.pack(">BQ", 0xCF, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xD3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise OverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise ValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, str): + obj = obj.encode("utf-8", self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise ValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = obj.nbytes + if n >= 2**32: + raise ValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xCA, obj)) + return self._buffer.write(struct.pack(">Bd", 0xCB, obj)) + if check(obj, (ExtType, Timestamp)): + if check(obj, Timestamp): + code = -1 + data = obj.to_bytes() + else: + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b"\xd4") + elif L == 2: + self._buffer.write(b"\xd5") + elif L == 4: + self._buffer.write(b"\xd6") + elif L == 8: + self._buffer.write(b"\xd7") + elif L == 16: + self._buffer.write(b"\xd8") + elif L <= 0xFF: + self._buffer.write(struct.pack(">BB", 0xC7, L)) + elif L <= 0xFFFF: + self._buffer.write(struct.pack(">BH", 0xC8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xC9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in range(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1) + + if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None: + obj = Timestamp.from_datetime(obj) + default_used = 1 + continue + + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + + if self._datetime and check(obj, _DateTime): + raise ValueError(f"Cannot serialize {obj!r} where tzinfo=None") + + raise TypeError(f"Cannot serialize {obj!r}") + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise ValueError + self._pack_array_header(n) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise ValueError + self._pack_map_header(n) + if self._autoreset: + ret = self._buffer.getvalue() + self._buffer = StringIO() + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xFFFFFFFF: + raise ValueError("Too large data") + if L == 1: + self._buffer.write(b"\xd4") + elif L == 2: + self._buffer.write(b"\xd5") + elif L == 4: + self._buffer.write(b"\xd6") + elif L == 8: + self._buffer.write(b"\xd7") + elif L == 16: + self._buffer.write(b"\xd8") + elif L <= 0xFF: + self._buffer.write(b"\xc7" + struct.pack("B", L)) + elif L <= 0xFFFF: + self._buffer.write(b"\xc8" + struct.pack(">H", L)) + else: + self._buffer.write(b"\xc9" + struct.pack(">I", L)) + self._buffer.write(struct.pack("B", typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0F: + return self._buffer.write(struct.pack("B", 0x90 + n)) + if n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xDC, n)) + if n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xDD, n)) + raise ValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0F: + return self._buffer.write(struct.pack("B", 0x80 + n)) + if n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xDE, n)) + if n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xDF, n)) + raise ValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for k, v in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1F: + self._buffer.write(struct.pack("B", 0xA0 + n)) + elif self._use_bin_type and n <= 0xFF: + self._buffer.write(struct.pack(">BB", 0xD9, n)) + elif n <= 0xFFFF: + self._buffer.write(struct.pack(">BH", 0xDA, n)) + elif n <= 0xFFFFFFFF: + self._buffer.write(struct.pack(">BI", 0xDB, n)) + else: + raise ValueError("Raw is too large") + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xFF: + return self._buffer.write(struct.pack(">BB", 0xC4, n)) + elif n <= 0xFFFF: + return self._buffer.write(struct.pack(">BH", 0xC5, n)) + elif n <= 0xFFFFFFFF: + return self._buffer.write(struct.pack(">BI", 0xC6, n)) + else: + raise ValueError("Bin is too large") + + def bytes(self): + """Return internal buffer contents as bytes object""" + return self._buffer.getvalue() + + def reset(self): + """Reset internal buffer. + + This method is useful only when autoreset=False. + """ + self._buffer = StringIO() + + def getbuffer(self): + """Return view of internal buffer.""" + if USING_STRINGBUILDER: + return memoryview(self.bytes()) + else: + return self._buffer.getbuffer() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..9ba41d8 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,15 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "24.1" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = "2014 %s" % __author__ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d629bd7bbf8a9eb1b603bfb4f610097ee327957 GIT binary patch literal 577 zcmYLGO{>#D6iwQ`e!i40T&N3)fsT5=k*;MZ}FG)!F8NJM{pC3|H;*bO};zS zi5=?3E^WjO+KijD6}RYFd`8=Gn|4^MYCBHcDZAs|u2+!cD_H|ySC8gGGT&&(Km$|$ zN=W~6sZ+uI6N#znVXAeZo+GpdotkBsh#VDVLC~#CE1HGVYP=AfWYoXZX0_5j;nW9C zVFT2V%ufW@5|%~_sj3mZroK|w)DT2<|IOthh=O@WjAFiBu86=FWql|}f zB8pPNI@K8ebgquZ{#7UyIYYTgi5)@FLL??53Qh8W+V z43^fLqkm7sX@nGL7Tg$#3MdfXFiwTM^$uYS9PHq*D0kf#xu7OvFXhngV1L|EGkYAG zuInE9j(4~2ZHG}k*!F|Evmf562Yc^X-QS)+sC)b2g}oTv`|;uT=*c%vp4-NMxG%ZS literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ce09c09c99482d7f6cc8659f0551233cfc00f8e GIT binary patch literal 4986 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b955ab47823037b6e8e263a8b59617064276b40 GIT binary patch literal 4573 zcmai1Z)_CD6`$GN`+sNqI2#*7&^i#z1^W)0KnNiQQ`&nxI`VWaaw(k(lVxeFVD-jGH8P-fOXDCHo6}4PJS95CK zGDY3UYH86jL`AjKv?Xd8(Hd68bdeC4*GnQP=JQ%UD;_FY!$w}z%%HC2M^#0Xv$B>q zEiqR#^$t^zDmRAOpuwOBM&B@w(!4;#mJNY3XCOSWLr9E|g}|DdH3*)oV7 z9F%jaa-;~F+5W@o@uHeft9R+OftauVxq$&qSJQMGw^ZE=-+vTF-a;x$VQ^>eYv9Bx zuW-9zl=XPpD+zIr9hSZV%D&(zXY*R#vOPI@1m5n+X?cST#s%9iNqNvjlI)-)Irf5n zSdxwxWxYC6FG?v`KGXRnLs64z{zOvOjwK7sy4w<6-APlk)XsvO9+k7InJj39q;x{fD+WnAgK!y1 zi5ea5p*Wr>lnBK%t5!kB1ph$aL^nfqZ#)atsb@*dolaLl0M7{d;SUzX_xC!10G~n? zG_rgJTLvyzZTpt>&f+weMQQG+51|QM!6rWAt>Eu*X95D6;3lwDy&Hrooa?#@Hwqv# zLlsWpscS1p5n3U5j6Mn4;}Wtw)fb@=uiIN{6)(v77$mAto!~3HN#z3WDl6pnD*Q;q z?Ju>8&(+0k|F1+%dspIJzYEaAaDEK`2|R}4fx!oiOOL;e8kf4>mk|c{te~TfjA8`VT{hK1|*}O@nblS2f_V4rbVVLBCR{!x0i z?Na-N_PMs7KK{1x%fnZrzis|?^Lx?XwEjZ67V4iD`al09f+G8|Nx}I;-@diNPXwqQ z@Dl3g41$j{2nLWVYC5tArp@QU|s|? zfQLUf&cBGp@CIbnz;4ly#EMnTQV`1U8xi5DREZlyj!fJu4}qcj9KxzGRj12T)JG|8 zSz1nYnFt7wx)38l;6cU6tKzYem>yQsqmtf+*ND#N3w0na+FErOURyGpUGD75q0gm};) z-l{C+YB)v*Q>-dGW)yWrJO+va$ymcwZCx8xckOb{M$gBN4t$apH;?b!A?oRc&tE-v}!^~fJ?H4LkAD_GXRq~ z>;_>VxMY4CXKYSaY=Mfb2n10nt6C4lIs#0B+Td?aLN$r*wFsWZJCW%0<1@;&$cEYD zccLvb(eJn3h_)|8+o$$@#-qB8_x#8ooGeejFx$P*^cX{T)7hTWJu}@i8!whGy?){K zt4FSd_D%NP39X;8&cAx@)y2@3d11?E^&mVS+3>HwgkwK=@nUd3wB-|oJ&m{OWA}Jy zzcAZDiId^pr_py;_a^y^e(1fQ^z`oZz5j%d_MdLtw~GHDilKfWEKs9vpyY8CIu3a( z1qQ3ieh57b{+Fu(gmUsEF5wD-gb@q>3*x*BwVJu|qyY`(X`(sx8m~wqymIBd$>;>L8>SHrxq+^A)IAqVnl#)X;V@ zc4_^E^^5geClB28)zAByZ~E(QH#AKNcbZyfcAoD!*E82WN3J(@PxaqyTt72@{!j%*At9lm0Js1D)(`>21X{`_I8=jU<)5jt$EJ z_+Fv0zc^m@P!)HTJ=6@)P(63qScC+PhXlPWyp-rXN}h(zY}`qng0}3dUQApdfM^7^ zvWV?JP`F_b1DI_F`@E~pnGR1t_G7Q}$B0LlNbxUZ5YJ06x0r-T_jDpZSoKTy9HB>#5 zf$uIB=$({p6P*a?q$s6jpikxl?6wF^DC_{-blS*gw5%Pb@!7pq2;pEn$OtXKk~yYX z!?vdY%x5{S!vifqnoH9~8(V~a$T;6EEXVclc0R;<$k$^Kke|FF5Ju^G6g*MI$ zU9+Q$Lf3p~wXbjwC*6j7ehiT HGsu4c3J`%k literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f50fb70f207c9508bed02c13b826a43d75feb1da GIT binary patch literal 14004 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 Qqu?>Ht$PkXE6eEr0cQwC`2YX_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f42e5da9666bfc08f1255870e722b26ea6ce7dc4 GIT binary patch literal 3260 zcmc&#&2Jk;6rWwM9VfBlKpf&UY3nLf)PS>bi$F+KFNC&mFo*UOA*~$m_@mfscXl1g zQ4TrefCNZLASK6eLQ(z{E{N|Tr za)#0Ksr6;`Fv{2;5C)IYXL?VGIb=F}!fbZHZ0%H6f3`@+*=gTwOOqBlSww~wI$7vL zi%8eVMazAA`5F2+An}lP+tO^drP~^hRCHTEFt!Zhqr^vukJ$#FA~{|$>?q08BXW%7 znGt!4K|hthJilY<6m;X0v3Qo2_!E$sNx%pVYml zoo%zQv60^_b=~|ImHa0yo15I(F&p)5v)%P-E$6{{;lAnCJ)Uou%3qbL+%?A6nN0eXOErswS(_7I(_j(_l;V~t@#E55OK0qxe#bK1ctv80#j-j_1++| z&wfuW{J43P{^9fU)a|qQZIQtGXv?c{QSP@PY19)a$%$TkEO5dTT};zQq=~p#lFh0p zVwTnLD29cxk-FoFH^IeP+b?+8 z^NsCRt06L^5-T8CkhekJ0eKHZcCyR}hEd?GlEjE{zaw(ME_5w=<7lnN=yMU%qFKdf z!7m;?z99YLv4`J_A*zD1Dk!T0tkO!AR;qM}D*Jr}+h@=2eDoK-s&)vnOz-f)1mWo& z5c$7u7d}U~%Pie4scs^d6!$0;fxrU&L~?L!=tkL{&JX%Rm17J>WqEgRj<;C=;!)Kh z#NSY3G=y>b_nHtd@kOL)gYl-8ofaCDf_K?vKonIr0CNENNDe0BirJQJyt@*T1VA}1 zFEJeO*LQ?b33o&jm=AY^dP}%?O(+*PvG+J^%fSr|3D~`XWp_X>-7cgYOLF)PCcz=p z5#ag(d`!N^{*xoLMz|wN@`nLO60QS-^zXnd0AZKf7NEDg8q!7*k3S|07qAFCUivyE zQ(DZ;i}$ggEIz6$Ob{Tikl6?FiUP=ekWkc>2s;USC18N8(d&LoL_zP0g4-29i3bydBpdT;*8<8cybVQKWrdqF}z!%nGHSO~NJKMWy@zA@^eV-6T|s_sXeMUHynL~$wZpD>C?sRZa%d;tAQ0AQ681X!)?0l1eXDtGl@ zQP`%3vJdEWn+Qd;^nRGTU#S6jKsgAoR;dGcND%=Zey+^=Z*l%oKfl@P!di`0hazX>SVGqI5Np~a8C8=rY0b3v zrw7%{w3hlUcn;2U3{9!A_(WXQVkoK9iWX+pTY<7jR1#$r5@o^D7?o34ToJ`Mit#`b z5X;&^6{awpzNV&3PS0p2pOTZR$!FA?8Iy~rGNyeht;cbd{UP48OA?MtlIfJBWLlX{ zAnul=A56=M;)qw0Hhr2TJtXV6$gie5Ceul^BRM@OCzG<$(UXo%C)HF&?>HOJoSPo+ zc;Wc*wjMdFw+&3Rb*B}zLrq=pNW{lGrm~sIbn2z{7hddurKoLFa_pLXMb$f|;!_>c zbv31=wGN9IPhIJdGWa=hL)F@+vKnqm3S5BbegJ<;)|{R{iR3A$^w0EZ)g_+YRf>xG z(I%xTOq6qwt^X8$mP{}TJL8V>ut~WYJ}S(Tn@rR;L_#*xe^J(SRU68tGV;x^rlmFG zyTg;JIHjep#}!o(_4KqBQ$^If7)wtl6cM~b90v}Zr~pmV)L15wZI2bVI(Qf%Xm}eo zs=5veH*MA`O+lZYQo%PRDV~aFB#CmWi3#lhh|~@ur~zO)B#C;oBauu-cO=0%~$pCHz^tLMpj~ve#vu1;bp#%&sih%GIqu8#ZWwtet z!fzu%7pP@RY>eiZE8L^v7l8*=^qY*Rq3ulOhZ?36leugNPE=`#x3tY)O~+FkCJ3?G zA>^|qW$l`(={Q*wsrtCZI$0z^=az;5NzogLgBF*@f(V|3Yrn-*7+n zVEDtg9=^5wgNLJ!dww1HDDoTmqu$lFbE`)ptNzHx-K+kASzF$_cmCGgttI7y#CwSc zJs)0pc;WG$mD{ zpnn&@?`O!Td}o1o2?y5v!GZwKf}H^7K+H+Jbp;nWlYgnO+v7!k|GJU<_ zGsDuw&cSg1@VW3%WXNDgn@#^<-50{cz&K)hEXEDe7)1YYU!;4W zcL4n1q$zX{^!0U`Osnbn{-uH8aE~-JJQ(ReYh0s_fzE-gc}tH{j*eVDI@WSDv|}W< zgVJ0-a=Cu2rG6{#M$cpiE*krqPn|lIga1D~l{S;T|1t zPHQmfXou8j+ecHKEG7nu94B zHMyZ7Tqm|%i51`0TwF~qDaR(`DYdlHcoN(m^CB$`b`wIgp|q86=d!krOU?Lox#Bx_ zkqUW7leb6#GnM<`cNfFmku#C-pviWkcb+!6OM|^e#mHrGG&6S0bVho>$tj0XH#$Bd zw;7#n(c^8ejBTLpQrlPym^k=)cyK5(&@Wva44;X-DGd*HMtTi?w0*S2I5c_;C*Z_m z&EGpQ(k6|zQxTLBYB6jh)(e@&5NGZ$N$MTw?(CI%JG;WYmN=7rW60#f{XJiaN<5Ys zftc1R0uXbernX;{Gf-fqkUBPIdV0cVIxqDOOM{ns!$UFHx#d=j;>`NbfwWOpZLa{J zoMs{8^GceiUa;R-)FZ~5CO#n+zu#SF-2}` zTX`J>%60b)U&`1~ch(UKnhsjXVdZ1Ybf;5TOtk503hTG)P+MSGMC%EtlG>frxEHPZ zLl=`O)L4oROrm;IPJ%;<8K_UP?lCI2M~!W7otRlfbQNlp}=|3l&WTCglw9 z=$qj+To9;F^v07w)2h4a@u@Fx9A-ERHWF$B#GBs-Mb#b8AJ!c(Lf3Fl?5whtZ3ZveC@;@J z2W&>J7WIjPrIuq#TGsr)u}k4ovLh6hOqL0;#>;(aaL92rn@%YkHL&HN7^ooSPlz&9 z!qZUorZQsb4AR~Yha-VHp~-_!D#ap)Ds*dw6N7UVoG%Rjh9Zlk6f9gv8{Q^sF7Nz_ zxf6GlPh1D`Zr^-lE^_BWfg|pNG>e~s^AkUAc1%R;%FR+|{yEZwQ1r zW#`^P#jUxml@6`2$@tq$md~;Jp^U4<1gnJzSFDV8n_YB*&08Fgn#TWje@y@pCuImg zn@>gP3&lu<3A8IKD(ZwhoxqxKg0flxNuQ3zR8`SiDb4bumgKaaX~82DItn}?eQ)G< z8LABoVRU}G7?}{?Mnk_X#&uCwF`|iY4{Ouv+nYtg7@o=!X&H}fP|DCKhby~b9ob+F zI1}DUWf>!a;$g4Fh3&z!?CV;oY=P z&_+5kegFWXjgNTz^8<4OEAEB@$2!h4Yo5BL%+loj^s@4+^e@vZ-#)kEimVGbly^6* zd8^>OU@RD`-oq>Qu9c=&9ydPTx6;t{1UlZsYt{P~qYKgd{AzX6taHs*^VBD<`o#Oe zzd7)i2OcONCLboB_+FhA@-E-(seIMGPrX(DTGw#D=Rwml^RRij=U08d?0ZtzHQV#< zK;Bzro&8EX2lpoice+0lfP8b%(u1%sb_rUrd)a#g_FOUK(LJ}zt}5+GIHj?M9=-|J zGZ|49W2%+`({Hk&h-sl!oRH%QNWkKacxDp#bb2Kqs(2?LQlGpL*Ec);Fl-3Rqrv@J z!2epPLvQjahxJnMwh*VGG0lJ`gAmD*Em7IpMHql_JQG^^#|~}*YlUrtUk}b{oegak z+3;;RghiPJF8x~oz$2W*7o0cdjHSj;yod6EJx>Fn)j;S$WO;Hqy3%s`NuYDZ-3iv2 z&(3B4?2lHy_J}?MBA*vVZ$V(Z&7LQy{F}^f0dk`P$T7Qxx03k`4}pBXaT!8$J-pd! zIfk0A392T{8rv!x-0GloyoM9w8Aw9BwFz<0nOs6mX&@ZTZymS=YOT%Li0a;`+)ya) z_63-tzXAZ#kT1CCUGRd-dxI-pam6kIT(i69JwNumU$u1UgXnwFdxuu-&38Qc8oUGX zu6cvAZtD7&5uJEV11EY}gZny)!<|?;XW`x`=PV66pltTG8@wLy?JWgfpX0t}l$&60 z@tN{|p?M2;+_skE|CT9TJHLY|zkLv0QrvOhfN36M{uL-up*k&IHnxK@F-6mx4e(kT z-RKb=sihD{ubak@?Q)5Cdu)3H28@H7G{0kG+yf518vwXn*8jL{3hTmCc>2r zS`xMvMlj3Z7_v09VA0^FGd-oItjgMS#S&?VadfkpHd#wgrxepe8A@KX%^6Ien!-u& zeruX;)NFXh_OV~Udv(0d`)_&)X(v!0Vy$@f6W8JVLGgpW_xfi0%0=VaL2#4h8)!mQ}G~OS%-?v=7Y%C{!)BN#wK5ky|4do9s7X;#I zd`37=C4^RoXWlXAxa0bRj^)}ro!{wvnSs1d_XCz-H2G`jveqS72r$qaP55-Y8HXs< zwuwq>0e(E4PFT|>aN1^uH*wmA0Jzu0m_~(BeDiG`+UhGOT+G3N8ZYFm9e4#L&HPNTB)TgM2>84G!~-R5a6$d4Ds+V>Gq_jn7jvU`|LDDCmI3%?ea zl|?)$r{K;S&JV~6KgbcfIjzgSGuTBCg+Kl80L+ljSzfRg+%BPJ%~yrDeKl~~=R1zK zeKlYdXXQHF_SLM{aKb+59{=|5NR<#=Z>bOttOx8ub>SeXKaxMx@VUz;IO%;MJV8SB zp@IW3C#k9};27Q)2G%`@H4>ZesZh5n)D_sE5X{%q7C3yic396>zek^Ij=f(9KwsyG z?a=4QX?+TQKxhyC6f-dmxe0!X(J=IAlL#UJOjr3wB~{ljN}IM!b_)Do!-SxrkuZ4_ ze^AmjJ5tfsCe#!$bqas?p_iiCc_dcAbxYU4P}r=JV4u++s3c9jqTa;YWHV5@VB17< zM$YyR42HWqhr(J93a>&y)xXswru|jx_oUY}tUNJv>VE~Wz%dN-@1*`S;{O-o_&0L+ zKSTbADfw-Lr!Mm3V4#b^A@ZAj-T!_1g;GP{Wco45dp6J~{tXvDM&EW=$!!_@m zbFTXxdu#1^RG+KV!z lzK6*>tMV@I7ZQ?gdse(1>*P4YemTKRGEDFbf{^;+{{f5Y83OA2vrUK1;;vvqo$_Tg2|OLq9<@g&h&6&l#!mRYj_O z)e)D^6{+#n&^j~J)%xlvZV9_1^}c$FTf+^JMqgv3$=5`mZQN9-2e*9Bj%jS+injP?_I#ro?eU!T|j?HjK%5_j>Wc95kUN}nq|X&97FYIrG! z($l3U4TI7zYIrG!(zB%}4HKIdt-kGIvot8S9DqWxPi%#i4~bjEHpqv?ez6_$5ph85 zfP7TkDt1CXM)%zX`|!L4Zyu9x$1Ladeu$`-RULt7G^PZUP%J7>dIgm~5}j48M+4z- z;Cxt8ZD(iWl6Wi>R8%1tkd+Tv>}FE!rvl`XM2;x2h=xBGk`Lx4vA;tQZO_Xl89>4(RLHAp&&F#Nd9ObBEdSUihT;pQQcpPiqcdlDv3v95tuV1$D(SpUN{lG93ru3M2aet z&|fuc-JnxoCan0SQiC8Kkd|=Qkl2kHfVUWl@v$NU48!_(I82_@Lvdol?tye9>IoJ0 z;VEp_b0r{qreZTuanLgZo0dKDh1g73^bl!EA|55?IX!XOvukwkFzr8iPf)FXx<9{P zwfp^%m^c%b0C)QRFU+A55-6Pm!+r}BO`^vP;`2vuq$~uK1;VvK_{$W!vf$s^AX3Hti%I2t@)jfu>pD| zPH#TOSX?5MKUC}u|TC>H{XM~q2wbU^XQGx2zgD4vi~JW|}JbR+aiyjWPY2Vc&nWx@+SFX5XPOUv{C&v~S)z%f89 za!8asu_>sP=qLsv{HzV&yad5E_{-Yi^V;EKP1!zpD1gLnqyUy^7*qi(@gj#p1;ilY zya5*sxXFN<4YR(m30?qMpq5IA6qW+Aq`LGr@~jN>WN4y|=Ps~?e`+Qi z1|}#>(y8|=)|M|utu7X8?VT{ZU+V+nm9)WbNjriL0IJLHH^^VVe>0KxV@m{M@Rz>@ z;18L6OM6ae&kF}1ws+-(u5}Jx`MRB{uKnh78s5~J6I#|e0Vy~$0a$TRxINR6inljB>b9LSuN7t&F(){9=SE~A#$KTm^ zZ{GvUPqrWWwB`#(^9{}Eo^&wv;({f`-mvE#b@P){)CYB9ghitKq@=s@1nHKDwnPky zPJmOqMwl{plDWnjh^G>{?=p}FqmhEhQqmnT_7$n=TWRhoPMeWb8%P+8cw{kc%rj-| zR~kp}J1+9qfw+z_Z$U3ib6k=owW4ql$z)SXa;0%a)Bn{b0lh^t!cD7ql9`7-Wh_|N zYkZKKW`f+gI#?SIOy}CPD0tM?ev^B(UVyf9d}*D?I6;o3rB@iQWs+E-2j!A7sf9#6 zj#6tkAkQ)^NUkJvt`?<{;e~*~_cp5?-gntsEX%y=7MNM?2mBS*%RdcPt!XMmWMvYt zYCkHVfTCHvoXQQ4s%%6?lGC`yc3@hHN>}6LV4}Oc{qTWs4D4L_;IQ80&!D4>+T&lD z-^??an!`V8ynp07olER;!)onFrgr2{gZadaVREr3zs%HOL-7 z$pAj{VJS*JPirp5LQ&NQc4>&p6>tH}1q+WH!Fp3D8kGn+1~?sFXMWn9f*V-(PXK_? z&5W}#HMOX`@ujzqW;#b#9Ag<_EaMn^T+P_rsoje^SFD~jrz>TC<=OPuPk^nV`Q>!r z=Ik3g-)>kMT5*m(a&@GqmcDR1lyhy(Shqg1)Ta6u`&KMnAK;#IHHQ~WA2@3A?#5et zZ|+S`eEU$w+4Iodn0DW3zTLdE<$GOO_txd{ta~`)9A1MtpI)3;vGwF#b+28$arIqu zu6fV9=H;<;?VYyUZLfFSH)oso_R7fJ|6po5y2V;1B=GG~ zA%TuIQc04%3`BO1ourEU9!K^=1wpA@_NJ`|!hy(nF>sKezxS6|jiflwq{o+fZ|{Fn z8daKzJ;M-mA`3Rc7jO^*HPMkNc+)Vvyxe>HWjegqs&b)d!iy z?lj$QTIzXo@b2LEhwt}hx_9SVkWm%{un24FUz@uzmp-#BF3jaz;~DGtZysA1XZuGC zYpVLd>Rjg`|Kzcq=@_^(d3$ns$2$k^9eC?tu6_UfvAo4GpIoc%UOKrCTD{p%pk>*h~ADW8zrfWz61Q4m45AaFMghCA94=l%zEb?M-f ze97|o9jzxrPfhKTt|Y`<(8{@}8~N~1Oa@zsPwJ{#dqJSCpD$Y%9v)5l=+}}wbwY$W z)12ARR#4DRE^phJ6fRb4rKNn%0_M8~S2$-)nk%-jMLRyF@2B-BjcHR*B+!(!CT&T} z+ng56d=cKnoORCjnJ45n^fo2+K&au2evt(K|1zi+v}FMo&@z?TSN}c9RXX!&-QI-r z{jI<#7*?T4Gy%(Tl~~Sep8W8)kbr6>Xo^$|A`jdSLN3Ac|2r3g%;h1TsqvuzF|IO0 zj8InWqatx8plD%AxdKQ23f3p%77H9%J$Uzp^x0SC)Xvvt@4oOc5pg>XYI2bifEz3> zb08jvNSa#v#5B|^BYUwqGA5PCcp|f2yJ{&0+f;`kD5RRFNo*!AlT+B7S{x;z?=m#> zqcE_6OIL8qR2w*TMGp;CBARlAREUVhaX1A30)N>8qII6hdwSB!{L{azYgsU_xmwcw zXs7*<&-CnEaqY@jcV%3=9)b5ZwJ5GQdh^b@)Q%e`SDhVMXU9tC$bItzN3QeO`_2h; z+01X4z-7y~b>Dby;b^KZb>jZy#88W!v|rZ29)CJ11_R zxM_nZ2O?1NWTQvDL(8EDEkAax^nN+(^emi6&6cfU@xs#V{hs@wT<78Uokt$JThiyU z?rj<8wv2mQ-qnz9i6$D@qXmBlxks~*fb1~bB7LH?nt z(GuD*RQ`PnkXxW|E*fi#t&%!#%&|%4A{uL(639#r!UkZMlTLK|MII%Gf}_&}z04Y3 z$~A6HKv4pGH5eV0m@t{>_{QjPBycfC=7tdqfyggnK@yuo|0Eg+QwIpm{DO<3I*Z0g zSh_5Q3+{or;0}0sRR~3=VyZ=pX9<@=QBj7SGe9_n7=XLz=@{c=WFA`l8~kNtEuf<6 zq1Ec0+3KD5&*rN4&mYe_T&s@utfQTp0}EHK{eIr+O6^RuH}@=_S*m}t?QUDHV<_t$ z%36mOEC!DqM$;2YU-}N#;p~mUrjo|FsLOc0*JqySoWWzS*jKkQOXK0`CmDl{S)q-h zd(@RQf@T35TA_WnDOG5N*2Sh&p;aXcD)utWh&LFUQiZWFsJtm@t$+uRcsC`(46U20 z;8E`j_I#_(Er$1}>)ldckzaIBYA0WX!Vi(FK;(jwVu%;PHU!%d3?djpFpOXX!6Iw0TxmtIK1#A-43#n3P{ zc5&38T?QnsK2BK7zmeR{-XjHAm;7yxKLE?HXI{+L!Ixmvews zz1G^X+B%qR9b9c4%eI2k-Sn_)N4}?j&E0To&&@q+?R~55gW2}MT>Eet-qw5P(CtIH zw!yN}u7TCA-Px|)xvsry+jgvOdnUW>ncTLM`PPm*TW@cDWAAG3;cV~WT<_=K+wtC! zOz+dV*5hl$*WIJAq)oO7geDi5yH;f?;NQk)ussjMbF zwLHoAb;&%7o}|t%;7PX5aiw^j!M=RLQ%!Q$;QD-ydzrh!YJMkm0la1!3{|WA#w$>` z;VWu(g5FKxB5eRL6uGh#o}#*4WuaJnms?y1_w%y1K46_@yJ?H|OdGmcIaDlK%#O%{KCh zj8f-XOFOe@JH-D*!+!p6Oo#X~YYdN(9x<|(QRG%uZ`u(T0~cU`eIELen*i>y;>9~*pPT9ayyc94Q8wr^s>G{R1T<@!9NGt@;XnQ zyoBvQVd$*`34XwPuni6bc`!d#jg{|r=13d)zQ>u6o zkTR-ZOQKwJvSf3~4TRuug)JJ&bY?{-MBi}1zDE96t0!a13GI?l66vOa%#gHHQw%Ot ziBX=aX1`y02{vD)Qy4xD;MTW57uMk8TaFZ8`vvElD0t*J%ea2bLdNd>E>MT%ca9ZuvoBF^MMajgu;Dca^(J z*Qr`v+~{q3Oq|^)^a87U!WB=DevicS*hh6Qf(ODV4>rECHmG35+j* zqvQz`KXDkg+Y63_$MZ!=nITcU%l4d)#XvnqJyRqW@nF0O`oISSv~C&{UR3))A~20X zEk(Zo$FU4<%&_sn6Oti7=847ei^Tde0CXl>J@q*nW zN{U3lGKSlD;}oS0oQ0JeYH&V7AG#OZTyTaExR~~wrXNpu;v^Q7 z7pFIVu(C;26c1d|rI=PQgyjA$7zM)hbxc=prgwa0*E6|YCv%<8W~^=b0WZMx@vOBE z0z=NOOxMn=W7n$VVAgT)fxO~4nujvauAFoCgMqB`2;_N3W5&?~#jDQ#th0aV8!OIn zh#b}QF73&>wr5=9`H`^ zQiaJ_R03{ByGP?}#8o~NRiMWbmZR{YEmQ&Nt)O!SdP<3g@>k$VdT_+Tct3!CUfZVo zc=8<_?G}RD2wq2U7r{LQo4z1H2}I2h0Z+6Wo~|<+T$5>JV+U&*+Ay=GEeQ5+m<7|o ze>j^>6D-{E3iLeb{>@}cFO_r*>k}?&nilQ?hKGmG!LkUpup>YkB;Q9+ z8cQH^P>`qvQ+QbWUIMHY@D6Dky0YTC?1zTlas0MvY6heQe9c5qajRDCqJbcJl0QQ5 zO{_30vvH6dg~LJ_Nz4c=SZ661R)kV6at*w`vw`ZJP8;p(RHkzGm>qe)It=njBV}~{lm{|8ljf*w^ RSKkqqonSv=Xhxase*rTaV&wn; literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..722a90ebfa1832a1fbfec077653117385b54c312 GIT binary patch literal 24972 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≠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ⅇ~jIFU_uz`6^-Wg}rfS!vtW{ZWty)We#=D+s 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 X6Zc+?t8bh6{U&$cX5;&tc=-PpkAkA$ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78054cfcb537ccea6fd50bc315d4e40181623786 GIT binary patch literal 4429 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≷y!xHJR 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1827d948cedaf0cb37d05fbaf4b1257112e6603a GIT binary patch literal 23238 zcmcJ1e^gsne&>7o{R;_6{QhMDHXz%80UJAxLxK&li5=`QP9`Cfk!3xBg+ank!Zt)C zOp@-vB(3GnbgZ1o?vOUyk|ujf&zYUNJ>A{RkM^Y7-93`!1m&4M>+Vdu&Hk~61h!&mv zcb$8J6F7k%=O*}Jo~O8GTr;d;Z|$&_y>-Jn_SO&U+1oH|U~l8Fk-bgBCcL%d<_XKN zh2hYRTPJM8wuz$Qq6z!3eZn#9m?$1DMxI_Uj5{Y>!>$SUu$$*JTu?LCqBbr64wk;n z%fE)pg7#o}C4LN71RcThVEKrK{i+m_shEBZNhG$RVaN~KkO0OgfgVm3++NV z-VMSYp#twlKy(O|fY@&4=%3Ijln7O?^YX94Q0Nk>Up5Z!5cUc+DA{yh_nA^7I+sVDIDoLlS@LBOTfjppL4KR*vxNmk_zm1-W5f;INJOVeKfk)bH}xLN-B* zA=3v9LXn_*S@*V5cG$>L^aUv9sKVo7_( zKRWY<#e=8UBL*kMU^Ez(=fD#g@x;ytJu&~NCnkn4te%mG=<$0lpAQDd+bpcmKsXxn zW8kA6zZmocFmoXxCF<0@!#o;)za8PDaF7P-tVxUY%s~g~FJ5v=E`B^ZCz(B(raF+#f@$CM3O&PzPw3 z)klvAMwws#J4CK?aeho85Gnw@)iI58zFclxb00`$;}hA4YsU)FDe(fV$~<#i%&Y>& zxv?AuHI3ttTG)Ce1E~u6%|mkBi1uxzwP-i>lReYiTl}EcAnC^=mxH2MgG8~Gf;t3} zjs{5FhA2i;7Y&Y&NY=t3)zXNX)B%lBTWDE)7HK~pnFzK|Or7^nO!$TNzDQtd0*fTt zel!$2Hg&GOW6z$}KL2#I_2fwFk%$m%4~8$bkB82+%iE=^t)sI&8j1y5C;fp7{?TBx zeKIuJ?zaHOm!&c^Uc_>I@{D=d(ogMSQ9tLWow#OYFg7Z zt(ltkdEG5jWwxaJ`oOh;?;fAmy=u-@HYY27Sod08rqYYw_PaK&tSY&8rFwU|diRp> zN1?YuH%k6X-JjN_s*Yt!2j+FZX;}waE|6OQ_(5^Dc&ZS=;^DTM<{?h3N4A$|WBnE{ zZpW`E74?Y3qQo5tW*pRuf{}ihfb0n7xH}H_io=t3cv2>hxD!cVr44MVcN6l07Bu1a zjFDP^={-W3HUzBZtJ4e9DO1H)u9sGqxVheDs+Y~5x}uJ5to-?f=ToLyx$?r@paU2i zcnx}Sor_Ul*c0btIXIQ|Mh!87XU`B#(iVFK`+kd5V&+$P@gz^BOe&828>O~LRZ8t; zrI^5!FF`Ss+9FjcRmn=x@NarhYKv4Vr7kcd_)j#X&|0w?k zcYVrMzh>ax@&cd`~KkJHy%zqJ3rAP@eUFz zuT>_4KOB2)EbVOhM2|!uaFwk%8`92(#o$WQfi(U*53HH>X3JMzeninWFF&FoMDFr5 zME><8^-@T%)(5{RC#X;a-8Ed;6HEk{{TWT)=q9s0#tdFoZQM((>d-3+`rWi zVO|C$zSXPUM4|8Lgwf}NT!B7Vd0kK_?02Lmre0!TJv2F4??DEdW14)!QU zCWB&Znl)2yA!}S0wPPOzq(q1hA$W^peUcdg^`7lpBJ$B7f|t3EHF~}26FcX8cy3@_ zXVyQ)ua$8I`zIP+U%#$JY>i^rI&xZNF0C?`R+mewTQ`{Xmi01TU$t)F^+))-2wUV9 zP~{sK3(+Vx|E^6mR+U?3X=MXq^CR%;y7&fiXEn3hSskRMtspfjWFPnJV}R8|Qo0`; zSp2LZuDdTBIL@pQR5K^}pHqG@3elFNU`+fah_(=AAr7|$+eX_wXD6q-TEkd}txzw{dOcWQ5s%+9B1UF{ z;b<^M0yH)*(iIt5k(p1kB@BrNzyt=FSA_l&BC%PRg1{Y-Ym7vrp>rW7BgfABV>w}* zWMtO7KxBdh_NdY-;F6_faX-dD;@hCjXpt!Cqm#fQY5jsA^A2;ajb4+aMUNyMf~aIG zkW!+O4iZCDGOPSMnqTwzL|>G+B#jk4Y^@`chRp|z;#0^xi@)d$f;sN4owGS!**Djh z-QN5M18)p01%7WZt*f6qk=ULzXUiK`%Dw4w?^5Fj2rU?&LE|jZ4#+$_L&rKKQYgtLsEi(zvGOD%$UwI9qAr z%qtJ4bX9B{JQ^q@)kK`JH28G^kwP(JD}o-+k;7R{Tr*b@=f$$T;4zk4azLd##2Qo~ z1#Dl#i2h8^kw|zXH0rtJ7eh=pYTglTrumtiu2p|R2HLuilr|Y_xW0|@`bNyMPZEp6pl2w!as%^oRwVilR zxU1EeEucm==iCW4$Q#H^Zj48OkFn95Foy)?5qLqPj?`9am!Q2*zAm4SQPvNNj{~#B z`;=Ya0k1NG4~_c+K|~GUEZBMlBC_Q4g`q)08J!6dzeTP%3KY}$i?$*F*RndV_AK-y z8DCC5R7lEsArR7(Zz>}~i z^3$3a%@BLGQU(QW9L$<*S?Y*^Q1elg12Noc73x&7H>(l!am^(NlwQNkZ!_xAM~d`B zD2xRrEBdtT*h-5|M#2Kf9#ON{c`@iGy4P~HwN(g3Y1y`phQ>kf&P|2Jp`SBkXUI^X zg0c)*-w%ahBk@B%^_-gqwuV>(mNTPdATA^0r17!xBJIsbXUu`gZwR|u+ID(H;!zS$ zYhF7Z3`-gj#+?a&EO1`ZkBX70Nr+ERFpvq!q~hARzDsQbWBP}i=kiltupl%SAT&Wg(SmsJHkvl=%v)Pe zn?f`$LBfaSOtqX~_|Jv9l-W7ef6CK!V6W%0Kk69?iBa&Jyyid?qTuLi>umFEn96%* zowY%kU?Jjx!A`AFsgUsjnmn)OBN~a1Xl5aUjo~HfV`QF#P0lXc24DnWt(MI4Jkic1 zc$JkDk(sB<=br=v3r5Au$oftEMRy`l*vb6!8Ef65Gi`0SX?^O=sikjbnh(8eNH;%< zpYKh-_fSgrl)NViulkTFhE35=Hwi%bDVXI(A>b5F4lLGuRh|=oE?wbgb@Wrirm36=}!r}#(#lr;}EYmHlh(>kXSY!I|Kp@>2E7C_qzplxxR;2_Er zEsfje+VZX6N?n!h<6^booHd3k;(DC6cL!(KoMIj1fA!y6nMtgh-6>UC9Uy z)gOzA5ZR`qqK@D!6aFhx;ZOiJHOYWI0E3xifHVmO#9Jg;CZ|D3Q#{ z;&Zv5d+DUvnj3cMZqJZ zG-$NTbB`?c6{#ea_H0!AZ9rYeU$hom48nx7EHRUDHq1SiwHD3wt=emn!%LbaXY!jF z`|i1;*`2#ny4`aF2oib(Nz>xqRi|gMYUxbI**W*vs=Mm-u9T-UNwIMrUFyRo3#>_@9nui{113EE2wc(^&K7wp7RAcl&PD55PJ&Z>Ho&ZyKvsE1H)a zH%c-UJ@Z8$S}T%|r)oN~7_}-O>5n1_0H6;LpOv>^^y4#Sx0s9;!TGqTU?VW z-u{mJkLup4yK&&A_sE^{s%yFr&2|Vs=Ax_C1#9A5vOH;C^e$GXN?LE3+Oj&+w~v48 zc!E!yP8t)_iXHKsne>pPL~E~+ z7|Cy8Pk-BT9El`FMcuTDWF>E zQaCz-?Vi!;!sr~-ant-X-^j&?Sg~h2N5aR`+^hfRGIvG$GAYrgmq9ck-QJ_*5%8HQuUkZ@v>|0?RhcbpTr~ zGxedFG)1V{p39-}anck~NEOHjMm){b=w=TvE6{XAr&fy-x-f%)0?H~xFr7m*O;ZY? z-5*nH42h8SNK5ieMsS!zk|rJOk^HBaCe8&%L*XzaI9Z~XIkL?BNW6j2M+Sv1sHJH7 z20f9?kuad~>ts9o9bTn#Y;W^z;|8u52fd=P|`cFS8@Nz=AR z{5qn{ZlS0KbBc-L&}c9myfP{F%xqH>1F}~{+YW(E;sCOzEeG)Tz`%@`pZ-1f=^U4G z5B*i;je+kSNm>`5TzYz?WdC1P{(7C*^-JYd{J%=Kz7OPsVv>6D8a0Lnz~hm7BK`nB z?%Rits2Gik(g(-MpFDlT{5@^r_+r^olf(yp< zJIG}N?6r%(fw*K-AaGWP4gV5lk5NE;U($_-qA@boPDCyRCCig!eCQWN9Mu=88<~wa zn<}P~G1*?yi~jH^gdIB4^~bzcaf(oqU?Y<0p0P;DhKU;w1#m)$^(5P1*))^HBbl%V zn9?8>LAQ;FIT2|Ga-+m)h-AsnBl2Rf6|MmB4*_z6U@wBD$>a6$Zq8P$xUm+s@tqFw`uKW+(Rp-p_FOpHm!n;zrnrD`CBB;L59#yB06ODp&SEruc!6&0JkGndW+Vz?q6ay<5u_SAD|qX6J{t z;x#SapTX>HKEr>S)t&q-`WS}(rQWiBJ^zy`XJ4o0C%bxU@#AMEzMt3q%?Y z4o!Kn4ridez=Q!ZRF37uqI@|aCm4to5C$|`wy{WUql}A;x3k*t_0Pd*Q=!Gu`{H9l z4{%-l99;GsuI)n6SWaNexBtF1Y#0yJbm((x$~kt4|MHrQ`H@FW#<)h*#&IS>;_(ny zAXw%U-BBKvoZ^`d3lSjs9DvD9s>S!5pN#q7t#Ex(oStNEDp~R=XTUEX|Ii`r{W&U zp~E=IIy4=P1t%Ce7f(`hj_xzgATAP=1!o>&EJ}K$q#KKb!px=$Yn}!Ar7t=)G7`EX z>2XpJi{gADqEhlGaZ(x_g*3xN9S(}203-E3Lf&2cMVqn7VE(D&T=k1J%YC<;4?sh- zmL|sDY`kS{TH3k%wYOStblu$9vudwQRXvumA5WQ%XKiIGwwko9COMR`)z9^>8ZGnt zUYa4h-!C0CuMe%%wx(-am(DF+Ox1Q|9GxjsXV&IS)Gr)krtcMFdD;jK@0PLQj@^}b z;`%e!o>_EfN_Q;!)1@tGd&`10YqqbLE7Ru66W=ZYj<8fzi>V=b^W<(&n9=`UbWRG z0~uRG%G#LHHOjUxMP`Ds!f|9LZX{`IJASFMR@9r9vs6uIR##yC(!P_|@$`abtE0EL zF0LQVX&|#8MRNtDF^828TMP8cJXXFSRn-HDU$aLot&#`WvvqO)5-&Qp)-hpUQwT8` zP!)~Qkkc5Av7BWp4y#iBm@qF@lEyf#Ws;?S<_6oaTPr%s3WYqKb5Fa!qI0MKdJ7$g zRd)t*egg^14eUfn74mV42O0sJeJI8Zx+H?D5)t$YRcBD_>WoxOV+;pHk|S~6S6omv zI|`TFg(-?yCoTh8q#Y-|LBX38e47H2Bb9Ud&61hoPbOov%UE*)7(31_nYH`U%IVx)`N}Nd>E3+mWv)w#;%T)cv zvK2&_;*wuSNmY6Au>ElHy`nzbQxfv!J(b^21$Gsl*;U+dwNQ5?>^V5$(&ZTmS!U!_ zC}@zUC(S;e_61nmHdqAMDUrZ4>w*DdiBcbSLOGZ@1fC5oV70{gy!{|wRVZ(7msSh^S!p*|e74bg-{1B~I+8=Da;-DL+N(WzhA?bw4FiuI0=fnygmL7en@To|uHU zI{7%0nB(!Q#+87&B&m$NNAAxNCZ~7G&LsC3rZ(~lX1s#K37MeU+S-T_oGnV@~BAO$6*ucVTSjaa;yj z9=aTQu=&Y*L*eKihwxtQproCg#5qf->p-`c7yk$)nB7anv9$@O(OsSALa_}b#f-}d zkZu7W{w1IV8mJmX=C}{7Zult9TVYN3_6y&7Au)B!Sc_xmJ67kt=b0omgTlj`1?8#P zqdXKqUhyla1|QKdwUQ|&P>8nZ3@#mLe>W$M@m%;E%Ilb4!j~#y`KH7j&~HFN2coClp=cASG_?q?S`R z8KmP2AdB;DV%|K?LCJ9CK)0`ZFV49cb0J0zuNysW#&JnM;*WLjWv{MI@nqd8)L z{_)NphJgyR`sCXF2mNG_<{TuJqybtO*ff*qzyWDDOQyi&6kCasQMSKDH~Le!*-||h z3j4)rp8_GSpk$a9E%gnaGLG{3F&yU^9f<=sjn!GJ3ukfGnk;Ny16h;fs(rzJv%K?t zQ`a4{Gx6k2^XEY9dEeAQ5MRG(uDPS&STrs*-}H18qDowT-?WY3p15hQ+N!Rkaj`U2 z-h9i{a>wXMxtr3)CZ!dL_$||Rme`Xv_Na-^-7+Plo}Jv@7Ug^Wr%02LVg#9aHvpn zLF)dM`yU47W=g0nMk)(?@<)$!h#BW02p7e<3su-7M=@S@MkEi%YIE?M;Glgi6br?w zxB1lL%-3X^|R`MBvFw~AL0c%XK^+M%P_ zvonW}jjbtRt#RJd8gtw%lzf%eQ28&>nmG{EQnsod&5x2$CX{bz(Y`M|KIF;!IpY&I z2&}hwvpLwJbsmh>eiGikpe@@A+agqah1!~^CPh%J^!I`2SxD|FunMSW8|1yIo`ZtD zpBy5~9BgIjXrp2zpacNlj`@=eBhXK=(nH4f)w z*=ZSGD)5kpcPm=MTuvE6FbmfDz!dyg!|)hWMuUcLP_p&Hy({>n>jXT4{n(xIn^&h$U-d$RvD zyGeTFY=2?eKqn66(UnHI6{LnDpku)JDQJ(^vmW}#^_0FWGs88 z36({nSA5SgjdK=nQW^2yz$9l$Dqs-epQET$v>{hUOdMJy;{h|yiZ>DSI@!Gk$*A;5 zq|*f1fk->ypA;caam@Y-TkF(040`~l*OFG83d;v{Fti2(@*PY`cWU5NzxcnX1WB1p z&t2X$%CpO|y=u~t>>GL#6@NiMMXakTOq7O< z=2?DZa}PiQxvQH|@&5tjw@8Md3tqDRT*i4?R<^aLx3y=sb)^f`iuvvn9ANSdlF`f(uAa*P4whug;e4UJ9g2I#<*sB|<`It&%zTWjV_Rf;xv^w80sjoM&N<~x9eshY~?2J=R^FO>TrC$bwd zntztmqy36fA3s-BAfplS-1Lm)MsLV|+q23M~yu0tQc2m7nFaQLEz zvPW%=QbW;(8g`-vLmn3Q<~Ozga_r}}zyKNU-nvPK+nqBiIsAY2} z)t+?F(|aHJfDq)R1CJ^hFfL3KSY?wr38l@`Cv$KZwqzErGU)`pHP@UL5<{4rzg`boMofHhi=}sq?Idu3qiV zA%JKDRoEAr#3vhqk?2|Sb~=0Iz+UL(N@6sG!hU=u;;i>``-0wm0LoA}a zV8SkzFxEJ;Efk5~%l&g$Wbc`e=)x(x&j3yPe^Z=^0p=VSvqOu2gPf0u$9szu#!tvG znR&)9{w$l`X>{AJn`<4O!u+(T<_JVx=&vA zHuw|U8&~W*)ApTNS7oyP+RnxP<)=~9u?s~V_;LW?Mc*d3GO!id5b-ibdb1%S zf2y<9{UOyP@it1*!^nQl2qC9Ym^W;~V#mwmdKxOJ=z#jCVd@|3=un|?2~)8V;(igs zMhke;LnZ{3iF^Z$l$aviR^X^HstNI9#AG);acx{Xn!iDz%R9r2<@{6gMe<5Ld~>;t zzPWi%;(u<*xDLz*y+K=fy0M_1%Drj@Vdvlny9a-z?0nb)TOj+S4DJ!jZ`m>^S>#`# z?gQOYksS9E<%D5S0R;KFbYPrqM)}5*K~90cKXUeu9%UT$bg3 zEz(6AM){PM$cqc_Q7QcWTj2SSvh7~6?Md7AESKESEnmvm zdf=zws9bS0ryb2p`i!G(Mc0z7T^VAcz!wKBHH_KHaJvT6S0?f51Nb<>0mAp)-@6TBelKqq6YNFKXs z+zuzrS6)b&>Q>FptJ@Z~Wz1E{;7xPm7RjSG%{x{d+cJ*&l&Sugj{1zFF=bLbeAFSJ zH;LK!e&ryW}=b66%s~&Ff@;4&jB!e$i!A(7Hl9DGEwDC94HSsP5-=u)_7m>aGsOU z2q?oI+ABnO+1y-0q;Ln)jq!JKH=&7_;{FZIBzp>OtRM&bj_|OjV5UrJTK>J!w}h}_ zrt~up+%r?E(x80wYs<+Zh9MQ_ubnB^*T}_4K2XNU`tgJL3Cb?vY@ipB29p}Qr1l-e z3lBiWKcNB?oTTwRj0oE!j=EIcp5@pr`ysmGWhZy%(eLh_H_~Nu_uSxJh)wlxx>xEu z()At74a*&=`h6K!H?#Sur#Cd*>O;$!4f`XA&=*g(Is(lPci!t4OC9Z^=WPWa22e97 zP9p{Mn|Vq7E#h*Ye~4J&;(3X3D0qfCM+YKwnY`%g{)PSD>-t_ac{JnRp0Vyo>2}<^ zQgncBq+R@f5!uXnR7yuPs?g`seDm2#Qkn~yNV`!c3cK>FN5yk5R8F$fLbB6@%X9S< z3w)lA7uGa`b^=lZ$xxH0({ar^Ij87*Ynj$UiaL(JgZMKuY05bBpYK_no18F|@6pL7 zb|UOsE?0)-404$xl1hehs5V`7hZ#8{()Z|OXvJjBa1^*#?559qOn4?DaAAVJOv)3x zObwH?KdgR!gJe|ZqdO>)n<4oGbb+$$KpZ=S5tKh9kUyhXfhsr#0rb4Ayg z)^)Cxa^_v1-Z9mG3Ui;n>ofM5h!?l@cJXiUy{)?6bs_d6zPDZXA3G8INi*Nuq5DaT zf#U5vg&h>)Lp`U_XnDUpjM$7l_cfAd&iF^4_41E`)iS!=Lx7BI9HAJ4Cig{8oIbdS za1dHQ5RPm>$WSAdu8n+Vrkg1AjmBqLagh)K{S;nOk?foEq;m2=6q)63fLx%|GK}}8 zhKQv|gU83*NNrX=YVY*Y1U7!?=$=95pgU2WI#zloo)Jkv_cw z*@g*-;sr{g?~F|0J5+y1wfzPKOoemH$5;3|A{|tn$JaN+Y5B6ZAvQfpDD(tN>`ElX zTqK?@8-R%8$XXsLc#;`P-wF1`7qOpmzCl4B1*{ir>`AVX96n#chgI=WD-&+G1?VQX zI1$u^12lIf8AU9KLn3Ay->OXMJSxGco;|7hX(#$Ryu+nnPzXTHr9 z-R7LPIm>OX_ebRlWJMJ>tm~7mnOxPC+pS;*_w+hZ%T|@k6eo^1~O$k zm;C9n_7vy-m7$Ao`ItknKF$~M)ptDx-ns7L`D6UL3BT7pM*eC3Zb=^(H}Tuo z&hXr}MipHR-=&~KEbFXZ)8ft0QI3pGh9PtmlhGlz-ecn*;nzIWxVi?`xH5hxYZBgf zfJ=|Jf`eivYKWO)o!qXTyPT1Ct(VmD?zO`__YmFjdV=R&*&>e;X@5YD+|j$%^^~=S z^UlNkqX6vY?F^3IdwbY#28G{iBF{A+yvr5yb?Z$$-@R_K^4r&IO#D7r_q=WYz?pgX UdIirnp*eMp|Hzf_T}*!Z|2yXPE&u=k literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10dc95c37466e82968509da827375e7e71742db6 GIT binary patch literal 7360 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 a<=h1GP|nMF+ZSsoSI0TLPkqR-vHU-n`$k~^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py new file mode 100644 index 0000000..f7a0218 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py @@ -0,0 +1,110 @@ +""" +ELF file parser. + +This provides a class ``ELFFile`` that parses an ELF executable in a similar +interface to ``ZipFile``. Only the read interface is implemented. + +Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca +ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html +""" + +from __future__ import annotations + +import enum +import os +import struct +from typing import IO + + +class ELFInvalid(ValueError): + pass + + +class EIClass(enum.IntEnum): + C32 = 1 + C64 = 2 + + +class EIData(enum.IntEnum): + Lsb = 1 + Msb = 2 + + +class EMachine(enum.IntEnum): + I386 = 3 + S390 = 22 + Arm = 40 + X8664 = 62 + AArc64 = 183 + + +class ELFFile: + """ + Representation of an ELF executable. + """ + + def __init__(self, f: IO[bytes]) -> None: + self._f = f + + try: + ident = self._read("16B") + except struct.error: + raise ELFInvalid("unable to parse identification") + magic = bytes(ident[:4]) + if magic != b"\x7fELF": + raise ELFInvalid(f"invalid magic: {magic!r}") + + self.capacity = ident[4] # Format for program header (bitness). + self.encoding = ident[5] # Data structure encoding (endianness). + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, self._p_fmt, self._p_idx = { + (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. + (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. + }[(self.capacity, self.encoding)] + except KeyError: + raise ELFInvalid( + f"unrecognized capacity ({self.capacity}) or " + f"encoding ({self.encoding})" + ) + + try: + ( + _, + self.machine, # Architecture type. + _, + _, + self._e_phoff, # Offset of program header. + _, + self.flags, # Processor-specific flags. + _, + self._e_phentsize, # Size of section. + self._e_phnum, # Number of sections. + ) = self._read(e_fmt) + except struct.error as e: + raise ELFInvalid("unable to parse machine and section information") from e + + def _read(self, fmt: str) -> tuple[int, ...]: + return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) + + @property + def interpreter(self) -> str | None: + """ + The path recorded in the ``PT_INTERP`` section header. + """ + for index in range(self._e_phnum): + self._f.seek(self._e_phoff + self._e_phentsize * index) + try: + data = self._read(self._p_fmt) + except struct.error: + continue + if data[self._p_idx[0]] != 3: # Not PT_INTERP. + continue + self._f.seek(data[self._p_idx[1]]) + return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") + return None diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py new file mode 100644 index 0000000..08f651f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py @@ -0,0 +1,262 @@ +from __future__ import annotations + +import collections +import contextlib +import functools +import os +import re +import sys +import warnings +from typing import Generator, Iterator, NamedTuple, Sequence + +from ._elffile import EIClass, EIData, ELFFile, EMachine + +EF_ARM_ABIMASK = 0xFF000000 +EF_ARM_ABI_VER5 = 0x05000000 +EF_ARM_ABI_FLOAT_HARD = 0x00000400 + + +# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` +# as the type for `path` until then. +@contextlib.contextmanager +def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]: + try: + with open(path, "rb") as f: + yield ELFFile(f) + except (OSError, TypeError, ValueError): + yield None + + +def _is_linux_armhf(executable: str) -> bool: + # hard-float ABI can be detected from the ELF header of the running + # process + # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.Arm + and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 + and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD + ) + + +def _is_linux_i686(executable: str) -> bool: + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.I386 + ) + + +def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: + if "armv7l" in archs: + return _is_linux_armhf(executable) + if "i686" in archs: + return _is_linux_i686(executable) + allowed_archs = { + "x86_64", + "aarch64", + "ppc64", + "ppc64le", + "s390x", + "loongarch64", + "riscv64", + } + return any(arch in allowed_archs for arch in archs) + + +# If glibc ever changes its major version, we need to know what the last +# minor version was, so we can build the complete list of all versions. +# For now, guess what the highest minor version might be, assume it will +# be 50 for testing. Once this actually happens, update the dictionary +# with the actual value. +_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50) + + +class _GLibCVersion(NamedTuple): + major: int + minor: int + + +def _glibc_version_string_confstr() -> str | None: + """ + Primary implementation of glibc_version_string using os.confstr. + """ + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module. + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 + try: + # Should be a string like "glibc 2.17". + version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION") + assert version_string is not None + _, version = version_string.rsplit() + except (AssertionError, AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def _glibc_version_string_ctypes() -> str | None: + """ + Fallback implementation of glibc_version_string using ctypes. + """ + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +def _glibc_version_string() -> str | None: + """Returns glibc version string, or None if not using glibc.""" + return _glibc_version_string_confstr() or _glibc_version_string_ctypes() + + +def _parse_glibc_version(version_str: str) -> tuple[int, int]: + """Parse glibc version. + + We use a regexp instead of str.split because we want to discard any + random junk that might come after the minor version -- this might happen + in patched/forked versions of glibc (e.g. Linaro's version of glibc + uses version strings like "2.20-2014.11"). See gh-3588. + """ + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn( + f"Expected glibc version with 2 components major.minor," + f" got: {version_str}", + RuntimeWarning, + ) + return -1, -1 + return int(m.group("major")), int(m.group("minor")) + + +@functools.lru_cache +def _get_glibc_version() -> tuple[int, int]: + version_str = _glibc_version_string() + if version_str is None: + return (-1, -1) + return _parse_glibc_version(version_str) + + +# From PEP 513, PEP 600 +def _is_compatible(arch: str, version: _GLibCVersion) -> bool: + sys_glibc = _get_glibc_version() + if sys_glibc < version: + return False + # Check for presence of _manylinux module. + try: + import _manylinux + except ImportError: + return True + if hasattr(_manylinux, "manylinux_compatible"): + result = _manylinux.manylinux_compatible(version[0], version[1], arch) + if result is not None: + return bool(result) + return True + if version == _GLibCVersion(2, 5): + if hasattr(_manylinux, "manylinux1_compatible"): + return bool(_manylinux.manylinux1_compatible) + if version == _GLibCVersion(2, 12): + if hasattr(_manylinux, "manylinux2010_compatible"): + return bool(_manylinux.manylinux2010_compatible) + if version == _GLibCVersion(2, 17): + if hasattr(_manylinux, "manylinux2014_compatible"): + return bool(_manylinux.manylinux2014_compatible) + return True + + +_LEGACY_MANYLINUX_MAP = { + # CentOS 7 w/ glibc 2.17 (PEP 599) + (2, 17): "manylinux2014", + # CentOS 6 w/ glibc 2.12 (PEP 571) + (2, 12): "manylinux2010", + # CentOS 5 w/ glibc 2.5 (PEP 513) + (2, 5): "manylinux1", +} + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate manylinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be manylinux-compatible. + + :returns: An iterator of compatible manylinux tags. + """ + if not _have_compatible_abi(sys.executable, archs): + return + # Oldest glibc to be supported regardless of architecture is (2, 17). + too_old_glibc2 = _GLibCVersion(2, 16) + if set(archs) & {"x86_64", "i686"}: + # On x86/i686 also oldest glibc to be supported is (2, 5). + too_old_glibc2 = _GLibCVersion(2, 4) + current_glibc = _GLibCVersion(*_get_glibc_version()) + glibc_max_list = [current_glibc] + # We can assume compatibility across glibc major versions. + # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 + # + # Build a list of maximum glibc versions so that we can + # output the canonical list of all glibc from current_glibc + # down to too_old_glibc2, including all intermediary versions. + for glibc_major in range(current_glibc.major - 1, 1, -1): + glibc_minor = _LAST_GLIBC_MINOR[glibc_major] + glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) + for arch in archs: + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(arch, glibc_version): + yield f"{tag}_{arch}" + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(arch, glibc_version): + yield f"{legacy_tag}_{arch}" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py new file mode 100644 index 0000000..d2bf30b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py @@ -0,0 +1,85 @@ +"""PEP 656 support. + +This module implements logic to detect if the currently running Python is +linked against musl, and what musl version is used. +""" + +from __future__ import annotations + +import functools +import re +import subprocess +import sys +from typing import Iterator, NamedTuple, Sequence + +from ._elffile import ELFFile + + +class _MuslVersion(NamedTuple): + major: int + minor: int + + +def _parse_musl_version(output: str) -> _MuslVersion | None: + lines = [n for n in (n.strip() for n in output.splitlines()) if n] + if len(lines) < 2 or lines[0][:4] != "musl": + return None + m = re.match(r"Version (\d+)\.(\d+)", lines[1]) + if not m: + return None + return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) + + +@functools.lru_cache +def _get_musl_version(executable: str) -> _MuslVersion | None: + """Detect currently-running musl runtime version. + + This is done by checking the specified executable's dynamic linking + information, and invoking the loader to parse its output for a version + string. If the loader is musl, the output would be something like:: + + musl libc (x86_64) + Version 1.2.2 + Dynamic Program Loader + """ + try: + with open(executable, "rb") as f: + ld = ELFFile(f).interpreter + except (OSError, TypeError, ValueError): + return None + if ld is None or "musl" not in ld: + return None + proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) + return _parse_musl_version(proc.stderr) + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate musllinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be musllinux-compatible. + + :returns: An iterator of compatible musllinux tags. + """ + sys_musl = _get_musl_version(sys.executable) + if sys_musl is None: # Python not dynamically linked against musl. + return + for arch in archs: + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + + +if __name__ == "__main__": # pragma: no cover + import sysconfig + + plat = sysconfig.get_platform() + assert plat.startswith("linux-"), "not linux" + + print("plat:", plat) + print("musl:", _get_musl_version(sys.executable)) + print("tags:", end=" ") + for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): + print(t, end="\n ") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py new file mode 100644 index 0000000..c1238c0 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py @@ -0,0 +1,354 @@ +"""Handwritten parser of dependency specifiers. + +The docstring for each __parse_* function contains EBNF-inspired grammar representing +the implementation. +""" + +from __future__ import annotations + +import ast +from typing import NamedTuple, Sequence, Tuple, Union + +from ._tokenizer import DEFAULT_RULES, Tokenizer + + +class Node: + def __init__(self, value: str) -> None: + self.value = value + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +MarkerVar = Union[Variable, Value] +MarkerItem = Tuple[MarkerVar, Op, MarkerVar] +MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]] +MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]] + + +class ParsedRequirement(NamedTuple): + name: str + url: str + extras: list[str] + specifier: str + marker: MarkerList | None + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for dependency specifier +# -------------------------------------------------------------------------------------- +def parse_requirement(source: str) -> ParsedRequirement: + return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: + """ + requirement = WS? IDENTIFIER WS? extras WS? requirement_details + """ + tokenizer.consume("WS") + + name_token = tokenizer.expect( + "IDENTIFIER", expected="package name at the start of dependency specifier" + ) + name = name_token.text + tokenizer.consume("WS") + + extras = _parse_extras(tokenizer) + tokenizer.consume("WS") + + url, specifier, marker = _parse_requirement_details(tokenizer) + tokenizer.expect("END", expected="end of dependency specifier") + + return ParsedRequirement(name, url, extras, specifier, marker) + + +def _parse_requirement_details( + tokenizer: Tokenizer, +) -> tuple[str, str, MarkerList | None]: + """ + requirement_details = AT URL (WS requirement_marker?)? + | specifier WS? (requirement_marker)? + """ + + specifier = "" + url = "" + marker = None + + if tokenizer.check("AT"): + tokenizer.read() + tokenizer.consume("WS") + + url_start = tokenizer.position + url = tokenizer.expect("URL", expected="URL after @").text + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + tokenizer.expect("WS", expected="whitespace after URL") + + # The input might end after whitespace. + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, span_start=url_start, after="URL and whitespace" + ) + else: + specifier_start = tokenizer.position + specifier = _parse_specifier(tokenizer) + tokenizer.consume("WS") + + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, + span_start=specifier_start, + after=( + "version specifier" + if specifier + else "name and no valid version specifier" + ), + ) + + return (url, specifier, marker) + + +def _parse_requirement_marker( + tokenizer: Tokenizer, *, span_start: int, after: str +) -> MarkerList: + """ + requirement_marker = SEMICOLON marker WS? + """ + + if not tokenizer.check("SEMICOLON"): + tokenizer.raise_syntax_error( + f"Expected end or semicolon (after {after})", + span_start=span_start, + ) + tokenizer.read() + + marker = _parse_marker(tokenizer) + tokenizer.consume("WS") + + return marker + + +def _parse_extras(tokenizer: Tokenizer) -> list[str]: + """ + extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? + """ + if not tokenizer.check("LEFT_BRACKET", peek=True): + return [] + + with tokenizer.enclosing_tokens( + "LEFT_BRACKET", + "RIGHT_BRACKET", + around="extras", + ): + tokenizer.consume("WS") + extras = _parse_extras_list(tokenizer) + tokenizer.consume("WS") + + return extras + + +def _parse_extras_list(tokenizer: Tokenizer) -> list[str]: + """ + extras_list = identifier (wsp* ',' wsp* identifier)* + """ + extras: list[str] = [] + + if not tokenizer.check("IDENTIFIER"): + return extras + + extras.append(tokenizer.read().text) + + while True: + tokenizer.consume("WS") + if tokenizer.check("IDENTIFIER", peek=True): + tokenizer.raise_syntax_error("Expected comma between extra names") + elif not tokenizer.check("COMMA"): + break + + tokenizer.read() + tokenizer.consume("WS") + + extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") + extras.append(extra_token.text) + + return extras + + +def _parse_specifier(tokenizer: Tokenizer) -> str: + """ + specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS + | WS? version_many WS? + """ + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="version specifier", + ): + tokenizer.consume("WS") + parsed_specifiers = _parse_version_many(tokenizer) + tokenizer.consume("WS") + + return parsed_specifiers + + +def _parse_version_many(tokenizer: Tokenizer) -> str: + """ + version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? + """ + parsed_specifiers = "" + while tokenizer.check("SPECIFIER"): + span_start = tokenizer.position + parsed_specifiers += tokenizer.read().text + if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): + tokenizer.raise_syntax_error( + ".* suffix can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position + 1, + ) + if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): + tokenizer.raise_syntax_error( + "Local version label can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position, + ) + tokenizer.consume("WS") + if not tokenizer.check("COMMA"): + break + parsed_specifiers += tokenizer.read().text + tokenizer.consume("WS") + + return parsed_specifiers + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for marker expression +# -------------------------------------------------------------------------------------- +def parse_marker(source: str) -> MarkerList: + return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: + retval = _parse_marker(tokenizer) + tokenizer.expect("END", expected="end of marker expression") + return retval + + +def _parse_marker(tokenizer: Tokenizer) -> MarkerList: + """ + marker = marker_atom (BOOLOP marker_atom)+ + """ + expression = [_parse_marker_atom(tokenizer)] + while tokenizer.check("BOOLOP"): + token = tokenizer.read() + expr_right = _parse_marker_atom(tokenizer) + expression.extend((token.text, expr_right)) + return expression + + +def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: + """ + marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? + | WS? marker_item WS? + """ + + tokenizer.consume("WS") + if tokenizer.check("LEFT_PARENTHESIS", peek=True): + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="marker expression", + ): + tokenizer.consume("WS") + marker: MarkerAtom = _parse_marker(tokenizer) + tokenizer.consume("WS") + else: + marker = _parse_marker_item(tokenizer) + tokenizer.consume("WS") + return marker + + +def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: + """ + marker_item = WS? marker_var WS? marker_op WS? marker_var WS? + """ + tokenizer.consume("WS") + marker_var_left = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + marker_op = _parse_marker_op(tokenizer) + tokenizer.consume("WS") + marker_var_right = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + return (marker_var_left, marker_op, marker_var_right) + + +def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: + """ + marker_var = VARIABLE | QUOTED_STRING + """ + if tokenizer.check("VARIABLE"): + return process_env_var(tokenizer.read().text.replace(".", "_")) + elif tokenizer.check("QUOTED_STRING"): + return process_python_str(tokenizer.read().text) + else: + tokenizer.raise_syntax_error( + message="Expected a marker variable or quoted string" + ) + + +def process_env_var(env_var: str) -> Variable: + if env_var in ("platform_python_implementation", "python_implementation"): + return Variable("platform_python_implementation") + else: + return Variable(env_var) + + +def process_python_str(python_str: str) -> Value: + value = ast.literal_eval(python_str) + return Value(str(value)) + + +def _parse_marker_op(tokenizer: Tokenizer) -> Op: + """ + marker_op = IN | NOT IN | OP + """ + if tokenizer.check("IN"): + tokenizer.read() + return Op("in") + elif tokenizer.check("NOT"): + tokenizer.read() + tokenizer.expect("WS", expected="whitespace after 'not'") + tokenizer.expect("IN", expected="'in' after 'not'") + return Op("not in") + elif tokenizer.check("OP"): + return Op(tokenizer.read().text) + else: + return tokenizer.raise_syntax_error( + "Expected marker operator, one of " + "<=, <, !=, ==, >=, >, ~=, ===, in, not in" + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..90a6465 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,61 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return False + + def __le__(self, other: object) -> bool: + return False + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return True + + def __ge__(self, other: object) -> bool: + return True + + def __neg__(self: object) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return True + + def __le__(self, other: object) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return False + + def __ge__(self, other: object) -> bool: + return False + + def __neg__(self: object) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py new file mode 100644 index 0000000..89d0416 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py @@ -0,0 +1,194 @@ +from __future__ import annotations + +import contextlib +import re +from dataclasses import dataclass +from typing import Iterator, NoReturn + +from .specifiers import Specifier + + +@dataclass +class Token: + name: str + text: str + position: int + + +class ParserSyntaxError(Exception): + """The provided source text could not be parsed correctly.""" + + def __init__( + self, + message: str, + *, + source: str, + span: tuple[int, int], + ) -> None: + self.span = span + self.message = message + self.source = source + + super().__init__() + + def __str__(self) -> str: + marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" + return "\n ".join([self.message, self.source, marker]) + + +DEFAULT_RULES: dict[str, str | re.Pattern[str]] = { + "LEFT_PARENTHESIS": r"\(", + "RIGHT_PARENTHESIS": r"\)", + "LEFT_BRACKET": r"\[", + "RIGHT_BRACKET": r"\]", + "SEMICOLON": r";", + "COMMA": r",", + "QUOTED_STRING": re.compile( + r""" + ( + ('[^']*') + | + ("[^"]*") + ) + """, + re.VERBOSE, + ), + "OP": r"(===|==|~=|!=|<=|>=|<|>)", + "BOOLOP": r"\b(or|and)\b", + "IN": r"\bin\b", + "NOT": r"\bnot\b", + "VARIABLE": re.compile( + r""" + \b( + python_version + |python_full_version + |os[._]name + |sys[._]platform + |platform_(release|system) + |platform[._](version|machine|python_implementation) + |python_implementation + |implementation_(name|version) + |extra + )\b + """, + re.VERBOSE, + ), + "SPECIFIER": re.compile( + Specifier._operator_regex_str + Specifier._version_regex_str, + re.VERBOSE | re.IGNORECASE, + ), + "AT": r"\@", + "URL": r"[^ \t]+", + "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", + "VERSION_PREFIX_TRAIL": r"\.\*", + "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", + "WS": r"[ \t]+", + "END": r"$", +} + + +class Tokenizer: + """Context-sensitive token parsing. + + Provides methods to examine the input stream to check whether the next token + matches. + """ + + def __init__( + self, + source: str, + *, + rules: dict[str, str | re.Pattern[str]], + ) -> None: + self.source = source + self.rules: dict[str, re.Pattern[str]] = { + name: re.compile(pattern) for name, pattern in rules.items() + } + self.next_token: Token | None = None + self.position = 0 + + def consume(self, name: str) -> None: + """Move beyond provided token name, if at current position.""" + if self.check(name): + self.read() + + def check(self, name: str, *, peek: bool = False) -> bool: + """Check whether the next token has the provided name. + + By default, if the check succeeds, the token *must* be read before + another check. If `peek` is set to `True`, the token is not loaded and + would need to be checked again. + """ + assert ( + self.next_token is None + ), f"Cannot check for {name!r}, already have {self.next_token!r}" + assert name in self.rules, f"Unknown token name: {name!r}" + + expression = self.rules[name] + + match = expression.match(self.source, self.position) + if match is None: + return False + if not peek: + self.next_token = Token(name, match[0], self.position) + return True + + def expect(self, name: str, *, expected: str) -> Token: + """Expect a certain token name next, failing with a syntax error otherwise. + + The token is *not* read. + """ + if not self.check(name): + raise self.raise_syntax_error(f"Expected {expected}") + return self.read() + + def read(self) -> Token: + """Consume the next token and return it.""" + token = self.next_token + assert token is not None + + self.position += len(token.text) + self.next_token = None + + return token + + def raise_syntax_error( + self, + message: str, + *, + span_start: int | None = None, + span_end: int | None = None, + ) -> NoReturn: + """Raise ParserSyntaxError at the given position.""" + span = ( + self.position if span_start is None else span_start, + self.position if span_end is None else span_end, + ) + raise ParserSyntaxError( + message, + source=self.source, + span=span, + ) + + @contextlib.contextmanager + def enclosing_tokens( + self, open_token: str, close_token: str, *, around: str + ) -> Iterator[None]: + if self.check(open_token): + open_position = self.position + self.read() + else: + open_position = None + + yield + + if open_position is None: + return + + if not self.check(close_token): + self.raise_syntax_error( + f"Expected matching {close_token} for {open_token}, after {around}", + span_start=open_position, + ) + + self.read() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..7ac7bb6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,325 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import operator +import os +import platform +import sys +from typing import Any, Callable, TypedDict, cast + +from ._parser import MarkerAtom, MarkerList, Op, Value, Variable +from ._parser import parse_marker as _parse_marker +from ._tokenizer import ParserSyntaxError +from .specifiers import InvalidSpecifier, Specifier +from .utils import canonicalize_name + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + +Operator = Callable[[str, str], bool] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Environment(TypedDict): + implementation_name: str + """The implementation's identifier, e.g. ``'cpython'``.""" + + implementation_version: str + """ + The implementation's version, e.g. ``'3.13.0a2'`` for CPython 3.13.0a2, or + ``'7.3.13'`` for PyPy3.10 v7.3.13. + """ + + os_name: str + """ + The value of :py:data:`os.name`. The name of the operating system dependent module + imported, e.g. ``'posix'``. + """ + + platform_machine: str + """ + Returns the machine type, e.g. ``'i386'``. + + An empty string if the value cannot be determined. + """ + + platform_release: str + """ + The system's release, e.g. ``'2.2.0'`` or ``'NT'``. + + An empty string if the value cannot be determined. + """ + + platform_system: str + """ + The system/OS name, e.g. ``'Linux'``, ``'Windows'`` or ``'Java'``. + + An empty string if the value cannot be determined. + """ + + platform_version: str + """ + The system's release version, e.g. ``'#3 on degas'``. + + An empty string if the value cannot be determined. + """ + + python_full_version: str + """ + The Python version as string ``'major.minor.patchlevel'``. + + Note that unlike the Python :py:data:`sys.version`, this value will always include + the patchlevel (it defaults to 0). + """ + + platform_python_implementation: str + """ + A string identifying the Python implementation, e.g. ``'CPython'``. + """ + + python_version: str + """The Python version as string ``'major.minor'``.""" + + sys_platform: str + """ + This string contains a platform identifier that can be used to append + platform-specific components to :py:data:`sys.path`, for instance. + + For Unix systems, except on Linux and AIX, this is the lowercased OS name as + returned by ``uname -s`` with the first part of the version as returned by + ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, at the time when Python + was built. + """ + + +def _normalize_extra_values(results: Any) -> Any: + """ + Normalize extra values. + """ + if isinstance(results[0], tuple): + lhs, op, rhs = results[0] + if isinstance(lhs, Variable) and lhs.value == "extra": + normalized_extra = canonicalize_name(rhs.value) + rhs = Value(normalized_extra) + elif isinstance(rhs, Variable) and rhs.value == "extra": + normalized_extra = canonicalize_name(lhs.value) + lhs = Value(normalized_extra) + results[0] = lhs, op, rhs + return results + + +def _format_marker( + marker: list[str] | MarkerAtom | str, first: bool | None = True +) -> str: + assert isinstance(marker, (list, tuple, str)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators: dict[str, Operator] = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs: str, op: Op, rhs: str) -> bool: + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs, prereleases=True) + + oper: Operator | None = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") + + return oper(lhs, rhs) + + +def _normalize(*values: str, key: str) -> tuple[str, ...]: + # PEP 685 – Comparison of extra names for optional distribution dependencies + # https://peps.python.org/pep-0685/ + # > When comparing extra names, tools MUST normalize the names being + # > compared using the semantics outlined in PEP 503 for names + if key == "extra": + return tuple(canonicalize_name(v) for v in values) + + # other environment markers don't have such standards + return values + + +def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool: + groups: list[list[bool]] = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, str)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + environment_key = lhs.value + lhs_value = environment[environment_key] + rhs_value = rhs.value + else: + lhs_value = lhs.value + environment_key = rhs.value + rhs_value = environment[environment_key] + + lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info: sys._version_info) -> str: + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment() -> Environment: + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": ".".join(platform.python_version_tuple()[:2]), + "sys_platform": sys.platform, + } + + +class Marker: + def __init__(self, marker: str) -> None: + # Note: We create a Marker object without calling this constructor in + # packaging.requirements.Requirement. If any additional logic is + # added here, make sure to mirror/adapt Requirement. + try: + self._markers = _normalize_extra_values(_parse_marker(marker)) + # The attribute `_markers` can be described in terms of a recursive type: + # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] + # + # For example, the following expression: + # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") + # + # is parsed into: + # [ + # (, ')>, ), + # 'and', + # [ + # (, , ), + # 'or', + # (, , ) + # ] + # ] + except ParserSyntaxError as e: + raise InvalidMarker(str(e)) from e + + def __str__(self) -> str: + return _format_marker(self._markers) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash((self.__class__.__name__, str(self))) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Marker): + return NotImplemented + + return str(self) == str(other) + + def evaluate(self, environment: dict[str, str] | None = None) -> bool: + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = cast("dict[str, str]", default_environment()) + current_environment["extra"] = "" + # Work around platform.python_version() returning something that is not PEP 440 + # compliant for non-tagged Python builds. We preserve default_environment()'s + # behavior of returning platform.python_version() verbatim, and leave it to the + # caller to provide a syntactically valid version if they want to override it. + if current_environment["python_full_version"].endswith("+"): + current_environment["python_full_version"] += "local" + if environment is not None: + current_environment.update(environment) + # The API used to allow setting extra to None. We need to handle this + # case for backwards compatibility. + if current_environment["extra"] is None: + current_environment["extra"] = "" + + return _evaluate_markers(self._markers, current_environment) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py new file mode 100644 index 0000000..eb8dc84 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py @@ -0,0 +1,804 @@ +from __future__ import annotations + +import email.feedparser +import email.header +import email.message +import email.parser +import email.policy +import typing +from typing import ( + Any, + Callable, + Generic, + Literal, + TypedDict, + cast, +) + +from . import requirements, specifiers, utils +from . import version as version_module + +T = typing.TypeVar("T") + + +try: + ExceptionGroup +except NameError: # pragma: no cover + + class ExceptionGroup(Exception): + """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. + + If :external:exc:`ExceptionGroup` is already defined by Python itself, + that version is used instead. + """ + + message: str + exceptions: list[Exception] + + def __init__(self, message: str, exceptions: list[Exception]) -> None: + self.message = message + self.exceptions = exceptions + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" + +else: # pragma: no cover + ExceptionGroup = ExceptionGroup + + +class InvalidMetadata(ValueError): + """A metadata field contains invalid data.""" + + field: str + """The name of the field that contains invalid data.""" + + def __init__(self, field: str, message: str) -> None: + self.field = field + super().__init__(message) + + +# The RawMetadata class attempts to make as few assumptions about the underlying +# serialization formats as possible. The idea is that as long as a serialization +# formats offer some very basic primitives in *some* way then we can support +# serializing to and from that format. +class RawMetadata(TypedDict, total=False): + """A dictionary of raw core metadata. + + Each field in core metadata maps to a key of this dictionary (when data is + provided). The key is lower-case and underscores are used instead of dashes + compared to the equivalent core metadata field. Any core metadata field that + can be specified multiple times or can hold multiple values in a single + field have a key with a plural name. See :class:`Metadata` whose attributes + match the keys of this dictionary. + + Core metadata fields that can be specified multiple times are stored as a + list or dict depending on which is appropriate for the field. Any fields + which hold multiple values in a single field are stored as a list. + + """ + + # Metadata 1.0 - PEP 241 + metadata_version: str + name: str + version: str + platforms: list[str] + summary: str + description: str + keywords: list[str] + home_page: str + author: str + author_email: str + license: str + + # Metadata 1.1 - PEP 314 + supported_platforms: list[str] + download_url: str + classifiers: list[str] + requires: list[str] + provides: list[str] + obsoletes: list[str] + + # Metadata 1.2 - PEP 345 + maintainer: str + maintainer_email: str + requires_dist: list[str] + provides_dist: list[str] + obsoletes_dist: list[str] + requires_python: str + requires_external: list[str] + project_urls: dict[str, str] + + # Metadata 2.0 + # PEP 426 attempted to completely revamp the metadata format + # but got stuck without ever being able to build consensus on + # it and ultimately ended up withdrawn. + # + # However, a number of tools had started emitting METADATA with + # `2.0` Metadata-Version, so for historical reasons, this version + # was skipped. + + # Metadata 2.1 - PEP 566 + description_content_type: str + provides_extra: list[str] + + # Metadata 2.2 - PEP 643 + dynamic: list[str] + + # Metadata 2.3 - PEP 685 + # No new fields were added in PEP 685, just some edge case were + # tightened up to provide better interoptability. + + +_STRING_FIELDS = { + "author", + "author_email", + "description", + "description_content_type", + "download_url", + "home_page", + "license", + "maintainer", + "maintainer_email", + "metadata_version", + "name", + "requires_python", + "summary", + "version", +} + +_LIST_FIELDS = { + "classifiers", + "dynamic", + "obsoletes", + "obsoletes_dist", + "platforms", + "provides", + "provides_dist", + "provides_extra", + "requires", + "requires_dist", + "requires_external", + "supported_platforms", +} + +_DICT_FIELDS = { + "project_urls", +} + + +def _parse_keywords(data: str) -> list[str]: + """Split a string of comma-separate keyboards into a list of keywords.""" + return [k.strip() for k in data.split(",")] + + +def _parse_project_urls(data: list[str]) -> dict[str, str]: + """Parse a list of label/URL string pairings separated by a comma.""" + urls = {} + for pair in data: + # Our logic is slightly tricky here as we want to try and do + # *something* reasonable with malformed data. + # + # The main thing that we have to worry about, is data that does + # not have a ',' at all to split the label from the Value. There + # isn't a singular right answer here, and we will fail validation + # later on (if the caller is validating) so it doesn't *really* + # matter, but since the missing value has to be an empty str + # and our return value is dict[str, str], if we let the key + # be the missing value, then they'd have multiple '' values that + # overwrite each other in a accumulating dict. + # + # The other potentional issue is that it's possible to have the + # same label multiple times in the metadata, with no solid "right" + # answer with what to do in that case. As such, we'll do the only + # thing we can, which is treat the field as unparseable and add it + # to our list of unparsed fields. + parts = [p.strip() for p in pair.split(",", 1)] + parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items + + # TODO: The spec doesn't say anything about if the keys should be + # considered case sensitive or not... logically they should + # be case-preserving and case-insensitive, but doing that + # would open up more cases where we might have duplicate + # entries. + label, url = parts + if label in urls: + # The label already exists in our set of urls, so this field + # is unparseable, and we can just add the whole thing to our + # unparseable data and stop processing it. + raise KeyError("duplicate labels in project urls") + urls[label] = url + + return urls + + +def _get_payload(msg: email.message.Message, source: bytes | str) -> str: + """Get the body of the message.""" + # If our source is a str, then our caller has managed encodings for us, + # and we don't need to deal with it. + if isinstance(source, str): + payload: str = msg.get_payload() + return payload + # If our source is a bytes, then we're managing the encoding and we need + # to deal with it. + else: + bpayload: bytes = msg.get_payload(decode=True) + try: + return bpayload.decode("utf8", "strict") + except UnicodeDecodeError: + raise ValueError("payload in an invalid encoding") + + +# The various parse_FORMAT functions here are intended to be as lenient as +# possible in their parsing, while still returning a correctly typed +# RawMetadata. +# +# To aid in this, we also generally want to do as little touching of the +# data as possible, except where there are possibly some historic holdovers +# that make valid data awkward to work with. +# +# While this is a lower level, intermediate format than our ``Metadata`` +# class, some light touch ups can make a massive difference in usability. + +# Map METADATA fields to RawMetadata. +_EMAIL_TO_RAW_MAPPING = { + "author": "author", + "author-email": "author_email", + "classifier": "classifiers", + "description": "description", + "description-content-type": "description_content_type", + "download-url": "download_url", + "dynamic": "dynamic", + "home-page": "home_page", + "keywords": "keywords", + "license": "license", + "maintainer": "maintainer", + "maintainer-email": "maintainer_email", + "metadata-version": "metadata_version", + "name": "name", + "obsoletes": "obsoletes", + "obsoletes-dist": "obsoletes_dist", + "platform": "platforms", + "project-url": "project_urls", + "provides": "provides", + "provides-dist": "provides_dist", + "provides-extra": "provides_extra", + "requires": "requires", + "requires-dist": "requires_dist", + "requires-external": "requires_external", + "requires-python": "requires_python", + "summary": "summary", + "supported-platform": "supported_platforms", + "version": "version", +} +_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} + + +def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]: + """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). + + This function returns a two-item tuple of dicts. The first dict is of + recognized fields from the core metadata specification. Fields that can be + parsed and translated into Python's built-in types are converted + appropriately. All other fields are left as-is. Fields that are allowed to + appear multiple times are stored as lists. + + The second dict contains all other fields from the metadata. This includes + any unrecognized fields. It also includes any fields which are expected to + be parsed into a built-in type but were not formatted appropriately. Finally, + any fields that are expected to appear only once but are repeated are + included in this dict. + + """ + raw: dict[str, str | list[str] | dict[str, str]] = {} + unparsed: dict[str, list[str]] = {} + + if isinstance(data, str): + parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) + else: + parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) + + # We have to wrap parsed.keys() in a set, because in the case of multiple + # values for a key (a list), the key will appear multiple times in the + # list of keys, but we're avoiding that by using get_all(). + for name in frozenset(parsed.keys()): + # Header names in RFC are case insensitive, so we'll normalize to all + # lower case to make comparisons easier. + name = name.lower() + + # We use get_all() here, even for fields that aren't multiple use, + # because otherwise someone could have e.g. two Name fields, and we + # would just silently ignore it rather than doing something about it. + headers = parsed.get_all(name) or [] + + # The way the email module works when parsing bytes is that it + # unconditionally decodes the bytes as ascii using the surrogateescape + # handler. When you pull that data back out (such as with get_all() ), + # it looks to see if the str has any surrogate escapes, and if it does + # it wraps it in a Header object instead of returning the string. + # + # As such, we'll look for those Header objects, and fix up the encoding. + value = [] + # Flag if we have run into any issues processing the headers, thus + # signalling that the data belongs in 'unparsed'. + valid_encoding = True + for h in headers: + # It's unclear if this can return more types than just a Header or + # a str, so we'll just assert here to make sure. + assert isinstance(h, (email.header.Header, str)) + + # If it's a header object, we need to do our little dance to get + # the real data out of it. In cases where there is invalid data + # we're going to end up with mojibake, but there's no obvious, good + # way around that without reimplementing parts of the Header object + # ourselves. + # + # That should be fine since, if mojibacked happens, this key is + # going into the unparsed dict anyways. + if isinstance(h, email.header.Header): + # The Header object stores it's data as chunks, and each chunk + # can be independently encoded, so we'll need to check each + # of them. + chunks: list[tuple[bytes, str | None]] = [] + for bin, encoding in email.header.decode_header(h): + try: + bin.decode("utf8", "strict") + except UnicodeDecodeError: + # Enable mojibake. + encoding = "latin1" + valid_encoding = False + else: + encoding = "utf8" + chunks.append((bin, encoding)) + + # Turn our chunks back into a Header object, then let that + # Header object do the right thing to turn them into a + # string for us. + value.append(str(email.header.make_header(chunks))) + # This is already a string, so just add it. + else: + value.append(h) + + # We've processed all of our values to get them into a list of str, + # but we may have mojibake data, in which case this is an unparsed + # field. + if not valid_encoding: + unparsed[name] = value + continue + + raw_name = _EMAIL_TO_RAW_MAPPING.get(name) + if raw_name is None: + # This is a bit of a weird situation, we've encountered a key that + # we don't know what it means, so we don't know whether it's meant + # to be a list or not. + # + # Since we can't really tell one way or another, we'll just leave it + # as a list, even though it may be a single item list, because that's + # what makes the most sense for email headers. + unparsed[name] = value + continue + + # If this is one of our string fields, then we'll check to see if our + # value is a list of a single item. If it is then we'll assume that + # it was emitted as a single string, and unwrap the str from inside + # the list. + # + # If it's any other kind of data, then we haven't the faintest clue + # what we should parse it as, and we have to just add it to our list + # of unparsed stuff. + if raw_name in _STRING_FIELDS and len(value) == 1: + raw[raw_name] = value[0] + # If this is one of our list of string fields, then we can just assign + # the value, since email *only* has strings, and our get_all() call + # above ensures that this is a list. + elif raw_name in _LIST_FIELDS: + raw[raw_name] = value + # Special Case: Keywords + # The keywords field is implemented in the metadata spec as a str, + # but it conceptually is a list of strings, and is serialized using + # ", ".join(keywords), so we'll do some light data massaging to turn + # this into what it logically is. + elif raw_name == "keywords" and len(value) == 1: + raw[raw_name] = _parse_keywords(value[0]) + # Special Case: Project-URL + # The project urls is implemented in the metadata spec as a list of + # specially-formatted strings that represent a key and a value, which + # is fundamentally a mapping, however the email format doesn't support + # mappings in a sane way, so it was crammed into a list of strings + # instead. + # + # We will do a little light data massaging to turn this into a map as + # it logically should be. + elif raw_name == "project_urls": + try: + raw[raw_name] = _parse_project_urls(value) + except KeyError: + unparsed[name] = value + # Nothing that we've done has managed to parse this, so it'll just + # throw it in our unparseable data and move on. + else: + unparsed[name] = value + + # We need to support getting the Description from the message payload in + # addition to getting it from the the headers. This does mean, though, there + # is the possibility of it being set both ways, in which case we put both + # in 'unparsed' since we don't know which is right. + try: + payload = _get_payload(parsed, data) + except ValueError: + unparsed.setdefault("description", []).append( + parsed.get_payload(decode=isinstance(data, bytes)) + ) + else: + if payload: + # Check to see if we've already got a description, if so then both + # it, and this body move to unparseable. + if "description" in raw: + description_header = cast(str, raw.pop("description")) + unparsed.setdefault("description", []).extend( + [description_header, payload] + ) + elif "description" in unparsed: + unparsed["description"].append(payload) + else: + raw["description"] = payload + + # We need to cast our `raw` to a metadata, because a TypedDict only support + # literal key names, but we're computing our key names on purpose, but the + # way this function is implemented, our `TypedDict` can only have valid key + # names. + return cast(RawMetadata, raw), unparsed + + +_NOT_FOUND = object() + + +# Keep the two values in sync. +_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] +_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] + +_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) + + +class _Validator(Generic[T]): + """Validate a metadata field. + + All _process_*() methods correspond to a core metadata field. The method is + called with the field's raw value. If the raw value is valid it is returned + in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). + If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause + as appropriate). + """ + + name: str + raw_name: str + added: _MetadataVersion + + def __init__( + self, + *, + added: _MetadataVersion = "1.0", + ) -> None: + self.added = added + + def __set_name__(self, _owner: Metadata, name: str) -> None: + self.name = name + self.raw_name = _RAW_TO_EMAIL_MAPPING[name] + + def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T: + # With Python 3.8, the caching can be replaced with functools.cached_property(). + # No need to check the cache as attribute lookup will resolve into the + # instance's __dict__ before __get__ is called. + cache = instance.__dict__ + value = instance._raw.get(self.name) + + # To make the _process_* methods easier, we'll check if the value is None + # and if this field is NOT a required attribute, and if both of those + # things are true, we'll skip the the converter. This will mean that the + # converters never have to deal with the None union. + if self.name in _REQUIRED_ATTRS or value is not None: + try: + converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") + except AttributeError: + pass + else: + value = converter(value) + + cache[self.name] = value + try: + del instance._raw[self.name] # type: ignore[misc] + except KeyError: + pass + + return cast(T, value) + + def _invalid_metadata( + self, msg: str, cause: Exception | None = None + ) -> InvalidMetadata: + exc = InvalidMetadata( + self.raw_name, msg.format_map({"field": repr(self.raw_name)}) + ) + exc.__cause__ = cause + return exc + + def _process_metadata_version(self, value: str) -> _MetadataVersion: + # Implicitly makes Metadata-Version required. + if value not in _VALID_METADATA_VERSIONS: + raise self._invalid_metadata(f"{value!r} is not a valid metadata version") + return cast(_MetadataVersion, value) + + def _process_name(self, value: str) -> str: + if not value: + raise self._invalid_metadata("{field} is a required field") + # Validate the name as a side-effect. + try: + utils.canonicalize_name(value, validate=True) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + else: + return value + + def _process_version(self, value: str) -> version_module.Version: + if not value: + raise self._invalid_metadata("{field} is a required field") + try: + return version_module.parse(value) + except version_module.InvalidVersion as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_summary(self, value: str) -> str: + """Check the field contains no newlines.""" + if "\n" in value: + raise self._invalid_metadata("{field} must be a single line") + return value + + def _process_description_content_type(self, value: str) -> str: + content_types = {"text/plain", "text/x-rst", "text/markdown"} + message = email.message.EmailMessage() + message["content-type"] = value + + content_type, parameters = ( + # Defaults to `text/plain` if parsing failed. + message.get_content_type().lower(), + message["content-type"].params, + ) + # Check if content-type is valid or defaulted to `text/plain` and thus was + # not parseable. + if content_type not in content_types or content_type not in value.lower(): + raise self._invalid_metadata( + f"{{field}} must be one of {list(content_types)}, not {value!r}" + ) + + charset = parameters.get("charset", "UTF-8") + if charset != "UTF-8": + raise self._invalid_metadata( + f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" + ) + + markdown_variants = {"GFM", "CommonMark"} + variant = parameters.get("variant", "GFM") # Use an acceptable default. + if content_type == "text/markdown" and variant not in markdown_variants: + raise self._invalid_metadata( + f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " + f"not {variant!r}", + ) + return value + + def _process_dynamic(self, value: list[str]) -> list[str]: + for dynamic_field in map(str.lower, value): + if dynamic_field in {"name", "version", "metadata-version"}: + raise self._invalid_metadata( + f"{value!r} is not allowed as a dynamic field" + ) + elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: + raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") + return list(map(str.lower, value)) + + def _process_provides_extra( + self, + value: list[str], + ) -> list[utils.NormalizedName]: + normalized_names = [] + try: + for name in value: + normalized_names.append(utils.canonicalize_name(name, validate=True)) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{name!r} is invalid for {{field}}", cause=exc + ) + else: + return normalized_names + + def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: + try: + return specifiers.SpecifierSet(value) + except specifiers.InvalidSpecifier as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_requires_dist( + self, + value: list[str], + ) -> list[requirements.Requirement]: + reqs = [] + try: + for req in value: + reqs.append(requirements.Requirement(req)) + except requirements.InvalidRequirement as exc: + raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) + else: + return reqs + + +class Metadata: + """Representation of distribution metadata. + + Compared to :class:`RawMetadata`, this class provides objects representing + metadata fields instead of only using built-in types. Any invalid metadata + will cause :exc:`InvalidMetadata` to be raised (with a + :py:attr:`~BaseException.__cause__` attribute as appropriate). + """ + + _raw: RawMetadata + + @classmethod + def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata: + """Create an instance from :class:`RawMetadata`. + + If *validate* is true, all metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + ins = cls() + ins._raw = data.copy() # Mutations occur due to caching enriched values. + + if validate: + exceptions: list[Exception] = [] + try: + metadata_version = ins.metadata_version + metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) + except InvalidMetadata as metadata_version_exc: + exceptions.append(metadata_version_exc) + metadata_version = None + + # Make sure to check for the fields that are present, the required + # fields (so their absence can be reported). + fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS + # Remove fields that have already been checked. + fields_to_check -= {"metadata_version"} + + for key in fields_to_check: + try: + if metadata_version: + # Can't use getattr() as that triggers descriptor protocol which + # will fail due to no value for the instance argument. + try: + field_metadata_version = cls.__dict__[key].added + except KeyError: + exc = InvalidMetadata(key, f"unrecognized field: {key!r}") + exceptions.append(exc) + continue + field_age = _VALID_METADATA_VERSIONS.index( + field_metadata_version + ) + if field_age > metadata_age: + field = _RAW_TO_EMAIL_MAPPING[key] + exc = InvalidMetadata( + field, + "{field} introduced in metadata version " + "{field_metadata_version}, not {metadata_version}", + ) + exceptions.append(exc) + continue + getattr(ins, key) + except InvalidMetadata as exc: + exceptions.append(exc) + + if exceptions: + raise ExceptionGroup("invalid metadata", exceptions) + + return ins + + @classmethod + def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata: + """Parse metadata from email headers. + + If *validate* is true, the metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + raw, unparsed = parse_email(data) + + if validate: + exceptions: list[Exception] = [] + for unparsed_key in unparsed: + if unparsed_key in _EMAIL_TO_RAW_MAPPING: + message = f"{unparsed_key!r} has invalid data" + else: + message = f"unrecognized field: {unparsed_key!r}" + exceptions.append(InvalidMetadata(unparsed_key, message)) + + if exceptions: + raise ExceptionGroup("unparsed", exceptions) + + try: + return cls.from_raw(raw, validate=validate) + except ExceptionGroup as exc_group: + raise ExceptionGroup( + "invalid or unparsed metadata", exc_group.exceptions + ) from None + + metadata_version: _Validator[_MetadataVersion] = _Validator() + """:external:ref:`core-metadata-metadata-version` + (required; validated to be a valid metadata version)""" + name: _Validator[str] = _Validator() + """:external:ref:`core-metadata-name` + (required; validated using :func:`~packaging.utils.canonicalize_name` and its + *validate* parameter)""" + version: _Validator[version_module.Version] = _Validator() + """:external:ref:`core-metadata-version` (required)""" + dynamic: _Validator[list[str] | None] = _Validator( + added="2.2", + ) + """:external:ref:`core-metadata-dynamic` + (validated against core metadata field names and lowercased)""" + platforms: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-platform`""" + supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-supported-platform`""" + summary: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" + description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body + """:external:ref:`core-metadata-description`""" + description_content_type: _Validator[str | None] = _Validator(added="2.1") + """:external:ref:`core-metadata-description-content-type` (validated)""" + keywords: _Validator[list[str] | None] = _Validator() + """:external:ref:`core-metadata-keywords`""" + home_page: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-home-page`""" + download_url: _Validator[str | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-download-url`""" + author: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author`""" + author_email: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-author-email`""" + maintainer: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer`""" + maintainer_email: _Validator[str | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer-email`""" + license: _Validator[str | None] = _Validator() + """:external:ref:`core-metadata-license`""" + classifiers: _Validator[list[str] | None] = _Validator(added="1.1") + """:external:ref:`core-metadata-classifier`""" + requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-dist`""" + requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-python`""" + # Because `Requires-External` allows for non-PEP 440 version specifiers, we + # don't do any processing on the values. + requires_external: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-requires-external`""" + project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-project-url`""" + # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation + # regardless of metadata version. + provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator( + added="2.1", + ) + """:external:ref:`core-metadata-provides-extra`""" + provides_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-provides-dist`""" + obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2") + """:external:ref:`core-metadata-obsoletes-dist`""" + requires: _Validator[list[str] | None] = _Validator(added="1.1") + """``Requires`` (deprecated)""" + provides: _Validator[list[str] | None] = _Validator(added="1.1") + """``Provides`` (deprecated)""" + obsoletes: _Validator[list[str] | None] = _Validator(added="1.1") + """``Obsoletes`` (deprecated)""" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..4e068c9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,91 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import annotations + +from typing import Any, Iterator + +from ._parser import parse_requirement as _parse_requirement +from ._tokenizer import ParserSyntaxError +from .markers import Marker, _normalize_extra_values +from .specifiers import SpecifierSet +from .utils import canonicalize_name + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +class Requirement: + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string: str) -> None: + try: + parsed = _parse_requirement(requirement_string) + except ParserSyntaxError as e: + raise InvalidRequirement(str(e)) from e + + self.name: str = parsed.name + self.url: str | None = parsed.url or None + self.extras: set[str] = set(parsed.extras or []) + self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) + self.marker: Marker | None = None + if parsed.marker is not None: + self.marker = Marker.__new__(Marker) + self.marker._markers = _normalize_extra_values(parsed.marker) + + def _iter_parts(self, name: str) -> Iterator[str]: + yield name + + if self.extras: + formatted_extras = ",".join(sorted(self.extras)) + yield f"[{formatted_extras}]" + + if self.specifier: + yield str(self.specifier) + + if self.url: + yield f"@ {self.url}" + if self.marker: + yield " " + + if self.marker: + yield f"; {self.marker}" + + def __str__(self) -> str: + return "".join(self._iter_parts(self.name)) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash( + ( + self.__class__.__name__, + *self._iter_parts(canonicalize_name(self.name)), + ) + ) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Requirement): + return NotImplemented + + return ( + canonicalize_name(self.name) == canonicalize_name(other.name) + and self.extras == other.extras + and self.specifier == other.specifier + and self.url == other.url + and self.marker == other.marker + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..f3ac480 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,1009 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from pip._vendor.packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier + from pip._vendor.packaging.version import Version +""" + +from __future__ import annotations + +import abc +import itertools +import re +from typing import Callable, Iterable, Iterator, TypeVar, Union + +from .utils import canonicalize_version +from .version import Version + +UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) +CallableOperator = Callable[[Version, str], bool] + + +def _coerce_version(version: UnparsedVersion) -> Version: + if not isinstance(version, Version): + version = Version(version) + return version + + +class InvalidSpecifier(ValueError): + """ + Raised when attempting to create a :class:`Specifier` with a specifier + string that is invalid. + + >>> Specifier("lolwat") + Traceback (most recent call last): + ... + packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' + """ + + +class BaseSpecifier(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __str__(self) -> str: + """ + Returns the str representation of this Specifier-like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self) -> int: + """ + Returns a hash value for this Specifier-like object. + """ + + @abc.abstractmethod + def __eq__(self, other: object) -> bool: + """ + Returns a boolean representing whether or not the two Specifier-like + objects are equal. + + :param other: The other object to check against. + """ + + @property + @abc.abstractmethod + def prereleases(self) -> bool | None: + """Whether or not pre-releases as a whole are allowed. + + This can be set to either ``True`` or ``False`` to explicitly enable or disable + prereleases or it can be set to ``None`` (the default) to use default semantics. + """ + + @prereleases.setter + def prereleases(self, value: bool) -> None: + """Setter for :attr:`prereleases`. + + :param value: The value to set. + """ + + @abc.abstractmethod + def contains(self, item: str, prereleases: bool | None = None) -> bool: + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class Specifier(BaseSpecifier): + """This class abstracts handling of version specifiers. + + .. tip:: + + It is generally not required to instantiate this manually. You should instead + prefer to work with :class:`SpecifierSet` instead, which can parse + comma-separated version specifiers (which is what package metadata contains). + """ + + _operator_regex_str = r""" + (?P(~=|==|!=|<=|>=|<|>|===)) + """ + _version_regex_str = r""" + (?P + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s;)]* # The arbitrary version can be just about anything, + # we match everything except for whitespace, a + # semi-colon for marker support, and a closing paren + # since versions can be enclosed in them. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + + # You cannot use a wild card and a pre-release, post-release, a dev or + # local version together so group them with a | and make them optional. + (?: + \.\* # Wild card syntax of .* + | + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + def __init__(self, spec: str = "", prereleases: bool | None = None) -> None: + """Initialize a Specifier instance. + + :param spec: + The string representation of a specifier which will be parsed and + normalized before use. + :param prereleases: + This tells the specifier if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + :raises InvalidSpecifier: + If the given specifier is invalid (i.e. bad syntax). + """ + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: '{spec}'") + + self._spec: tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 + @property # type: ignore[override] + def prereleases(self) -> bool: + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if Version(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + @property + def operator(self) -> str: + """The operator of this specifier. + + >>> Specifier("==1.2.3").operator + '==' + """ + return self._spec[0] + + @property + def version(self) -> str: + """The version of this specifier. + + >>> Specifier("==1.2.3").version + '1.2.3' + """ + return self._spec[1] + + def __repr__(self) -> str: + """A representation of the Specifier that shows all internal state. + + >>> Specifier('>=1.0.0') + =1.0.0')> + >>> Specifier('>=1.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> Specifier('>=1.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + """A string representation of the Specifier that can be round-tripped. + + >>> str(Specifier('>=1.0.0')) + '>=1.0.0' + >>> str(Specifier('>=1.0.0', prereleases=False)) + '>=1.0.0' + """ + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> tuple[str, str]: + canonical_version = canonicalize_version( + self._spec[1], + strip_trailing_zero=(self._spec[0] != "~="), + ) + return self._spec[0], canonical_version + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + """Whether or not the two Specifier-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") + True + >>> (Specifier("==1.2.3", prereleases=False) == + ... Specifier("==1.2.3", prereleases=True)) + True + >>> Specifier("==1.2.3") == "==1.2.3" + True + >>> Specifier("==1.2.3") == Specifier("==1.2.4") + False + >>> Specifier("==1.2.3") == Specifier("~=1.2.3") + False + """ + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _compare_compatible(self, prospective: Version, spec: str) -> bool: + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore suffix segments. + prefix = _version_join( + list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + def _compare_equal(self, prospective: Version, spec: str) -> bool: + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + normalized_prospective = canonicalize_version( + prospective.public, strip_trailing_zero=False + ) + # Get the normalized version string ignoring the trailing .* + normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) + # Split the spec out by bangs and dots, and pretend that there is + # an implicit dot in between a release segment and a pre-release segment. + split_spec = _version_split(normalized_spec) + + # Split the prospective version out by bangs and dots, and pretend + # that there is an implicit dot in between a release segment and + # a pre-release segment. + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + shortened_prospective = padded_prospective[: len(split_spec)] + + return shortened_prospective == split_spec + else: + # Convert our spec string into a Version + spec_version = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec_version.local: + prospective = Version(prospective.public) + + return prospective == spec_version + + def _compare_not_equal(self, prospective: Version, spec: str) -> bool: + return not self._compare_equal(prospective, spec) + + def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) + + def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) + + def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: + return str(prospective).lower() == str(spec).lower() + + def __contains__(self, item: str | Version) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in Specifier(">=1.2.3") + True + >>> Version("1.2.3") in Specifier(">=1.2.3") + True + >>> "1.0.0" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) + True + """ + return self.contains(item) + + def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this Specifier. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> Specifier(">=1.2.3").contains("1.2.3") + True + >>> Specifier(">=1.2.3").contains(Version("1.2.3")) + True + >>> Specifier(">=1.2.3").contains("1.0.0") + False + >>> Specifier(">=1.2.3").contains("1.3.0a1") + False + >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") + True + >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) + True + """ + + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version, this allows us to have a shortcut for + # "2.0" in Specifier(">=2") + normalized_item = _coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifier. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(Specifier().contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) + ['1.2.3', '1.3', ] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) + ['1.5a1'] + >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + """ + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = _coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version: str) -> list[str]: + """Split version into components. + + The split components are intended for version comparison. The logic does + not attempt to retain the original version string, so joining the + components back with :func:`_version_join` may not produce the original + version string. + """ + result: list[str] = [] + + epoch, _, rest = version.rpartition("!") + result.append(epoch or "0") + + for item in rest.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _version_join(components: list[str]) -> str: + """Join split version components into a version string. + + This function assumes the input came from :func:`_version_split`, where the + first component must be the epoch (either empty or numeric), and all other + components numeric. + """ + epoch, *rest = components + return f"{epoch}!{'.'.join(rest)}" + + +def _is_not_suffix(segment: str) -> bool: + return not any( + segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") + ) + + +def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]: + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return ( + list(itertools.chain.from_iterable(left_split)), + list(itertools.chain.from_iterable(right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + """This class abstracts handling of a set of version specifiers. + + It can be passed a single specifier (``>=3.0``), a comma-separated list of + specifiers (``>=3.0,!=3.1``), or no specifier at all. + """ + + def __init__(self, specifiers: str = "", prereleases: bool | None = None) -> None: + """Initialize a SpecifierSet instance. + + :param specifiers: + The string representation of a specifier or a comma-separated list of + specifiers which will be parsed and normalized before use. + :param prereleases: + This tells the SpecifierSet if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + + :raises InvalidSpecifier: + If the given ``specifiers`` are not parseable than this exception will be + raised. + """ + + # Split on `,` to break each individual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Make each individual specifier a Specifier and save in a frozen set for later. + self._specs = frozenset(map(Specifier, split_specifiers)) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + @property + def prereleases(self) -> bool | None: + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __repr__(self) -> str: + """A representation of the specifier set that shows all internal state. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> SpecifierSet('>=1.0.0,!=2.0.0') + =1.0.0')> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"" + + def __str__(self) -> str: + """A string representation of the specifier set that can be round-tripped. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) + '!=1.0.1,>=1.0.0' + >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) + '!=1.0.1,>=1.0.0' + """ + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self) -> int: + return hash(self._specs) + + def __and__(self, other: SpecifierSet | str) -> SpecifierSet: + """Return a SpecifierSet which is a combination of the two sets. + + :param other: The other object to combine with. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' + =1.0.0')> + >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') + =1.0.0')> + """ + if isinstance(other, str): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other: object) -> bool: + """Whether or not the two SpecifierSet-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == + ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") + False + """ + if isinstance(other, (str, Specifier)): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __len__(self) -> int: + """Returns the number of specifiers in this specifier set.""" + return len(self._specs) + + def __iter__(self) -> Iterator[Specifier]: + """ + Returns an iterator over all the underlying :class:`Specifier` instances + in this specifier set. + + >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) + [, =1.0.0')>] + """ + return iter(self._specs) + + def __contains__(self, item: UnparsedVersion) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, + item: UnparsedVersion, + prereleases: bool | None = None, + installed: bool | None = None, + ) -> bool: + """Return whether or not the item is contained in this SpecifierSet. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this SpecifierSet. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) + True + """ + # Ensure that our item is a Version instance. + if not isinstance(item, Version): + item = Version(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + if installed and item.is_prerelease: + item = Version(item.base_version) + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifiers in this set. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) + ['1.3', ] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) + [] + >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + + An "empty" SpecifierSet will filter items based on the presence of prerelease + versions in the set. + + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet("").filter(["1.5a1"])) + ['1.5a1'] + >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + """ + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iter(iterable) + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases. + else: + filtered: list[UnparsedVersionVar] = [] + found_prereleases: list[UnparsedVersionVar] = [] + + for item in iterable: + parsed_version = _coerce_version(item) + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return iter(found_prereleases) + + return iter(filtered) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py new file mode 100644 index 0000000..703f0ed --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py @@ -0,0 +1,627 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import logging +import platform +import re +import struct +import subprocess +import sys +import sysconfig +from importlib.machinery import EXTENSION_SUFFIXES +from typing import ( + Iterable, + Iterator, + Sequence, + Tuple, + cast, +) + +from . import _manylinux, _musllinux + +logger = logging.getLogger(__name__) + +PythonVersion = Sequence[int] +AppleVersion = Tuple[int, int] + +INTERPRETER_SHORT_NAMES: dict[str, str] = { + "python": "py", # Generic. + "cpython": "cp", + "pypy": "pp", + "ironpython": "ip", + "jython": "jy", +} + + +_32_BIT_INTERPRETER = struct.calcsize("P") == 4 + + +class Tag: + """ + A representation of the tag triple for a wheel. + + Instances are considered immutable and thus are hashable. Equality checking + is also supported. + """ + + __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] + + def __init__(self, interpreter: str, abi: str, platform: str) -> None: + self._interpreter = interpreter.lower() + self._abi = abi.lower() + self._platform = platform.lower() + # The __hash__ of every single element in a Set[Tag] will be evaluated each time + # that a set calls its `.disjoint()` method, which may be called hundreds of + # times when scanning a page of links for packages with tags matching that + # Set[Tag]. Pre-computing the value here produces significant speedups for + # downstream consumers. + self._hash = hash((self._interpreter, self._abi, self._platform)) + + @property + def interpreter(self) -> str: + return self._interpreter + + @property + def abi(self) -> str: + return self._abi + + @property + def platform(self) -> str: + return self._platform + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Tag): + return NotImplemented + + return ( + (self._hash == other._hash) # Short-circuit ASAP for perf reasons. + and (self._platform == other._platform) + and (self._abi == other._abi) + and (self._interpreter == other._interpreter) + ) + + def __hash__(self) -> int: + return self._hash + + def __str__(self) -> str: + return f"{self._interpreter}-{self._abi}-{self._platform}" + + def __repr__(self) -> str: + return f"<{self} @ {id(self)}>" + + +def parse_tag(tag: str) -> frozenset[Tag]: + """ + Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. + + Returning a set is required due to the possibility that the tag is a + compressed tag set. + """ + tags = set() + interpreters, abis, platforms = tag.split("-") + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) + + +def _get_config_var(name: str, warn: bool = False) -> int | str | None: + value: int | str | None = sysconfig.get_config_var(name) + if value is None and warn: + logger.debug( + "Config variable '%s' is unset, Python ABI tag may be incorrect", name + ) + return value + + +def _normalize_string(string: str) -> str: + return string.replace(".", "_").replace("-", "_").replace(" ", "_") + + +def _is_threaded_cpython(abis: list[str]) -> bool: + """ + Determine if the ABI corresponds to a threaded (`--disable-gil`) build. + + The threaded builds are indicated by a "t" in the abiflags. + """ + if len(abis) == 0: + return False + # expect e.g., cp313 + m = re.match(r"cp\d+(.*)", abis[0]) + if not m: + return False + abiflags = m.group(1) + return "t" in abiflags + + +def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool: + """ + Determine if the Python version supports abi3. + + PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`) + builds do not support abi3. + """ + return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading + + +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]: + py_version = tuple(py_version) # To allow for version comparison. + abis = [] + version = _version_nodot(py_version[:2]) + threading = debug = pymalloc = ucs4 = "" + with_debug = _get_config_var("Py_DEBUG", warn) + has_refcount = hasattr(sys, "gettotalrefcount") + # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled + # extension modules is the best option. + # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 + has_ext = "_d.pyd" in EXTENSION_SUFFIXES + if with_debug or (with_debug is None and (has_refcount or has_ext)): + debug = "d" + if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn): + threading = "t" + if py_version < (3, 8): + with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) + if with_pymalloc or with_pymalloc is None: + pymalloc = "m" + if py_version < (3, 3): + unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) + if unicode_size == 4 or ( + unicode_size is None and sys.maxunicode == 0x10FFFF + ): + ucs4 = "u" + elif debug: + # Debug builds can also load "normal" extension modules. + # We can also assume no UCS-4 or pymalloc requirement. + abis.append(f"cp{version}{threading}") + abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}") + return abis + + +def cpython_tags( + python_version: PythonVersion | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a CPython interpreter. + + The tags consist of: + - cp-- + - cp-abi3- + - cp-none- + - cp-abi3- # Older Python versions down to 3.2. + + If python_version only specifies a major version then user-provided ABIs and + the 'none' ABItag will be used. + + If 'abi3' or 'none' are specified in 'abis' then they will be yielded at + their normal position and not at the beginning. + """ + if not python_version: + python_version = sys.version_info[:2] + + interpreter = f"cp{_version_nodot(python_version[:2])}" + + if abis is None: + if len(python_version) > 1: + abis = _cpython_abis(python_version, warn) + else: + abis = [] + abis = list(abis) + # 'abi3' and 'none' are explicitly handled later. + for explicit_abi in ("abi3", "none"): + try: + abis.remove(explicit_abi) + except ValueError: + pass + + platforms = list(platforms or platform_tags()) + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + threading = _is_threaded_cpython(abis) + use_abi3 = _abi3_applies(python_version, threading) + if use_abi3: + yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) + yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) + + if use_abi3: + for minor_version in range(python_version[1] - 1, 1, -1): + for platform_ in platforms: + interpreter = "cp{version}".format( + version=_version_nodot((python_version[0], minor_version)) + ) + yield Tag(interpreter, "abi3", platform_) + + +def _generic_abi() -> list[str]: + """ + Return the ABI tag based on EXT_SUFFIX. + """ + # The following are examples of `EXT_SUFFIX`. + # We want to keep the parts which are related to the ABI and remove the + # parts which are related to the platform: + # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 + # - mac: '.cpython-310-darwin.so' => cp310 + # - win: '.cp310-win_amd64.pyd' => cp310 + # - win: '.pyd' => cp37 (uses _cpython_abis()) + # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 + # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' + # => graalpy_38_native + + ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) + if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": + raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") + parts = ext_suffix.split(".") + if len(parts) < 3: + # CPython3.7 and earlier uses ".pyd" on Windows. + return _cpython_abis(sys.version_info[:2]) + soabi = parts[1] + if soabi.startswith("cpython"): + # non-windows + abi = "cp" + soabi.split("-")[1] + elif soabi.startswith("cp"): + # windows + abi = soabi.split("-")[0] + elif soabi.startswith("pypy"): + abi = "-".join(soabi.split("-")[:2]) + elif soabi.startswith("graalpy"): + abi = "-".join(soabi.split("-")[:3]) + elif soabi: + # pyston, ironpython, others? + abi = soabi + else: + return [] + return [_normalize_string(abi)] + + +def generic_tags( + interpreter: str | None = None, + abis: Iterable[str] | None = None, + platforms: Iterable[str] | None = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a generic interpreter. + + The tags consist of: + - -- + + The "none" ABI will be added if it was not explicitly provided. + """ + if not interpreter: + interp_name = interpreter_name() + interp_version = interpreter_version(warn=warn) + interpreter = "".join([interp_name, interp_version]) + if abis is None: + abis = _generic_abi() + else: + abis = list(abis) + platforms = list(platforms or platform_tags()) + if "none" not in abis: + abis.append("none") + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + +def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: + """ + Yields Python versions in descending order. + + After the latest version, the major-only version will be yielded, and then + all previous versions of that major version. + """ + if len(py_version) > 1: + yield f"py{_version_nodot(py_version[:2])}" + yield f"py{py_version[0]}" + if len(py_version) > 1: + for minor in range(py_version[1] - 1, -1, -1): + yield f"py{_version_nodot((py_version[0], minor))}" + + +def compatible_tags( + python_version: PythonVersion | None = None, + interpreter: str | None = None, + platforms: Iterable[str] | None = None, +) -> Iterator[Tag]: + """ + Yields the sequence of tags that are compatible with a specific version of Python. + + The tags consist of: + - py*-none- + - -none-any # ... if `interpreter` is provided. + - py*-none-any + """ + if not python_version: + python_version = sys.version_info[:2] + platforms = list(platforms or platform_tags()) + for version in _py_interpreter_range(python_version): + for platform_ in platforms: + yield Tag(version, "none", platform_) + if interpreter: + yield Tag(interpreter, "none", "any") + for version in _py_interpreter_range(python_version): + yield Tag(version, "none", "any") + + +def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: + if not is_32bit: + return arch + + if arch.startswith("ppc"): + return "ppc" + + return "i386" + + +def _mac_binary_formats(version: AppleVersion, cpu_arch: str) -> list[str]: + formats = [cpu_arch] + if cpu_arch == "x86_64": + if version < (10, 4): + return [] + formats.extend(["intel", "fat64", "fat32"]) + + elif cpu_arch == "i386": + if version < (10, 4): + return [] + formats.extend(["intel", "fat32", "fat"]) + + elif cpu_arch == "ppc64": + # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? + if version > (10, 5) or version < (10, 4): + return [] + formats.append("fat64") + + elif cpu_arch == "ppc": + if version > (10, 6): + return [] + formats.extend(["fat32", "fat"]) + + if cpu_arch in {"arm64", "x86_64"}: + formats.append("universal2") + + if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: + formats.append("universal") + + return formats + + +def mac_platforms( + version: AppleVersion | None = None, arch: str | None = None +) -> Iterator[str]: + """ + Yields the platform tags for a macOS system. + + The `version` parameter is a two-item tuple specifying the macOS version to + generate platform tags for. The `arch` parameter is the CPU architecture to + generate platform tags for. Both parameters default to the appropriate value + for the current system. + """ + version_str, _, cpu_arch = platform.mac_ver() + if version is None: + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) + if version == (10, 16): + # When built against an older macOS SDK, Python will report macOS 10.16 + # instead of the real version. + version_str = subprocess.run( + [ + sys.executable, + "-sS", + "-c", + "import platform; print(platform.mac_ver()[0])", + ], + check=True, + env={"SYSTEM_VERSION_COMPAT": "0"}, + stdout=subprocess.PIPE, + text=True, + ).stdout + version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2]))) + else: + version = version + if arch is None: + arch = _mac_arch(cpu_arch) + else: + arch = arch + + if (10, 0) <= version and version < (11, 0): + # Prior to Mac OS 11, each yearly release of Mac OS bumped the + # "minor" version number. The major version was always 10. + for minor_version in range(version[1], -1, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=10, minor=minor_version, binary_format=binary_format + ) + + if version >= (11, 0): + # Starting with Mac OS 11, each yearly release bumps the major version + # number. The minor versions are now the midyear updates. + for major_version in range(version[0], 10, -1): + compat_version = major_version, 0 + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=major_version, minor=0, binary_format=binary_format + ) + + if version >= (11, 0): + # Mac OS 11 on x86_64 is compatible with binaries from previous releases. + # Arm64 support was introduced in 11.0, so no Arm binaries from previous + # releases exist. + # + # However, the "universal2" binary format can have a + # macOS version earlier than 11.0 when the x86_64 part of the binary supports + # that version of macOS. + if arch == "x86_64": + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + else: + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_format = "universal2" + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + + +def ios_platforms( + version: AppleVersion | None = None, multiarch: str | None = None +) -> Iterator[str]: + """ + Yields the platform tags for an iOS system. + + :param version: A two-item tuple specifying the iOS version to generate + platform tags for. Defaults to the current iOS version. + :param multiarch: The CPU architecture+ABI to generate platform tags for - + (the value used by `sys.implementation._multiarch` e.g., + `arm64_iphoneos` or `x84_64_iphonesimulator`). Defaults to the current + multiarch value. + """ + if version is None: + # if iOS is the current platform, ios_ver *must* be defined. However, + # it won't exist for CPython versions before 3.13, which causes a mypy + # error. + _, release, _, _ = platform.ios_ver() # type: ignore[attr-defined] + version = cast("AppleVersion", tuple(map(int, release.split(".")[:2]))) + + if multiarch is None: + multiarch = sys.implementation._multiarch + multiarch = multiarch.replace("-", "_") + + ios_platform_template = "ios_{major}_{minor}_{multiarch}" + + # Consider any iOS major.minor version from the version requested, down to + # 12.0. 12.0 is the first iOS version that is known to have enough features + # to support CPython. Consider every possible minor release up to X.9. There + # highest the minor has ever gone is 8 (14.8 and 15.8) but having some extra + # candidates that won't ever match doesn't really hurt, and it saves us from + # having to keep an explicit list of known iOS versions in the code. Return + # the results descending order of version number. + + # If the requested major version is less than 12, there won't be any matches. + if version[0] < 12: + return + + # Consider the actual X.Y version that was requested. + yield ios_platform_template.format( + major=version[0], minor=version[1], multiarch=multiarch + ) + + # Consider every minor version from X.0 to the minor version prior to the + # version requested by the platform. + for minor in range(version[1] - 1, -1, -1): + yield ios_platform_template.format( + major=version[0], minor=minor, multiarch=multiarch + ) + + for major in range(version[0] - 1, 11, -1): + for minor in range(9, -1, -1): + yield ios_platform_template.format( + major=major, minor=minor, multiarch=multiarch + ) + + +def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: + linux = _normalize_string(sysconfig.get_platform()) + if not linux.startswith("linux_"): + # we should never be here, just yield the sysconfig one and return + yield linux + return + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv8l" + _, arch = linux.split("_", 1) + archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) + yield from _manylinux.platform_tags(archs) + yield from _musllinux.platform_tags(archs) + for arch in archs: + yield f"linux_{arch}" + + +def _generic_platforms() -> Iterator[str]: + yield _normalize_string(sysconfig.get_platform()) + + +def platform_tags() -> Iterator[str]: + """ + Provides the platform tags for this installation. + """ + if platform.system() == "Darwin": + return mac_platforms() + elif platform.system() == "iOS": + return ios_platforms() + elif platform.system() == "Linux": + return _linux_platforms() + else: + return _generic_platforms() + + +def interpreter_name() -> str: + """ + Returns the name of the running interpreter. + + Some implementations have a reserved, two-letter abbreviation which will + be returned when appropriate. + """ + name = sys.implementation.name + return INTERPRETER_SHORT_NAMES.get(name) or name + + +def interpreter_version(*, warn: bool = False) -> str: + """ + Returns the version of the running interpreter. + """ + version = _get_config_var("py_version_nodot", warn=warn) + if version: + version = str(version) + else: + version = _version_nodot(sys.version_info[:2]) + return version + + +def _version_nodot(version: PythonVersion) -> str: + return "".join(map(str, version)) + + +def sys_tags(*, warn: bool = False) -> Iterator[Tag]: + """ + Returns the sequence of tag triples for the running interpreter. + + The order of the sequence corresponds to priority order for the + interpreter, from most to least important. + """ + + interp_name = interpreter_name() + if interp_name == "cp": + yield from cpython_tags(warn=warn) + else: + yield from generic_tags() + + if interp_name == "pp": + interp = "pp3" + elif interp_name == "cp": + interp = "cp" + interpreter_version(warn=warn) + else: + interp = None + yield from compatible_tags(interpreter=interp) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..d33da5b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,174 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import annotations + +import re +from typing import NewType, Tuple, Union, cast + +from .tags import Tag, parse_tag +from .version import InvalidVersion, Version + +BuildTag = Union[Tuple[()], Tuple[int, str]] +NormalizedName = NewType("NormalizedName", str) + + +class InvalidName(ValueError): + """ + An invalid distribution name; users should refer to the packaging user guide. + """ + + +class InvalidWheelFilename(ValueError): + """ + An invalid wheel filename was found, users should refer to PEP 427. + """ + + +class InvalidSdistFilename(ValueError): + """ + An invalid sdist filename was found, users should refer to the packaging user guide. + """ + + +# Core metadata spec for `Name` +_validate_regex = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE +) +_canonicalize_regex = re.compile(r"[-_.]+") +_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") +# PEP 427: The build number must start with a digit. +_build_tag_regex = re.compile(r"(\d+)(.*)") + + +def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: + if validate and not _validate_regex.match(name): + raise InvalidName(f"name is invalid: {name!r}") + # This is taken from PEP 503. + value = _canonicalize_regex.sub("-", name).lower() + return cast(NormalizedName, value) + + +def is_normalized_name(name: str) -> bool: + return _normalized_regex.match(name) is not None + + +def canonicalize_version( + version: Version | str, *, strip_trailing_zero: bool = True +) -> str: + """ + This is very similar to Version.__str__, but has one subtle difference + with the way it handles the release segment. + """ + if isinstance(version, str): + try: + parsed = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + else: + parsed = version + + parts = [] + + # Epoch + if parsed.epoch != 0: + parts.append(f"{parsed.epoch}!") + + # Release segment + release_segment = ".".join(str(x) for x in parsed.release) + if strip_trailing_zero: + # NB: This strips trailing '.0's to normalize + release_segment = re.sub(r"(\.0)+$", "", release_segment) + parts.append(release_segment) + + # Pre-release + if parsed.pre is not None: + parts.append("".join(str(x) for x in parsed.pre)) + + # Post-release + if parsed.post is not None: + parts.append(f".post{parsed.post}") + + # Development release + if parsed.dev is not None: + parts.append(f".dev{parsed.dev}") + + # Local version segment + if parsed.local is not None: + parts.append(f"+{parsed.local}") + + return "".join(parts) + + +def parse_wheel_filename( + filename: str, +) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]: + if not filename.endswith(".whl"): + raise InvalidWheelFilename( + f"Invalid wheel filename (extension must be '.whl'): {filename}" + ) + + filename = filename[:-4] + dashes = filename.count("-") + if dashes not in (4, 5): + raise InvalidWheelFilename( + f"Invalid wheel filename (wrong number of parts): {filename}" + ) + + parts = filename.split("-", dashes - 2) + name_part = parts[0] + # See PEP 427 for the rules on escaping the project name. + if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: + raise InvalidWheelFilename(f"Invalid project name: {filename}") + name = canonicalize_name(name_part) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename}" + ) from e + + if dashes == 5: + build_part = parts[2] + build_match = _build_tag_regex.match(build_part) + if build_match is None: + raise InvalidWheelFilename( + f"Invalid build number: {build_part} in '{filename}'" + ) + build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) + else: + build = () + tags = parse_tag(parts[-1]) + return (name, version, build, tags) + + +def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]: + if filename.endswith(".tar.gz"): + file_stem = filename[: -len(".tar.gz")] + elif filename.endswith(".zip"): + file_stem = filename[: -len(".zip")] + else: + raise InvalidSdistFilename( + f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" + f" {filename}" + ) + + # We are requiring a PEP 440 version, which cannot contain dashes, + # so we split on the last dash. + name_part, sep, version_part = file_stem.rpartition("-") + if not sep: + raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") + + name = canonicalize_name(name_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename}" + ) from e + + return (name, version) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py b/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..8b0a040 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,563 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from pip._vendor.packaging.version import parse, Version +""" + +from __future__ import annotations + +import itertools +import re +from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union + +from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType + +__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] + +LocalType = Tuple[Union[int, str], ...] + +CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] +CmpLocalType = Union[ + NegativeInfinityType, + Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], +] +CmpKey = Tuple[ + int, + Tuple[int, ...], + CmpPrePostDevType, + CmpPrePostDevType, + CmpPrePostDevType, + CmpLocalType, +] +VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] + + +class _Version(NamedTuple): + epoch: int + release: tuple[int, ...] + dev: tuple[str, int] | None + pre: tuple[str, int] | None + post: tuple[str, int] | None + local: LocalType | None + + +def parse(version: str) -> Version: + """Parse the given version string. + + >>> parse('1.0.dev1') + + + :param version: The version string to parse. + :raises InvalidVersion: When the version string is not a valid version. + """ + return Version(version) + + +class InvalidVersion(ValueError): + """Raised when a version string is not a valid version. + + >>> Version("invalid") + Traceback (most recent call last): + ... + packaging.version.InvalidVersion: Invalid version: 'invalid' + """ + + +class _BaseVersion: + _key: tuple[Any, ...] + + def __hash__(self) -> int: + return hash(self._key) + + # Please keep the duplicated `isinstance` check + # in the six comparisons hereunder + # unless you find a way to avoid adding overhead function calls. + def __lt__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key < other._key + + def __le__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key <= other._key + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key == other._key + + def __ge__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key >= other._key + + def __gt__(self, other: _BaseVersion) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key > other._key + + def __ne__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key != other._key + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +_VERSION_PATTERN = r""" + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P

    !I7S{BS4i1|@R7s@ zBh>dJ`X=v~Z#j7L7qym3O>1w@`}Ib;lHEs;SuB-d~dOAuxs6o zj(1yQZ!1o$-ceA_ip^cMNbJHAzA zF5#OchBvm%$mo|fg`L0}NG*Gu^P*QrkQ=_&+t1jl8hJX@o2ho?5x?BcbwBFM#siz|d;E%O<^m>3KE=JyzULbu z!9rpT0nW-V=64D0ba8!}-!$&ST-WlG@kRyLYJMUoQLfGWF5rHDnyWqgUbko8>-Ow> zX>TX(w@rvt?c(R7d>7ZJ`3VoUQRgmx(%%Zws`-VH(WuxbeV)7Zy&mWrRQR#2e9Q4u zyf?`&I8M$dwp{Xj8oYi-^R5+}NamrKQk`Gs_Z5C$<;T2V=N5ij`R($k&fWZAd)14b zk#V3iZ*4s*_w#0%zwaks7#?uWjt_FC`!YFG*#0)KE(g3$J??cPygRE7;bGQZ>oe#b z8!7rOI)oSNyQ{+AHTwIOBfldcb*2MX262l@&YrL3>{@f?{_UJS|D*-01nD#~1loCCNM{vKql!)eY^z7ZXSKF&3X z-^={Fk2=8buIQ`JEyNEj!CuDhs>Q6m4+0nKpKpM^yFP8>!`*lB_an6H$3EVNEh>m`j@YD1eU|hR z;wsYL8p=r?!DXQff70d%oRi1Fp}P&qM_eRdU}zWxhKG4~6Yrjb)`AlUA3CNz%2~JW zb7)NU<`(((;|lZ=dU6Z4U7y8l`u1%vCH;QzRrDFpj^1(pIC`p|*if}UOEne3Zn!zW8COJkrrg7Uc71-$!*e@A^1Twq51l0y&|xd@pWn#Yn1e?9 zQT$0~>?|;f{dw(6W$n{|TkMhet0Fh7Y2D2kE<@uS>DLAHOUCb)1Ivc76Pu(?sn4=y zIq?f9i_OsAW$(o|5V>9Zh)PIV6TUgdbH(2q9kLfu*4oOq5kwz+ls-s2(P}-`cZYhHj4t*Pua$G%o@CMJ8|n?uZrujTn^9aF&PCoVE_ zd~3$VN1)$TpYY@3;ZJ>vJY_bHcL0ZsIqqYOx`BFLz~(%UUm#;fr(6x?Ldcsu%Q#{V zYu5#jk5e{Ej3N5w;BJ9UY?8cpci9c&Yb$LE z55qgViAQH=>bf~+lRl%1befDw1UKp%e6!{&_ySfx4{f1c;it{|dam!pSh&^gZy9bs zmpXrTj<#eQy~^1T4T)o>gw zQ^x=aX2kAIO>c@C`a4V-cQvH_k+GlPZZ0w;xRZK&!JYX5&bH^=#?j((a_0U5$}Y3< zXvt50`~Y<&8?~I|HG=AsO85@zsJaoo7bcV${dGW6Ri|A#1k6kOY&d3Wo^*j%K z+`3~8<%e}gZoH6nyVAFI>IlO-Cc1-XeKv^b*#}7HIa})t^z4bH?(>b|1$&-Q`eJ^A zz9{CVh{@H!+ssqyez|${tJLSlZ4=Mh2A=iZs9{}e-uKS+vOsY}z1YpO>vipW(YO~K z4!*$0?lAf?j2;tQh~E6M#Gc{dt=O#^ELHHoGea){c4_de)>IH{tqVQe_v8x-SC`*E|Kkw@9Coh+qwGuIlIsDeI2LIk?rzb zf|36C+M#}*trtZ00xItSXR0yJyXf#9kJ0}c--#8u`4s#>VCSh_UknZGLTB}^C`-Hy zkI6SoBl!K|_wl`ieghv=+Dz6@$#z(DhRjXNcU^_wzDC{asQcH{-KFcc##=Imis0)= zKB-&yTk3bObyNIVcyrF`w!Q-;V|_m{+^1!&I8T@syAQ%1`-hXG6A1U7=lcyNF zv`xFJq&H2?E23R!u-WX9@4vT1B|Z^_uNZT&hE2`uVs1#rIZGJh;InNG?38ahrR%;` z>haTo?JtXd6j@_DDR{H}HSs47$=FHiS7m8>ZzN;xx<-6PowhSAb`N{eqjr1y!H3ji z^kl|1arH0HjNJ>}by{JTm1bncz9ebLhQKIg0`#G6T53s@v(u$NKH@qWmoD9K5qr!9 zAJjET=Jw=UG%{9Px#sq6jVCRKKhbN9pkeUHmpnx)uyfM3Sthu7u1oqO->hs!r~8f#1%@c?}}6;^t!QP zWHLAx`pH@);?gC(tZV9HF0mJXvv0b$y@LK!^6PuRTXdAU#3K*jziwna$2mpyBE$K5 z&uHQo|588ts9C>TZhb>m(&U|+UwQwOu`{6kW}#icoTMk~No+vWljQdwJ?iYEGak+2if$f|(_2fNvJB=Re+viem z*sjO1P2K4A`dDfy$P=0;BWJDYJ|+pG39+OXk>eSL^$zp7Uxzhip=08gt@E`kC*JI?u!U-Wd;j z<9uLF>*L3Ks(FvdFm2{Gz9)79-TVxEBj4kUVsjlIWdDZrSQworWAaw$wwGt*C;n0V zo*Mk>HRR>oh5S}@`p>B|dFoYb3(eOctK3`PI$*6qH}D^2 zOyKZw^HFO(Lpn4w`9`0N^W^(6W}8>9jW+Syo&+Zq$9)~$tWgo%JFy0*U+N2Gn)j{# zSUwkVd>w1(aaoTC9RKO`$WsC@~kko{2GtZo{FU$@4Vf<*#`A&>KP0UMt2C;p=Aih$K&$f;;>gB!U zlNihaSDv4cCzo}oUm2UzBrv{)419TP9xip{(97Pj@it@ZkRK*+_2P$hp}SWzZhG+x zYJhc5IuuR6XwcW{+;Zq4aZlT8>qwlNu z@rds}zcJnY4J{S#qRkB2L!XIXufN;*JLq{W{ir2f=vNCpzXA+5&ia)_Phzd5S?ZB$ zo-0_(m|!e>8vGA{+a2h;=4tAntnHO~wkY)%7#H;8D_8rd>l^5k@XE5pT*^9jQ*7pb z@=2RBXj9q>b4@3|#MnPX-aYJzkmn`b*BBppy_@*&X>S(uOr`pC?*ZC=&#<2+ZS&nQ^sDu4GF^9Ly2Lv-2ac!c zIV-nbbNcwK_;S);Y!~M>Z}Z#u8HU5sgZI2S@}1kileTi`hu9L&5$jvFw;-GH{BQR4 z2gDuZ`6ry)@3i68zm6Rh`uz6)pv#$;ciTtzI1Zm|^QyP5Oo+~vcxeTCx82se0es0C z-aQRW(em-o(CimJA(%k?cYG}TmW2zg|J~zkw>_f%nqyZczDt>gV<`z~ujZvI6A#Gq zOZM}ltbvo~NBJJDy#GNcu|uAJFl^gL>t7V#RFxIQ43!c)j8B~0PX`aO{uR0u3vSI* z*CZ;?Rbv=u3GT#iao2NvlzQCs*+@J(hjWU>mrWisiA);QHw_yh{OYt1?+>k0^)ZHV z?Cg)&uPgpyE@f80+vF=5xlXljVIWT}3Gr)Tvedbr(md+dmb3i7# zPV|NNIrH&v>nT5xc3&cp z`ZGH9Hu4A#TYjMGdOZbmPG?6a%e}-7!9jJ)zglD0nUpD}jO6d-oxrvZc=nVtABBGA z8)5Nix&1vU=EK62jqX!7hz}h7oM(bQ+x=EM{hy2*^t|I+!|BogkG(gKkNT?j|39A@ z0y7CvvI4<630&IA&_#BlUNeDK2jWIZ>vq2q%GFMidao(8mew{2xJ(+CPC=`nvbiLw z)mA`>y-J|!4aKEEOZ6@`0c$6u)gq-$T4{dI*ZF)t$s~l@yZrvUc|7v?eCB-4`abXT zKJWA1&hM?2%PAvXiLwh~=rG_x@;*?|xeZtfjuGH^6L3=7G3{&n!(veC#4K2cb)Gk?ba*0|6e z&5goOhVa40uDfpGXtJRN=n5}STR)$`<`!Jb(fp|X`|QA?*H{08M%Vv3^X5#Z{`axAUi24KsGZkS z4&Dqt^^w-GVk%s0{YiF}0M5Ga^A>mg_1V^zC%}t*@aAj4@}F%h@5{ijYmD`GJv{kW zDKDM%e1CKUvHXm!h3d@3wvN3gl3)(dQB=N#x}xkCt*kZZb^U&DF8)1hWt;Bju!FUd z6M5xS=Be9f+^l{y<#Es2A*=oo?$&8IZPi2ns^YA#j{~FN$?cU5zF^(SiG15Qy?!_M zGBvbMck*nUzVb%$G#r{ye@fp^&v47mSh+^&TW8l}%Sqj{o%F46fo$U68+|es`wQOWgF5mG3d>bLvlFYtnFNj+;J5>zVvl*3UBOSGws}u3To)=hm+! z{(Zxtxo-O0m9pP!*gC(Sy^i$xZuV8^o1*hs|`y_>t`vww$w>q zTDo$MNq2ApR73k)o%D@wT`68G7}#iF_z3)DEU0&E z;em00^tdljQJ_43b@J@ing6_#NAnOMUA8!ZSHGsbj;*a|Ahajo+f*rkp5>>UIWqZ~ zFWnI*S|geuTbB5E$M&-3Gxo|h>MVm+iXJGB^m*}()=H(tH$tQS(^{#ufd0H*bn*l^ zWbA3cH^oqe*WQqcO*3-Ff%qCH?rNv{LSB_o{ur@JgkPK|pdZNVklj_2=SuKiIRDgB zjx8MdlB@Wxa>^eB7f<9g8#;OY5S=^$oh+E~fB5--`03%N@OpCg^|zk{rv}}9PS4T% z+)FbH%swZYx5S~j~^fAM{8jJ#%_ zdq4Z!Oa7@B-RDM^)Bb$1eJ;WIIIH~1r0j~`d1v%^;>?}LgEe*gLsqa(JQMao*{k5%c0eC=Rt!AvTPc}+Cch7}-lNH8bBBF1^$=$_SyU6>Fa9>2&zBtS zFW6c#H~YFcX9Nz8Gxqp_dpNtY|K-|N$G^c(C?EFJ!}%U^^EFyYS(??xG{l_3|A{&*#=_QLmS8^#1=!NOB5K4rWF6U=!>5U_=@+9lt5rsk1+HJi{{# zJOaF50gU!whs!vh58yYYy<(>9ckzRmiY)ms=}V9+Pe-OaLw;R%e4@W()(j(4KJBv> z2_9E+&crU`-Vxuxw_l~T)9JRYGuKJ@8b>~r8{zz82mh0q%{J-JRZR=@+(-nP2w#S|rooj?VNPW0ws426&`4%9hn&Ujm=gicYm`p;a&1 zRfA33InGOOrJj&o(07B`n}^$34xYu39s1M`&wOHVsLY%At#S^`GmKncwjz=bNtYvg zE!lAk_EGFMq$dl=e#0G`#uW$>bC$lZwga_M+C9CD`==S7_WoAdjnj^UllUR_TBW(P znIey1Q0=RF8J@8!Mn2gcx%#7fyZwa`Y>DqvKEY6VJISa1>$g|0^vVZ-(Xy8YtFrhu z)DHc*+j`UD7&3FgQSgoVoxZ3{wJ)#2;O{K(w{BV6unh9&MxXQFop1T?IrBX+ZNA}! z=)d^zi_Z6WXTH6;*1T_oS8l^zM)Tbbzsos2eZDtn-mYa_!}C4dj^;bz&bQ{>o$n2$ zy;WJigj>bYg)nnj9F|-$C5ADua4+w!OJm&Z0V@JLY$_CrT&So1Yj|KhXE zx90B%dvV;(NR|+r?F#A)9`0RIf}F61wC&lz@80*nyc=ALzq)$K=h&CShf}g=TktXJ zQMoqCWl@HD7QUUn#a#b8`j_(->W@<s;qa&G);Q&pOu8 z_8{j+@~Qtd$PA=^Fk@hTw@-5J=DXkXVWpLM=z6{pyT zhzWsxzPp0hwe}Uh63|g(WLRM}ap4h97087#N8e+ah zp!2MQ%0Tw^LhLOfHRl}LhKtSd>)F?3W3K(o+t+*PgZA|^Jj390fcFKAaZiTX*Wq8> zeVsF8+P?nSMfY{?DU`hL0K5SBQgzg=|93nkzZ4It{rYNrQe?O3&_0(ZVBh~uT0aiC zWu1MWdy>#MsjR#2!?Wf_)>04qeuRGK{m{+-)3iGNS#oUJdF_3FEWM2*`^VoV(gT0= z6nxNipNt;wVN73h+xcc%I~c>}-C8^hv!@vU$s((&%Uw5b79YgAnZ~+Ve#eIXNvxa9 z%O`EC07vf+jfB~!-1(IPj0W6MF*9-6`lC_F&dE(Uxi(BuqSA|%E&EVRCxrsvYQC~-& z1CQDc?2hSv7Cq0RXL*Eo&LI0fLcIwWU*6AqfcJ-~&)o~98;ty(^q4!=;H*j8il(Ed z;kU-EbqTkEe_C$4)~VL$4sa~i>+G?gDvaJ%%_ps*=l|PeKp7i)d%A2y#1dVetzGge% zFH9ZGYj9Q&y4_itIgWVuTJt^Qlik?!%l<(2JK{@<=(8EuGOJYcb`bhhL*6iW;^j3w z&06f|nIFaGG4?XhOjBnX9YH^L-`T0rfqwx0y}Or|EXW9CW%DkZB2(wVjFEN9mWVau z)tL%mn`Bw_nc3If-i6Gm7k(+v4rXaQ!czlR#&dVDe^E2|to{}On^W-7-+ZLP~4_*yVSWca~ z4;4Dz2hWL|W|%iv!MrEHLGe;Cp4^YqQfqV9H~IV6W6CJA2_9OsLjBGJ7nXxpVR)$+ zyj0wtYWB$m?30D$>7gI$?;ddUacJ;pn1=G4{@f32J-YY}7tXEVgw~UxU(^-a>)cHs z`*J_OKS@4))0{w~+F#_HA{wPLCF@9K^IFIwy1O~8{%i1&<~y|NXMbZKPm8-|{ED3T zSY`~iW9K4$i0~!#9c-J$6J3oxDR#Yi*rx@pPgUk~e%+oKt>65EX4ZRdo+cA4|) zwH^;ZDSpR%wJeyMyNo$W^w>28Qp|c4Lls^e9i^Wf9NtpfhIKo$9QE z{O3%waM?{)KH-o!nh(@vb_QKLM_)jPSLSSR#@&fA^K) zJr0;0Q-9B;oww8FJ|~&)nb?ME{MMvvWxM@+pxo(?Yyj04*1-j|`+c+_Sx}N^F7#j| zT#-kZIGqkW3~bA%3bvIRe?dm$F?h1$*2)6n3uD9hLQ~~K?9a5bpw$=aU`=H=yqSFt z-k6w_9lMFWCAbS`8INKfY|+zlL9;Scu(Fdu2>d$CfYqfXL zewB~z*I4|VqhnSbQ_G8zJ=l@FywR7O4o`=^t6h9aKW87=KtIm9YC%R?i){?PosSk_ zFC;owjXsJ0eNPdq(&B8JK;{#)=Nr11X$O+MbL_S{#(D>KE04cDy8kSEz3STx9%DE6 zP$&AC1;BpchV}hEtEn;uEWr(UCC4sY{MH`7wNErF%>EuQur50h`UmbPhsM(0gLZK+ zdD1QOUCtGjV?X<#y=FN5+oVTMPv`lMAYh^zD?VVHJCYY>&-gvMx^|Bt~j3v-C9(X(akIHG@ zJF&gL8yI`Gw7}W;&@R7ZdJF#ek4D^nTtYv*I-i9GYF=uX7ujsdmP`2q^gF;DW!YJe z&T-3u*R0oz$7^u#mv!a(iwL&9xs#Fx#^sYt9GYcQtYjndmz$t}nw$CZAJKS>@3b?1 z$@q5AzHB%I&mGv9n>FmxwNR1&3GPDgH0`C)Thrc7;(>!h_Q7CMZD}p8blW;BIBOlI zwdJ+ptr5?*<+aZB@PJ1-?-^N{&(6dy)%YkxOuNOI$rt_p$g(1M1=?0T$$o!EMDZkF z@lR;KioPgLMyWH8ZeOOGc~8A1I`9lKwm%Xh;%RgTe}JDl1wWPYW1j^+%ctDTwZH6y zY#&4e^}7$6W5!h+Ftj?otXEF>LBEZ>`eJ+681r|JZ%w8H&!$Xg{uoy^?fw;>RO3dj zegRB%))8EdZc*@Va%i^tkUo!Nws+8NugAdEz_C%|ba-I-rKYv#_>};INF(iuPc?Ap zaoSV*=r+^$Rn3>r&T__AoTYg*?d_nwpZ!(zcFpDaoRGr0m9X$tfcUz zlXkyNyW(>eju_`qOab`oToW%qb|z-52c5QEAKanwrthf^oJa0^vPUp|IcWMK9~%dM zdz`*RIU{d!`*PhFeQ|UK4nFPx_Cx(yGt?gkSKT?k&<|&<{ltOMi1mff%82#VG;wHs zHPXk?>+5>@{J*`v;32jcSeO5AtgkWf;h-}{^h53(Omy&p@y&GcaKVTgTXOfTL5<8RG!DGYdZQ`gzq!@)F9A>2N*iAJBK#WQ%^r)v zUwQrwUOCBS^d9=%{QkYf#}PmHd-hQE?*YE)OlovUX}q5UKkbX24s3*7{J_2w+{c9; zInF*TJKqv~M2Xwz#Qdb+t&(eGSUEb=NETa`QFt@5fU2PH{fpxGXi=uLSF%vbbG{#r z%gvp+FhdKJZjlbpWa9TQH&tpcrgJNN>~eIY;$P#FDa%eQ?lM6686SPnq&k0nRj=-i-DKs zyPI=b{HkbMo}E=8TgC0z%qW)Am872~HsBgyAo){Hp|yo?b(~kKhT|m-$59d=YB9&s zvBkZZu*8*3aRwjCkDrMbcgf9f*6Ij6NaMTIZ*XfL^;T-U;x9#u;BQTA$Dwwv%v#k- zJNotu`b;2}E!E(y%8AcYzYKqn=6_qnx9!YP`ngc;4b`c24ZlA0n>(Zv;7~R2_!x2^ zjVUYK$asj&YiDJqkE`J>t4%OWZ_{bVTc;L&r`RqsxA#z&a0a@vC17c-nm7}Ck@0qf zkhw6ox>LwmKgbMJrj0Tht64+tnBc2(LZ8Ggei|`>-is__3gtWPeq>_VQWa zSm38JujYJaqTRJG?_C^^H2bZ^%6A|6bS|*7IH$5V{F!s~4rn*?b8H%8YDLb(`1cxG z!C3X%J1bkz&Zk*Rdq^9?C)!GfyV|&oHZ}u8%{%ytOfL^OjpeWF?U&A+$d5CKuc(1{ z5c<#l6KF2)kStnt1&PC3)`aYy{Y&=(mVMeb`scF4#Jv&i{7<{Sm^=06S3CCRI`N#Ilg|h8>&XZLk?g#CpU!mp5JJIX^1|Q*d zzBkOvp)c!v)8`qxMPK2~J2~gB^A*mUNBZToyMX6M@i)GV_xa-ki)#bceD!zpIBULi z`CnvRt@F*8cQxNNmhI4fh&isy`ieeYg5^)HZVHP!DmV!KVh_ z)SFqOv|TVy_4E=SN_%U=_?(+<%B}O|%+p!qPqepULtc*fkT2-n&YyP`ZL3cWw5_v% z%4q*u=gW5L!e>}~<2tK)5x8VzDC>NA=35EB%P7}6W&74i_N12H7qDwZjyQ-+eJ`@9 z1p08zcY-*h2FA?yci=~q9wRnV4)>c&&l5oY^9Z=s1KpKfh}oOdc%uaC$?lnyyn%TX z4t|$A$cl*L++1iS!_2GN2ovksYeR8Dijj#gpf6+f!PI9@PVRE+doOgZ5qQLXljkkR zzf1FK@{~_bI{sdH?e7@MbICkxAddyTJWZ2bxkO(3+sIQrFi1U9<{hRUVj_1WYHLit zb^_D8eZiJkT0aB*gA32CwMq}MjxGKSJu&>7BeRhYTDPmW)IBekL92UaSskfO(b8`A z<~V(pyaC(xypzCg+?yIJWrJhR8LYuB^fMN;<5A!jJM*57KJ*=impF4t$MCw(ilnc5 z;`DWh-Zmg_743}|S{)93BoScV?5p1j;APV z!QW_ZhxyfEev7+ou$%F>dw%|xN(KqPAYLnSE%$h6ZxA1p7E8Svo}iR`7xF*D^(tPd z;eF_bc%KR6k5g|h^;WNlDpu~^59hMS@!lo+edd}0`R!P&vsNR+$sF?I2~3IN17a=w zCHU8{g7`MHKmBjCKYCoxygcN`KOi|!G5v`0|8@2(jVI&3Sl@Bg=fbH7I5je!z+WBT zq`+T?eUlj5LNlIn$1f=gK7N6+YBR+%9fs%cc-Zib;-7?PDfmX|ep13c(s<%q%-+d= z@9uFW)O}9?-{0Ox_y!L-N9pi)%{;ThR>!GL@L^XIBNKcHmd{Qq?$pUs_>^s?{$=bH z?8}N%>GiLo&EL_>@9?!wdJQtK69IVEn*BQQSI6itBZ#rKqTGPlH zkbYci;;Xvn(OnNp|66Nf0{J(yCf0GL6nuY9Y;eP~jXswc`sVOUzzx6k;TY`jj1d^r z=Xcz@v_t2B2sP zx*4m>6Q$9{f8wsn(eS1J&o{c`5^Z@0ZHY&QCpR+kDEqy}q&ynahxopOGo?4CPtXVD z*Z1S@m@3Jm{(X&a+OwpKeivyPlUvWR<^0xsIAh9f54vOeB4zftbCo_%W%PY`AA0@s zluJ8*Yo0D6Px?G9r4OU$NpxRhx{+_*JWV4leV+38ojy;GBY#nu4^n2Vc^YeuG(SUf z67bwYCf&|DYGs~?zGv`Hd=T}*PZEa+xHY=xCuEpgUIs^s_$Js5?PqE92G~Ad?anvl zs=iO%0nQcidwm^VxnViB$3Hvp4mDa2#l`pG2N`Buxpw1LGp^zZNe+hhNOvchhtc=Z z2gy&X9ev+}()T_4XW-2FO7s3L)+P8hQr|}zi!zoUR&Si?d#nW?6z`nrpU4e zW>JUsc)|Tq?lw)|*Z)@jZ-8Uz`G@h%^M`ce2^qOX(AxV1{|W5j65#b7-Z}4Ws4)2M z#P)s>-ckES1e>$)B%R?iO&ppoVCAU;-}TJ%t(;cdfTC;kdP z{_7Z90=+!vrVW}S`JBbZU+7P8rPe9=de&OWPf#EH%>uPQD+upI%!bdiz7P2Pbrn2| z=nwrp^E5oUVhby#Trua)mBfEjnNG$OrrZJU#5qO&#Q4tAR_3dSv~F-rdtQ2Z!QG-x zuO7vr+wt`8Pjv$9{=ls)v7$?U!WUr)F6jIP;y+ z9DFk~`m$(G8+g1*^vdVNXITs!1T%xzq@{>=js06+FZpKBACI^Hi0Jbqc5w!!!gLA_m3dA=YD4oPEp{MI_3HmqNf`fOaEsh_}%sN z;T981(kj*2opo6Wo^(i#@-#fRY`UId4_3@L#d^~`on(DL%PV#NKsPcKV~A<9HedEni0s|5z3?xOL(i_VvIkjHDaLVI z8mvlOSUtqNNwygqSbscpK6GXc^ft9E+VKo_tlWc3%+AKjr;*jkrj@(q+d0Ru<`ffL z_Fnnz-xt5moT@+Hpst-0nM=N%ox|BQ7kh{|TDkDGm64hmt18Ov>@3SF4NbI4?^U~2 z{|{TiJ@BVgeUJ@Mm(Qv!ywu8F9-6Ug(WO>)e?#N34WzFwdFNkda6f$yiz< zx6rSme_6u4MLNre`L4Q%Po0!KHMqKvHEH4oX^jQ$bk0#>Y<|Ojr;gySu*c+nJfG^e zyN|JE>hTw^QvE^OzIzVeTBpn%r3}MJjmD-Yo%-qeZ+^< z7>fUT&2iZ$?m9oX=mzc;It4rht0|oSq>EsT3$Q~z`W(L8H_?{_w#~um_R2DQlEJq- z&V`m}Uu_@`hj4N`?RA~DvZJ(_;OvJFd2WsE_y@$#Jhdc1TKr6CiTeI4@<_I7Gak*u zXAhx=Sh}Dk#lGJjX3LPj7Q2-?$*1pEQ+DYMQ*b|$v! z8K+$9L-^-rSf#6XUUFs|W%}@a&!TU^I~$M1CLP`?-}KD3;I;sL3j(KR@-(2E(fV1P zw9hDS^F$|adOo!;`)lRBCb;5d<&*3|b&i!U=GL!r4fIE}<6^YS(IH>l24JN9iX*do z0sVI()5`9H&S%oEYCC#}YIcd$qD)=?(7 z{LCE1%Vq6R54!b;bnBW|*Z0Z9{S)snmYvK9J8*M>ocC&Qg!?h&xzI zTUcMJYZ7(EGpGx`APz2s-L)N|{@P2eC0)MgvEae^Eujh4L-T?4-M(C4KCOjy``FC6 z^OCkdu~qA1HasHt2rjIKUVMT+wQ|N54QWLtAEd6bgYZY3N%-9{2|J~aS^bNi^G~X{ zeLVCxY1h}$j{x!bTki~S3!bk&9?!&A0mmJU@XC;4l z03KquyMJ^3O5eY=J~l&3v=_qXpt~5pi|X5l(JL1Dp9p=rZ{>|2{pd%B*27vK`ach6 zoY)#Y;Dz+?x^v<_@Z&?wb2~7Z2A%l?d|C|H;L}rQ1CJ4Ne=yP#1IJg_%wIAM8s&Xc z|65(!FPbU%iZ)%r{?i5B_TV3;&zb|#z5ws{F-LL!*Hgymg`jJ_%%jqV@hSI+z6+koxno&tw-_j|&WckkI6!pA%pAM@H-tB@e2Py`sGt<8Q_Q!W63fBXZ_(l3wjeV_y@44;opze*>qI&dt#=+N~ORc|Q zzc26JxY72&uKs~_Z9%_e-^RL*h@Tbx>Sdjtf>$WJ(`pkPV{eN5)~x>tktd)-hK{Wr zrepAq5v@V-ZCcOsSFyNDaTvdb4da?t0jrCZVGi-v6nE;_?2KXTTUW!cu;zuS4; z?T>;RgT!aJo4Jg0r$GvtY{SXWlBX9(2mX$^70pyzj-N+f`#%g0-e+hb-=#ZnXyJ5d z;WTLBaK4{$?iDS(n7y!fzAa&lVeFnyL!TRvZFU2fUG#-BP-!D)5$_D!%NT^40n$0g zJQR8Z(kt?vJ+n>Eqx1ber9dfxX| z@mU3TN8nc~WTH+^kGObyVTAd3p4jz`#5HZ9Oq{&peIn$2CwaFQJ3LJh za0VWEyIF@}Xhop-$*s)c(TJUO_iA`88{Ng=A;+(=E2rXa;)j|#D&S$ngEhdX^>N0l zwyhlLT9B93?*w+(&Mi=1Q&#_v@FAY6d!J{zMi!m)Swr!D?2a_EH14;#Bn#=VB`f(`s@-Y?->gYb%q;i&XR(xo#>oL_hR zv_BlFVC>cS9VEB|)&?$rpl_$3Ly}YcKX7^#c~euaIX;m*Dfop!>yEz^;Nx}RQ+7RZ zd#YN;(XS1KH}9bC19|inpNs?3Y_9009DKnu{)v$n;lp*_Iz>D-oqZW6){@SrJD?k>O%9z1K_^bqj**|z<}X?2 zsafzk@Fa%UA)lcSmpk-9^2s7-zR%9jNuZej9(1=3kB1+0nhnc{`vv76;kS}sht3Lbj2#>L=KQx>t7I<_m^*P5 zx;k{udF{U>ehopbo?9Ub^=5FKE!Y201>?(;9Y)kik;f$!$*R+ zrZU!ft@}r{^_{e~zWI9F z>Y*)v|03zYq}%J6B^qxf-wIw>=xkH|Xoqyk+HXJ4I)9PxosXVfB3W=T=Q;JK6Wmii z_U3H)f@HDoC1>a+J`Z-|c?s@G3I?r}&FIJu!xK3+efg1>pfQ52>>IVN^YPJX<|)4l z_Dk>+8No8{-ef*r!YAt7hnBL|%b{t*^7t_NCG8s}*c&XT?v0nq{~Nsld|rv3(BKGr zJ2cJQ`O_-B18cU8xhr}48e$nne^6#;_IYuhN1oH2yHHpE%DD>_I%U@Nhuq&g8Mp9o zIk5f;_X}6MbXoJL^`9;SNY@)kF7!v%w$68PWM#_xcDK$Z>ZFg)=apZclngb>w=(ye z&H6Oo)?A)!XB^T`GWP7{(oK4H5!~q}KlPo=mGqSr??n&f*ochKSqk1MBb(iL>;dGg zjlkPt{!ei3*EjVkpxE*^V^_f)PRscXugksDR!7ZDtHao&lCJyalwWarDesIqU4M}# z-_>|UhXd($Ewh8hu0?P>i_eAnob}#|*tO8E^sDJ`_4eylV5WN%yU>+)Gp-oCdY7vw z9{_%ci*ka%vmBZ(ncHgZvG_RL&D?1(l3b6c(Z5JGJuKgIcw6nCigO{|DErVpjaB>P z3%p;M*4FRcwr26|I=3y>glWsWR}n{E!y{T>HL^_iUd4Q9T3-7{>5pP~IsUYfs}6zF7fl<;D2=vE-N@ykgYXlkJS(rk;z9+v~f=eP79Fn;fNd^>b|1oq)bWCjsuevYiK9fh>^CI(? zeqKzc!=vdNJlwt;)8=WKSr@JyoJ$`@*>Vlrx@n)qR%Pfr_MV~(DfmB!mW{OgI}Pn| z(ybBpSYCPWp3F5ay*|r2igRWc%@Ixe9Wf4Xm>KO@L)x3+2?NY&HFOTUxB6CK43Arn z{R;FDc|10b>dRO(RW>01N?*KoLm8o)n>aVBole@&URiDU1mdddH+(|3;S;!TgWu2? z@Fcf=AMXk9jJbTQ#CGq`hEFJQ@6V3Sp12KKmB;r7!*(zk=!upt$4@a}2Qx!KpE>&v z_i@HZm@v+e9jIR;-0}7dYzqb3q2I*#2d|Ka62}di8)yHng~n^275(S@o{ZW?=QF^) z3($S2q5BM3cHa%anG|C)rQhB6Id>>1-!OmftU1wD?Fo_>U<SKVdHo^jyaj5)zMIl#F@HoeTpXB3;QTu>>ugl)Ba#&bia_N zZc%)G;I?l${gOY}zcG%0;#~qa?Ny>V>3pw8=U+l+hiXV`kis{0~k=hnr#9c=KmaR=kELC!ZZ?p|7jyyDyhM;Co|nc@-z+RweiDjlpK zMh$zc%5-aw-jsf)UZA}O{zzxn9@ebNoaB2KX`)-}$Kf-<9Zd1_gZs|DZ)sZ_GSo0J zVes?|W`j^VaF~XCnU(uou;SI@*6RSuZ}-EyQ?9PUn9+ao~5t zv(2Pj4>~68!#Z!hNPjqknS0!d=%3ox^WX4E)csA0dHxc1DVV%i7K+PAQ0L>Z%am`~I#=-+~!zUrN7Pi<+!Zn6M) z%cq02b}R#Y(p_M!zJlQx_T)WB40~eZ$sc)dC-%&*u-CkVoN$nDO`MrT`(GrDap7xm zalihtWIk{EnP`vb>uC9&LuUn}E+bd{@1XqK zNG~G2W>>ULdR3iqs+pfgXsnHHr;&O;O}*9b`Q&@N*YG_keR2~%`@5_*#fjmpawHFY z3tG?LyB)gA@2W3DVb8Yja{=OZ7~v zEjY2DMc-=JKkiYx@CVTT0r3vOV%p~XqqDJWZpNCE-#sE(9;`Y-@pJ2tr1S2{2uvGpUr;v6%p_U$KtF;``j})Dj)6Z>^s&s##7nzh;3x`&mq&n2W3EegZ6Z94!Uy_ zTVrN_cI<3VZt@wM0@?iZ18?bhZ2CDGK68POWHleA?XJtBZQT2NWHC5p#@sNjP5Se} zhK#ns`PRVTZo720#_!r=j2QnZcl@L5BfRkkHGc98jem5$^zo1SX2y^0X7_x5@)G1< z=a7wQ?A^Iv+A6#Wb-22paf*e7%|5@y_XYx;x^HHI#(WamDH+T;%4@vy;ipo&%S+>Y z*IIpo^QD2`K?i<4z)x#j@Z0ecw$U@AZ9(*KbAZjDFU#OsKz2hrGn3ItQ(M*$KSgV< z96hJjhxUy0`hVip-{jQq)ty?q)ae6rx|clA!w736dGN>hKF*2`ytH;1>&TMNYeCS@cpSB_Iynv?>e+gYO{32spkj_^wp??YN>yb-1e5K2WdifS&qaJg0n^B&o zEPUe}%DH@Fsr;=x9$;)?ZK-(jD&igN zDiWVyCpGuNSCc1=@BJnHhDPE$V*Iv`on7TKwBqb4f7>9mZg7@e`k`Nf@Ba-tQ3lQZ zAJGZcYd3wrgLTb$c7QP^uVSo@4AH&UNOoLl`U0Kz@pEtgAvjdTTu6?T(0*e(HudHB zC$(}e%inor?`8t0)%%@0jRU}f-^auQ&ZE6=0i)xbACYBuT#p_#y}oyT zWL)xo_LCOsd6s(aw#OwCvk$h$XE(KOM=rS&zCiWGNpHBbskH%|I7r$()T#QGsy^*U z>L33XyJN%4Q$!y6e@`IIru}!E)77UezBN;q>WO0)AG5LBCSAWP_+8`r6V#;n6Lk7G z?*Jp|)Y8uvp?fAf{y;k>8$YGcwIg{@ryR{I3q_K(lbY7KOnmNGkD%M$|J+=P@KAhv=IjG*a;vHwjK)?2aO!HVX`$> zd(((-oSi*CSkXc4Ih-@+GM_{F#P8*@w_QxOCK@IA+OS8^j;wwhKRm z58vxB_Okb60slC-w0)`7zdgquDB=6|LsoyLoqJ?^0cY%*bxTS(Z^sL)C2itwPyzC{OF-!-&3xakeZwygGQbkJe;VR(eP zPW-ZBz$j4ez@Z12nstt^SAf3u?uK`#e&`7C635l=2Jf<Cl*x^-*m1KoYYqQ(@u=~0Js;w6Wgz);g)}buUk%AVcLq(mUN%-4ByJo zN38mAT0SSwjCnP-KU?{(qMX{6-(K7|v1Rf{#>pNkTjwLS{{VK9%yaS_bm%O!{sMbp zL+6|`r11UZCBC*r$OesU7rM8Kvz+jGHuO?5M4jsbtovX_v;&^HZVmG)T0f0GSl2cl z+m1X_{Qg;ZhI7y_mGNB*o>S%xKf>>d^aDQmLghv7b{h7wWskcj&=A;WYZTlX|u8Tj`7P=v%OK|%C+&Y`XMJIF5 za@&WxA>BTBSk5K=L38`E4zEr2_u3u6G=Z-Ov~KU_w?_vq1-3hAubn>YcPsQ)GW8vt zUH1TEVxF3@$6p=xQ%V6JQzv6q-fHR;Jl9gk9?EZiJ9-<+K~J)4UJWE#p%>C;s+}K_ z=QwREzmXB8@d&{`YOfroXM3TuiJZ7>z17}>x$J=+tg%@#a4#vpRQuySoZFM}%dED~ zp-(yqjzpQ`wM(6~F1@zqBass>E#jF@yFA*tlyYjr?zueq0Qr?i`@mTG+PUDnBfGcT zZ)Hw|w|P0(Wzdg;redx8%B=C+T}NE^*1NK{1#52IUuNgkMWKJJ-R#x*Zd`Zh;&$|x zQT$qCqKiEaf7vTN&C}?*B{(i*H+Q9zP(Ets{4-lM3?m%BY z&U~7>JR0lQevoH;VRjH}?-sK^RhEOx?0Mu#q9-UtfwZRWgk3EDWtp zL3iiaQS2rIbus!9z<<7$v1IYzx}tUobYZ39Znv(8XrIWgW6ni`!_eRo;2~UST~V{7 z4EyhZeJS}$maK(NS3`fZ>9_J!GdAx$$Qif;zxSz{lYqUVBY>RFVoout%=?5H!_=WM zoMY_^_7lpBvAb$K_66$t1<&6w|E=@JZ|j>BARZ&Jz@-OdEE*GQudbDGyo-Jv$QW0@ zl=sw%kD0zVi#8L}Hnrl)CCU%2%U1rw$bxDa(`o3gXyC6I^JLzITkCgOC4#f!ii+-Q zEH}-wl1KP9+245VS2^@0GI^WeB>LU9A%0u)Z0k0`DaklBf0KX%W2}_UW(Q*$O9$=A zQHO2d?1(v|QwBRw^hf^4Hh47Aom%db3Si?F{7AGE{HqlXAq!d{9z#0m;O}a0i`e;@ zg1KE1dHK6`|SO zQv%KCt!k_c&+aOWBWDP;a&Cm?h-cB6J#c)hDYt`i;U~74_Zr^gC!BZ9MZo1Ns(JT# zjB@HNwl2+yX+5p+{MJGzl-IN^9SeQx#okFgiEw#zzfRMy82w84oPJ4{<@KjKtv}1t z`okG(s6U=&}T@yg4`LiMGW{|4oO$pY<(!ZY~^3ilu9Eb9FRNB5dB?sUc|8G+~_ z>&xsJW7`#b{xQz}HyTFj<9g2HYF9esgn?Dwe*;#;GzV4-fz=M=eYZ1y@ww~Vy2X?3 zGIBu2X6VJeW=$Xan$GmX$)Pd1_b)K^(fc6F2D$23{ua*IBwIzM8aY9mk!Oba8s;Yl zo*-{0vUbhQS^i^1))pg!@>^%dIXIpz!hgY^7`wx}<$F#Ef^ySBw;2()> z26}SrYG6=JouU)(=UwHiE&*?;mvw05ugW)@Z#(XF^1YjPeGg1_+IxJG@&6i_>MuB= z*!}_V(DC^QAone3|0D4VI>n#BhXiY0T2gk7cn#B|w}W$4t>_D0(4OMUJCctqNoPL2 zpSvV+iz*Mzi$>cbOGzH_m&|? zJ%sI*>Juzyq}4T%x?UhgZi04IR{?f!>wzT!hZc0Xa`w2^x@*_Dz%Dq_Nd3j+J<8c# zG~yQUMLL6A`XG6D6W_JATF_}!qiZnw1MJX6A6EOV`qkJ(_xSI|7CpcHMeOPtGXkyIh+X(hSf2Z+vHLoMA71$Eqh+^<>F{<;*(*C3j7HB&}V_=Io&_S_@hiXE~z^Pqt8>V8VIf%r|pb7u?$WEV8f;2-Zl#UvMuXcZD-q-aPQT7JvASO?;R`&u!w`-u$ zZRm8B?>FQV9TYD)*7z=Ee4nJ8Ll-=`saCPO3g6-x2YYq8*9x*kl(H$iCmmW}cuVF0JIi&ILrTv4_h+&@K-%ER+ z(h5oA-%G1h+8asZ-%ER!(q@vzzn2zM+GV8i@1-qM+9J~U_tM^`v^SH+zn503w6~GQ zzn8W^X-i4t-%Gn%X~;wp{CjB;r6E6&48=>EO`6uyh`4TPats46Xx$LJe3a+kE1$1A z$CJjtmo`Od*xw}h_tLVIb`@#-duij9Hjgy^y)>J&3;Q#YKh_#-pO4-v`YRpw zxlM_!Pq6MAu@!heh0P`S+~C>@7+R4gs~K&#ycyo4hkCG~xlhmPli26;-UKgGeF*)b z_rBDh{7>GsPO1-$likpL)w`ktkJDcDx1$5c^lXm~JjT=1voRxypS<&a!}#Q{hw7P- zJmS3{3W!EIbuP_JqEo-Gy0U!Wfah+wILHK3XPwdzh!r|B};V_nIu`AG&yyI34?feAD+LJ5b@si+(&(|6Vt)?Ugx> zTzvN)$;GXs+;5f?|K7tKa0e57i}8_;yy72+&qzk(tbcr@{paw<(8CydtUUAq4ft=B zU^^gLLoqgi-r3CYH`09(d6C)J(8C8sZl#>|lD9CHC$Q^lU$?+OFi|;A6#<&n&V$mKi6G-1iVdh7TBBk>Q@avSBBojrK@{e zAKq3ON4~iZ8H>(s!lAR&tFww=)j}2Z|pEf zf4l89zO8?aZ;coKCR#D6cuF#}+mRu~?A86;mE8vqUiD7S9lxY6&8~i|IZZznYx=M` zue`Hqb^pcktZ35t-&$FR?8>?)I&dBE9ZSxjx#r%#ff|=~dGV9FWn*}=WW~glu%jK| z!NTg>jcxhf06I+izOb8fX*FeUMy6GL>&S1vbHDva->Bya_xEw0@r_O_Q`HN8E{uOB zI$#a>kN#5M?&jV09X+h~FF5bNP+7|SOwW6x1M}ds1-q%h?$%x7lIx*EPk=iKpWx^C ztT#e?JAt3q*L{@jByA7R#KsTzck!)}xQmT$o*3i#F5gbf8T%M`!K%!UXCz%+LU!!@usj{xHiP3Vg&ffki@(wIRqN2JPcrvz z)@%I3m7xvv% zuuW}CM#8-n<_w4*?wNnex$fm%)U}KAgZ7L@AAWg1aCm;hZ={_~Jl-<~TmwDBvQLfC znv?7w^QXbZ%Pl5UPQglJYFbA^~NZ>$|yPy$uQqX{kK93USuq(8_Ea%%$d>R zEZ0eFaQPEa?*i?4;)@OfQ$4GphlGv(PtM0xjYH!ZfnRBUS^6e95^X*vJCZrv znQ=Gs70bRB+mFDbtFAn_+Z0 z^+|?29E%&Di26?EFEou<3VObk`;&lYsLHC}0d9ug@BF4e$K)p^I0bfwlU6Y?Mbdw- zQCuPCyVVmm_9O{stdnRMzeR~e}dwLc!W}b>?yZtK8 zg-UyybN_APdTXWeM{(r3kss2xm%xK!@~(N-k&`Th-T{{!>4PqIZ*d!IASNC!$XsLx zS|k@lj*3r6UY+1uQZBwUvu_Q$K*=5s!-wC3KZ+;+xQuuk^2uHdyx}n`4=|=_ zRrC9=$Vy(M4dC_IblXZoTNi}k0kgoVM}2`uuV?Ow2XLmE^?iaftHzmPoPn85m4Vrh z7bdt540+$c{#N941#7m-0 zuRp(`KZ5Cv|1LaqF*`L{ENY{#m>ajk`k^x1q%vyTL4BHMs% zF8lKCG#HaVrx6B7YyIffj$BKDirw_vUOdRuvxGi#>K=>BPar!OadddM<&tEwOJrwcI8 zsqc($n}ZJe4sy)!S_78xLp3v(^| zg9F%%R6rxK%NRI-Y;GcUd%r?gq_HV)mz|M}3~;CL;nPd5BL4|{QpNUzi~3s7Yoylt zl5uRymG3m~ef~+2D+aKot2u4#He%S^-H(1)HULi{XSkBJEdQBjRW84C$#Q#AmTWp! z+XZ!r!zD}V=m+*_$JDm$z=#>ua{97MWZRHjJz$l-i@Mb2;BJ3gOm%X9YYERK$Sr&g z(c`C1DV`ECA-|P;^LXRa|4?;4^qI8@-saW#qNN&70e32Qu}-%i4ENPdVK1hh!QYH) zi%{2c{@JQZocY|1?NP%VVm7gsTcPi%`PK$QQ>Z(=Uiw{Wcox?#A0NgA zsw<%-=k0B$iN6tLuaPa`cH*{u9@v9#28Rv{ziQ4d z!JZ~Nc(A0U4_vARj~?Y7>(%zezCLJl!p_UWN2){oht`Se_!xNT)uA;a{GMZHwx}+Z zZ+FXQkxyqH;j3tD?@ab0zOUeSGyU$R-o8lIwm7&U8z#-U=4v!;?Izxb;Fwyrw6v9V zdAe+rtO;2iXB>P8e8~sD_u8_ivFysWQReD!Yb(C!5|vCNH)LjCerlfDc7aY5>{(Gu(& zJMaz8N=>jhALrLCqdm2|8(YV*;M$X=7=*H6iw5A7>s5AqigLB-U9qHr!w0}l2g`8XYWoHL{AA+ZN-x>Hp zr^E6Q@nm+^5kES$A)46URQZQlGmil$0Ztd(Yd<}$or!MS;>XNhg3Lx`+5aTBiRk?S>d`qPKpxA@ zA4sdC16?KjJiObXi=GQ#3okzaTnGKO;par(WY_pafwf>h=gmL-rvsa3d3tBWuewyo-E;+noX9PcQ`oL_f-!eZU^-fD#x zv4_id0vnuyNEPGK^Iy=d?7$vZb@ft*?of{e`WG!g_nfnRo+KIO*h`iza;C-^)(0B#Y<-p@Gu?AmY z4PtX&Z_&Qw4aLxf^m6yS>exM`r#(rUsd6%fu+Nv zoI39AMf6SkP$%;63&t~_J9nrjjJ)ZzAN^erUn}ZcPF-5lsR`&Y@JnP5>S$yPx?|mD z43*%Sw+64}y_NY0ur~h@n3eGR2A)H64*uM2y=hULy){(h$X1q;C&4|fDzlJxt!v`+ zaL=7x;hiJF_2f6d``WZbG39P>b(F~B^4jyGOXlQ7m&7t0e~;x&R(72CcQ!Q_*6=Rh zjyUg)=p`G0$4&4nOVMjCeRXi3bDna})CuTDdK{wy`sl5zf5m55I*B0dm5+*J^dFqr zWIyL;K6qXS+o?uCUr}VEHXAR?ouQ{5FZZ@^s^@~Msovsrc%YJ#-uG*u` zo; ziS<~e)xK!QJMgqn0<3K<-<+RJ8P~gY?qt#Cf>Kw56M^O+qscHGmdbze2@Z}p^S-!U;PT- zwSLs!hRi897jeewV%?=Cy=n0i_!MMXt(C|Vv32CW_)CasJKmQApH|lmz00&7M1P!F z*GW5>)_(I|JdyI5z&?w$j}HX2+?+Rq&|B`Mt1sq^KA*bUpy@a8)R^VJrkEi2{obtW z`szo^Z$InbT&TD^I~b>6A^CDQ@5B|ax8cb{_Vl_n{MPt%HXYt;rbarzvrgn&KI(V& zpQ(|(q*32P;?b|>-9o>*m~w4*g;rrlF%=u{oWsOxl0JMVc`i%CRoS}sKIMGVT&do2 zv#(8!e8a7`8X2KrDZV_t-7kCJkrl4uj*|qi6)ZJw$%O?+!KsI5iZ+nxbgbgL>O~~NnF_*;Ku~7htHca&21bQtjfc+jk7`BM9yfA4Dj{aw|yObz7?Hd z{rTYo*h{DDcf2(mfc6kimGLFUTQ|dJMdX+LB$a+FL%zZ5GW-$+BlLsy z!UgVvt>4La$t@&HXy%#2vxcYWIsO?&HeY5>Gkqzu-(a3UaQpO+^eGNrgVRP<*+x0_ zp@gS=WezN5Ea2*ajn4ge2M#&+;~ntXCcfqYpRc}?{(Qr&@4fCAB|{9F^$@I6j3V}_ zyf}4=|BLa|c*Aa60iHqPKE=Onm&oU6i?zh;b@E}v2B37WecR&L1Zx`l##-TpXv1k_ zubmkVT?iFN>l;argG+%m(@mK?JG#iwpyew%dWlaOu?sS5ttE@qCb5K&Rj{8DH>y@+ zx5v+`pP*Be_TYo+NJOYr+J<$W1eP5+jIt85kzi@FJ^qU)m9rM zt_N%3%)dG7OgvG7J?kZYYkYrYeDZ&4Bu)Jm?fT=WywB>l%UAtH`vdSe{SM;QVr$h! zIeqKd{PvPmg~fef>moto-Xgp0z=v4=z{gG@GZephEq-2Mo%PBcnXk@?;vrwDySC&H zS=W?E=QYTD9AvI~7e_lLLIc7X+Dj(Z*{tic$hN)mi#Av};_I*V&xojv7em~uCfOwX zvRAKHpZ0)e_IHE(?Cru6;fs;~gDdI#`yBdLgN$GMe3<&B2fCZ_?`7OCB7-yS??iTK zY>ypTOf|f$lkWLIm7S1o;FFXat6gu;mnBr|_Fca?h_xr4QfkDs7zaOK8H(9Ew(o3&KRZN1s=s*{~_k!ULzyA$lSv_9=nDA zFZ2I;$Gyw<<)Lv?|FOSv_m*jLOQs)n_pV)P}TdY>!-`H6BEccCs^Vm<|lbUOamK1+-{3?8o zkKV+&Hg4OJy_H6#Z=;Xm)%3jl0@$YAdpC4{m~-xDFVML>BH7w*#wPfNo`A3a(e}d2 zsBa>Av?z9+Uix?GTOYVn1H7(-uMgwzAzYBZS?Hj1Pjo`{{AKkLcyh?Pr<4 zQ~2u~hu6=w;0K{cI=5d#TeP_sc-8A%5bNaL19V4aoh5zrzv={KRuM}>Yv~2*IF?q& zCh8EcGoNn-tcgbKMsB5!TY!n?GeA77ID3V~y(fZAfIO|lQ&~FBTB-JQ#yLQKAGQ-s z(8yEpOedjfUuDmdZCMPswy~B3Tgg@y*=E0A5_%e#Q8qw7!=xD){oJbGNq-aKi%D;W z7ZxvHOJ8D?zt}xCYxvF>+TZ(a@melS)9ma#c(O+x4Zw@V-e@hjoaY3d6VdhdF_tWR z@gw7+9oV**c@6L$0>+}tluM@Dl|73MufDGUHyW+CJsu1`S{UA$IYTrmFb>{~SgpX0 zvcU_=qUSp%J@fVqCvNSZSQ80iDlpz;=500mE1I&}-_0DU-gxlWTUj3~vmThdjXnDK zq^3zNDks~zICtM0o};swBPHG4z$lcvGoD^@D%)AxcKp{@38~zeqht( z_94sd19y!Zo8~`LW|=!je+oXb^>jn@2VFn$Z+i;;Vvv5dssEd*f6!$IT7t9v+y2D& z6#tx?`&y~@{=1^bzfZo}J11{@PT!h>?Xs=XxNEFnOBput=#7uAKwnhC8kx*~DV)(A z^OvI+N>Ns0jWDj*mDB+rmjyng?2Ih%nepDV|If^i<}GGVs;HaYvNdqq75fM633aoW z!-n#|>(kySo%1umfO?O$QWo9vag~qpAEb^sx5f7xI}OT(%jdLY+LyFsQqOy6OFAa? z@mXkX7v*xBa$CLyynn&}N6rqi)kiy8=)-A$R)n$D`4~4iX8Ikvtz^HxgIn}5P`8XR zVo!{3m$g86R%6Ccv%i-0rF3jFj9vQZb;w#jc43)ws8q0j1QB7e=x>yMWpdu{l2^e@%IkvUP~*mN$6!+ZN4 z!rlUUC%JJM_W~Y-?~RjB?V7bj`tecspd@HVI)?bG!}p-Xx#Q$X>X9612XibrkfrA& z*9H_Dksf}VHj8zRlP+vVdl`2ZS{to}^QjYBpJ%??c2c~6dGCP+dhZ8i>*AD~OSx#H zxevbbFMi6s9K9F1ot?s-$g*$zM&|kT$9v(qB-2@468%fB-zuHx>pmvf2e=QX*Z(>0 zHwv_9jPK+>fq&kL5-X?54rJX6%%*hy;~SAl<=pgY_3;7rsewJgk`DsspzpRfhLMkl zHiVFYH5YD&wwz;4tDPACbEv0}bMp3MQ|i}Zhm)HBM(KAuB(Dwlc2xGaOz22$p3rdx zve8V^p5^;<^X+8Y2Ws~x_?PUl+>31k4AB)-B_5r!vYG!$cV?`*9J~n7kMZ_|3fept zF8;;V3~;xXI^sOTABgXVcY^1^?!`Yl5`+%M@|RaM+rf%V&Pl83Z_3~N!8SW9tL#^H z{Y3N|0qjZ!p=a7ZbZ^ljzCHD8yPow}^?mC6CALJ{q05c%ED6>%G+<>2o2!lB$Z6Vr zH*Jdc$sVQ5O;3>?_<%zb0~)(MF7vRRk(oLB7lq;Ce=S@A-R&b!?FX*duf0a~3pe{J zxRa9k9(WIS50rb3wW+a{eIUGFdv*xgvJ;r-`-{L?d%Mx=@%|O^zcj(GJF12pNC$6;`_ z)y3DIfZ4CJSG)My49;m?1;9Ju;b`0of^%i$J$?E1!s}gJYi91f{wOB!VQ{WYyb3fU z41RccC45`q;+6X2;h}IT?&6{FCbl7w>!g+JFHw2w^6=|f7r%r*U7vxcg(p~lSH`N1 zcinYdG_-rqCCNSC;@q2K*-z> zNUnay0O%W zgZXh_aSGWp`s0o-5rgHW8B1AXOFLrMS<}8$+`qW>uGVdZ?9Cr&@UQBa&OHyv*t(!m zW!vCOo4#78yJT6rD@zXkeR6&<(Bi>(eP*=umdVl5jW6DHJmJgF5-hKytr}lcc60c9 zO-~BuyZCMggDufuUdt`OwYP6s2lH8O3Ml><^R3Txz5Zmk@Yg?>HG+`|1N*6QXb=2W)A803Ub zpSc(H{Pa&9*HuF&W9JU6Y(V^jkss-?2F-U(9^;;31 z;u(bZyF_@{KlClzpU`<^Zf$HrIqF3@Qak@s86v)#$D5bo(@!>S?CeyA2e7`O+6vi` z)3m=6`y;4*jKp^&FMZQA{AcWyFr(dg6?UH)*5-PjXIgnrIfymF4BDsO1LuFD-FU;^ zd1G%&66!VC!%vW3N4@s`NA(*0KYP7?9OdC$uhBN!H=w?L+|wyu*wd+a-@H_`mo}n) zt+uz9j`sEv+5_?8nJwB&i0luD_5wE%FKjI4FaoJgP{LT$oCQ_ zd(pI+?8U}^%U;Al=U1~AR+Ldo_Ch^toY5MoeGB@) zX0{iDP}hE05EDAn$yR*qY%A<}akUkWyc`y`qN9_o=qPOk!b)2KjNcAh(J{04;0J}R zcn7wE@<+Df?Pj*3V`d%gTSj~N82Si-t@s6Pp7uaF+lo7y*@}+;maV8>_AG2g|25SE zd|@jF!B({UldbrLZN)UU6?A^&9_-m}$yS_&tX9|x8t>9`Vj=7WjXfz2vKKhJUDyi) z`aQ~Ctbo0sGJFet2)nIN<%js*+uGb#JPiBa)~WpV;9bpM&}OKf7@D#8^db^!S^qJDyd&-)VO@Fczt6@9HPL$O(B|KQy)Z9+k>wxR?&rt_r$WCy3?uoH; zOZE8|oR>nfUIfK=1<+5IdzYH<{62~22)V65-+}5c=0i8srRvw!VqIkP?^u(Cy$dm7 zz75aGP|WF_!*kV&u^H`o&&OFnhj0d$vTgKyi-Qf4ZLqD&GtSpxgOKOHdS)xzM*9M2 zf0bQE*drk$(pU-^DGwzW_d|~9^bQJ*xAj%n2L{V#{{6ts{@9x2jx3zXaiwol$o7YUL2^R1Tm0*0hmiX@fOK%tMFW=N2&K1fKWb zV$Z_2$Zy8-R~~M{ILjAxe)V$qnPxnjyxPS2WO{l{S-4kgZ^pOT*T9{|e>7kHt+pkY z#(x<&;}h*;`X2PP>+oDIcMCX3@!^ch3!x}S+ zzH!5CCNbwr^BlLfmggB`&SYH$Y~R)P2Dh}g;PiIPD;(I2V>>kM@S#J8h&uMA$$5L) zOGj%&^zLgu=GABpm)2WNm@Dab%rW16{6)1-t@)fe=ASQ=_|N##dw9k2^QiRY%{>-W(+jZw}WN`V(v8qb6Xi$GqU!i^PsgwVJN4C z*xNA`ZQO#ncgP!7eo?OXT7maqA5jC=V2zj~?@4U|d-Ul!3HzYlQ(H^#QP3K5DAsLh zjhWV0X-$>JWz7S*DDy6zQhUan4h!F~?X%k;m~3*I|urWbtc)KxDju6n`V5a^}&Kh(>Smh|HD zZ|G$l>t!_Qh4#e#m0rYq;!-F2K$AG%Lf^)HCdy_Q=~&3m?o?+=P>=P!P1`UBb=HJF zq822>JdSq)X)Oq2kQYm6JWhSny{*I^3DohLUWn@?%8B-Rl;HUx_!f7;uR~j=av)wA z&E@op7T*dYnaO5Qn{!^L(YK+Yv%q_OJOgdEvhip*qcK6z`K1L>05#1pVpbsu7+ixy-*zz=h+m8 z_&cBL;fOb+*|+@c?!{f3`KP#5n(Et!bto4~+k8^4ZK3?cymSTjy3!u2kRgm1{vdNaOv;(_OvXV`P7 zBP+09j?O?Fk7p3I89ZATk-PlvX~*qj;Er}2wgYva_LI{4K=e)=?XUV8&z^ehk-)dV zu#VaRdmVzX&#Ke*Q`n14&%`xu0ht-gLjt@|zr)&~4}f;7=~f5RItbMt$6gcpt`yay ztF4E;3|X4?;ruRy{|W21(U61Wh1}b*7J@x-?l_m%6VK;XVZXY!4m<3Wj|Qx#Q$FZ9 z1DiB>O(*o_5tjUH6*}m=9b>BvwBLyQ?17(5tU)e8xs_sXNT)U??61{^J%DeQVefUO z3G?*uv*-}!yAj`_0kC~WvT@P!Y?SC;a&I!(FaySjB%!nyI`##9k0O!>knU8*rWr*>&1)lHf&W zSO=kA(b?536J#Zs4nrmr`oRvFJ3!{ncA4J+pWe?Mfw5%uEzM>AJ9#5n-k%_EKIBzr zuARglO?r+UV|ih-o1MA#GW6g$V~youdAC9y?6nwX!WwMzcGD60Q)jZ#xjbFMI-<=` z-6K6v|7$2@a6W5|#+-E4+L;gKIo;$3`y+PXT&-s3v6aA29sJOqI~tFe;7>g>lVA_f ze%77da`nEkwCBywIZ@{m(6?gFl&(Saa7G?Jh z>;iq$88!lY$FS!RnQxo`gspfy`25@KIp!7>u&v< za>BPScFe^+R+#o+ZE_FB+36o|Mn8UC zQV;Ed8RO{?_u#XqJ8KEY+=4O23Oaic?}?VeHZ_PdjO06;ypMUi!F}w<*k`h+;H?dt zkKwE+@=xCZI19UR27BGM0BZ<)w_DIb+5>}m@}sM8#zCnyEHVb~G-GXiXAsT}r!-5^ zmp_YkQ30KsFGn8>Sl;nrm1Y5Cp*^-T-C%pV_aN?bNb4+YLy~)-NNb@k;GjGsp=u=7 z1dqa&j{xpLs97H9yOho2QgSEZ+z668*8Q*L{&QS7Kc4kLa;dofi4J~(96t+v z1)SZ6uu_+S;@#Zl>BuweRXT^EYuaO^bZ# z_Hm^5E7ER4+B6On&q#}F`kh4jRacsZwL$)b%py#%_$KL}<(2+x;h)m+at}Coc8+OV zgIn-H8iyQ2I!W%G#JiPC&>m0^*WKJpTldZ?MH9Av3w1 zgqY9m{6^Ta0q{@ZsgCc&nPX??Xxos+(ckgjX#bN`1Jp9lVvs$dIqpdNwix?X4Woo=|FoXbav*$L@}P47pp8Cib-)oeVzqhwZ$T z+79-SQatp$(QCRjA!tjQH@?ROnMk(p-*@!Cw?G~f#zJ@((LVn$`7zk8+i33^-Uo2U z-W=@J8oNTfFb=kc=A6dD7KE&jXQ_m0rjb_2cnb;PwJzvf~3flE`!?v{ zKj}MuMEPi;?|3Wr*Iupf_@R$$-?0Pr3q;>B3bIw15mq>b8pgytNp&0Z{Er8cHw;|e1Dnt`Ze9^h3)}t*i4)=igcQua2rYA zBc^du)2*$mPrTr&qK*yQhmw zIxNp_k_Ue5^0@kQmdAxBg8Ab6q>V;Z&pl>|swr@cEG_N-r`{H{e z&h-N0yFZW(&*#8fS86YsF&827-NSv|Vx(8q7U|*LG}vm4!Q>hPrH6Uho#d|r{28n9 zz8`D?#a)N*6&UcF!cmy=D<`T|IO>;|Va!2m5@+$9-%>mm5XUZhK9c;-d(SB!>fFs* z%&lXPzX9bs?Bq=GO^O**rz_x=O#1F+DyDHN&HK^Z?$ypAq%|0-XH+-IHcf%PX?~0B z%s99aZxY;^F!#LPO*>eHGqz~`poGra!urcptaJ2$9~vv3!MKZ_DWum|IY0EA*J*2E z3p<2Gy@$EmR;CMH7$4HyLeH)1gXOrSL)Z)7i#3M9&|5+f`1x-c4pJCOBOCon3P*n3 zo>(9JB>ScFU)LiYy@oc5_u8qy@(^%2>+wPS4ginp-w%+j2V|l57rR0ZawB=Ej?#WN zoRjm4Y=bmT=n&?GJX1bRNSpB9ZIlk`zfRUODsuzYp_e;Et$tYcMKb7JxaiPzx8i)@g?^=*g*;y2`0kQ+VIVM3Bg*1B z{@u=R%jN|r3j^Lwx&e7Kw=osNCJ#S|z7y8X@jbuDYo?*!dKUX*(O+Fu+j`69>F}4~ z)dlbHxG$pT679{U{%%H_uKpn_q+1r;#Qx*<-TXuLx-Y83xhQwTtpPXnYtS#7Vnja@ za|qM>>wLVw!#fAq&m9=s-ZZie_P|cj;jFbwd}a;i@5&yEUb+u+e|vPknJWctefG5B zp3U#+bO({gz;|(O-?!M$U+obLx!e|6(EqK*`$RsSeZrbFue0vxKhoZL8gG>ALZ?hY zeqz0}VtV%=rj1ryg=ZYSyOcruhVkx_mFiRUghf3;^>_!Io>N}h3cTA?HskaYT4<@4 zb`<-S*BOg5DsRQy;VH!HtfwR$omG9$W}1Ve-+vrLKi=s*FnW%qqRf;Hay|dN7IVkZ zMZW$R6L_C?(}M7PSxEK%Wt0Wl+YIXO;f16P$(SGe8gVQ8_aN3(Y0N^;5ZJ065$uQB zdN|nwgrhXo`+l{5oX6|OuzybTJk;m;5NpvCw;Sfq(Z42p(=43pdxFVs_^ze!i@j5z z;`xcO*%>^`O?WQQ8EF~tL(j>*(ADWqIM)?%X5f7uax=lrAkx4&olf&RuIV%(PKx_O z#0z~4Z@}}Du#6w)TejDR(Af;fiI0Bq8OTEEQ2twrzpXa^F|R8>)KrJY-VZs>>QLS% z4$D3GweD@VZ*bEBzi-p{N*|27JYX|u9nGz&sm4stm96d9>FTvXec@)o9@B@*r?`8EX$c`a z@cWe+i6I?;KN*)8(s-sYBpBgm_$=>UJmtoaxeIOzNyd%wexM%v>`!2Rnf8z9m)6$! zd1>3C5W*=MLN}HFZ z)BD^4x?Y#kegCZ`H4V_2F+BEVKg6^DQo*tQx^`2nm)lJ*#eR!O_-Uil9VOlAqjl>F zy=~q7i?ja_c!k%xz-tS;$9p2K+0#R2fiA-RP;h?t0?;l~5<;#)zJ3`uE2IO$9Gf&J z!uzPUQ?2tstYwC?5Gbpc9ZVI92T8P2@BUEv1_WAZzL{~Pt zY3G}6tR7Y}dh9m|vvBPkJN$t~#%s2fM-jj1;OAqvOux{&S4_&-58r+5p@$w?1+z)l z5qC*T#(s6vox(l(x=%-qgTFZx4dMa6cHF>k#*Qu?{=>-Ma-uYkAn}a@{e)2;dDpI= z(GKrEH!N>Ev$d|He}kvDtql4P(Z!3iFG6(5i^@=ULUehHypr)v?SNImVh-OR-_L7n zlJ%JOZ#C(HY+h*RXLOzXPvad2*qB9n)X%dNuX|}Q+3Gvt59f=Aozr!I+nwS)h$(Q3 zf!lYwK)9_5-UEN+=QQo@SndtG>xHuey7(^youX?UmaJ?s@dbwM(G!Eh2NmF}Ykp}73!=oeKod{yR zc(7h@rijps?;@|DvYM|0RtdZ6sV@`n0DJnC)lfaf7^+atU-$ZS#b@gwh zb@3sv6lsyCF?Kwq1olkKDnA8iHjn$0KZcL~lYfIHzP z!lsfM@+UCD`WPI1A8l>T3AibKDEx)#Jh%JQuCFocd=BU*boq$%*pxh0*xS~SvmNAY z3pv|B&JeAOjdbket|jVqKC8X8t}}7=NX-n zt2Z~1Y}m`AWG9(IIsN3OCa^UP&#vu8%o)Qr)>NZE7^3OUmO#fEo}v1T(~+f^&mno8 zp9}eze@nhH;S%;UyofpU1hm@(~6`7zWNO1|Q8 ziTX?ELx}GdINSLQ#I0RM+`ih2<&Z;9Hlj|Q!4UE>$wG2BKleuVeWYKvb=0rKJj&Wy z$VmNfKL2Jr?L9h$F^W8IO@4=z`d#bsZ95UxsXs>N;_rn`rZ`%bW$ef1e>2}oK9Zvr zI*?<7Kg(n9=V8n%`}K}>TKzJQnciqmW_(LJMC)Xmf_IoQa28C6*3q^Qzs-2JD@5zS z?izjvvU?l+ZZF*R9^N+UL$qXX=$V!286?h%$;6p5)SfbRoe)-UL!W3!GSZ+jz&v1B zLjavetH*K>`XP8;uGV#(Npfw`h1liVqU&y#Ym2U%U9K&CsQr!l*qfTUzVhE)07lHlB7LfU|To?{b~5 zcN}aD+Ha--{lseM%sZRp>onwqU5<|Ut>o)~-%9R4{MK0R_W0dK$X)Fj#CrR)J(7C! zX1#f{-n@p8&Q5shZKt6tDxU_Om$wOW>0u9$KVc8nKyKCl3vt(rXNzP1n5^40-g+7D zxX>8vBQ0pe4$U+I{g|33(XYv0+SNY*<@Ax}2Y2%b6WkvY?qpNQU4wi4h!VJO67C_e ziR7+_d*X;foC&1CPT+u1#MRw@C-4TGE2O!V)Z8uHy7*&kWuHHBei!}n&9B?frTsP4 zecPp8+NFkm+U3jW6F;>HW08GsM~n4ZBF+%LY&0cz$2_I@UMa0dYS00lk4JkY&F%^_J)?;1uS-uBwihTG8p?WL`& zM;}mrdl~0JLk9Gp*M*`FJ7bTW2Qp%BW+3hh`%Kv+!}%xNvTHH-brEMxHsXBt3n4hc z0W#29=}d%4M&A+Rzp%dK7Gk3%W<*V1GzC`ans(KH53H#{uJt}ejzuXT7-C@2&w;eVU=d_tF;hYSt|9W68 z%TvrLV_(Cr({R7oT?-o92K$;(erJF;0GmDO>?dtV4EDmlh4Lo%i`|qv_Bjc6O}Ho6 z-Mh29pK#yNRr&A6?m@ym(C&`CONb`}YcJm+ey_{sW968WKN}DlhG)^_Gw3f2K>I62 zpQjwMlE3eTznEjy z4JDb5qmGoJosfPo_Jz)nC+M<_btc`Af8i$eBHf@X;U;w=-JnXHPPC|dL2i%1W825U4YC~w0M>)**M% z*xK&Du)9CTT)WP}Pbr1(5F~WpKfH^-IBN$y;kO6Zi5_^L8h$f?XQNGcWq0wn!j1f# zcQd^i-(GuD@Ga86)xzNk!*2}Z7vXpMbnQ*DK{Tc}wh0-Ufp|z(#B({qOS>%6<#;F@ z#Y=uO;3oXTjr=37%Y#F;%h#hk#Pf11pLL3M-4p(4%uDT$`Vk^d)Sq(HchalZr6u=c zyne|n+=AF`v6Gu0yA?XQ>DjHo?pBI=AmhuIZaU=GQ?nURHe+eOKFW;ViL64Ip}j4l zK9KP5x$q^L|3JQK2pc^YzMKJhsP7&FH#$Q_`1?6S#QPxnTk+FPZ(=U)O&Ep1>7k~} zFS@~Y(wS`b^MK^DA9lP7dyuNu<6ejRUfgSOtLGwYgQ!E;`zyX*(*W7(Fn49f_>FL&at$qf5NiW!M ztIq3y7sAmPnQR%w=Z&>T%&Tng?-ZX(N7+05Xwxow*U!7kxF#mlR2+->CZo=Kjb_1n z1(>V!HsE`Nuw7$Kp=X~!Ud&VmIxio>r+~4(hj#&eGqp0TZEV%nJ%RZ>^h0V?{BnI! zK09e1V^~vDMTwiXE|BIkc%6)%jiqq2xakiP?{hq3z}ty<#GYpCuibU})(q4&&7ayI zxr;fInU3>iFrQewEoRLOn!B)|9*BHxFO~U%%=9koR+4`(zLkmaA>sN(CSZz-WL4#t z(G~R<{`;d18>=%L7ea^VuOAH4>DHKfXh%QWfVp8#pTc46SA#Q#(Qn0>&h4QuU(9ix zTZT2wplkAURb%wN-Ddh?F0Zst_2%}Q4RJ%f4RJA1`Z$aQ&LEEoG3~29qkT%|sGvA6 z{0`OW+Q+!z{6X}+lG~Wqp#L1`dw%)-Yjvi}X0L8DaSp`&U0%o;1gWns_STF=rq~*&oG0{;D;vDc}2=*PQp= zJDOzoM;;bI_8GYQBkUlAoeCNY`W5U1*^oBapJeQDU^8sb(J;t51#zvyoJ=U*5%7Tw zW}R+2=1!UKV=q^dPo=vb=~9{2B5lftYNu3hbf`ZK_#XRzyYASK&VN#O(h%;yRd=Q% zt_<1EYj9RhAk`geA5?!%y9Zq}6!l8A6RImz9#j_X?;V;$^@i#e)uVwZk2X5*GXqeE zsNGOKaBeqfpY5|yFIK^w^j^*7P4%Kb_F9G0{#3N(65rwF^G5`Kg$%AAvk2>2w#|p}V|^rsu4CwRJYHsxjx> zeYR&KuQ@BUbsg>GU)ugZ2f<$qK~P6nlg zcDn=dm9ow&pnvMeopW!q{XBkq;rCjV9`t$+&(5`Qr}}da=Rx`T7~=FU<)ueGBwccO ztuH}+qVlJDYIO0d?5Xl=grNZU)X$SLI3jkyfKTGeDDc_@*T0 zlpN0|x%bqlnQ&fW3Ox}C2F{GqEz$~c>RL%P5MgB&#pCiuJ7CfcTe0(XJzR3 zPR2W?f2Gq}Jooz^_-lSS_8*kunMLsw(OM+ZqTj=>5@$L1D9cL&{@%~7AMifxU&)q? zIpC)Kf6eD~cKvb{KU8O^UR~aOm3S~0MtFY{mfpUKteE4N@!?g%mt)@qrE%~o ze#%f5`>w(-0sr-@@HOyXz6zh(0LpS$GW>13nm^>#j4@j|*3X`y@<*T9s*~sD!_JHM z{X+4sADtgd@B4+}4Az)BoS&-B%|||quc9l}j<-V&oE2|tsV!^&AH2*-=q2I0o~e!L z-Av1wzQXizOt(^-Y!O1~ZLdI*w@q(+s9dnXYE~Ak)X09$@-0(|V>qGW~;T+ccT3foTNO zaZKZwrZBZJy`Aa3OgA%qn&}%%KW2KKsW+ETSEdn6CovV33IDotc?@JafvMsb_0dc^ z1wf02G{=fnK3KXZGynKBiL0N`iSXwqN~-)T8vm~JSAtF~rQVMfj6RgO${Bkzu5`iGjM4WI*KwEd^^7q`Bd+rMY@C^$C%mL1jgu-iz}Y7ia(LDD${w4W$o0oWEY&~;y=TM zpXGw{TyPO%RUWsy@JkshdG2=MuXVv2T>Nix!H>A$GREi&i|a`jez^;N)&*BER{GiD z!mo7Uzv05Ka^b)2!moD0hg|Rxm+&9D;Nvd%3m07Lg6myyg9|>#Sn2D$3%=;$ztIK% z;exd=_&ntFvd7XTz-s|e*80PX-P?`Y3Zq1pm~=3R7)0n z1I{l<16B@6Nd*~J^1u#BN%JlF1jufR597}B?;=NH(lshH@YD=Dck$C71TkdvM!u;Nli3_0nTK9-juEj=r}AYB^+ z7=>L`qep965BwejhaR|ZxKaAc%}cjgATObC_@nyMAC)pZ95?;OO>HtfDoh&$O7#~} zX`>MbZPtnc9RO+!)wEkcZ^FF{cV7frh96+l@E zb8u^c)H#XZNZ%g2GuzIW;{R1F6pz(bPzX(=S@ZLERb{swdCCF9IJuqP`;IFMY2OlvZXi|D#_={zv0GaK9aL7IhF86SF7X0IuGX6V_|fao1KH8;t! z#A0PLYIh$!hO8KDX9DbsVM2O-s?D0`Fb|qx9GQ*rS(f~KC$7O#V33avXMVKJW+`U9 zauBl>P2HB7QS200_%Mvm&CVkWZJ3s_5Kjz4EbN$5y2+ND+??X<+`@bV$}c@X4^5h* z7V^?R)pxNw@DEpa^-Og3*OHs+OSy(unELk4;b`ncH}$z(DV&7+-%(1F!mG5&KV9VZ zPcD*4k6Vp9C?3KpJW;}QwU)$=36g(uSLrKC;mBRZgP->B^jlpjT}8>=H9h6mm6AWD zTcWO*{5$gryIv$Cg;RNR#>(B9Qh362sW7fsavgkyl|NUi_=+mNYy67;ckasH|I({# zK-C%YrF2fz)t%a`;*($J%eg(Pw&NOJVb#_sJcXk+PnT*VL|yHG!jwMoT`8RG;pw-! zR6A5u$*B8KUL?R3>z(vS|rZT#8SAUE?PC=q7jdTgluKhBtA!#-rR7ReTkf!ixWQ z?#kc)(!bV#QOnT^wJiK$;DyVWQ<#+{e+rCxS*6DE#xjAFn z1Lurs51ccmy>ZU?eiuyp=bZUF+?wN^F4&iZ#HHH5mxNljmanC1xtdK&$KOCLP3S<= z#^>55qW>Ci%S}zs&)2ltgU#o=O^2G}pr0j9WSSQ#v7&}^5?3)@8!zV%s+h7k+FFjc zw3Xx^XIgSbhOcI7ey4f-MI)qt6_27SeTDrF%Ww);aC*w0k#QsESGkjY?ueW04Bezh zqErX4e?izS?8DQ@K9FvyO_I*3jEIsOQJP;T9@Qnqqj)JSQJP<)c>Qpb8_g%t91z{) z-UBzeW1oh=(TvA4jt8YMGuVA5(>b6N|6JUZb{1}mCmXi`cOLGpxNW#e))L$#>k6hT zLCO6#+!W94xG6m9sc12eG2RMFaz2Th()kx|^7krklIwlk#Qy|0@#jK;G)EEyrI3Eq zmHeG7&oZX9Oby>l_dKRYm>PbN?#WEcnAS2ioM%4M3Z{M+*qvzw(`u%*OwTio{89S1 zKx0laAxhf_v+#2BU}o?*+l%!!;+5v zN%$|1wsmTKNVPrpcLQPyFKL6)~8hL+Q(^c-y<2dEJ7 zP%Tz%Bn`P)(t=Da$46mP5eJn-0W=bh*hnu_PqLwzLZM@7V^lYrm$W0VREg5HB7|~n zugxV)Lp)UDbF~Gileq}dvhMzAe6kE=j!9PS(tmGuypBgv->1ldb%^dF1=v3C95#q z)!$5KcY3B$_!#@N+;|%%=rBP!6SG0q+#IA$7d^MhU+nm)mOQ&uPVO}QogRlNqJ-So z@i7x9j6d$^yuA3_ENf~pq~T6cLb@&6nuB@r+?=WD1sS<%IQh``2%H;K7ZX z9@_lyBac3|rEKftPdxe5)Bh^pw*8rBpL_m=iWgscdB@IIUaj2q+Usw;xqDC5-naI> z{m#4ZRqsD=@X+D+KR9x<=GccHef-JsPe1$oi!Z-AQCoNNRQ=cAeA{sP%-M6_egDJx z3qSsJ@#kNDZM^i`?|)pr(xmC!+&w&7wbpxi`}nqL+s?1Oe?VY|j-7%!2Y2b(t$T=} zN6%ip`}FN+3=Qi)AbjAUh`~dK4jVq=n#hsYj>4SxSd%3M3!d{AWLOtwW@YE(<}I@2 z7ZfgDQdGS3hIu#Ml$89}{F|38zvb5d>HPmsr~iMg|LAe!Crq4lojGRml-Q|p)8ePk zn3*tZ_MF7I*Gv8XHUIw=`qx~nA6YqN|BNm0{%i&R3l>nf!v3fGhnKQoL|5t@e{Q;e z_NT%-=jWg0*Et0J*0*5){dE+7gq;(Jm*4y}>FS5y>KFO?hZ$yXuKxd7ZXLe-G{-FjmyeSkYLQi>FrF{ zGTp?qoaqjxRZI^tJ;L-urpK9n!L*iXJ<|rJ=a`;ndXZ@(Q_O0Zr~vg$1DSSZs^ag> zcmUI3OifJVnIiS=H_S#7?;e!-l2qyLT!@Gs?D?%XyBz; ziZ$X3s^Nmad;;*BBY%-A+%pPof`Q)%Z}*RQ3T=!gqy0@vPtm4YY#4{wK#R4>NPlu+ zmKI&OK%1GKr%l6#rnub2+JtmDq(T_%-6^JUHt_@TBYbKGDB`fv{2$^FgDS)WY2jYD zpfH~o^bu!4dUi^>jTpEPe=Z@U;p|N5*>Ut#O^e4(*VL(l($WSMi+BmA;Tm9=ipxMh zigA&%W;S1&oqa9MFw1ME7@s1%7|}yNz$D}x{HFm{0%lYSK_`hh0Zp4JM%6@VTuZZV zGF}^GTG-A{ul7=uAkI2RaSoNGggr=wUJF1h`Yl%J>UKtQ5~AxThdyhYK8W z$#iM{NnSF2t4NDnWcqSUt#B6Wjn}kaEd+7dbCUzLcCahexwKN?w|sQ7*z8 z%ir8R8dA~~&y;>o#or+4G!6fYo#Y`G`Wv7bgdg%}u)B~?>D#QCwQG@jHvZF0pt{mg zD&ZJ)(|kBx3!%YqXdzxg%yH68-FWC*UYXE)xHd)1qmzr|C!ii`&~>KtpooDPNq1MQl=I+JiFXf@R zcDnS8)m*zDW16FN~Kv?YvbZG)~-##p}-*ILHi8E;~&_EDEHHZZ@O zaSz57jC(Sk$Ipjej4PSnn{gH6K8&jw_ho#9aX-e#8LN&}En`|Up{s#$e+jkoj0Z4o zWE{>|3y}4J_MXzEXFNhe&5!XljDr}fc`O6tk<2$Tmb<=C9~h5iek5ZPV-w?O#%9Lj z8OJl8z&MfdB*w{%uVb9SIEHZ^r+>3Du&SKFusOy5#vb4rHn^1-o*G?#^sDhF|K4B z#kiXBSjNX0n;17Rj%M7*csyf$Cz<~Vj17z@GLB$8iLr_Cb&TT~$1qN2JehGG<0*_w z7{@YR%Q%j48RKb;D;UQ!u3|ic@e#(e8P_tN!}vVo>ltf7GQa7J{TOF5HZaa&9Km=6 zV-sT?cR=D9doYgR_Ka`HiYuA7)LRVU_73&iE$?5M8-PqP-QUoU|htwHRDpoILAd?n;7Hl z8gZ2~_GMhjIGAxY<57%j8D}y+&lnS5@(Pyu^I+`9xHV$~V=u-LjJ+9~82d7gXB^Bp zneiybd5m>|GWin59*oyAZq2xiu@~bC#@>vp82d6l!Z?_5E#py)8yV|@WcvCpGXGwT zgBW`=HZt~Q9LYGCv6=BG#>tFz+@Z{4?8Uf*u{YzjjDs1MF&@RZlCjPp<*jDy#rQa5 zZ^jKOJmW?czPAjo@5=dQ9K_h0v61m8#*vJ5Mj76$!ZS`(;TdNr{{y7|BITcPsq)Ww zlky)S{g*5Mj4PFY#?{LIFzNre^3S+I`Dfgy{6|Xv`ff7+-i(77>qbkyQSli^D!xhb z&5F-BQQ--apP{f>;v$7(B`#GsUgAxRJ(fva&N!HHC1W{DpkdTZvjDV?Y!OtAOU*oT zm8;8`Phmc->(fQ6`;yY^1L1r@X&(_?^Tp^K<0tknXHhh8r9awVK^KjS>7wy3T{#?Y z4&yw=dF-Ed-Oxod5OmSL8@lp&jGV76V!T*T+L=Qa?XIDVW>Dy|B1d%5tN~s5_WVe> zvcxP1?OT(0KFhh7^OwPM1s06d=}KpLvRMubG(cA-hofCJbY*aO+Q&s#Ci~Ci`0}w^ zg|0%5w}8{n<9HTuI<&ikE}9{sD^tt@(f&H656RDF_XV6k(sL&K)4mq+NqbO8Q&b9GCzbL;deX3{SK*~SWH^M4?s&^!h@=x`T^r!Mq^)MXTRPpCS%fwgupn4e& zX}MV=b&4;+9v{_Hl264)^_B9+W&zSrdb6C$i}W>4?6)KpP<^KKlzwTi85u9=rKj>o^*$WF)i{>wKjn|7U*UVHz}Mq{EKmX0J8Bos^@iF zk-u=%B318-gkBtYsR-}D)UKTUQ~L@>EmirFyVoY!%Z=I_rI#JyQFmc{x?jshtv5?Sk4XVU<3$TPhba&+Aa5pL|}M?d?hGDcUZ#)Kj$GZb>~k?6}m^czgTH7xhHu(^(EF zzayVYu6Wk4lq=TWZlqi@?Q%-FVx8om`sPSi%5|MxZY7tpkJ8?bbCNR~eFsO&mFZ8g z*B_bwRJ$Ee={xKprSGV3GX3#(dneO($V+>MsrE+Wzq5VI#}k+2P$etnm}-|(>OaO_ z4`n*>cD_t!Dwi(VZK`K2r$ZJ%)livEg1!F8bR6wTrZd5wf9H6cmut4L1kL52hL$8R z8Si8#OnR7Y&kyCFTvW}Fa?Q2#W%%)SJEHWgo~sm|N}_pqWksl8Mci@ra#i|M_Ex4h z*`817Kfzv)r2lApxk~@BPV!Lv*Nb%)%CYpXTAONbQ=ItZKiQSQg1PRL8fAMKQX z;?J_T3&|hn5i;D(Ue5eH#;-C~>waoou$1|#-Kcdx5B9%_ z`Kn)2&iF3ot93z7#+A%h_F1hHs&&L_=0DEnEIXCG%}6Jo5)Lu4aA_;}Ygy%lJ6+S28wn`t2F3b>*>)8`%FU#*K_;s_-2D z5XSl;vV4mfALsb{Fvb_L#J;x$jE^wCH)A97<*XUj{TScNd_AYvpRt+w*^Cnz-^N(2 zqmN;n!TdWJmvVfg7#A`BcE%CRk5K-Z|0v^4jOA<{*5w%&GQX1XEXHPknSX!A)y#j8 z@o~lpj2jqlWE}4=!v`>KWd1#jlUd#ojP*mM|63R*a`-^TLCl}6!ZW`EVLPsR<*Ph;H3csFDHFe%?Y#zBlL7#kT^GLB??kg=KZ zdyGpt{b0t4%%8_t&Eub9oWcCJ7?&`9lkq0TPcyDy{1D@{oL(2k)y&___&DPm8Jh!S zeupw{VE$6Z70fp=Ze;#y#(B(-WUL=9<11lY#Qc$rgP6a9@g|nHD`O+`Z(rmm4Ud1oh zU)1Uxt;f*31HGRuFF7BTf*9zXVMjc2orXsJ@}l)SIwwH2OOhoVT2^|J>o#ea<(8M6 zC!_eBv14Dak6uZ07sl6V``4*~e%0KC! z-tKnBsVKAN*p=TrJiXKH>|gH9CKs8Wqr4?vU@t$3Gwk(7;%vNY?i^o^z5FC!tv0Io z^PKca`H_3e9qH%U>#Yn=v*OP27rO8lJH~t24@=xm?6pOs%I+WF}Pq}WWR+(v? znbzsl>Z)9KCVi{;Mki_&~rAPCxS@!xU`PpJGJo%98AP)KDI*p@U%5_V} zzIVC)=a{X+9U0-s&E7RUS<8ob5t)kOwolLUUFSn?KY76 z51i|dTqjby5{OUfJNu{j9ri%3<2mG!>&$8w1D$(A^_||Jke9@2cLP2=&Ff^!VkoRy zyuzwQ%5`eBD?;vzkf$!l_~kmELms(~<7ht;JMtqj{a4{>{Zs9(Q0vNcQi$Tq^#c_H z&F9lINyVVnN1XYzUgFFrjVg)MdV&MfIy#+_q0&?Bhn{M*he2}W`o^E1htfSCdT+_U zba#G!%Jn>zI^~z@tCE&5t@qL?8A=|Kfqcj(w_K-n=v$sJjh*_ zq=j){*@6^S;U&(n%Of$J2qG_u^X>LQ;sX2gQ?BDwl zm-2~jV$aQ;`u3YfV^)*f1FiS2n%%qWzkYjXL3VZi7unC9wdp9p-uKh`J)U|X=*b`Y z+O}xHOW6h%3li%9+S!_U-+A&Mw=xq0e(M{*-9&m!BnUIkd+z_lswqnfIRW1kaxr zbbRCJj2B-0J@lUYk~f4=`dSa))vtGY^4=F_Z`*QRs}V0vxv@6sixThcSI(P0y|?^G zNpNPbRIJ}b#twP#y*amiG;VUerRTO!$M}tY)ArNX>k2x|t!ndhw{uyahWQ=)2C@0w z(ftO?v>a>L%|TsH#(VT1_T`}O`^Bd|v}pg+9Zyfb*Emq$DK{r3IHxmd+cc!F={b*h zTlY&J9o-Q6`r#YqKR9sIKkoNU z`6ExiI0oS~)8r%PE}k##b?ZCX-if&$d&cj(F}%^NZ~uMQxn;i@&tE(|_NjrL%NBk7 z#$6Mv%XK-I{2rYhTwM6%eVSJH(yq~kr7PEW9D6wP+8wLDy6Z9hq={2Ae4qaO^1AiC zPXwIHi0C(A$3x#ouXttO0k^~p(=$GOywBq0_biG-4NCj{o7=AcvE6fXHniVaqRrnK zYWSe$olll$kA14^)K?FGmG|gpW1>608h7BxqD=wypRB#sH0|WrXD;O~ncDZ87rd#K z`3;`+j8{#f@6!kST4vvMTi1nqFWyzSxM9M853VbVe#}$9KdRMhWewFId^@Y^x4M@m z=zgfU#n3yykL~D+OO^G{dv<7TN*T3u+Ko@XKQ#K}wCwD5J$@WI`|H^Od;4tsJ zoaa-{ZC};%hcADB{FVA2>N@@S=KP^0r8};P8c?}s-B-_c)~8+kFm7Sf@U{zQF9_WA zx#_^Du%e8Ihh%>G&I>=kVNL6c{M27eD*63|qqDv%H%xxGan8nPystd3yZPw>ldTWz z=^onk?f16Vd~|&Adn1ne&iZWq+DG5pTz+s$pPg zxHXsdKf2B*|Al2uo_BE3x_toz9QQ#(Jay%Tb>Dzm)Af1?WdzIZOu(tGJV*ZcN^yR|0?mT(H|r> zP3qZU*_`sZh2Qp_xnN1B)K|Ybo8*1@lyzjo(BWmC<#+8G{LA=uAw51HfBo?Xf9~?k zL2-j+JZJ)I&AxR=gwc+J{Xz5?yZ=! zhc@<4dSGm1yI)>jX9&Ee=;(=YNB4f!GpfU!6ECbz`ugW3YYu$-#0@hBxsRFl?Kp45 ztNDF-afa8#8|%jHcz)opm!HUe;_%p>SCJ{=LO^XFfAV&F@G@!RitX5^W1!yeqY?ZgS)m195El(-d_T?5f|4?hxr z;khr~8}Qti$ZMv)n}1|M_L)}Y4^MCW(f#em>t>W)+sp5hZTWXhc-`?4`5$Vxb=dk%;i*GEh7P)Y1?i@~ z(~`8`e?GQo%;K`sg94Y&kG(i_;DySc?rqa9z`7wezr0=FWK)1{w0G&ELp{Quy5@)d zpRL|8`1Ntov6nv1@?2A0sq;L!?7NLK-nQ&Z*?#=9yS_Rzw9=Ase#4ua4+SjzXzxAY zqQdwEG>lmK?qi`HFM5xS`RRkFpIY)nuia0syy5XfgKU1oZ=LYy?#h6-%HxK_?tgCR zV{g26<=MqUdc+PKayTGr$GR(dBR-w?`W+hs$6XFSG^z2+$Zu-yYHjUw)GheRg`H8) zKeKCJ?)UnxyX8aFwEZp9icgm`4jA)E-J(r{zWvB6b-L}#&gCymx<2gV_rGupyYl6v z_wVT)(C@jLUaxk3-Q(^4hg!XQ;OvXneKE!B(F1N@ymRmLZw8ml-gj?#;-F#Ux_hh% z{CdxofIpf%+ZCrSxIE&c`HSQ0cBQm}-YgXhg1vP$Rdt?6M&4lI7$V zsbOz;^xg3AM|qY9`hZtRoVNy zR_o`V&57xp`}sZV3s)B0G-7kkJA+?cJK~*j#_D^EpYQ!uTPmcq=)IduKYD1u_)mks zEqQ$4m|rr-6vwO_zwO)N$=_V=xjFCS+8;hR;Q7gu_q>^oH7f=@_Un@c?_Jur@!PHoBkPl%ePqo~t$#aL z`q8s{uaA2F&CY+ z(|6gx&(;){tt}Z9@XF`mYt0{I-{Mi<`=NM|ruyfGqI5?;$iqw1d9=}Vp8lGyRgmV^ zs=Maax{v0j57*rF!!>uWD9zp5ta*6P&^&x@)I5Bxnx}7}=GkVY=Gk_w=GktG)~em} zS}VWZTC4USXsz4VYOVc$)LI94>hu9YI(>(5oxbCEoma=XI z{@`A8;s?>`bmRvpo%SK!xt|8EyvnQY6U$PYR&EhAvEW~VMtHv<=qJ%H3tDsj6+yG_ ze@)QV{dNm_%O_PtOJ+Rqmcad|zAb1((>sE$dgeXBzkbGkf%pG(K;U2RJ0x)He(wt! zwCe++RlT1$BKY$b92Gb^v_{~Q4T73tpFSqs*H}Ij?#~5(BtB%~O_9X~f_RV90nvxo%d&Jr z7PR(sm7s=CTAvc}8{-76s$DN=vfHPE*522xUc|e`BB-hHNkO&a-wJ975Bpm1FJ%g9 zGCe0~ncMe*){YzajYyZ$R@di06)!6Z84*>zz-`ms{EVo_-Ywm7!@D;{Jv8W0!T`6# zsEC>V*Dl?c619F=zV*3zmZ;Nry!7J2K2xI}U%GVH8>?@K`r@g%5B3_C8?{7t%zU|Z zPSh_KAG+?ukj$vYu0LL^56z02+vSA0`cA*7i0H*TW?zhr+BEc)KL(YhMlJTrEPeVL z3&)cgHDlHjtM8kW8TH4m7Zz2Iv_z%7uWNnmqx7h8J&wNg#<$r~X&vJ>-J6#kHDb_v zrzcuxMSXTdL%=U54N<@J?zf}%)zMM!O)`G%@oa9??s0EFANcT1QGFN1xi{RH8Fg&# zOLcShW=Eww^6^41&rwld#=iDj#~$;duDjtIWqvFl?#OOC)AGIWD(u>!9lO5IV z&R=it@~<1Ck~db|nXxb`D(#1gGlg1i)We&8U+Ld^XjIMa3;V{OO^&*K-pl7&y^s`@ zk@WJIZ!W||J+&zK_wgGiMLjqt&UB({R@6-?pLuWJV2V0->hgoJ;W<&m?%Q_yql+m~ zyXPIs*}oty>iTnIj+pXtqDFkRa@?NX3!=sroeh3*RZ3Lk&$dq8R$U*pZfD4DziFva z>(6#PR`*DD)VQ~|bq<@I8WpQI|NPv^gs7$atLJ@vcRcGMB5F@Rx7VX8vZFRtJW_GP ztCpyqCw4v4F*hbErEBykl3&n?y z1Q+Kn=FnG=h(9045g9Bw21_11rXdWShGJcuK2Z2{_!D11nQzO@Mu;pitHm?-u#s&(qgxhaNJ1ff$P4fBOCB0h4*`ANC9Y{^{~ynZOXEZ}}zlJr|%_`*_wEjP=MVaZ9$!l!av^XVwR1?dGSK72AK zH8(BYkUQUyr_LUymLw24J|IQLW53|aDsHyaDW=`Xo|!)JsYY9<8?A9Qve`^6!vWohk}x(sBz?dBYbK=Hk0H^pT4PO^iYt^Jf`{AWXM#jIyiZe`6m+!SEmK4kr~EhwY{&o>y;7sFCn=Nr;dEdmec6TzGBZ{v^ETftSZTIEgD#r+)pHX`Wmsca62GMxH0<>TbvXPsw9X z;Q#JN`7JHy>pzWk#>@#b$9}!}?#xL$;vVhNB_aRCBkz(5#$P*cR(`rIf8J~yU0gg5 zM;X)CvhwHUTj}#zN$NQ}FM7t*5yR%qz()`9y{>r$BZh@rY}o_z(o$HUW1w`?RfGGw z@d>dwL{ZaY+&2)PKBL)aJvLwHpVCR(J3EK``t8$cbk>IO(;KUvM|4^h>d-(OeO6%U zJ)HcYEOCw=+#(`U=P%H-YK6zoNa&q7KAQX-ad9KZh?Cf!6DLCxIaMH&XUK^+`6K9RykH20TC9wVE(iTF&-+!925 z=H_m~Up(9@pu&MTD6YVQ$j}ahFwT>>_tK?H(^8;5EohpX)TgZ=wRcRkl&_iF^&&o_ zvs;4n7Xdes4+@(g{h7!g8vno|nXY-B8_p^PmSs2uKear#3EfGzq2yKyH>a{5MsD<- z`q`M5;IJdeP0K@?=;aOMY~kD6nh_hJ2Bz>iab<{`($8ZL6>eHQ)gfEHEwy*VV2UFC zB{!{ly4_94MDG9e>Yyd}tXpyF)TtvY!|GSizf-5WX=P#LcGRPq93_F5V6CEa9q3*4 zRVBK+>QCjpq0=gxnwp&4P0sEkwFtku>f5W`?vQ?~;rDqI(@D2+RjVl0zV)ZR1Fkbw z73`PrR4dJ-_tZ>UeZBZ@hQ98$daOg4{ETp`Tk)X|;+@LS;{E0kzU|1$-f#%QG&|Iy zRU!8cC;@7FL=Dh<1a5`B5jU1cv=s<5Ov|IVMOYo&s?j2EN2x?2EKwgPzg_UVlSse* zR6qRgDSr2??}6VP`1e39UN2<4qh~$ILvb!MVgDfRG{i}C9Q==jJ7uFaetT*--Ll?| z=4|!Iu7CbT@JrQ>RQ!~?0%@hgw-4FQg zU%g*neP^}DxYqT}0PX#W2&&s(y1x~b;VM~%;YSJFvwkww^&`#e`luG% zzJzRLNYmBt=ob8@Xz@W1SF4jHfEIVk-sV!lgJ>=C+KamFD4XN6FpZ46mhK$ z-{`@|`wbI%t!~!7d;d$*-o|ZYf3^7C=!9<*^;Oi?X1em!40h5spgtT?!9emH|U9<=G<653&@1efqR&luU z8^F8h#BZbd+4G_F(|8z}dtcf#qUbB@>ri^4Alg}&z&-0b zxX5J06T(b4rx)PD$1&a7|7q__0HUh)|IZyT(JZm$g|;wSDrw4ST39L|U_hedPAi~* zP>Lg<;>%<#D=IU5uUA-_!#?a-YP3o_l_lCnK1)n3EK4diD)an5pELKuh+tOl{eRm# zdic)0_blK2e9tm>e2|Uj7qxqC#j}-e&wblHx1;SkxAxP3TNrV<&!vO@`Z$0+EHyq1 z(&0!Q4p+VrqJ{TJW>;dyY@C*JP{Br3Dd<*>hiT%y!Ko^(#Ya++eCO7~h5?Z9YF}66iq= z(CO*Ow&JH~*qqQrv|i?M@Vh^8xaUNhHbDmE(=>7ObWLRFWe?)Bn9+89UOWBUh<59d z4gJO0O~hMm_(jju#0SWR&+p8a?23a-W@)WHV(TgRFhc8`M-w~IhY3oLP8_#mPSM9z z(4QVkb|>nObq;ue?9lmxaR#xWYm8k7S!Sy`uCe1e$iG}&x5@uD+#9d%wdo0bhqpKH z>AE_{(`x4X?>f_iUqnzZ&S89!dGh3YWVkhS1(MYEa_BX-($0O&ba;j(Y< zVCdUGmW6NN9H0q0_=>QaF@$znKUG-Nm|>Kki1G**#hzW=+^pMW%ZxF5Q(u<1=}W`& zm`|fG@umwhKIhySDClzrcsxuRaNiqq2(eE)$SDMVuQ13PQ$-DPj(y{BgJT!(&(`5# z9dgcQB=0zU#(domb2cMcanG@XBW}lu^E;*+b(pHdl{$3laI+5I(_y0yn|0VD*40iw z9S+xFxDIdB;cYs+ONZGybm*`~hg)^HQ-=q2__GdICAj)qrbC+!<8?Sqhc}ZaNQ-p1 zQipjud_jjhbl9vz&snZ|=jgDX4u|S+v<@S6I8BFhb+|%@c{+Sfhg)^npu>GSY|&wl z*{**3=+L6WaXOr)!z3O4RfiAg@KGJ+>F{kGex$>FI{aRT$8>mhysKZc4lOzyr^AUl zoTbB59j?&fDjhzq!y+BNpu>-J*sR0ux_mCup+$$|b*O}fKbPq87^=fi9U9N;P58mD zsaz6YXp6vp&P;K@6F)o_GCw74{@jF+^whcGuAL1rvI}K~luC8%HAZp><^yG0%((%)0Gn3;JLXzTA zMTs_E5fp`AfsLEPdU32bAucUFjGJ>q*(v^j3Vk@j7H-YATk*Lz7dn28k7HwElqz;ci+&EBe8B2e{_`Q?yNb37t~ZnM92E z>vPkV*b>ATUa>+5_L1~LLR=p=u#CP)v1lqb zk7kNV8h#)S|07UhYWRei!PW>>J=7&nYeK3LcFOF8kogN!u(2Wfuy36zz3Yg0af#dA zX-V8)#7%L4cc(5%!_O>COP-eyoTeziCo#*T?N{ukPDoBm4@VV|LXJ&ONmA+-AC@s2 zztDh9N7Q1^8EnlZV;9GP^A67`>2s&2U}FQt#W2=)liOOY?Kk+IR}%A$e9Re-UGGdrpOAfLE2g z%SM9Z<5Sfy9yheJxnOZAIY>0D^OMO45Fw7cN-1vu_5;H?3R~Slpyf~xh|lKwvBPln zSus=G+BtWEQ{t!El2epci6^^EYyGW62S2yUDVJBRa$3(T)%1%V6XwUkPbhj7bx)r7 zJB+}p%ws~^FCgOjW76;XJw#d&?kv{ELvfT1i#yfl@yYm2Gt#fxT&3cl_?eN9sZ= z4LFr6Np|$;Jj%xH!Hl@nWNw znE8KG`mJ9xGqp<|diuRQpgu7f_3Wa1cdi{9>8YPw`?Bt3_^kS{>%O5E2IMpM&%8cW z@=7-aovQqQ_4D?)TbFc!ed95H3R-4Y(24Rd=kLrnyB?qPclmMGtsot4I?eLI zdil*Lzb$WHULUbPuPN`Q&f8y>t7=T{BE;mKx9&8Hn4P!n9DZ{7_ZvQI{0ZmZm$@)& z(*1Ui2VDO3&%#VS9n{T1<(!{0BG)m`hY%{00KW7;4NaWRu4Fh z_+qi1_Z@(|FU;5v#&r_l3cz~6`$eKD8V+c(DZ#^esSsyr2_7|KnH)dKH^jnkq5 z*Fg@;!eO?z@?}kehuFNvQMklA@^W&P0618M$H(M6G1}sXFb3y zly3qgz9QHK0|0wKjy!yJzP3-ZjT88$e4N$O zS8FnPPv&>%_h~hN=S@LBQ~2(lIIRKjACQ|3hdIJ=zX@=O*rVB|K@V_kn+{T^LXLpv z0rCaByKp~iCeA(p`rIHyA@rtJhfTK#Q38CjZxv#b_|g;})H3rq8veEEn{8P>2uFPb1*#Vz$Y-l6WSXnpQzSOkbKTt4YT!tqJgDwB!7n z5JvzVeEgGZ`p+FTBplSS^#@YGYRi9W$&gWz{_x54;Y2^%;jho{voyk z{ss5BDR%{*19pS`M?Xz_g?z5A<$ud z)5Qlnp!amxEuaO^yH1D~=@;LEAENx;QGP^o00xU#Qw!h_wClIk9}s;wa1qp89T5Ne#Vy`b)UHG-ft)L3H7Wx z%m7@9^4b5SzRotq?h@iV_#f+M=-+g}!`2A70B`H(;1|ke?S+1O9`Fok65>}e=Zt^@ zF1qYrfvTjQ(wBvR<54t3&S|npofg{`S=1 zulAdwy)_Y!a@pr-@P~;W;pb`MVr`B`()l=tf%}%f;2Z&<-vyc&W{NjO_r`ftTqj+q zDY?`F9s$2ej z4flga0Dr)0oTIS-X5cIh^`!~0FYxoa8s|80KWCJN@oujv>sn3p*Ah(Cqc!D6>|-?H z;PW8h16UUVd;qIMHPHa*4AY>`v6}aI@E`s(=sFF0H%qGroD8{`!`V)p77zisqkQxA zxR3VjQJRW7yl@uA^9JArNPpH0mapHb6U@rW5b~N~SBlPnYv;&xPt0sZ~>tb*| z2QWMibfSFhEKM{6HYT{_8IY*KF7}$50c|Wl2YdmnzD*MafPV8d@d^B+NP#>(51ipl zRr+A^N+Z2{G%H{o%C)3Z??B%|LX3lp$d`Ru%VOYl6ZHNLO&mnItcM_XK+7sk#Zlpa z=WDY~u@AdoMmF);qghsiUhu#AZ!TzgM8i0lXlenx0`1vzDBmwVeAZ|x&Zq$l$Nlgf}QPe#T{lk5pTN#CGo+ZBm@g~oSM+5R~cR3)>j^-f#<2gmb za=_7uFB$xT;Cqh3!KIge8Ui0iHA5u^Nb-O&m;0a&!zF2=eY=ZW{Z&L zv4{`P9pylNJRj2neE)AIPvHT=E%>hb*?<{<-hkPFK7a_F>;P`5D@F^T!kILEm5}+A9Zj)5%=vK+-JWq6+3`i;$6hSE^yNQ z+D`7*cXGe6ll#q`+!rUQjjNz{C-=>r+_!XapTEN#g!}xyN|W33fK9LoH+*6@!`FMY zk?yqxzJfx~lkGJ;?{8dT`u!EIDP%p>{*3Yzo}T<9u8j-8Y+QR$$a=~#dBC3;S3-Ti z$BfG$WQ-X2+j$x~bf~!Qy6eQunKMOla{nhCT>Ij>RPp*m^c^rQ6`h^AH#Ddlu_kbpK0!oxITvdx4ogR(Fxn%&Hh#T z5&cW~;5Oig))Etm-?42!?Z(wn7Et)#b?kwy$F?428@xU~<>m+!I5rpUQWr@t<7xoum{?4T+=Ok;IoFTRHGBf=Pc)5kL`4nGjU(q zg@){b+!eVevaj?Lm>(gVk$+3iM~oODqN1Y2)TvVizHFy(gMup^&(6*krKP1}iaM=qEo<)#?9?EZmUZkiq=GG+dj zP1D)lv#Z#Crj+0O_+zzDT6~8P%Y1#McUNC2JoF6O!McvKQHJH2d%E~U9t9~rxj80W zw@>~1_ZNc)4;B`SMT{9UMg#{3i-?E_#kl--n|R~l>qUM3?ZWRRDXw@$ieYa^5%`)EBj1){^m|g={H_!sA4qZiPAMku zmLd&#`sY&I^raND8>N_aP>SWtmy7%FzhA6gy;?l>*kfYNnl)nW+O@*raEQXfLM7ko z>T0oR(#x5q-g@gT@$S3titXFCiw{2dKKf4)vD$fyPY9_shAV*IyZZl8^>iB@AS zi~4h#5evv(;sMlOi~5zQUyJ%XP=B9W{Q;;SWW^a?8|LoWLaeIB+7s%((k#Sw)Nerj z&rp9a>K{P;L#Th$t-k*NjBmlv^_wuxV7;q)74~XM5Kp`cBizwT$cAA;emYsmeG7#A zYPFEf8-zT%y%m4|^H9GZ>RV8MEb2$0KH6$dM*StdgnVF_kn1K3S+zjOmsg|B4MOhU z-c}#u8h=0Cb_VKqL;dck5C7AQU`U$J5pwJ>A#a{6aZzX0{0M*Wvi|4r0KpR0GF{(jVNZmoX>-g0q0T1Z9<_o0PCwD1~Q*n<|D zdr9&AFewgCmg49FDSlin#ZMcg_+`6nt$!iv^Ec80QGW{R&qn=4sGo)UYkEmhG)#(( zlcjiNffU-UkW56*nVVW zL||mh#pm|+!E+Sw(+doULH)pBHV_gSbK$w?_I5p2I9}Gz3?w63+mAW_ymQaJevE2h zu%faro&*0-)(?)v^YhNV_<9|;34@3N>c<2IM@@{342z8E!v=c$TyVi(di3aV(FEei z=NO`pBJuo$0x@I*pNE7+MMOqMg+=+EPyo*d4pQxpiwcbliwcbze@UP7^)Apu%;kPV zCV+mnAELT2xE3?o2Pp6g{8Q}@yEY0ejtYy6QbZ^m4gLfFn9yNCL?JRNDyGl)@#mg< zE{JG-9&^GRa9O)URRI6Yl4G^ zd-UvL35JP}Ph)}pI{dvqNfA4N*Xj-puU`Q0B zA_JjFZO?6^O%@%!IQ2%yK9%L&_hTJTaO5B>pv!h zdN=9XvrJus_&g*K>WbYIJyE_f(13`bGkcvqDJCQ;@LK4a@s#{EQn+`oQBlF*V}#pd z@;_9S!2PSQ47nDj;{F)Vp+9Ip6p9!THu9QwkKNjbpd*5>Ik7hE8DjZ_}p{P3C0Q^))tE=5N}i?R(S2T*Tj48y{BS>eV^|ZpMU;2zU#kFeEs#;;^4u9 z;`{Foso3Dikt5>QUw;*=f0SYaVukI$xcOQCz8L7P#y|(V%$|*bZV3juhcVCsFeURQ7a?c>wm-`{@_KbiaV@#)id zkgxaIXJ3MNxOYFl{{08`_wVK1^YXKB-KX!R0|%mPFK=J}!Ty8AMg0c(`Cr`KzZVLe zeb!l*T-3L}pZ}TN{VvgOn9Y8J{Jp$-_@U0_=bU|3AD;^b`Jd_K)xBGnEneA(c^eFrQ0EIq-h`Vhi%5sRz|GyeXmWI}C3>;e&cYwm*2?D_vk>WunR^-X-wL_Xiw*S9Yq z^JT~bx^?S@8IXWyAg2&QW6KZuEM$Y@`1mhLn{Pg-Y1-h?qenyY6-^j4R6Cem zDY^X~{!!K(n9mt7V8Eq-0Jv(;nc=F|!U(OsiZrqhmWwp{e7sje#3?hcRusXGj}5F3%mR7yC>Of zw$N3pR#_2O6SvEe2VZc(1y^EihC!Z)hAs>Z1Wz*Q$DF6A-f2wQJWMsrV>N9li@OR&R*8;u! z1#LF{{PWN9`|rR1;lmF z6C)FU@`}*-%xh+Y4npE%WZ*1~44F$K8}|(ONAQ33)mK+Sj{Tq$D@e;Lue_pYpnhPz zNm2$_XHxn?9BC7ec5G~jYJH;3jR_;9*PF~9Lj)vB|Ve{apz~s|Fh3NQ<%0ZxEz>8A$drrz#yRbKK z?AY4VK^|ok{_yqE$i&~shAa&DN9=@lKz*6{nUvQxNEz}W_)i)jgR9<=ayV#6`55~h z$FSbLT}sPKO0BT6cv`79)=8<$E3drr%6`y=6{G`lQ1lpd5R#YFBl5o^I>>kOoHC-` zQ2*(7F=tZICDZK4MsNT=tw38E$(#u^2;xB z`?Kq0;nGO?_<}(B==>ms*o|LEIeo8`lN+UsA`PGD_6(gFZP+t?66~2iX#nhi_B;go zM4LX2eYOs0Q20aME3tOb4}N_GX`w$PG-x2C-czsJ(_!crb)CAjd+SD7ym++CUpPiS znKo9@Kmu+#Amt4@4c6UKP5@5fprO^CNrP_BL+O*?Q~Sdw^#u*SH7?(ZW|p_3LE+!8 zU%yuWk1?L({7Lel{c=1o`n0fRVgng4dB1|St%#MPa(b65&rP^O8;SNs~8W_<_tOv zS||gK2ktU4Xdxv2^pl&G2g}Mku9c;rp%66Wrn~S@J0xZ7*Px+E%9)^n_Dr7?37=%x zGifmFnKT&oOrPZUyuu%+3{ObCX=fZ?5NEY!(qQEFbQrecP6t1e2Bv2+N6Dv_UL!02 zdaW$U01b=A$Ro{P$&X>qq#*`0V2@4CbhBsrB-(Q@Y=J&006vN1v*D8lZjtg*7yj-2 zlENSH{mPLeNA^REvVwHbFA`E`NC#scLej!}9BYlZjL$gUGG<_U&OSI6i|0BgPo`lB@Cw+=u_CzcBRwnrp5ZKv@`>_DZ~o z8*w*iq3@@^=e&k~lVcUfHl~;E3Xso&hE2<^k=0ADmF1wJy*>W}K56y5V7c=4aWX48 zMBY6oL}tc^$_E$TC_nqSUXlj)7(>}Jd=gVf_`}~T{Rcj)h&%BjBu>Pe_CP)xGNF%m zkB=D-kw)tOt65{^i=d$fG;F*RG{6>U&!mC&OrNv{ew8$2lZM;I$@`K(Lt?0079XZ) zAfAjdI6fOO#z>5BNGIt(eFn#1#u3a;r&E@dl}W~>MmFR@cq%)=x~!~!GETmH_to-+ z<)8t!@HA+s((Rc(DR<#mxh{3A%&`T^M^b|1!*he>gP`GF&~O)MxDzxmwU04wg>4|6 zDA#%&z0rGj>p6QbedoF-aA`MUIH2e*EwCeU? zd4IBt1|q6r48+?Lkk`Rq9hdT*cDm2Y-jq4U-_YsAq?4taTba?+$p5@(C#Lk~S9v8N;- zdE^m=59jyfH)-Hlz;S|l#mqSjX`nx)9&#)sk6wE)RPHDy{zv881&i8Z4A=r=4B9h& z(&HIXME^JEUs(IQA6uczsXx&5)tL8>#5tI9*s#PinURqpVH1+q*I$3VihFP#M)^2W|M|{ldGyGU_aX1oUVp$@O1WaiiXU)BN#1qWT}N)b@kTj! z?p(!p%qx{Hkp|iY*L{c^>1a<2*C03!Q|}og(N?$~u?6!<-eZi!ae}mTkideUKBK&T z@A?nhg6%r6M!EZrJMK76JaKMRW!khs!=OQfB+jlWIdIIN&NKEg=peqtpE^%EIX57r zJvyB5j6#@jhcJ#@z5Ff5Y0-RXAt(Fy|0|1b^y1 zGj)mU&7_IAam^WL@09(9goMbTpdg9UDM}7}&N>DSgoa)jGBNCg_CeeYNIl}5fqKO_ zkg_w@H-JC4+j=0MPE!68bg#q~KtJ$s1?~C87hhB~kUv~EgncL);^N}ugb5RrZedSe z;ZI(Z=cI*r(+=o=c%O3w>JMY>EwBUH0BwTp(gy?g<7j7vkB?6fZz1re z-{d~w=_ZB0p{IoII!qdjOx#Epb%?fb-+lK<_$Z-#GkS; zVhHZ*Q17Wr8O~K-`V}5zLYBE#*IqyTYG+81r9@J*%jf9D_&)ZIFDT|Ddnqc;qe<@^dQ^|xh;Y_p| zuc%|JL)wThb!!WJCuuQoM|@iJ2ld^Bb=zOH{sa3`^IweLD@Y6ZPiW9VXwX4Op3=Y2 z7MLj;-lH7oJ87qs8GRA=61WFNTF7_w@kjhj8^$MoQurJCk62*<`NVuGnJ~U*{6o69 zFUL&XB7EbGHkg^wyk;57 zf;vw=lSb+~^yoNZgeJ&}<0{Ws{GPFi`2AKo2L*Tr;oq6r2hTq6oW`F{(vHDp%i_hy zL|1t{aPi_sd_Skz1@TE;|LdTK-kzpIeES9cA^k~cv}d&MhPR!~Uc^Q z)O6^f!>&5)sY72K2I??VhtdT#LOeg@ z_Sm=<%sqwS*xR`oYr`LXuTVM_4y5&>E?v4@jk(O@V5sr7950M+KKo) z59?&NAqEab`C-WY5N{lsgFO!JlW{FH22R}%;4XbkaJ`&TnDBoGS7(P57 zeYVhl(noT>L>!onJq$hOKMue81AOlL@SD%EVeXl7zmfY~++X3EIQNG>JS=5BXg`g; zUSIlYtSiJ}?P&&aVC=-XC&x$nb&f^!)r@5sr|=m+Gu?!}D(-o5uZ?>=Jiov_D(>%a z-=BMIOq~&r`@Wn5U=Ess`NC}+e>tvkp38n2N0TQy{VH~HwdnfG{jwXecFX-f?v-t9 zc7NL8XKrG->x1f_^FhW4%*272{+*dT;rR8<{++V;?ip%dg6rW-v%bN8*H^B6)2YCL z`@TE_!L@zv`5OAj{a)@fjt2bjM4j~In1cCh9OB#=#KXXa@@EW8TsZzbzh<6V)8?Kt z*W``K_o%qn$$i2bU?WI%x=egIj$_>=1>e8Bjbk&j zfdgX>@`SN<<+2d9*T?-Ct|KzBZ)Wbja{rine(w6nvn<@B;a(s2n5d6~UsP3(8vQd4 zGWHiat};$D;x_{q*5JA_*8=mgp2#18%Ng_qobNL}C*8z_JRsbWpRD!`xnIS- zTkaWh?|HqxUr3wa{s{L9?bxF-c)-rweKhxOky`biwuSHZrojK-Mq8xc;k!1ZbBBlqyRHf`7h_nElY$9=L)9S3%1-R;`PzZre+`jK~9eULBX zOX?u)kTE|Y@n9xDn287ZL^+%)z5hy;+B4-|-3s8q{nB>nB>%_$AAIn^xF?@{at8N? z7>^SV@|^Q(&Z)U>N<7F5`XfGL;{Gkq0T?#Xkv_7Vu4^3uU&h#2uSmgq%RKVo;fEhq zevf{a;~)J$b%Fe#F0yap!bF?+_VW+qH=ln5n`ozxunFoTQ%4;e`p@||*EzVROCEE6 z1zS|}E!rk=GUVef8_MGK)mGWO?*n;g??-L=2%F&kHTCg{WjC<<4#$7^R>s@D>>qm( zdjbO))h$+g(|D(XeBglx)clS((J#^thzEH<`H(k1H0_k{<=!rzy*pT)1u*n6Z^?N1 z)IV(U>wO4L+H~y%HjEuR_DZbxE+HM*$DBWF)~q-2{cU;s?YFCSV4RUuYZu1chdd`g z$bZi7s0-u=@o%5lCd%!AZn=-OC-lz??2Ao@-K%*Z$9nF|aBm55mc+SlMYl2kA|A}- z2k~ex8{)@ti@t;NQZ#=RGUK~bC11`#5r2Hey+rOy;CrT$>#xLN!GZ;f@AL;82idlv z1MG`_!LU_~6UVSGGY7hyh8XEMI^~(C-X5M*%o6v@|$b9)IqMLb6&Qm|Jc8c!}sWBuy3|WITHuGCqUx8 z0&?QSi3&I3z|1nV0hXiQFixVs;JHMsh3BGO&J|84DgR6VgLCw^vAx|`ljoREpToTc zyt6>e97 z)H%wFye8fB$yj?S`kj5N{@D+Fjq?8;;bFwU_|AdE_Z`(*G2=q6IZ+?~MBl1^(rb*r z)Fsl(Hks-3Xmhk}(n%fT`5m6U!1n@_fB1uRvu`F}(%+u%?);|=nCW}z`zU9;6N38p z4c5c%M;lx}`J;*7HSzv~nfCQt{;gBIj``v{yISk_b$#vN1+s=LP9w9NQO6fmm;-Uo z$eH-eEbSe5{A zF~795RNY4z&;0!S2&`wnR8di(K`t2Jy^8x?TT5fm}V`6&udh=Wm=p za{kJ>0_Q3g%$3#vFYdK+PEOpZ|LnJ9S%ivle!v{;3E<2&I2Y&Ki)#^__i^4CfO#j^ zs2NicZ~84J&S5x*dioy=B-?OLU&F<6O^53UoU@UCloQ7w#z9Qa-y5dlEzUnU_u$-z zu`cHuBPJi-}9E4nVIU02=~<}OX`cke^nTN>R+x_asQo|`{;?pZX*9ME-1gnJvp8qU|mD! zHY^(}ziND6@so3?dy-ZEhYkIq?$OuN?@*Tb?z-YBeKlqI*(-VSsk^RI=egHqTrb~# zu9)3#GV0^ID=Jo_|DxW|Z!_kiJm^o|ap7l<2-WhS%Zj6)cpW_kd32d8w z8DoE@dwu$8;>~u*3p`i$#4(%eNvz9xHpg!4#hg%=?JVnB9_)=QJoGF8JIh8HmS^tC zvKkgL&1P>vPxS^i4Zrm4y5jrS@CHUR%Xq1`uX*5^>x%DQ^TZpCcx6^^UhATl#1+b% zp_eqPx2|=?yVV%(%@9*X4E~1UJuFl4_LxaxBCaFwcRW5bz36!ev7x5^(IN2@VIUtO zdEy_?Iw9dL+qgGXq>EI1_c}$)L2JokF5bNtfvZF@AEn2sG8Pel<2KfX{PONpi*po{)+;pgJ98PQGVG zFdc#~R+=G&)8|)!!fle?HYG>g4B7F@C584l1|cNS@IIbY;1&-q%?4JdFEdVj$j1}w zx94U@yyW7x2JMYQ&jyxl8pcIO!hTkq6 zGjP~Y%RqBN%Ix{^`0>aw1E)_LKO|tFIV~MOau_#veoDfaflCt71_q8jtNZAbWj|F9HPaGiFT^hpF43=XCpBTgLiCalZ%s{J zgr9qxlaSW>(EV{(2CDKW8z&?zN|Z01B`l7}nyo9FMyVzW8DGn;O7RMIbitWYO#g5|Y;@aZ+;>P0U zVho&4v(w@Xa$23SPMg#2%yv4Q)y`UHy|dBT>=Y&5CFT-KNl=NkB(}s>VlT-qag4l}VMh%8W{TWmaW&Wlp7|(pgzuSyNeCSyx$K*-+V7*;LtF z*-|O0ysEsbe5%Y<`g;$ zYYOWM8w#5WTME63e2V;v0*bGK#W_a*CWqHAQtr4Mj~wEk$0%KE-~;0mb3P z(Zxx{8O2$}ImOQ6n&P_RhT^8;mSQibkJHZ?;0$+0JCmFl&MapRCS5hoI%k8k$=Txc zD)A}tD+wqGFNrQmD#<9xD#?U)(1Pf)q_T{%tg@UkXITy8+W^_NlzBm_evoK*d31SFc}96wc@AV-1C42b zwzQOcK~MakBjM1GBuFp|(sM#`b&y(9MN5SjRZ~?9WrG(FX90LQd>np`07tkZ+L7eQaAY}h98O1# zqt4ObXmYeTymEbV{c;0x!*io^lX5e1vvPBCow>EppGKuS-q0HhbjAvOu|Zd|p(oYQ zk$UJyGjzindSQW1SgT^IY*qHE>?%i9byaOueN|&sGx0D359o++cstAvizCQkb;LSs z4!a{8)8}eOt)t%2=xBC`T<=_St|d1p*P0ufYsvJ1(n{!2;cb+-V zk{6U`&5O;m<=OMH^Bj5AdA0CejqqI}-y5FGk{<-m75l&5Z`t6dvf-nu;i2l`otjHU znRl5PzA328S{7SoE3=nnmpRI+%WC0q8sTmD0%=S+L<7oJm*ImA?@Px# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe b/env/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..e8bebdba6d8f242244bf397ab067965d47c5093e GIT binary patch literal 108032 zcmeFadw5jU)%ZWjWXKQ_P7p@IO-Bic#!G0tBo5RJ%;*`JC{}2xf}+8Qib}(bU_}i* zNt@v~ed)#4zP;$%+PC)dzP-K@u*HN(5-vi(8(ykWyqs}B0W}HN^ZTrQW|Da6`@GNh z?;nrOIeVXdS$plZ*IsMwwRUQ*Tjz4ST&_I+w{4fJg{Suk zDk#k~{i~yk?|JX1Bd28lkG=4tDesa#KJ3?1I@I&=Dc@7ibyGgz`N6)QPkD>ydq35t zw5a^YGUb1mdHz5>zj9mcQfc#FjbLurNVL)nYxs88p%GSZYD=wU2mVCNzLw{@99Q)S$;kf8bu9yca(9kvVm9ml^vrR!I-q`G>GNZ^tcvmFj1Tw`fDZD% z5W|pvewS(+{hSy`MGklppb3cC_!< z@h|$MW%{fb(kD6pOP~L^oj#w3zJ~Vs2kG-#R!FALiJ3n2#KKaqo`{tee@!>``%TYZ zAvWDSs+)%@UX7YtqsdvvwN2d-bF206snTti-qaeKWO__hZf7u%6VXC1N9?vp8HGbt z$J5=q87r;S&34^f$e4|1{5Q7m80e=&PpmHW&kxQE&JTVy_%+?!PrubsGZjsG&H_mA zQ+};HYAVAOZ$}fiR9ee5mn&%QXlmtKAw{$wwpraLZCf`f17340_E;ehEotl68O}?z z_Fyo%={Uuj?4YI}4_CCBFIkf)7FE?&m*#BB1OGwurHJ`#$n3Cu6PQBtS>5cm-c_yd zm7$&vBt6p082K;-_NUj{k+KuI`&jBbOy5(mhdgt;_4`wte(4luajXgG4i5JF>$9DH zLuPx#d`UNVTE7`D<#$S>tLTmKF}kZpFmlFe?$sV{v-Y20jP$OX&jnkAUs(V7XVtyb zD?14U)*?`&hGB*eDs)t|y2JbRvVO)oJ=15@?4VCZW>wIq(@~Mrk@WIydI@Ul!>+o3 z=M=Kzo*MI=be*)8{ISB{9>(!J__N-a=8R&n#W%-gTYRcuDCpB^^s3~-GP@@5&-(G& zdQS_V>w;D8SV2wM8)U9HoOaik`_z>Ep^Rpe3rnjb<}(rV`tpdmg4g@>h`BF#WAKLH zqTs?sEDwi<=6_WPwY&oS9!h@ge4(br)-Q{|OY*#YAspuHyx;~|kASS3FIH@oGSl?L zvQoe8yKukD)zqprHiFKlW%;G=hwx4l;FI%8m&(#zU|j&_bW@ThNpr9D0V}xa)%aIb zI$i2CA2mPU{0nJmK0dxe)dY-`z>ln($ z;r!UXuLDDi42|Zd3Erx&m8GqlFWbIX0V<*Gn6lVNq%gD>gw}da}r}ZQB~ns?p8uy4i0%1Ti$Vt|~OUth4=+yEmPu8{3(w zUDkd@?w?`_J9HBkx&ZF8v{+9phcT@3J8VI~wN7Ez)oJS6^dhb2N;;{RTXB`K*E$64 z3rDqRtY&&*}9yq2oUcvD7K)=@bWqC1X%l0jk)W<5-WBYC(#rn4H5)gp#eHMmwlLJq=^%|*gMQ*pq4VV(QhHA4CGj<;!d8i*#Z8CaN#*>VcCnj~;kkeUa{LUoKxFCaoQ) z(Lz++&x3Lwz;=6UnhwM!MvN17>{Qmb?dwgsTmzkLB~jD#wiGz73hc0bFE|C9KA#|= zH}%FQ>c&Y5z*TJD-<$$Y*WZx>5NNe-E-TfAt1!)%Wc@I;ZuNwxDGGasDIMyUNiVvG zq;Q70PYHcLO=Xgv2698@cJrkun-^>P2}|fMHlm7xaZmE<{&cQtb`{N9zj0bRmpW^T zzQV7oTs0ENHe&mxQ6DI7qd0SU4;3o*2qRd`X1>(=ew})X5Dx zx$lyzZM^emtdsbk^u+xwdSX$lp7h*2CkHCqDohShL)V4hM9k+UQLP(GN-H7!C8gyq zex`xuPQ(!g4}S>0r+CyH+xIAMP9Z&+?BT1!*kA<}dqRn*FwJPGe}l-sw(lGYN1b8} zWQQjQN`9tdtF?#aqMN?wu4E3)qGxzOhwr*vb;kX_%&U*-=KLr0raiGc^x8|=Wqt`N z?L0luR(~BF;DS@~yKDN7|*TJkj*-B%s1{65$`jY_(C#P&^rVi0?Ro4iaFbR)Z2NLxS0 zTL;%Kt22(A8JiL`U$i!iR&zLxx^E%H=*c-=+h@sisygu-_#m4J4LQqB?~vXvP4@yQo0-^oki(PiH+=FZl}&W)S-qI zk>W;2Zl-vl6rbe4X6feZb)l-Mv2oh^5t8q5@(Y-SPoUZ;N<5Tdl!h|=x!1}5)E;}=RcAXJ8(<$^13IV==^rU>wwq$hX3V4iuA0>h< zuxK^)myr=p7a)oeZ+g4u^9(OmpFl8J@{{UJfy=DjAf8lTTD00iSF3Kb9|GdM-PQp)0<* zZkW*V-TPpIXEKDks>&FQ?qoV&Tfa*;TJyB^yJa8xcch+*-cYj6E7HdBX!5)TIXSNM z4C2L57KVd0rioelfI{ELMrb&Y}?h%mk5iSTXrmJ zwlk6qsS{}3<}Uc!G}Wr;Tek1Tym8$SrWokvCzU(FVIAWTEa1pwE zBJ6JdS@$4RFBV*~g^Eo9MAFafx2rt|uRsR%xpNVyj8!g>2u0v=>eO zS~4nHBgR%cVxB-_OwP@%JN(CpY3qHvqsbt-TUGivY2Dr$b+=`6PJSkbWF)!Jn=iZJ zMt}mOG~-m{)L*SV+yRH!c@XR%)K^BqVRh zq&wib)2#d0V3BD*|F5o2J6$vbdJGh`O-30SrMI;e*Y&m8c0Bi^cD-$Daq1haK*i4o zS^0dLE!U;Du-W5i&*6##L30bjy7q7@lQPyCc8<%{>0)|vQlrFG_D_+v^1uh+p+bhA?!)dFEqi$(hoT?=hJt20DQXmOiJ``9LY)@=HE zO1esvSjV70vmITir9t{Om5D&<%?UTa#`5Sp-x@^?6JCK@(Y_-+ye_agHcB_zSUEYe zay}#@o~N5_?G>%q2t<~g3s!Y+G*Mj=P3Zn>mA2=HCm`lzap|)*f|(31R{)36WvAyz zfea$wK&B|2YxO{n>twI{fk3f0YVK4T;XDy#cUe=*$V6#=30zz**pkdJOUUdHcyGKx z={=%tU83}-sM&@LFz=EaBy8m5*VS4ZYhB<>lI{BnIk4cD&H_E|%!spiL(( z$1W0V$;KX^P(?<}XYHqoplpQo7H>!m)d{bdPaLde+h7(tf+ZB(6MxWZnoX6&>|)(q z*DB~wjMmL&u~F-ZIbJ>BJ5ZM6ik)gUbdlBM`Quqove#M~lf*ebB4nBg}NN8q8e!? zVj>HOMJZ@LQzOdvHUSih8gCt%IxvyHLmO^Ea(*!Nd-Zuw>`f87{SkAwbrcIp6hiff zt7^x@FVoBVwDl9eTxT2$))(-5-O9W=qunp;*yvYT{VJ=~FI-x;pN&=5ArA%W0()Z} z=?f87g#Y@j2_ct@T|gzY^?R)mq?NdksZ}7gJW^{18>hCuy{s)%iDWGzC?-DRKLl?l zlnO5zQf3*!v6nJ;)xm`Sjm!6zf=o%-07p#e5?cL}gBtB`Nq!dTtt@<7#(o8m8xm*XOvN65AL(=C_D} zJM9UyYteSSwriu8{DkKl6tSk&09e8kMrjh@N|SS;@9l|6^W@_Q=i{`@$NUzI6|VF> zN{Rev95oVSa&%)ew#+uKZf{3cFg?f64ASokLt$^COgO2#BW71L>H7~o2Zg;=Z|nCM zZ=N18^ET^uY+VpF$K*teqc&2xaTF!LhIKrwGne_WBX+B_9vi@rt2GKHy|kQxSUJ18@{fEswY{>va~$3%JGyYfr29k%@bck16c zdf9Hh?|r@PC`@3R-j=#7868z@m3)O|u0`Iw|bd&(6~U$UMGD@Vncn>Lm}{NqU9US&{gYu`~lU+m1n zi1g$#vC1#v|9B;ObTzhRor!#90$^5b(Gy`buihHrRfjV>-l^6#?Dg3lZ}@PRD|I(> zVcp1Kiyr8xABHMWk$xp&hFzvUhIKbDi1339ve8Ac5ON73NDM}^^I8O?+8zk+GVA0S zG|7G=o9JQQO;-x!z=zz5c@^<{-AWi)tG`b65v40t#CwnzKA}>?+z|q4`eNlNfRXZK%L4$WHQ)8Sgo0 zwE~@9)+4fUIf8fW?9TihJ6Hgttrta)MqB{FTBqxu|CDLzEKWn{Cn*>&wx$DtvzSvC z(4Jr-g8~qe!NL-;BVhBlx}Y;!It5;VT~^q_HdZcH!a^(MA3%zpy!zmpD(NfkvF=9= z6p^lmDSFnrRVn4npverH%%I5(CT}SgTNGB)0sCY%@`7%@lG#4Gt*2;3c3;0E8(QyS zoo-l-h2)DEIh-3t!@^Gefe~>Aq|Sbf{goW=Op7FDAB-5amdpAhatG_BQh1V>p|DF2 zoM~XblmiX(kl0U_veatKBQ+uz9@Z1{N|y`0j<11Sd^JtI@w2S`$mW?%;MWLc4%=HL zi!p2d7Nf9k{=Kw;xt19k$vh+UMEX9C2D?jRP0wn3ihvj zIKqjR_QyB+t|%#l=^@PkY$HlM{<4z$Jve9n{#ZUhYv#%_q#uJnen z7S7e0{d|oCJ_u>EJ_(yUqk*m3cisoGsENRi9?F=l*A~&-*(<$4vm*-sUaFT_dJdnX zrOQM7ERMPl>SbN2|4`NV9yZ$|0jqv#7_|5qM&SK>FdA$Qn}>sahte?IEg|!hNZ-Lw z+2M47yawJ6YgZhmd7`)o7cpN%77HvCf^&@h2FBhy;L2rI>K+Cp6&?pq zlFhyiSR(126>L@rL1c*79q1?uBeI5<%2ZP3K!*8bJ8n5Vkdy&9Re{a#rI- z6fv$Y@#|&(1pg>!eIKW$IeEqD_akO!YCNey`?q5Uh$a^MgG!T#n1>V}I*O@Oh-I-5 z%k{Du%Iw6?)MXzjh?<)@`1%M|Z2fN100q^u)YBKp;(8NX!a7BpNWL}bB60|{!@3IM z&!_-j!}^5^fVs3)8n2d}7M6&L95t6HGcO7O>k8tJiY2gy{mtC0V*s z;mM4hWAvYlP0?$+)i!p-gT`AH%yAiSovz=pXFBCU*-y1#y_wmwf!PgMrEDEyp_Y+h-3$ZW$Ny$8H)g+M&odOm3D+qCuDCyTVF4s8_v zmEyLRLz)cEXCoqszT`H8*!|T3k)9}efv(zxR?xmMPtJ#z>B&Eo77PE!jE`0XJbxM^ zJEbz?Lu5g--#l!-Y#gzXP3G6p>XOps?99>9SjC=T%MY0{>#J9bVPGK(CmAlr@LDVu zdtE8Cwy$lsu#8`O8L={lK%5}c`pb6GjOmh$5gX((WMNF8jU#kU?6HQLb+0+w?hE$3nE@wxIvFA6~zB7QMVyoEeHQuBH-S!>tRw89F zyIi51ALX;4mfyl>Gbw7NUa`Y^`9s-NepV{j;n;E-$Ceyj?qimR?nQpJ7Zt@YCfL5$ zX%(74|FeDDa8Ol;N-078H81eqW|LX(_9$cc`%a*!#=7{V2=)|lNG5a40)v6g4t z01XUUv68UZ2|@vkl?ceW7{YVw!nCy? z+sAnJ?mvd`Ab`J#GpRgV_N#doE}<~&Z?VHb%c3L;ua)NW2qzfhmeh>}dH zGKiE|U&0iVSyyQ$NO;+GkhAqI3{1v-UXl6k&ogShm<+H}bDWf8ZLbv`!7=F`^V*WW z%|fH`g0dA}vmj?dt{;}&QQW)P9h)H{A4EQ&PP7V>>J53l4KOcs^mIW( zWkEdG-lC&N1l;w9;87FIEh#42)wpNXA?u;BStwK2f%x9dIa=c%`6v*^^D7Rdeo3P2 zK9dB;uN>7oyTltCA%$60W`E3W-dBpg zuqcq@x{}^i&v~(2yR)n>8M=s-@@eAy%xR>v4&Y%h*z7^|kj=+ut-*SgnXpUQ2Za%i zw_32)!m77h`9S6v$7W)#c5Gu%xh%>rSYMFAD@|Kh-5MzR0ebF=8}-^F_#pg>cMe^Q z_fFTrqJD?X&Jg+pQE^7T9S;~YZ`N{LIq@lM=%?CSV`D_iRT3c{J=yaikxU5%rHT=TI9ln9_p;9*QY6sX)@dJei;QU6QC|w1dx9PPU z-k*1jcMjN$eZXl0=c@we30H5Z#G4Zf18#{O`?4|fubhbI#LpT6?u0J@S5*J&gl|g| zx>4w6bp!F}L5Qb)5yTF=Q~b_2auNe$u2af-1--x-Y8ugJ)$~A7xqyDQUb~z9yjp?2 zS$2CCh3xpcnb+1EDhBdlycVY?TH-GQhOBi1Em;xS%mih!zz5d%5ZTK)kgI(;YVM1) z9Y?6R=*3Ee3NQqA=9m}0tBfPY>WV^F{KDkb!>u=FvBx{<@$4HF#Ty?(D_|c16@7ar z?3sMj4pkIxD3B@pYY^(UW7-_E@LkG|E4F$T>^}02mQUF3kyHzn_+N+p{xB`ffEMeA9vW5-D%{ zZltI*4Xan_uaQoJoSn85x~zjwdZGe`c|L&8DFe`!Uzz7`w0>!xulJ>+=37i-p5mR> zWl?vJ+1b|P3AuYhVyI7#LAPEYZ87i$tRpmE}@el^F1lN0erixJ1-N#3v0fp0!puf z11^VLsS9qh<=8A zl(KovC21r`^>K0LV;-uDR<&qv-K@mIx|7<^+mo|TDsK^_F=k^064`x9BFi|CeU^vI zA`v->wGlB>5s}S`2Vld*+LS4GWdW#Z9=Ld+EhF-ng5iU)X7A68`i# zO|AEyO~DJK*d*(2vK_TGJ;J(KCFF$1nt-h(v%kz8V%#2jMxD`gWt|!-@k5${77Q@!{4z;ze=7&BScC z{l96Ke7GeU{#P5P(1-)>pb!x>_limI(??L33;=E&UU`S^Xg(o6V~Xzp2+b869oyFB~+oK91m(zDG}-Ce|yro;clXhx0fm zqA!a1;w8|CgOIS{tHtHPM)Qnv&@IQrVjZ>Cz6}8;hEX6s#`+#jXAT>_&8rE)U3h@u(3Rj2wHPF8HLr_+u|u2h!@v|soMqnSEk8Zd`9UErc zRN_h>v@U-yBXM8Ej^Rk$+sR6^P!=M|4(TT&#@8NU-8`?Hjo1~wjxi#DFXslCbHj#H zR5!NB>1Vtka3nsdw|a3-Y^?Qbif>?ajCQZ}h|~?V$4;Z2hvePt!VjWV5kP_Mdzd#2 z(Ya9OE~}OG95vq%MZN6^iVy-|(zl&p4c#oK!g~#g9ul0wCtz5||XBmlcb|@y+~5^oMA2 z%2&t|Z30b#v!su;P0>oP@n%l!68gTFk*t&4-cTiC(g?CTh0XM*M_NA`XrI~P!(S-N zL`<-L&IbV?K2X3qpYwnLW)JqoQsvmwRaiiIOAWlUuFCW7CR}XuDqc-j>a`x<)1Wa~ zw1+(1-L|GuLWkn}HjH3W>Zkjq4e-!WA;hn0iSIXW`S*t~{JgUpYShtg%LoE=slzv~<=K*WA*ElMAxu<+e5ER>PXppG$|uZeA(Temu%&q(p;3AFN2!kq zm=?vfxfpqDEN!LF)Xm0H1wg{HMEXo-l13}ryyuWqH$7J>Xgp69ORBMSo%EOR{GE@T zp6`=69Ftb3=ONylwdwgfFVgK&D$mcnFSmVb{~?FB$0_H`z~O7eOlSLUCm#&_o;kIB z^GO&pU!)Lg-zm3^a<;FL4;!T`wb1X9I%}R0*ioufT+j91NaBu?NMeOwVtj_4-Bj0@ z_j+s0>1Gh!;oi!cvc4Mg&8Yc4=Cmj3w59_z5~=-$9!bpUA~dL*qwByWnz05DbT{~4 z*jZ@K?vDlzYTtT-qUP-5@^1W$cjLZ1m)7`wc?;yk#>sw)Ni$-;5OH_f-AMb*3BElL zTXVmwcEz1Nab&8Q-#V9uW2Z6VdwH||2KhpVBR4w8!{_^EvduYpj=@m1wadC|nCyj2 zt$A%;w3fp&nPJJ87ID86l?_lyq<-5M`#ZFGH^n*bFxrb{B4*!>glHD=IX zaR4E?rmXV`e=Jb3r)umy9O_=}HG_<;wLag>;c-u)&Cx(xabWC&VP!^jmFM&Ib z$EM)|j1Ueju0pu}b54-q=pis$~y&T*+xHtN5ij^Dv z^%7mNlKsbrMJuxz??mDQn__!^I>*gYDhiq>gCh>6y-yP!!np!os_nT!v)geY)f(H$ zMdxVz82saUVjQ{l!Fyx32g`P8jl0P*QX^tlU_Sb?kt&IuWuyvXIfW6 zvj(<2h5p+D2H`EwSwH=TECv*ISR}=U4K0jI?@X;}rSnDnja37_hg1U|)xdV^hSx;N zR_l)tW>JcPb8F@5C~uO{c@SQX_Wc-vx12+X_zdyQjX9DVg;djzhq7W0o z))<;YTY1Kqwi$lJ9G%8d#&=Y2g-5J9EDiLvQu;DVkGayNG;o{qwO{JmzR6Uh$UG@x zPCO=Jtf)bg*6_lp#3+w^Tg=a7c|p*fGtm(jE${gPmO7HD77SR?ytQ3_Bxr`(@-qAT zWfSOxaSdnVed(w}=&i-FC`!Pi=?<=yrTgx#ws#DU@R`1IyXR+k0R7~IY6mXQnIYJ=|Dqf4+{O?83Q*D35 zm~q?{FH`;v)-R{BFDCMi3*t-k>{7fQ)8nw?9TyWqG3`Ursw{KR7s%pMMe3iM)dT*M`1?|}%AZgc@ zX30+IPfbP!7X!AEjBUyvWF0|-nESBQh0Mtj(=rdU9mNVG#;RgmWP&-P(zBuAracc- zp+(j}^q7=iuyEi?+-C&NiI3TU^)U0@n#|Xx-UoNc*6NmU3HqR;Wl%dL zkIaY`kZ}eU*h+@_w{SA-$LNPRs?I`9&yRXRk~$gghBqUHqL4xmtMtVD2F!n`DBU&Y zA@L!Y3w6XoW)F{rN=O!R5%FX>|1Ypcy+BCeYqX6PttY}QV(d8A+D=AhCvAj2I9Ci+ zE_xz1LN~*Y8IN@_s1s-}DbcJjI5vpO#CDDjrv=T!AxN@1Y#t5bfti^9CyoyfXpL_T z2V8Sei{e7KzA*ct9Fu(Nld9;CL z?d=gOO0=h4Y+4Jb!Gh3(cScOi?2L8L!@ zXRz-XiI$JM!z1>gk%aITI}Ha2`#~+lD$VpAZrrCeDp|VeRi;hXLX+MU&wulyCi{V@ zp~_QZXJ}92zB_-Nbp#$k+W_m_M`OPZC+5?&W-o>zKXw6;Mw zPZVMo6>O;(y{(rJ))j>Jj--v{g0^&C9d>R#xu`p+I!;{+20Fvd@~tlHPH#Z}#D#80 zwJKsBYO=M&SD3rt(@+KWTkw{8Sk2`v+CyWht11NA9@xI&HVQx{ji8>XzDsLtBV)te zncQFSH2RmvZZP^+XpO58RW`&kpI(%5tDHnrJ71E)Kc>S>es<7(F(N@%94gfc zt}u%Qr8lQ*gBzd@RpP2l;SukoBN6k<1H@t7b$bS(TH|}1=7p2j`DH3Rgr=l(6PIL> zoLb8o5hMoHL6p-P+JoNWY5<8%Jy_)&dQZbMH@;n1k5gZVSDG59CRwN@mS3YieR+R+ zBAkSWPvs4(spUN{Y+l|!Sg;6&bFUYtQyI6H=HmrUtM0Jb+GO9GuVy+uB51tb7Yv*T zYFD3tL}TJ3oc#GNW=rR=aO>o4-~yYIy{l>KgSZEC^?)4Dv_{}AeTN7(PtHQSsCppR z-O&ueZ%;ojbgn0xqy?c1=D}`fMTVQ+(Hf7#GMidk%E4&NTj|ys)55Ur?JSdKcj|Q# z@lkkIq~gI09sUQhXE1Oi`1G%+0*FVX$zZ^K;H)*Biv-5nT~_VsJQLwR!63B8U?hW)?=-Hdlqq`a)%WG*cKqMfqu&U6`6B@bTa*hHb`MGTvKIJRjs3NL+*6oUu`f zPz-+a;yzVqgUnl|_Ft%7(MqVuf;hXE{lHCF2ZJV3dw8A0ZK9=1GTeu=CHDQBU?IYD zYb`v2rzovi+{2bQ@h4?87jd5uw$%IJMg@8LZ1vzM6o{&c7{V%n5d_#@0$C223kja0 zjv%e6ch#8!Yiyzet6(Ps>o6M6;8nan=LVmWkAUisOgL8(UDj`QAml+b0wtTWQz})) zSJ`rn{zz=D(Z4h{djmEwSX!(^ZPaMhTGKdHXyg77DUCNG*u3gne57pNGR1|dUZ|DD zUz|F?3wuqfM>2#Z)dh{pi{q#ASe1LBs*PR_05B!hk@A>Ki}d9}v5yvdfiOihrQ8wUSumgQPT z^#CeUufkXX@5DLrvx5#hRD)I=NS3K=5*W_V>qWl{rNnBGEPPs!nOv=RtGrjq3z|oz z%TQ`338%qxgAOAc(jbx<>pSsBsbK8L>)Xq6SeSZ@BwFdhWMPA9H$=OVZ%8pZ3SwOU zve7>|_N5K7hM2X<8_siH#wcItPcL%K1u0ta&UGs3R;U zDFUi^?@j0u_Vu&Ua)bjE8WCg%lxXp`R{m?P8%2g!!Sm&i8ysliZz-Pe)W~iKi$2@- z%_3*UuodHBQkRe`Gg%(oKyxZiY$9Kkf}%9HjO|Gs??vP=@Th3JlaO^YUi*R06`J)L zM<&jp6-PabbnTBvoEC@yMN~q%Hte32CG^+Hq!Y-3#Bck`o&Ye^n)8gAcjrS3G3;f# ztlv78_U$6c{iV}g2vq6cNn)6j5UD?NVll)n<{W@3DD~vmQD0afGzl}{o*aCRADki_ z=2bm;e{nE5XBgAp9!e}Kj3yT4)qV7PJvnnErUkw1#M->mWvgOe+8O_dh*2zSE)^88 zHm|BVM?!u%g)5yXB(SvQ%{h1(*lmIK`cKw|O268HNamNIhp(p3)}H)Y zPDp#QH5Ayq^3-4%J5cMD$!OkkaoPKe-}-JTT@VzuHovho{+xMvA)b$wYN|zTDK{_A z!=;ipwz8(>5Q?(SiryT8!!Lqar~p8UnO`j=uM&6I*a>7SB%*^ANS&jk`adDWz7Sx2zfof8}0FuZtes9;}u zB+1-Zal>$baBaxDuX&9iE1ln=o-T=^!RCgr5bsJ~CbW6gB=GQPFj?(4`p2#G(oAxe zKV8Tn{kWAQX$9i_OdFVjLG*L=sG>-tI9wRH1Q$&*H~5=?sf z00n0WnNK)qk3fD%dRC{TQE?y+baCD^r9)P~=SLLO6W>vFO;58*F`ox*%F>k6!x3eP zc{T1$&hc9d;0GDo(7-vRvd2`T@-mUcE?7|-H>ONK0Yq}-H>J~aChwpa{&C^2T`ni| zz*%QM45LVV0&)-tQ>Q{NTp92^7BAbrnT{X= z{9VAVs&sD53A%Sg-2258V;u3+r`FgO<8l;^HMYd#YmI#r=S~9KckScO`lDlr5YJ*H zTi?`7<`$KC)kJX=7tUgxcLwDBKwjd8!cf(cQor`?hg6AB>D0=FrBh?)RW8VhP1ByN z)SlFH0!LQ*%68G_C6fTCp&&2fem+vRBmRkKB$Xxc=k(;|r)@Y%0}Wnp#Qlu=W?q%I zCiOVHU(Drsu?a?sn+Gsw=b_S!Z^?s&q(`@$B9FqBJoJ#Xr)3nW#N~ydM4dP7PTb(t zlMfWb={ATW2Afk+3ssZm9Am&uE$q-@f_UMx1Dod;oX)$GpGoCu2*2&EynoQJ>*{3a zoZ^Vt6|5|YO|SfVPV8Lm$x+&q!JI(%%5kuSFHH)rbqC$g2l1>Ux5m8#4#{F8PY=8VI@V4ed8Ja-K;lqb{X!#!&;aj>ZKK?0ZXiqsqd&(KwQ!=z@*^8i? z#a%onx%!-sH_EUGHPGr3#5%U+M#`Q?w}Uk52@(;DP87;v74K_x_RR*0!>X&5ktlO# zmEzeP1rG74R6Zc)k)ZLcZFSRy+?rG@s)+duS#@ktn@C|03e3*a8spHy20vtI^`9bT z_u`f)O#Ei@b@NBgI_(O!s3JdE!u(*Tcut&)y=WsL6Nwiyyej-%DU2D=c!%rQ?BN9R zn<^_3*dgnGGaw`s2nTI<@3*@soU1iqFLm{L9%O65oe^%}+Em03Ncf~gPHAW7B|LXy z0XAoQ6Q0}EOJTxui@bz$6>16rPWHPuQ*dpY}NlQP&(W~Yj6k}hp_|woF2JBV+Dt3<`-hr%Ezr=pxxW7j1 zQwQya#XN8`!r~?-DhW$G7|LP$7=SE~H0T%rEt}55mQ81YbJ9bhyDkeI2OSDJDZ<&H zfCpc7z{})0@Nt=f179eoSpdWVRPk$8P4*5(N=#E;;=Ie`upgiM9uKzS z@x}&0gFt?wmMqhh0#=h0PTsd*lS2lcL+|pf>WYJ00cC2+LrF&Ku@*@=<3Z4k@6y#! z1HMbnm)Yt|r(a~xO`^ssNf!ar*|t-Y`Oe|QKy0%RQc&v8h?=9KfjzMc^aKlRn{_^f zPOx^2NbYUce~}0pm&&~$NzXK7ifEu4c5>-SK}EYd6hM6C<_M=<>z^`Oj3k*G7N#-` zxyvde%Z#-Cp}s%T3I@_;8$>*}*5a{_4bhZ5PS`}wwZ3Xg`+J=Nw~gilc5$!BBVGAY zD&t7Tcn~`6DR*<+%e&|>X3_gVDM4CAw(lkKjiS9|fHYi7ehib9a)?dYa0xv1kYhY| zK1s8QHID&!cPqsnt$usgt_PNiBC$i=EUeC-oJTG8+^^rP-j9@t9;JJwN>$ z4<-AaP5#qrU)yC(0;$ZBDYK-ka?;jB*)PXZ=Ze?K%?i!Ktb-ew40db_8Q7VV*EtTO zdUh6LWukK?5E%5p%-dPvF~TA|IkI*G{jrh8Wn3>JB}N<@nAM*td3w9`L)w-lniZ-u zc$M{GEz?Alj4g%}{#i}WSxk1qGl~wxM_gCa>p1@eM+n3+@v-S<(TCEr%<+pqQ7xQ? zGQ;jyC|j5B74kB3+(IwtKkA%G?O`f>Qqfnj3f7$OTvI!j;|gTIK$q6|JB8Jn9_vO0 z_@W-;zA>)&S=##f=tfTy!#_^$B-!k5xF6oc-c@rjBk6M~M|wHubj3;$=AMofQ<_AOs>}JJ5>u%(%)41kNIq1IvFKc1K))za8*eVg&hY`m|wpzYQxnde<~ z0>F0FV=72u2bV~!IPY^z3hyaE&K20W0xTUoB(F?-BcLgo=QC)WAQ$vR`^$PY!pZ4@cA({mL4nip57 zdCG^p;&{{ayb!lpWN|AY_dYVga-|DRmxFPw@mJ2*&FX8R`r5DPFlu7wmpdZSrh4hXG*R{@B@?OJgoIBda|NU)=bHI zoUCH*`Sx;vs` zPpS@9wL>DBnYNtN0#XtqD+Z<19QA2O#!3`2H>av3C%Z1K->_Y=GO9r|_0?TF(ug(M zsfVgD>2Z;^IabF9Wh7QDV{@_5e`@_9uF=vT!SfDZzgBP77YHt~taOO48%DIb^uUh$ z`infoEYMh5Eqxxb9)of#dL0(3HGTkLB(HK?r`|5C7LpMKO)@-WK;T8j%OIznZiwbB>UnP8=V#ywX^ z#w%pd#G^D3+yFp;7Y+X%**j9Ug~Lnk%jW3BS_}vJqIQ=_yHuY?brm}Bto2{Fs__T8 z>m`%(QzwTF&)35W3APj?m@{JQo40Vp&ghxSY@oCQu1}i%Y^G~yrc>?!%GwSUbZPtE z`JSM$UpOC{HJjhnCYC-NJ=cy1Hhb%;Dq^GT&FVg(_S`i`KL)?`?}%Bdy1Myqr4=Ft z)m|;AP?7ZW#NlI?Tw^Wh|f_hvJC4dygPAxw|6lgr!oKdcOn%DRBs|th9xAZWd^SbKBpPvt@oi4p4n^m-7BH#T&!dE0YfwmPv zJvr9_xZ&mt8a@SddBG5X^FI&lR@2vs84pvpH}Kr*=JYUg(t6T3t2Vv*z-nBnO6}NE zd7O;h6zmPVa$?uX!^?4*Sy;-w*#D+hP*|`1P)`;;LRIC&r<+@dCU=5$4=m8#=W_95 z9$r6TS8#2ZQPdPShq=FYud1yz-Ugeq!-aNd#NHAyp792bt!@mP??z0FA2Vkw_-1e$ zFc%5V;5y)fhG@XskZJ;5K~{qJfOyyR?QP)%$eys(X!`_~u7!y9`0aNY8C#Pqn;O9) zHV(3XM>dH7)_*;5Za{8E&zB~v(*;JqJMNKpY=6-}Hh^_{2F%S6Fae{5=^|BJ@5~Db z;0P59g7!1|nqyvOS9?e&k39|Qw|(EGD!0KUe^x5=>4YiXF%YJxZn}qQ55!Upy%(K@ z<~L{lgng+3LFW)>Wk^rl5&0K-bTpl5L`;>+E#Q^(V$QsaqM_u^Eyz6-cq3@0gW47Q zgMs~Vq_Bar7K}V#VNjuQ?ySq&@jlx>);I}-OG)PvYaoGb&st}{GXTOlRh~YW`8{XK zCi!O&8%jRv05ItdVe*_@YgZf(29C$6{J#S6FL59%7jaI(AhDDH&{8WCD?)$#0*U1U zif=ejaG`mbg5nn$D88S>9m1==H>n7{S z-m<4;{-#Kz1XZOyO--#9yrgMw?PQ#+F}XR?6Uq7(IU_p z*UZ@^jji`;M$ZZU{z^LEm{a1HU~O|wvH0%FS+3Y}66jWgl5kevkUa$Fb1ZQfV^SBg z)~s7uhAeXr{66iM`zERZg8MVJTQ8v1(eKDRRM39wpb=*f=Yuiz3j0JdaH)}79jJ^bPd-8#dQb7oZ4CAoR2{*B&Yq;uo2y@+8FZ| z&34nQ-JV*`uQN$pq=D`8L=KVU&RjtdF$wI!^$qlh=Qw+LyDFS2pxOY(1!G1jS^{~Dde#<9}X zTh;FEOqiNIfN*GhA@?=5i`;6IJ_CnLzdCeZm;2I%{XJa@R#BtYy#(Fi08_?wT%6?G zN8}q53FEtj9)%%X@jGF|;@92I{Rlhb&r_+EN)QjC6Sr;n9EP5^1?f3rtY%N+B&s8Q?}lkqvyO=}aXDxXS++z+i%7g{o)&7W4e~2kZ8xiz11ICtT@a)-*m*yU3z*{=Nj2(#97} ziWm#jI2HEQwIMUdP)B#a3U7HsY_^}U<6QPH`N6RFKJh_Az5^He)_fo?j;zw zh@gUt2+okp1-!bth#+0e5xU$yV6&)&Ps#-YBe`H;R`bHC_W$92fq$`YA~b*Ib^&%F zE>!r`?E){8MTpQlJRni6ajSa4eYlkuxm}>fdS;i%iRaJzu` zVoHGjGV8n4Qnw3;Kxs9QN|dA@uvYS-CyNe3N`qGm&={u?;>Uo9I@p-VH65YTZICi} zv%tkpyYUL^T;4+5EO0h%kkdNyRjEnVspJk^EHGRpP8A3?|BsqLp_1yMJD&4*Matnt zEF})9GZ#)x%iJsQC@{dU(;I~T8|sCze8 zyG1AOj?}ipd5hImMY>ma&++yK-CC@WV^ufTU+RxU-Cfa&ZQMofY!^9?!vuk08i8-X z!H3;e0@8Arm(o~<@<_EKL~0Rf_nJq|Lj*lNz@F4CYw!}rE4LjkRbiCiR@v?34oJWG zQpoHQk>Cdit{Gem*+P}w0L6@Rhf`1;E(NGG$tfH&5ybcVbQndp_T|1j6XbW!L{L z5{)Z8}}E{XmeqjG2}{hcnqYd6KY8b0_hg z==3`dGPXA}I?Psdn8MBJeAdt7-HbEn^~c8I9Jv$g4tHbS&8T1>TH}X8vj{AB8kt=EsIb%i8orF&A`kcVoopxh&F_8Wyi|68R+Du~Bt( zb?es2VHdX>%N@iYi|=tk^C42IYA$M>dxn28V4+DGYHJ2m)ms_?Q`QmPV9OA-g=r$63(u%WQjm72$7 ze0Ht*G8#Mw+($ej>mYBcEOevu~(tx*WziE6D$ESpc{vf+36xm6@}2>cse zIlMZgm2b_sODzAo8N^7&sr4?a^S{NB;0ipkzgCP?*q_f)!xi4F-BV2~rw=afrTkX> zMyc>4D#&IrLlOydA|~`vLP_yH{^J=CSHj2YcmO0l7;c>Yn&|Iv?+l z>vkfjt)1;H{nm_c#XZ`_yGx4JJg6=*iBF(6Z_Ec&+{x-f=vUE9TBt1{aBB9|UhPTc zPM6TqWAG(!HF}DT*5ct;lo+>qhujjDJ^YmQ4HGKH`Pw_5EA~aH8T?~>3-sDHt~}`s z_dt|(V$s{e^~YItTQS?&iArlGFPV!AwhUv_ve~YhALlLLS&Po88ISOe#h9QEBIf@3 z0M`O@!p0Spjmg(R%Tr-_{P2I?6 zE)41(~C3dM|P)!0etmm?S)~ig9%2R3(F^1wW{Mn8njlaS1+%r9>fqN3|z(K z{=R=hJz-d{-7od_&M_O+kYKyz)!77>&jwoxgh)c=(0e0?hOV{I^5MZtIXFTc6&riw zw|NGeM`r5;xl}diekGFpYEC%0xG&TkDjyzhJP^A%TYv_tXdreCUTrna1=(!s==Nr+ z^h=ehU<3NY`Pq-uxm4;*qRzO%I!=WnRFyiHW~T*j^4D-fM1-5JtoF9gen2=YQAFTa zubuxI(M-*&d8bgITl>y8c*QKbdo?S@{T7|}%k0Xa8??rY_y{z)TH`}VQ_NRUu;I%E zVp=Kp=A}IiOUk{+BDK$8)R8}k=I+oFVM_(da~(Hk<03&1#-SPGwZ`}5{nBS*Mar2J zqflxGImm35Zg+7SuwrZ^8P1VQ5DC}WlAC^j!+_MUD8k4TNHQ`+y9F{dCsvzAGGm;e z#u(=gkngQl`$%2Y{jbGtVq8b=v+bdS(qrQr?q5(4J3Z7qIotBu@Pg*h^x^41gumG~ zLO#bm9qxj383g0>q;AW-ZYj=ae5BQ1(P~VS74Lb3SK7isHX69o(!N#5GDx#Z2Ju+! z;43#hTyUX=A2Roa%ie9ce=#0PyTPnjw;JVq8-LAScSGDubE!Wwcy+pv){LWh4~_-8 z`co)iZ`Pi4&#L^pYxy-?9`v^Mj?mr6@zd()%APv0vU4At(j zlsp@LJ8IrJH(2)iZVPwX8nZ(rQU08rcoxcEdcl^v<(t9}dPH=#eLW;#(FgD=6>zsf zIDvL^Q4b2+%x~KEl^H~G;ZtYW{dQt?xt{t@$~5iSD2p>zgd_f`|0_W*Rs?y=AVG4t z%HK8XhbGS_vo08TCdL7=8yzxNC@&@Q3Us*`VdbO{=6DE`KPprlAI|5z)PK>f(B?mR zX0er_&Akq7f^qc0Ex8%ueBeGsk|S;3$M?#c*7PF^K%kCr0}ai)_p?MAP@}7>n!lI7 zdO=|4+Av(oSqDO@Yr`)ONmgZNw0U0nrRk_paq&R?IB`{@)0Z$+dgo@@3t)h5>$|r= zTY^A(e{mIo3DVQ4>B4N@X33L)Qjh{&FV?;#!cF?jY)`@;2I#sF-*HgtpwJ<0CQ!(r zCh$qj8$mw%=D#z&$4+AIcnuGmuiL)VD#)|n6Q5xHmBSKeC$hTKE1cSu3SyTv`tOYA znQx^32l{xHPpNas#I7*jdXyA<%&Nhv(|=2ObuHwAfkV6-uFu@zi&%j9K{m?4T@p<{ zDBIin-1uqOvNv8yYZb2&czwn|v#CwMQt_(njX&otF!Qc=WpCs_0}^;IYWB$`tI_1l z6=V|_hAi+lcTDE>u^^*V8{WZjl>Hmc~ zud4Qj{MbT9;iS(A8eio8K7#Ij)>>6V0jP_R@5p5JLX8(S|R^)bin<3&Qf2Q-fdM;3B zw|UX(z7!dZ8;RvQ^HOdplAFr5@OL~{6k5CSHg&GO+N5IX1s-JNK|#jR1+l7Cqko|# z8Q)Yv(Y7l+#lF(J3MahWW>{jb_GDYyt8Ln9O~y)rxE9YF?oQ|0EL|rSp781D7ulSM zx@KVJE7fbc&mV907pvDkYj3xjm=@zQECfxjKKNb+r~yl|V>ud-TmRo;y1(qibYB=; zJ0zrgB;B%g(R2J1iRd2X*q#4;ne{PijDW7)|A%mHWz)&}hbyr!`G?YS>T@pKEgOmH z>1g3m!MSi#7aUD2{VJY&xk!ymv8psU0p0NDB{<#kSTGRF9VNAp|L0lZA7gh`7jv*A0o~-iX{SMpf8n=K!@o0r=sbuuu`oJEe|29ViRx#awqL9&lx8u_+ z@!Yj4o;zRoQGeXIi`3{}r8TwFP|I1APS3TwFd@mG$H9KYK0?Iyc76Aev>!wW0@k!E ze5MQRt`L7kCm+3^Qisd7v+L=p`)DT{)O}zesC$VM)QyI6@4~!mh@_fZ9!y?yn2`8u z(pP5#xewf19UhTJHg;kbtv{WcK^UYUo;1B%{6j;x6$VrC2PFkTPUyBduQZwo+P32P zLLY@I24c6*S5qskaR29)fq?C?PQZ4t${P}}t2&wPgk`pVIM41Y*2O-h)C~|XSs)#>ramEx4ajCWvW0r@? zme6R~dlbpWX){LLlK$+s`iXI78+uHIHOn%e%O{D`4wd??3y`I#f>bf<52 z4x;$**dbn0)ln)#D3V@-my3;s=YC4t$DD5SPBmf>P&mty~Xa~TEJa`D33TGJJrR1s&Z z_V1c?L*r~ka1bY=zdj^L{aLA>bxoYD2pEG>_M&#^BND6RcWLZwewT@v;P}e;ql%TM z9|<;8E{hkiHA=cL-3(_aPJfGEzq&>$xK{Rz1KNy>yCkG(g6kFvTN|L83hX(Ot6G8mRfCXYg@Ff(rQ~?S8!`sgy0Ie;ZjYlZJ!vmu~op0{J-bk z=b21Gu=ag_{q^(y{vEhE=ehemcR%;sa~WJG3uH(gFOV^Gq`*~lOM&Q4@c?B8DwJ03 z^E~v7o{p^5r?NCU4B22Yb6441;okU+RW3_dY|64Xj)v8u*Gzi8M>!<(SESc-@M_mV z+jm)kQTEeDaavkCyd7 zcv*PIk9h4jBY0cePdGc}9;KX&9d}2j_*L`%%+uBrKZV?~qEEJdrX%T#f3_~|^BKsH zQV}5)#C$R<7*~#pKO~Jr#z4;bWzeO`-$S@|jy#?gxeMg?IOlfW1F~Q5t1EH4zcAZ{>yl zn!Do*d3B%=tMID>F(0rYOw}909JXxPlvXx-9~{;XHOO9%?u>)z2w<-_*!s!+;Z5=V zpd@TId-oBN?HBrAjja{z@;FKM*v@W`?Tb++FFIgPyuTW3Z5a(G+DOFj2*%c!I6gm&sPu)rv`%3$%p8J;WdZ_xb#PsWZ%U97u#ii?3=^c9SA|t1)zbi1= zR^vw6lx8C(oErmNGnh9hBVC$heh%Td?&{Hy~(g(7P z8mdwFWBuQZSWDA|mt;46eN?WafeJ?JQQEO6R*2L+!KbW-h*{wX@CWN9fnspe^& zRJUt)wh5y_vN-|E*1B6{0Z`#tf0^t{v<|1qFnJhi-a&`c;TV{342w&{bAMY3u03^G z&2aV@={iOUoKQQM{YG|E)r&unHz=}gWmfIq5lvQ%P%<)Qi&VsjV%Z9_E}1aa-q{^( zyPU=vsV54_PIQc(K$q15N<-_hby=n8*ksv%(@YT z`^ywm-NQ`d>}6~PRc0SUpRayGHsLu<<+89@y+-s?!Nsf?yHxfyLf)^pU+HXY-dTN- z_MM&ZXLzQO3aXwRX;akGP)Cbpp3RC-QWb}isyJ5S70^JnZKBf%Da}qtN9cQ;J*{Gi z;B0#SJ({Zeil(Z}W1e|DJ`xyP-J7DSZkr#J9`vH9iree9rm7dTG9Z6gRh6g=)2gbn z*Z-OJ&t6a_;_QqG=n~+Ag9_ACWp9|!_VH(7Jyqx0daAxp9cCUiYN|Z*j?(-6J+xFk z{vuI0TB^$MuD3vd;ma1=P zPcKAz(&N%`TB^30#)O8d_E<9(%Ba}(?x&0d-L+LMZTr+%Mrx~CYP415X>C<`+q|?a zsZPBQ>P=gf-pssg&1R#+u+gQh3iVduUC<&p#-!bgwkkVx4539>@kFYs3cIPQdI(tp zVVCt#RaL0h(pDWilrB|O!u4I%K2ZY>OJy2u9}~`~PTr`ik{!^m@6}T`Jt=Gb!Bv-Q zbyb(>ZPj+6gPqyMB%qrnc`!<-Bmi;BZphQHfB`{vL`T=La-#J}PMN@&uEm?JwQ4$^ zB6MA~?~pnBOI29)Cj@iQdkJlEV4@AmC`Rfhv%febwtc_=!O)Q0_9qZgVRc9>aPo+j zs$NxCJ%o=Fs<8S2ju9%XHp*u?bTCS(zA2w<%I!}Xow}>Ax*VG(pV#=F&xd5%=$({_ zQj0gOGW#E+!b)=~tY&sM(5&q_hI6BBimj{O+UNp1>Z=g(^E4t|tU|{)Yw>F#jqcj3 z{B5j=S-a>hj=$|`omEkX)vNX@z1v|SC=@i>tCqCM5lnc~gH|kO(^Dtj{u%96i;2|T zevw4oK9|3)_AIHFI9M{Gy=tnXx~f75<7{}|HYGEQieza@v>`1RCd))kj4stxM}=w# zsrF&j78jg#ycVmS{w^(6i`GhKz5PU5tgP>F=3=i{&%a4(v@<*Xu3alFDHqJ@ygTo2yml~HLyoN zi`qP4NBeo%JU|@U`-m$U#u|4IzHmkPN+?rb4zm^~w@>OpvOs|-EHhf}gz zVR>kJ5Cm<`uy(rWkvHKW?JZ`&@x_imzSujX5WtEk_LEMrO~l0BmQCN{9-HT3WUA!l zn1jKO{D^#Ur>(O^;^oMCeRPs=HaFl82l+K3mKgzOurL9Q@horcg_$yhIQ#Isxp zle>zYDHmUguVSBeTdmXpNL@+6XqXZI93pA@MAEIZ{^duL_x(md=SX3igA4Y&y^N2zwh!*J33~ ziMY+t82jA)*pPFs297w$X+3=NF@XgV!EG{zp;Er7+7+1OFaAK&LS)UKe@4g=C!ye$ z!oqw>ri>52ujQgIlABaW$@`mz&yl!-4-m1|Pf3(_ApVipIPMD4;qjrpv87L$JEw*+ zS-s1~cHI}uYoxZU{f#258cG^O&aHVSMmKodVKQvjKT>+(Ge}`ibf%m`1);yqTqMj} zK4T;YveJBJqy~>T$OjYlV&yNkq?F}P3yC_Ul$<%DCWfiD#Tqg~8WFd$xb5@DuL(~1 z^#Sd1XQ4J9fyanAOAL(WDuY|}V&^7XKfI>16UEp^Sn5%7Bmo-dBqN|nn~+=h(%<|c z*SZY-AjX9HRjDz-aiJ{lEHCQC11Ymc3FtR#w1Bu-D(eRb_FI49+~XM{lkO)pkT}pC zKu_mB&?WjnQ};|G!{3cITyWwR?46IxSc$y9Tq;6>i7C$?+O%2POX#T?Gq{h~bbYgY z@!o}8@_Wzu=H=!X+@nR9SoYa6S>}a&Zdd_mALaw;%-CR3USqBsb!wk$Fd?$c(z*ZgJO4CKn1LyvCd zE9lu1~A_lJqhsi*}FsNpRhl#m^Aa2vrXxGMQ6#e}ra*+570)b|b_`z@SL`P^QwqFoi zU8V{Y$Qa=!bX~*{L2XiF&sz6NP%}i-b`23%jn;G215qjF~p89@W=ICI5n5pk)Jv7>LOEX)$ zki~kaGY5aXoV_u6L!7^Jujiqu;_{sJQm&pI2KMxTYgWVIz%X_Xzs{;V<_+}WZ{Oe@ z5=q}Z=ONMoPvq&Thar=v;g95^E|c@ay3D>o9!uNR{-L&)wV~V$;dP&xVag&`kP$ z_QWlv43cHmF747h0`quh**()6IB#a(z#Is2mgfof3VxwZC#B$#o{eO9moB^nwCT{E zfD;7SC3czy2<%-V)nU>>kWZ)6HV8X?$%RW%WATY@# zgvUbDp9A9=t(>>9Trv0TWoUb4PwYncChS);7D;;>F$&-Q##yfk4;6t?D2uLk7}N4b zlwa?i;HJY4bxxTcm#uYifH@l`u>OtoXMR|_)L+cGu^*K~wHKil|3iP~ff}ayr>t>L z;@?a;8F@{-AsdcYPbc=-)e2(G)&*^xHIl6OsPg9Q#t|Oy_Gr4SP=W3y8(H1xPrNqB z;(e%vdTC&i^)%?76gtFI%$cz)EA^y&IE=j~lWGP6iUQO92R_p)p={nyL30CEX?oJ_ zOzB6o%#2jzMbg19KmyU89ep|m9bAI3G}UXPityU#g$26XC&=a9pVo@7%13(s{2BIK zHE73y+4NSv%qT}uD;yClb`E6}I!o@z$lN8>?B#CTw*rK1npFqrU9X6ql$lUjzea|; z+=N^56~mcZc>YlA-M5e)V@kbr|-c!U+6=&ZF_U9RBW=FR=671 z9?IIVc8R}nZAVVSvjKPG+M~XQliTC68%vL7Z)9x9KV&^JR~n{g{i(3}waCT#j$rbU zJt`}XA!J6*p+Iy_{1>6;jQ$MR*s9q#W*({j_BWW z*U8zFY*btD&oOWvAo3VEJJiuWH0$slcfd`OiX`9ni2!9*J8~Hvq5MLgL2C9rP8IR? zRdQgW{23#EhRPpL{U=$$hMdff&?}x>c5?n7I)HZC&`a%coQ<_dgF19Xj+6|+v?ogovVvn4w9_vgQoKGHGtTB|qdh>e}B%|#|&{rSa#^c6@@d6V~_LoKT zJllS5)g7{4BMwU6+L`hWR;=}YX?+W;y()>)wBPQ_d@|U_SND8YdtXuU5CiJ=hZePl z60AXWgwz>+jXk8vuq~#}Tk|>bM5XB7Fy_6}V&bM*zSpSBc{hsx* z49{tR#q|rCny=yGKrob$gF=j_I<4^t>NMuGNUaXF`jEkO8R9#TPewX9fozitWN52u zTJ)mH!}7+pFIql!oDgKl^7^$eo)k>xVnz%8zndlJDxHDd#4gjc^;9d24J__AL3I{J zlZ8j5M{ienU;npYQYh!pn4Q6xgb&-J5;~~#oiz73vt*SSIF;=bU^HJ*x;tb6M)4J+ z^j0fI1xI9W$XU`pWV^g+XSbMmZs06wkCEZV^kjs+XhS|8pUV!dZEjrK;#vPwu|PtP zvNn&|L5wQP(;#Akg4PA9IrdpEOi6vWp+=C*KV6mVtN%Ras)_uKY_0zn>GhUb$C#XgCs79%uo<^bz9l^Fg+6P0 zkzCA@`~*kpv>BDG^tbF3Qb<9_rMF{F)&>~Y_F0rZu!@pzK|h&4)t8 znnHOR{%$OFt#?c}1q+_jCK|6GhUD7!xD+jvkXyW)u-rh5ZONIi+sZsuw;49LvgnF# z&B=W4y4Tv#WxlrAZu7+n*&9naF_1Ryt9$1`PHihPR$HW4OMwAJ^|yYtp<*SF4w>HypQ?1Xw6K*2b{e%eZ(gGp%9@*K#HV|)tS9v38 z6?#p5M|NCC1S!lD|lnbb=G&6jm9m2FO z|1J4Hi0IFlx*AaeiTaCu510{lIxBQ*GfpBn4s+^x>$~C)sY&~WX9J%sWt|(I z`O(AQXphbd{hr&M8Dp=T$(1-6>m=aUbS#|#9c6xGlv&-QJmbrwr)avT&b;tHG?u8DGWYjHP3}*Pi2Vsu(+#OQ@>`a~W0csd14u&hrowoz1X4+WRq3 zleJf@EnEf(wTLd-$C35yd@_^JYxa5`-qW7tFPd>+=# z$Mg-{RW#$c<&Ek7`Z(CQdZ+XX*|W}=DJ7@*i@0HSi4;;R=HpEsvsrT9vJUT;e)~OS zni0MsSORjdIUxE55;=Z8*e=0IM63T0*6Q|e>AhI}K9_$+QVFX&dLe6Bn|IQs>wJ-| zBotP(xeKGU&>Rd56gi-N*)SN!(YXULh!u=7d%Hr}#+K>PArA>v$u1f?S&g^KiAn5o zIWf7cHD^Zgpx_wUlK1gE1OcM6GfI!@3lkmoA%Z+hlDhBNvOp%jXDb@>}V@1N_D7B(R?s zdU<|rg)86f-V+^Gk0$Gi}*&?0`6a2LTD zJI}x4-DL0?;FE296!;Kh9p7*`xE-d7i_XR0WBTtG`tRrZ?`Qh&r~2yHO~#8%uPK1HsL%_q6bS${OZwaRKaA&}0M`Jw0AF+etMWz42&;qb&| zAE{LkPg^VWqTnk`!Tm>ITv2co4(6SioSWHlHIH(eLdW~Vgwkby^HIC(!a$UHo&iwp zjdsdkEMuk|bp-l3<=>SI=izl3bSfir6Fy=^e=-CRHJ*W)p`2=RM8;v@a2N}ZiNTm! zOOUeYt+begR$1P3&}{+ye^Atu?V5*E8p#(`m9y< zb;&1akruWdkk}f=%1SC5Rzx#UJ7+W8 zWRbxP9OV!KG~Exr1w7AiJJa~w%%`X*dl`4H)&cJVs0qWhQ%12|Oi_Q6urY=k4K4ZstiwB^m>oh`)LT*Z%PWU>!~~LzRg8X%B}UY>>}ZP(USyDH zc-Od#!V+6$3(r@!#>sM<8`HbAz82EZ35W)lzl$XbT;%5&$#BjO)Y0eSWpzDUBFqad zjF(lI*Wc)C%@Z{)q3n3>IWL6kA$nbW9atU>zDQyt+rGgl92wsx&LZWpw3-LE5ux&= z#>9J4v*WY;>vq)fO*UXrwuz5zS$yY(5>0w}o?U%0GXLkrCre_feC8&LU8>l5#V(C( zWr=;O*jr+6GKK;OY&*pEXz*9L>nuqD=@S8-ddZ~GB(t5$Jih$UU{h{1igCJEkiT=E zQ%Aaj{Pk^75tXDX2)meYB{>yT&{aY8ZEm5dCY&o6uAn$mK^*dgllY4DlO2ClDA7T} zQbDQIMY2>7gd1d%@gdCEKlqZa9v1iA%d6{$+4E{sKh%X(OSqa${p^USpFBG~q3=br=F%riMN739XU|CiOzBh-&#iTr zmeq48*KJ+%HR=5qBwODwNUBw45U+K)LDH;?4U%rtyF`QSssIASbYpqZGCZxPJEU1kw!v7Gs`mg2EpGj_$I;k8(hX0Yq!BS3%7<|9r)doK#c!|MV1z%!tOYl5{cL<(k@S}oH zGq`Yrtu%wX1s`s3{Qyj|!BfRP#^7GTk1i1+m?vf4Gq`@yrPbgW;^#$!%fj1gF}U1; zwH`CLJP2cLHF&k)KR5U)!EZBoo!~bbe1qV12Hzxjz~HwDUS{wz!Iv6*i{J$Y-zs>v z!M6#XVen?bPd9jr;9i687krSxHw*4I_#weRU#!dCDtL#%Ey3S0c!%JJ41QGbXABO< zR9VdimuI`J2MnGp_!fhw3Vyr6y@GEtc$(l122U4!mBBLvuP`{QSY;I&+%Nb-gBJ+y zH~134XBxav@N|Qh2|m`~)q#8tO_fHx-Y=jmH!d)QimkV-sy`(y(zG zn-3RBu`l2S!K7n1=xn}aY%;L<$k;q-j?C1ieG>kSq|d7-Cd4K!?{Yxc%Leb3$*yqKHjM77v|WJerfgMZ%CwH-dc zX;9zg>)!74EMNEOQP0&+vj|3sBTZyy@OQb7INRsE=!5?H4hn|mx~V&J*Y67KZTI+x zvEe(^xeLytta8{ek7tuS#@;XwlMS}Dio_aWRp#ELByibxJkiatelP`ak)V~`YSWy3NOkh&|yL|$KJD&j$KjJV1E{YqKx(^^OzN!8*cc6d$ zX9M8|1H0p*>bEuoQ~p zj8IY|M?0Yd@EE+I*mdC1Etv<_p2nk!T2u24n+brBN{gG97m>yHhLV=xsr?1(RnC8M z8)L?jvp8~g5`x>mbK^PlEsjIKCuxPAM@MjbY=~<}FJ->P!&PLtFIo1iPo)XvHR}9k zzU9$u$?Qg*%eF6M19?>Mfc>7?`~A`TQ2|)fU;JD|-i1}v96U+$jG8WH8hyDYSKOvcxr9gL-+`{B zrr}5Rk^b`&iM26S6l0;`t20F|H~HbfH}T?H%6-PMSUbKcFR z81cflrNl=)>t7PGG$sAaFZ9dT^pfu7Y51;mt)`S~aL}c>LozH5*XTaSUGu-5u6_8m z4>)+S*Ai)G$|~_FchR3W?#W^I<=TCTohiwVzZDWsV{9s(&}|)x^$5}rqz?!>{o^Dwa$C!grV3o9vo=$Lgp%IBNkB(u z%IP|(R#C|{QxZC>^JM|BSK;yb^eb?3@h3yG`C#LJOf0_67x5Bzm^%VUW1|%yg#(^Y z(mIJV^ZCFu-pvw$G5nm0T(4m~j>JQm?O|YN%7eBC_R#YB7=A)YBI4Yc@*~?NnQI5I znNW15z0gjY9ahiv48usxvYph53A*~8(9C(zhxUuAG_s-p91ME#!0Q$JSe%fv0pf`Iy`k-vUY&tiPqL?X zvbdHFYS-%QRTNw0a;_E}ofZE#A@+KUZ!$4dp*1|c4o(ssj&>wkjNm~aX$iNMcV14@ZI|{H zteO#9yn&@U{r+j|$KTficN6^epS51~xY&fSu_`(9-m4Oc$sEe1%lMrkgUjW+tc!5e zgK{8^X`#jX1dbAKLcU~WI1ZN@hgR(%0-TSU^Zzg(+AFW7aED6TPGE$v?$2xWANhN3 zW^=8_`jB8w;_b6g-wYRiU%+k67$s$3wB$Xs=d4%s)FPu#V6f=L>+hd{RBmFN6nK~Q zA^ONfNwq$`Yr+CA|pKr0h>E5yX|AZ((`Y_fSPl*yW&O<`6hpr$o84=fePl5_C zaAEblI|_9p=={%tjKW&}Qy)B05hJb3$n&TS>r9<>y=?g_8$~(U+kv0F5JIzmL=C|Y zZ)J4f@p-JT{x2itfeVp|Ey%yJbBS+bz>^`fePLGA;jI0~kn)bwvfi#>U*yiT&fXvT z4rhDNs-1*Z?WeU??I8oHfTyh&-;zr7G(5#-l0>GH$oZj|R=mf_>Gl0sTV>q8Vl3wn zdnv2JW@#f$u?hH`amgUb2{IfW&n>$;Q@%~zNn~pY1t+^N;^&?Q*%BichZ7V)-sAVM z`bpKsGH=pT&i!vuH0x=%)GL8)31qNbEr*FT7eaVPc5%> zpSU6JKHQejp@j%9+xp|%wukSC2Lw+t^xt&FptzLtz_Eqqf~G!ooqABDH)4e{92UxX zMrX>|0LWzQKOtB?ny+XZb^=4+M+5=f4>c;9Ej z7tu5vdBuH+=f+sr}mV#cafb!(7!3=m#mFD z_fnX*eH*epc{IzneS5Rx3ZQ|aZ|1dqqFdH!WBEMP_8uSFwjBftUrA^ogl_n>2W*^$!WUD&UoL(n6bH?yJyA+6E+Oy7Cl-d z*t+q5LmxrcebPxks(H>oiW7E!(|QSy3YqK)OrF`)cT>_IS*7|zi958qAz7j8nwEO^ z`gOEPNKGP&=L73boh(8E8x%Eb4b zzCsCqKgN_WpON=OB|MFS^ekbfl(0Vzx?I)bW1CPw`Y4B_T@^LCdx;WhZE~8UMWaMK z%03I?P-P1wuh|pXqop@jPoOUXq#rLL1;pD$P4W*WphWe+QQnqt>cn*J%P0?e1f6Rp^+8hqunvz;&Sx6HQKa3hu^Pxm{_Jlp?Umh)V2_!_b2+z(u zcHOpiR_segNsE@x6z*V}0y7Ty&>(SrGz8JD28qn_-zOuCpD~#2Ct1kRYrW2tIXVZ7^q;c=qU}w6z5VCR3nEV6wuJZbuMb_Fh^uaF_0jc?m?bbGyY)f%N3*m#X-rb81yl(n$b5OyH4h^jj z?;S>*F8#NTsyxwu`zS6w^xr;oqkHS{Nd33A(yL}}@yzu+)X;Z7uD%@>8n5(9>nI8; zWWMo*T3Et*8j8u8h>G9nHgK8^|8CpAX~WxX*gzIUq%yV^w8t3upxNUace9#R_-3US>Dy7DPR zH-)(8{clrsI!>Z{|SY-y7{zE zl2~;tT?%o}JK8P^aRFh4xZp84q4Rh&3#GaLe^7{f&ql_}6Dq_-9x>@zw!oTrkqU9s zhtdxIM+$LoB3j;6PL+6iQ;54@oX!^J)DhX;)xaF))?PH z#uF>V{p6=%Li-~X;(l_LPRdb;YgD_+(m1RU_xThA%r=hJ8gZwykYvIM#QW-x#-WCr zrP-G&$h~>GS!8~hg4|gsU@Z$w;;*A1cN5oL-cM+6tUJ4cI~AQfkN}=GnIX}UEB2_!we3-nJ4x(IQ1C9W+|zKfKvd)o z7Kn=6egaXE+eaX(9OYh;s5dHBKPasgRLU>A}1PDexrbo}5QDqzeS^fby<-qp+v|cr^tiSI#wx0<1w^RUtBPDx8gX9O_ES7s zPhJ*YIbNG>tH}N4;mG?&EYL;JRWuG~upaoiA1cE%;+@V$9agpqUSN2^Q-L6iU zbJBmXKT0Ncwkei{jHg-6x4{Sz-MCj}&dMaM+RARaakH`NZGR*eT+%3S#Qtc2eh0L$EcL`h|cCwTyo7meir45qW_ypeM~7y_JZ z!o4-OO5no44Mw7whm8*g&6N^i6-SLi^G4f7iHoo3`o5hAKhi0$yDG)Hg>ww&z#wln z-Dp=k3PBe!lIOQtcTY99OMLa;9Hcz!g{{VA#ti*NEh@III$w@_28a+m&$Pf=7e4g2 zzD+Ychgi++4r?lC-P)rnq~tnE_!fw4nd>A+^}7o%mwhrZr4v)|RLez(rprgOeS6d= zO?WMLNMwkL2;H`bZ@5+L_4@3MX8XmI5|qfxsj}$AfKM?%H|l})Yttw(<>zSf^}rqQ^MA}coYYVK(Q7>GhiUuc z${xCjvd`w&MIU}pfKRhb;XMsMXINmy2i-}^sUw=|1pn$$98FRi2rB9+R;a;6~fxl?~TJ;rMl$xRda5T${3Oy zd3HcHr@kNhl%wU)@8x_Z#hQLecs%;xTy`Fx5_w)|6e>%MdX`6KVIhaWG3nCOEP4Zc zd-0UnYP0|^pHUX&4^3ZECd?_G@4IEMKXdwgzJgU;s0@9;twqtX(*89#du}e1&FB~W zxU)H|w`<`#p%2|cPDbPn;=b1QYjjo68JYvb{1g7l*k-L~rzh%nWP=ro;f$?0Xia_J z-#8hPuJSide|3d)9@zT7Aa5Lph|XG?eXhijZ9Vz`F*e5TE`nKf_5H%GU%lG8>pso5 zueQ!u;?O`358-y-b@osD&mp!Lj`!Y@q{lS*-PTEUI?{PM<>mmKq%`PIU@{W)YAs0C z$Jc33XWO2BVmwWd&(H_br*8Cz`s7b|&mTILd*BOsAgwyT7?G^zK+Y3F`h3yTwO=aW zy#Hbv=Bh?;sNA5NJ!4v#r{NBKfF^>lzq zb$pN|ZU^7_g)Bk$*;kFFs=e0BnN0oS?Gody?T2{karT%c2aoy=41CE?U`<+E@hn+O zlbdqBhBeV6f+J~4DPrg4v@DAOSKpi)vqz59DP*iZW$o<_9b-s=3?DLb$R**>0pE6R zH?fFs=9V4@q$r^4b<9J@lzrO!?$l0sSMxj<5-Zb>m|=n?NT2|_D0xvAH7I0QtdNQO zJ(_tKvOPELAeGLPRQL_P-^s+nJ=g@#ux^GYXpUE{ZwY%4mtMy` zdD-kT#=b{X9jwOZtT&0DvoK!6%*}kuA9^XrlfM`1d(0Ud7u{|%Ik|RN`|DOdG1q6r z1{16?I=LhQ`+2%b^zuJvamYnhSH{cONPldZdayI)YQEYRt-cIG5jmdDW*H}iH2NvA zXgf!$iFMgbydF8^ABJ4ZTij0d*P{@5ob|{8DVHQnpw}3AsEltK@!{1nR%n)CuKi>d2T@PY-k9ymfU~yL<&J9ht@~pg zsbzbf*zY^=DK|Z`I8|Q)#5N!|KM<`AqzObvgjXQiA^fxJ@?7pZ4#J-1X1&T-$G6IG zwWs&6zh2u%wWs3C<-V>x*>NWm*ksh9a3>h2b<*&_(vjDOHIGxx3MDOMLMqg4%m2u< zG{pMJd}m0u7SG_YTUf2_@uAq!aCI78P`uu`56<9JF*em1t$8(4-nZr^QMU)K7yX6e z$OG3;c^em`w#}qp_VU1WdywMw^1$`3MHICA1J`3eavIco(vn!eGQfG;himmbayZOd zF+21mmL+5T*2{mEFA5+U{qO65&=u9G-(S%t(!U9u$k=_u#4Agc&UD^ zGa+fiXkX27H zll;60td$0~ShuqcVcI}V-QM<8lXBOjVC{hjqV&=bm-9K2MXRc$TmK#(B`Ad84-00! zBIKOUPopJ*M<^S2;j|FIWpNa_G4`${Qu5t?qnCl{`BrVg&HY3nNT5$=N+?!)N!!&q z&I0Wm_pbgc>~fOi&LgRM{h@bR*%w$JOb}s2b~jwpjC9GeUhL@tStLxM^@#0~9vNmk z!=bWPtm!2>Ct{ZaWhL_dg=sbxtI`?UY(s{cWdi36hm`YjV#_nu1YR2SRS^ z!Fzhk4da8dp7>^OPI}yycYu#0iI%6cHuUPGL#>Q(>QOw_6w1nva1Rr@{_#58*rSS#BR!2%5`H^JUW8LYM5t6CBi-t*er=)B!pCRzmQ8EXmAzy>l%Hj7up{f%TBR9RMK}mW|MUBQmIAG3NCQ{u z0~@L-=DVK_(`hN3LD;F!`p258yoJnVXF-f+t5AL#Gh)z(``7@hIuwzYQrmR zc)bmOXu~vFnD85H!#*~A?<`~gk?l`SGvA3e9BadwHoVY=SJ-fa4R5#MRvSKL!#8dC zfenw@aKLnv&M7v$(1wLJth8Z+4R5yLW*gpX!-s6R(}pkF@NFA**zi*u#-C}@_1f@s z8=hms`8NEz4XbUq!G@b`xY>sH+VBY*9d$J8PZ0NV)*KN4UhBw&odp7*J z4Ii-K9vi-9!)bOs>dNKMGj=^bWWz&Fy*eIF05^{lrEW?MDl)L}pn=caZD7w}?$3;U z-6_4hNBVaqeXvZvWhs-7X+5lf9K$B+5tt0KOO70fdIn~UFN*aWqGWIRR0(`9SQqm;?N zf}WCJu0`s6O4%h}PJRrmb5 z_^R#UZ!!5O(IxNhvJl^;5x(=Gab-l<1-N(rmV7wrDq5MOr<93bz9l{>hr}cKmhh~6 z{AaIRd3J5ML6z`3-J8$PE68eo_##~X9U$&QBAml&o8Rf zpQNiuOA)`st%y_N!&DM}wIVKwN6jr=rU;`J6a|7cB{=Y#TT^ah(4{O`Qycz*UZo|K zr4bejgXSy0s#5z}5VT=YK;n_`5=P-q;YZ;vNhnuTbWCiYICtOpgv6wNp5*=m1`bLY zJS27KNyCPZIC-RZ)aWr|$DJ}h?bOpIoIY{Vz5Z6Eh{c5UB05M{E90pR#sM3f1{>0 z5WMQ@RjaT0=9;zFUZ>_%)#R)y4;0i?6_-lwuB0s$Q};Erf>Je!mQ1^kQj$ap5>jf{=b z56da_3cf0J|1H;JTV!0~UQU|jxL5G^8rz@ro_O86O#I@n1ovX?Ek%|D6Jgeb?QlKSvM87ZZSbtSekQhK$|E6Kmfdw^aorI%W)CB_Qvr%Ely zPU4d~bxJ1VQx}~kYC5eXZ5dN#%<-x;W`ttCYSgKGEhoN8zNO5PC$W*1AoP?H9Z#uB zokwXwW)6_@Nehb%nXU6Aqp9R;lCE88PfmSL3DqbeZN0_i)ooDPv6H7R z`c6@2h2wMb^VRC}YSQXG#op`G&|wOrhLiuVo}Tn9>9hZx^rnZ?tEP>bHgFYj)extw zIx3*r@jc1un_U!h@;@yc-&fE7<>Xw}N~=gWKpz$gIbYHuom%Wl&8hD*)QoU?z14RW zwJP;xMndV|ReH3LQL~gWQbw&(9fQ-39B9gOMvwL+xsn)Vd@y5MC@_T%IE1|lKfkF|&gSBdxJJjbsld zzrtj*-;$G6{j?eC%Xx7YqY$^PD&X#8`vLjSVtZ@HWyzm5ds&J_Ut+hTu@w7*;9jl0+WuC~8N z+23_;()`k9?#x3GPbjc&-~JeK}L)U`k?&MDuWdjps?}#aHhxMYIGmf zCn`B6CnqOXe$&&5OFVir3YNsV)miE3iwoeNd%e1exeLn*`6;!kdKEu6K6rV-?FP8{ zC!hcMK>_b^|I!!-&A;Q_j<@ksGhgz_+~wSSQ@T(7$RMZxp=D*v4D z-v6|L>tB@XtNnArAK#+?S(|^<10RkcF}imB>egLf-?09MZ*6GY7`n0Prf+Zh&duMw z<<{?g|F$3e@JF}*_$NQze8-(X`}r^Kx_iqne|68jzy8f{xBl0C_doF9Ll1A;{>Y<` zJ^sY+ns@Bnwfo6Edt3HB_4G5(KKK0o0|#Gt@uinvIrQplufOs8H{WXg!`pv+=TCqB zi`DjS`+M(y@YjwH|MvHfK0bWp=qI0k_BpC+{>KcO6Ek4G5`*U7UH*S}`u}74|04$3 ziQP4W?B8AfSk8mxfZq9y;9F$LoF6iZ-M*Xnj$BLJ)Z?4mzunw7_4wuvcsKW(dwhSl z$G1FL8JV6uYZ>`1(kHT}ZpO$-{CTAguW@mCWl7c53j#%fa`>UxFRCrAnYZkU(&9jF z*`q0Mc+_&!}WE8Vq;m+tzW+$!l$R#71V7|Zk0AZqhN6z z>opd21qB-j>P@TLP)8`mvaYPG%X6^@^t?zN?XK!meeS#+g*)&@!_eR(BCFW1F#!gsk>1p~c#u=CgD4_bbS zzeUuG!zXcg%f-};a3_RUA-hr8K?uJ?ILLQ+pNIj<;)4aPup!stnXrRd~ya zDoZL#YrH+n*;RilN&{41dB9s-RZ{A$TJEiOc=Zy~B+^}laek9&Kegm&GVMTeF&Q`6 z)jPkORn>Gb(=trW6Yt8E6X0`$Usb$wOqb8}>qxrm+(r5?Db-CO(vLS-D}-6JaPCBN zVjSsTr#yblcyEzi3TZ`=p-JI*|D(o3+KP&*t0iIy-J>}eq8%5mdyV!;rI&PyYE}fL z!fU;0rB^Xhl`r>}uB;BMKJ_1`w~VG{4`M}Rw77`Y;524wu-=uWE351y!O?b49IZ!G z>4#o*ydC_r1=$O3T{GeF-?yBX^Mk`lj~;vLYw0eEI_K=AGC$QWy_iP0dMW2+GEvno ztu0?!T~T_uGY&5;DX$GI4V*b`Qgw+Lhz*%e_*dfYKhUiPmL#fy(-PFc`JVkr%?Z_S z%rWu;cY2k25|bqY{rsNtD)lDD`R;#Gj5=w`;OdmZLFp1k;@dY$slQ{sW`}VNjaNeh zNopu*3|*L@hEC(VCZ&1k#H8sXcYD;ZKtDC4B#HDBm1k;vO`q17{ZYcqSi>9$aK*={ zc*5XP?MiT|1WM)_6t4zN^Qb{nk~{jfChm`Kc2~z0_9^HuY3(MB0I;MlX}Q(V`6>II zytSOJ)E_VbCvUv(5kq|ahsUbnvs0T*NtAN@Z|uz2brSq&?pKBo0k!)_k5e?W6`fh#p$rBZLH)LSZbkUC%6 zSN9*(M-3`*QwMQU2fDpTxpHSJwFDC`SDz@=XMWU|){ErtGH%9vgn7r#PZaF4AsFYo zHyRe7%Xu-zNvnVVKB_-?>_0_XaD1Udt9!DPdLHxFFGz@AU)`Sis`&YR!uj6j<4k?F zQbRvC(1o6)L|1?1@+K;8Nq^;Cn5?|e#alDHMYWcpDQj(#kqc@`;E{~o8&%x%-G@%@t4 zZify%esd{8`b!yWoIFS!)kLKa9qA@b_Tn{N{Ym@RUni3*Pi z*Oe%BD`usgrpcG-A5I&c%QB(>v%&UL3NH6Iw?yW13TrdLxd&{Xi z1Z14Bavf_KCLDG^j2bX4Ne#F;p}?j4qutMj$D2B&Zim-&)t^JF*RMb`(3L2N?VgA9 zp%WA6D;KF@3k&Ek^VBfc`O4HhnOVblL8e^86V&iPD(zzk?PIVS?i!#>uf$D{iS%#k zb13y`_wVNZCuldnLJs9*1ZA9dWBNP&yu=<)=cjZ;_V?v1xqgNDi=FR@;JYwG>^|U1 zajO)@mK4U86xveCl>W{AkGI?J(BWq=>i>Y5;)K`vC+!l(*@fY8w%OGq|1KF{Ih1e> zaWlsERYMj6skoRm1Nj|E>M^dzzD~6AKg4<7vbFWlUo18OFRcY|4-h zLpxLF(oeRs6M7rtJ|-~{mmaGaqsUL{G`C8fV)sQU7jaO=Rx`VGjSWBk9%BQhD-Oa@ zC#lp)Ds&-^>Y?cgYUH%L)JWIus{3q1qSW>N7}6djeX}2ZGl{;Ls0Q7fT&-!bFrG1h zaey(v_+j26e}l;1p!v2R>d?curTyss>el_Wuh5P$$*F_ITTyR_DWDDny2i$Lh+95aM;2Ttu*(=%LpIGl%Y{gmgvglZ>USHCFLZ%Vv)(e0)u>`AZ3pI2%J zM%s$N{zKwvgRC_e2Zqca*x|GWhenGIDD_9oqc)99AB$K=F#kGzOyb;gkn!mSrCxPt zdNO1E%?Yi2_s2EIR>u@Z7eu8CO}l8(HNOu%GeM1;_KoOquI16awJGl~^7|$2_6My> zJ&keN?TO~TEB~O>Z!yl?XWDWJZTV}xw&fPatuIS=`}<10k8#pVm~)T#81>lyP;k5VVO8qHdferUe&1l`l!_)F}g66srs z^UeCuH8N3+4D?qcOOol+{nW^=G2dS6bQ?cfSp%IYudR~Tp;Hso=s>A!bV-S8^t58v zXxGz7)@6QM zrV8#-&5pb~Ulw+oqq_XqUN!iSe7vE{f8^s09sak;$B%SHii0+};JeN-{GmK{)Qi=G zm<6T6AS@^flr2`*@)gOgg?nc>xN3`{{{b*X*tc{w}+L*u_QVfw@&R z3t%)y6x>0Nv!l^KXP`BFU4aekD>Pi!;#1xt_TfT*hog?g9rEU?5EC__%Kb0~_J{PX8 zE>)T0I;X0#wyL6ZPN1g3#8RU!)%L-f8ki>83 zj#*S$rkg}b&Z=TWzX=Zkh*YWjrJN^pj*8B$%`ROQT(P3Grl6*@7GkJVV&(@bE-t5% ziYgXW!nb0-Gg9pGs;aIGR?mf1E(wrnVG5;+%bcQWO89(N@`42punm8KtTHlJ;YI8{#E8#scxLDh2n=VTL+@7t?@rvs7y&4dY@6qz+O86{UfmROHZWK}9L@ z{F9^e=HwSu(~4eHm z>RPTqEG#FTT1inb^=*565sSsj7oAsCRFYS|tcEKOl=?N@2IiLO_3<~_LlMN!&ee&RkDtBlgoV z^39a1zd26P-%M*d%zWE^femGLk@zpcNZKrZb-0y4FNUc}4acy+)cKcki2pi_M`QpfRX$lAEPCLe`0^%0hIjx93$!7jS+tjW28*aVZ{9vjJT&l6rqn8q07Ja zmwdvXN!NSA-@i6r|F>d4vGASA!HI>x{%_^*U!Tqin}9t_pRfsd|MhwMH>B{tyh#+~ znDv({Dn<_=`)vOY;s5zN-?{T7^`|?nJ2~j=@e9X)?HxMAMNB9cz4rCjyz27Tu6S)q z58sT(FC2Qa^%JGexYmS3RaWPm2w#5t-buC%vurrih8Z@TX2WzFrrFSI!&Do(ZFsbg zq4Rq-Y_;JVHauj*7j3xThR@ir#fH0W*lfecY`D#a57=<44Y%0vHXGh(!v-5V@vpJJ z12(L%VWAC|*wAmo3>&7~@N^q`ZRob)(O6UNzD)S82s(Gz_LdD>ZFtCr`)$}_!)6<9 zwc%zPZnEJj8y4EIz=jz%Ot)d04ZSu@wPCUi-8NJ67^?HGPnht$A)*?=`K|O{LVnuoY>z2TssI^0Ps5CKFk~7 z&j6E9R9ctjQiFiYFk8mDR0%L`2)ujz2%N`-=uO}Sz@=>5mx2pCG*YPtzy-dIkvNr? z^BzpW7?<(_zrZX6SED%3!bn;HVC-n(#NG|e!PJqi==^LH96vV#Cyp_AI&kh-(!#$V z*ou*~1b%OvDeq<=dcbs8fp=rX&lX_9cw?UkoMq!J!23@{R~d0W0PMtkB>6c_snalu z{G1LfJ{=x`&;*z;k>Y_T0#C&hh#%nBXaq~ZmjZWUq%6CE?_wkm9|6xzM=lThEZ{dW zLgzKWUt`42R^Z4plzNPp8@<4DFcNWNV zux2J@!A}4;->+am1XP&M*H9i5q}Ku zo3qhD1il7%6GrmC3HTbDjxy{;R_WCo@+mlQyB`@O@W+4y&nHgsrNA{92`lh+8yEOC zM)IaEpqerJ@t+R#V-A5A058J40bU3!!nA^y0H^06j|-jwtipT*UJZ=TC;!x4B9Lo1 zDj+X#0x!l$9+m+AhLL*z2v`SmOz0`F`cmq0Jn;ZeTS`9#KOOiOW+Ax1GcKp!flmVt zDB_F}96fnzCPw0~SfPi2)u3u>axM>fUYuQ9|L?9lY#vkz?5=hp9-90<9=Ys#%~1v4wH@lX5c3np~L6E zd#*6}y}-;0+8cfXz#n2H4=uoPRkSzoG~ksO$$tQNH%9zy0bT<$@m}yXz)vwP;GYAp zt2KBXFg9RtH*gb1>Pz6+LFyO(Gl36cWc=I)jJe7#FR%mSK9xAd?rPc!xWKqorXIb( zKC7uC?A^dTjFeH}6cji}|C$C|^G(WvAAvu_NdLMW*ol#{h`iJYjFiy}T#MO^|E<7d zn62PyEn4NTC7csuorkQM#|U%Z2AS?*lz+pd6%J23o!p~L)!x2w=fd_2H-x7ghel;ddJ2E zKJZK9U*J2xGGnR0`|mYl<^#ZA{Tf=4*1f>ZzcF))z(W|RFM-LwHMqcCm{$B3Y^7Y7 z_rPxf&fEt7cmiz(*l#=I2zWAZHb&~S8u&a$^0{B|M`<(o*$?dVn2FyDy!CNTeX-vR z{1Zm{y9J#5gu%0b7N!nA0`J=a9~}Gv;Q2eD8+ab@SGy=L_`Sf>c2j=vEMQI>x7rku!F9D8!#o%ec zGK}~an0d&w!A)nZ<0X~Kidx0O@_)*|RpHd&#F9hzx$e8d9Fzz$z2zzv)s?#tM zR_^J@y`#@*O9JJdkKh93uFO`(B7t%bM(hRdwsE-&Blk_jUZC775&r^*es1gqiVVK^ z5h(W^1Q#fG8w3|9_YedZ_%j=qy9jcRK4*h{2a#nJvb@yloP3GDZuz`pea_8lj%S3(5)7nyGI3GBTmuut#BUii0J*caT% z*bRKgB%m^W!5Bk+obSTB7)#w<-|pWs#!(55d-VgjkL&tQeT{D_*>P`v7yrcVe5d`D zZ_4C+Z{picB|G1@{f%)UBKc#ylDJ?J zFeo6d!5tM12wG~@phAl)QCXr!=ly+8o*N!wz=-|-Kkxhb^yuL{_qk`znVB;)XU@!h zZl+Jy)}hN%+g+J`Oy%_Hvu4p@w{5H}wT=6A`z2jB*2QkY>U#Qgu6LE{wg3KF-xNIhd_u>?8%ssPDEQNO+lsj@V1P;m*Wdl|tmcC^ma4~m zb=UY0-qodNRR@1v@mlG<(M215U+xR;(}X@&A@E~-|I&@G=l^D7MP+IBdalJE`|hHW zib{W*{^IXPi!03E_WWmvT~)W~@Bj9~wyN8He2*K0Gu}<1vff|1%E86 ztM&D{o~jp(L$utdUpO4&)K;_fy=A+4s`XVHsWw%OG~~RQYLx1a$$7VK-Si%1y}9T;p*IWPIVmg|48Wz^z`r+ROM`Z@uMq?%Y`|=aYEMpjhX+;zt`H>DNxW*4BObcV2YSMJ1yKcPmtz zHa2DQ5VJLDHs|K{C6`{5=CUlmWX(m4_n7|hU%9UBv;F&votNTkotqOGY0Vl%nyVkG zqFt=3y#{^gPiFXYu)7xD? zdVrfhHqqTaF~QwECEh(Tx0hRyo$T(Kd%1gb(IofcZRfd7`D0y&r_G)Ithp{Pnu~kh zT=!SZ^?BXgWv`h_+^VqK+vbLqnafnY=mT??{@dKh?dC53)ZE;;bKT81-|TX7a@-wv z+~MxL^G>&T@nW}Z*)n(EefRnGEiNv0Yu2psw(Q9#pLAQED|Xj?VQx*ixffn|!M*(Q z%kH(;UUQo_Z+2U^Zgp?J{kD7e-FMyYo!i`&FU`IG{`+1oKKke*w`cdq?!&Lmm6w;h z{rmTOS%Iy;h}AiBsLliun#KziM<|x?NZF4omz>)1uCIbWm)bBl(w*mm0A5~^YtoTZBw=&YmjSNU^N z!Z(^b+t$U|yThFAnC$H19B1XLobB6OjeqP3f{zw_XZbAs1fMGSO9ekh@H3k`yQPb> zCBvLOG}+lRIT~}7vz?m{z-wO{+CcEX6nqoGA0>F%pK>`v7InO{eqEehHq6;Ilbzj> z<819JXInQPfOp5~{V6BunWWb8nPQ~2XS-5Ke!1T9Y|SrG>}`^>VK+FNyx3XJ!_HQ1 zaJIQD3_eQmXA6F?;4c^a48boD{JnyIMDR}w{w2X{&YX7yzf@Y4i; zli=@cZtngr=2j0g_v~bIr8(x_S!M2%%?IEc3my)fDEN~F-&*kP1b@2V`!zQ=qKmo7 z!_3W}tg&*;m8>%N_T~fd2b+epsuKQXVq*V<{s~F`tHGT*v^_04y4|_e9TNJdBqt{& zr6k71B_ySt(V>0&wx^wYZkx1FhoofP*8j=+kd%}b(~%D6o*NaqpOTt5ASF)24@gXi z>z|NzIvv`!jcy&fpPU+>kdly?lqh&GJM;9In0_G~>5`I~5|n`_N1T*)raCafY0<5t z+6c*H#!pE}j!Q{9wMEMa-B*VWp$_fR1Rs~c0EsDSC%0(Pvg*Fa@wDhDA(>n~e%gsA zv}kc&Uq3*Mr?R!~3;!hG6H;{lgchfs7s73DCr}W4T3kZv`6(#_Qqo#6K+A}ePWsg` z#~gFYU~uFW~H-xSu#6H8~|EbwFz5K^=6zeJ4MD|J0 z#LyI)A+2MFGX{%(#!vK91YAq&6Co71694@8U3#aA#i;{QQauqK$AJIBKP{cEhA#Pv!@IIDishMnWmQqxkC2c%YEDHBpvk`uf2PmFC)@2K-bH{exrlFU`;e%d*) z&6@nOUcKgngdr%Vro>5*4%|=Z(Y+f%(%Ck-H(ikNriXczk4!K};Udy;qIfVdHC|lM{L!3@!aQ zxTGF5xa_N~&#Gve9k*T1#d_83s`_*Mxh#!Qvs!JwT(*m=;m;l3PYL|F3of|8`y+EQ z&aL)69+=V3-85!^TQnunt-fx6E52)v>#;#Th3wp*zndE_-vOUthT6aV?QibxyYF^O zmMn3(xw-D%d++tW!XuA7;{CzLAAj88E4;b>0e83jjbix<&p-dXd;Rs-y>GDNgEIHQ z2Oqc{J9fBFKKaCb`st_c%P)3&-(c_Fz3#j3zH>SI&8?EJu=(3CI~&_t8(j}=bkfU( zBel`Z)JAukHoE&=b6f4Y*wb#9ZE%xqi_5Wh+$!6t{rkW^<6^ZT4vi4JHrs`#3;t}u z#|u71@RtgHvfytN{1U-GEcllNUsk=({MSzr`~K^v{GaqwTDhvys#Pl~k>Z#w`L|U> z+t}FHPJD`L)heP@>rRo)jyvwx@`qbScWB$TecRaP&6;*RR@bdsw`t#AeVaFnjE#wn zai>Ig>JWSCQL)X{;kaXu{q-rW+jfXO`lt@S4t)_7)uB^tjr-FJhZTp4g~fqiFSwjXkwVL&pDA#4lRt>gYB{ zHE9x~b3p61C)YnkcLj2)t~GzmDJQgV6B8R7(_Z*%{!TG5r^Upyj`8%Jq7tRjy0yP_ zSxps-Z={a$m3^(Jwzk6eK_B`H&P6IWs7CI&`-5sd7o~rHR{4dX<+1ypFUV{6Z9}!p z{QsjIiu%LN4ZcUKo){S!*;+02G}U%Znl#Y~$jLImDY?-4^JS{Xss zO`Qt7ZKjI&M=f2t^tak~p4h#6_rE^>{PTZn@A=@f&pz9!wrtOyJ-c---SN&l@2q<1 zrI&8i^FlFw`t*_Hdz!Rq_;GZ)^6U0f_{UnaF(2QqUAs1F;T2)(x|E1ZFTFJGY!!7r zS#iYMbdI)?k`nv(zyEF8Pfc+b0#sI3R%SYX8}~(n=?wnvu3fu660PsQ@x~kXJoC&m zS^fL>@2YWFr&ClXPpJ_B9fAlIxwz2 z|0Mjs`syo_FO$=zO`GoG;ewAp{@4`Lt>$xSX{r6=AOG-pYJEKJtj+fA+wGtK{HMQ$ zrl88_@t-Agd%pPMiweozw;FTTH{X0?Uw--JS8u-g=3^gz_+gpm`WhI~`4{P1cj2%A z*q@5O{3+91)fN1M3SWcDngkX6;T3K0nQLl52QBynRXAHvwdNMo;Jctb68xWg?z#C| z$7spKJZO3L*=Ics$cN%h#u_Njdi2ef3pO18XS# zH`YP1dP2C>Mc3cz`%3OhhtCoXb=BXN`}XZKZ9`uEd-m+v4mqZ>28x^66Hh#0T62@n z>~)wmU`-TP^A+4TY}jDv%C>FW{AXyu1|Vr`g_p`?g3|(Eqv=kN?w8Kb>>hX{U9U55GY6(zG6)25b&%0AHbpwE%ZM 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 H#ex3;_fXA_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/util.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..0d5bd7a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,1984 @@ +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, cache_from_source, urlopen, urljoin, httplib, + xmlrpclib, HTTPHandler, BaseConfigurator, valid_ident, Container, configparser, URLError, ZipFile, + fsdecode, unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + # Some packages have a trailing comma which would break things + # See issue #148 + if not ver_remaining: + break + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): + # The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as + # changes to the stub launcher mean that sys.executable always points + # to the stub on OS X + # if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' + # in os.environ): + # result = os.environ['__PYVENV_LAUNCHER__'] + # else: + # result = sys.executable + # return result + # Avoid normcasing: see issue #143 + # result = os.path.normcase(sys.executable) + result = sys.executable + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + # entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + + def __init__(self, func): + self.func = func + # for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + # obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + if not isinstance(hashed_invalidation, py_compile.PycInvalidationMode): + hashed_invalidation = py_compile.PycInvalidationMode.CHECKED_HASH + compile_kwargs['invalidation_mode'] = hashed_invalidation + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and self.prefix == other.prefix and self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile( + r'''(?P([^\[]\S*)) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path, use_abspath=True): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path) if use_abspath else path) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result + + +# +# Extended metadata functionality +# + + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + # data = reader.read().decode('utf-8') + # result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix, use_abspath=True): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix, use_abspath=use_abspath) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, args, kwargs, result) + return result + + +# +# Simple sequencing +# +class Sequencer(object): + + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + # http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node], lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node], index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: + break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', '.whl') + + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + + # Limit extraction of dangerous items, if this Python + # allows it easily. If not, just trust the input. + # See: https://docs.python.org/3/library/tarfile.html#extraction-filters + def extraction_filter(member, path): + """Run tarfile.tar_filter, but raise the expected ValueError""" + # This is only called if the current Python has tarfile filters + try: + return tarfile.tar_filter(member, path) + except tarfile.FilterError as exc: + raise ValueError(str(exc)) + + archive.extraction_filter = extraction_filter + + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G', 'T', 'P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + # elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + # import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + # import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, CertificateError) + + # + # HTTPSConnection which verifies certificates/matches domains + # + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if getattr(self, 'cert_file', None): + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + + +# +# XML-RPC with timeouts +# +class Transport(xmlrpclib.Transport): + + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + return self._connection[1] + + +if ssl: + + class SafeTransport(xmlrpclib.SafeTransport): + + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, **kwargs) + return self._connection[1] + + +class ServerProxy(xmlrpclib.ServerProxy): + + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + # scheme = splittype(uri) # deprecated as of Python 3.8 + scheme = urlparse(uri)[0] + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + + +class CSVWriter(CSVBase): + + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + + +# +# Configurator functionality +# + + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() + + +# def _get_pypirc_command(): +# """ +# Get the distutils command for interacting with PyPI configurations. +# :return: the command. +# """ +# from distutils.core import Distribution +# from distutils.config import PyPIRCCommand +# d = Distribution() +# return PyPIRCCommand(d) + + +class PyPIRCFile(object): + + DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/' + DEFAULT_REALM = 'pypi' + + def __init__(self, fn=None, url=None): + if fn is None: + fn = os.path.join(os.path.expanduser('~'), '.pypirc') + self.filename = fn + self.url = url + + def read(self): + result = {} + + if os.path.exists(self.filename): + repository = self.url or self.DEFAULT_REPOSITORY + + config = configparser.RawConfigParser() + config.read(self.filename) + sections = config.sections() + if 'distutils' in sections: + # let's get the list of servers + index_servers = config.get('distutils', 'index-servers') + _servers = [server.strip() for server in index_servers.split('\n') if server.strip() != ''] + if _servers == []: + # nothing set, let's try to get the default pypi + if 'pypi' in sections: + _servers = ['pypi'] + else: + for server in _servers: + result = {'server': server} + result['username'] = config.get(server, 'username') + + # optional params + for key, default in (('repository', self.DEFAULT_REPOSITORY), ('realm', self.DEFAULT_REALM), + ('password', None)): + if config.has_option(server, key): + result[key] = config.get(server, key) + else: + result[key] = default + + # work around people having "repository" for the "pypi" + # section of their config set to the HTTP (rather than + # HTTPS) URL + if (server == 'pypi' and repository in (self.DEFAULT_REPOSITORY, 'pypi')): + result['repository'] = self.DEFAULT_REPOSITORY + elif (result['server'] != repository and result['repository'] != repository): + result = {} + elif 'server-login' in sections: + # old format + server = 'server-login' + if config.has_option(server, 'repository'): + repository = config.get(server, 'repository') + else: + repository = self.DEFAULT_REPOSITORY + result = { + 'username': config.get(server, 'username'), + 'password': config.get(server, 'password'), + 'repository': repository, + 'server': server, + 'realm': self.DEFAULT_REALM + } + return result + + def update(self, username, password): + # import pdb; pdb.set_trace() + config = configparser.RawConfigParser() + fn = self.filename + config.read(fn) + if not config.has_section('pypi'): + config.add_section('pypi') + config.set('pypi', 'username', username) + config.set('pypi', 'password', password) + with open(fn, 'w') as f: + config.write(f) + + +def _load_pypirc(index): + """ + Read the PyPI access configuration as supported by distutils. + """ + return PyPIRCFile(url=index.url).read() + + +def _store_pypirc(index): + PyPIRCFile().update(index.username, index.password) + + +# +# get_platform()/get_host_platform() copied from Python 3.10.a0 source, with some minor +# tweaks +# + + +def get_host_platform(): + """Return a string that identifies the current platform. This is used mainly to + distinguish platform-specific build directories and platform-specific built + distributions. Typically includes the OS name and version and the + architecture (as supplied by 'os.uname()'), although the exact information + included depends on the OS; eg. on Linux, the kernel version isn't + particularly important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + + """ + if os.name == 'nt': + if 'amd64' in sys.version.lower(): + return 'win-amd64' + if '(arm)' in sys.version.lower(): + return 'win-arm32' + if '(arm64)' in sys.version.lower(): + return 'win-arm64' + return sys.platform + + # Set for cross builds explicitly + if "_PYTHON_HOST_PLATFORM" in os.environ: + return os.environ["_PYTHON_HOST_PLATFORM"] + + if os.name != 'posix' or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + + (osname, host, release, version, machine) = os.uname() + + # Convert the OS name to lowercase, remove '/' characters, and translate + # spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_').replace('/', '-') + + if osname[:5] == 'linux': + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + + elif osname[:5] == 'sunos': + if release[0] >= '5': # SunOS 5 == Solaris 2 + osname = 'solaris' + release = '%d.%s' % (int(release[0]) - 3, release[2:]) + # We can't use 'platform.architecture()[0]' because a + # bootstrap problem. We use a dict to get an error + # if some suspicious happens. + bitness = {2147483647: '32bit', 9223372036854775807: '64bit'} + machine += '.%s' % bitness[sys.maxsize] + # fall through to standard osname-release-machine representation + elif osname[:3] == 'aix': + from _aix_support import aix_platform + return aix_platform() + elif osname[:6] == 'cygwin': + osname = 'cygwin' + rel_re = re.compile(r'[\d.]+', re.ASCII) + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == 'darwin': + import _osx_support + try: + from distutils import sysconfig + except ImportError: + import sysconfig + osname, release, machine = _osx_support.get_platform_osx(sysconfig.get_config_vars(), osname, release, machine) + + return '%s-%s-%s' % (osname, release, machine) + + +_TARGET_TO_PLAT = { + 'x86': 'win32', + 'x64': 'win-amd64', + 'arm': 'win-arm32', +} + + +def get_platform(): + if os.name != 'nt': + return get_host_platform() + cross_compilation_target = os.environ.get('VSCMD_ARG_TGT_ARCH') + if cross_compilation_target not in _TARGET_TO_PLAT: + return get_host_platform() + return _TARGET_TO_PLAT[cross_compilation_target] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/version.py b/env/lib/python3.12/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..d70a96e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,750 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2023 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|alpha|b|beta|c|rc|pre|preview)(\d+)?)?' + r'(\.(post|r|rev)(\d+)?)?([._-]?(dev)(\d+)?)?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$', re.I) + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0][:-1]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + if pre[1] is None: + pre = pre[0], 0 + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + if post[1] is None: + post = post[0], 0 + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + if dev[1] is None: + dev = dev[0], 0 + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + # import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + # import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + # TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + # See issue #140. Be tolerant of a single trailing comma. + if s.endswith(','): + s = s[:-1] + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe b/env/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..4ee2d3a31b59e8b50f433ecdf0be9e496e8cc3b8 GIT binary patch literal 91648 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe b/env/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe new file mode 100644 index 0000000000000000000000000000000000000000..951d5817c9e6d81c94a173a0d9fead7f1f143331 GIT binary patch literal 168448 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe b/env/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..5763076d2878093971a0ef9870e1cde7f556b18b GIT binary patch literal 101888 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

                                              # pre-release
    +            [-_\.]?
    +            (?Palpha|a|beta|b|preview|pre|c|rc)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +        (?P                                         # post release
    +            (?:-(?P[0-9]+))
    +            |
    +            (?:
    +                [-_\.]?
    +                (?Ppost|rev|r)
    +                [-_\.]?
    +                (?P[0-9]+)?
    +            )
    +        )?
    +        (?P                                          # dev release
    +            [-_\.]?
    +            (?Pdev)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +    )
    +    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    +"""
    +
    +VERSION_PATTERN = _VERSION_PATTERN
    +"""
    +A string containing the regular expression used to match a valid version.
    +
    +The pattern is not anchored at either end, and is intended for embedding in larger
    +expressions (for example, matching a version number as part of a file name). The
    +regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
    +flags set.
    +
    +:meta hide-value:
    +"""
    +
    +
    +class Version(_BaseVersion):
    +    """This class abstracts handling of a project's versions.
    +
    +    A :class:`Version` instance is comparison aware and can be compared and
    +    sorted using the standard Python interfaces.
    +
    +    >>> v1 = Version("1.0a5")
    +    >>> v2 = Version("1.0")
    +    >>> v1
    +    
    +    >>> v2
    +    
    +    >>> v1 < v2
    +    True
    +    >>> v1 == v2
    +    False
    +    >>> v1 > v2
    +    False
    +    >>> v1 >= v2
    +    False
    +    >>> v1 <= v2
    +    True
    +    """
    +
    +    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
    +    _key: CmpKey
    +
    +    def __init__(self, version: str) -> None:
    +        """Initialize a Version object.
    +
    +        :param version:
    +            The string representation of a version which will be parsed and normalized
    +            before use.
    +        :raises InvalidVersion:
    +            If the ``version`` does not conform to PEP 440 in any way then this
    +            exception will be raised.
    +        """
    +
    +        # Validate the version and parse it into pieces
    +        match = self._regex.search(version)
    +        if not match:
    +            raise InvalidVersion(f"Invalid version: '{version}'")
    +
    +        # Store the parsed out pieces of the version
    +        self._version = _Version(
    +            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
    +            release=tuple(int(i) for i in match.group("release").split(".")),
    +            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
    +            post=_parse_letter_version(
    +                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
    +            ),
    +            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
    +            local=_parse_local_version(match.group("local")),
    +        )
    +
    +        # Generate a key which will be used for sorting
    +        self._key = _cmpkey(
    +            self._version.epoch,
    +            self._version.release,
    +            self._version.pre,
    +            self._version.post,
    +            self._version.dev,
    +            self._version.local,
    +        )
    +
    +    def __repr__(self) -> str:
    +        """A representation of the Version that shows all internal state.
    +
    +        >>> Version('1.0.0')
    +        
    +        """
    +        return f""
    +
    +    def __str__(self) -> str:
    +        """A string representation of the version that can be rounded-tripped.
    +
    +        >>> str(Version("1.0a5"))
    +        '1.0a5'
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        # Pre-release
    +        if self.pre is not None:
    +            parts.append("".join(str(x) for x in self.pre))
    +
    +        # Post-release
    +        if self.post is not None:
    +            parts.append(f".post{self.post}")
    +
    +        # Development release
    +        if self.dev is not None:
    +            parts.append(f".dev{self.dev}")
    +
    +        # Local version segment
    +        if self.local is not None:
    +            parts.append(f"+{self.local}")
    +
    +        return "".join(parts)
    +
    +    @property
    +    def epoch(self) -> int:
    +        """The epoch of the version.
    +
    +        >>> Version("2.0.0").epoch
    +        0
    +        >>> Version("1!2.0.0").epoch
    +        1
    +        """
    +        return self._version.epoch
    +
    +    @property
    +    def release(self) -> tuple[int, ...]:
    +        """The components of the "release" segment of the version.
    +
    +        >>> Version("1.2.3").release
    +        (1, 2, 3)
    +        >>> Version("2.0.0").release
    +        (2, 0, 0)
    +        >>> Version("1!2.0.0.post0").release
    +        (2, 0, 0)
    +
    +        Includes trailing zeroes but not the epoch or any pre-release / development /
    +        post-release suffixes.
    +        """
    +        return self._version.release
    +
    +    @property
    +    def pre(self) -> tuple[str, int] | None:
    +        """The pre-release segment of the version.
    +
    +        >>> print(Version("1.2.3").pre)
    +        None
    +        >>> Version("1.2.3a1").pre
    +        ('a', 1)
    +        >>> Version("1.2.3b1").pre
    +        ('b', 1)
    +        >>> Version("1.2.3rc1").pre
    +        ('rc', 1)
    +        """
    +        return self._version.pre
    +
    +    @property
    +    def post(self) -> int | None:
    +        """The post-release number of the version.
    +
    +        >>> print(Version("1.2.3").post)
    +        None
    +        >>> Version("1.2.3.post1").post
    +        1
    +        """
    +        return self._version.post[1] if self._version.post else None
    +
    +    @property
    +    def dev(self) -> int | None:
    +        """The development number of the version.
    +
    +        >>> print(Version("1.2.3").dev)
    +        None
    +        >>> Version("1.2.3.dev1").dev
    +        1
    +        """
    +        return self._version.dev[1] if self._version.dev else None
    +
    +    @property
    +    def local(self) -> str | None:
    +        """The local version segment of the version.
    +
    +        >>> print(Version("1.2.3").local)
    +        None
    +        >>> Version("1.2.3+abc").local
    +        'abc'
    +        """
    +        if self._version.local:
    +            return ".".join(str(x) for x in self._version.local)
    +        else:
    +            return None
    +
    +    @property
    +    def public(self) -> str:
    +        """The public portion of the version.
    +
    +        >>> Version("1.2.3").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc.dev1").public
    +        '1.2.3'
    +        """
    +        return str(self).split("+", 1)[0]
    +
    +    @property
    +    def base_version(self) -> str:
    +        """The "base version" of the version.
    +
    +        >>> Version("1.2.3").base_version
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").base_version
    +        '1.2.3'
    +        >>> Version("1!1.2.3+abc.dev1").base_version
    +        '1!1.2.3'
    +
    +        The "base version" is the public version of the project without any pre or post
    +        release markers.
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        return "".join(parts)
    +
    +    @property
    +    def is_prerelease(self) -> bool:
    +        """Whether this version is a pre-release.
    +
    +        >>> Version("1.2.3").is_prerelease
    +        False
    +        >>> Version("1.2.3a1").is_prerelease
    +        True
    +        >>> Version("1.2.3b1").is_prerelease
    +        True
    +        >>> Version("1.2.3rc1").is_prerelease
    +        True
    +        >>> Version("1.2.3dev1").is_prerelease
    +        True
    +        """
    +        return self.dev is not None or self.pre is not None
    +
    +    @property
    +    def is_postrelease(self) -> bool:
    +        """Whether this version is a post-release.
    +
    +        >>> Version("1.2.3").is_postrelease
    +        False
    +        >>> Version("1.2.3.post1").is_postrelease
    +        True
    +        """
    +        return self.post is not None
    +
    +    @property
    +    def is_devrelease(self) -> bool:
    +        """Whether this version is a development release.
    +
    +        >>> Version("1.2.3").is_devrelease
    +        False
    +        >>> Version("1.2.3.dev1").is_devrelease
    +        True
    +        """
    +        return self.dev is not None
    +
    +    @property
    +    def major(self) -> int:
    +        """The first item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").major
    +        1
    +        """
    +        return self.release[0] if len(self.release) >= 1 else 0
    +
    +    @property
    +    def minor(self) -> int:
    +        """The second item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").minor
    +        2
    +        >>> Version("1").minor
    +        0
    +        """
    +        return self.release[1] if len(self.release) >= 2 else 0
    +
    +    @property
    +    def micro(self) -> int:
    +        """The third item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").micro
    +        3
    +        >>> Version("1").micro
    +        0
    +        """
    +        return self.release[2] if len(self.release) >= 3 else 0
    +
    +
    +def _parse_letter_version(
    +    letter: str | None, number: str | bytes | SupportsInt | None
    +) -> tuple[str, int] | None:
    +    if letter:
    +        # We consider there to be an implicit 0 in a pre-release if there is
    +        # not a numeral associated with it.
    +        if number is None:
    +            number = 0
    +
    +        # We normalize any letters to their lower case form
    +        letter = letter.lower()
    +
    +        # We consider some words to be alternate spellings of other words and
    +        # in those cases we want to normalize the spellings to our preferred
    +        # spelling.
    +        if letter == "alpha":
    +            letter = "a"
    +        elif letter == "beta":
    +            letter = "b"
    +        elif letter in ["c", "pre", "preview"]:
    +            letter = "rc"
    +        elif letter in ["rev", "r"]:
    +            letter = "post"
    +
    +        return letter, int(number)
    +    if not letter and number:
    +        # We assume if we are given a number, but we are not given a letter
    +        # then this is using the implicit post release syntax (e.g. 1.0-1)
    +        letter = "post"
    +
    +        return letter, int(number)
    +
    +    return None
    +
    +
    +_local_version_separators = re.compile(r"[\._-]")
    +
    +
    +def _parse_local_version(local: str | None) -> LocalType | None:
    +    """
    +    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    +    """
    +    if local is not None:
    +        return tuple(
    +            part.lower() if not part.isdigit() else int(part)
    +            for part in _local_version_separators.split(local)
    +        )
    +    return None
    +
    +
    +def _cmpkey(
    +    epoch: int,
    +    release: tuple[int, ...],
    +    pre: tuple[str, int] | None,
    +    post: tuple[str, int] | None,
    +    dev: tuple[str, int] | None,
    +    local: LocalType | None,
    +) -> CmpKey:
    +    # When we compare a release version, we want to compare it with all of the
    +    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    +    # leading zeros until we come to something non zero, then take the rest
    +    # re-reverse it back into the correct order and make it a tuple and use
    +    # that for our sorting key.
    +    _release = tuple(
    +        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
    +    )
    +
    +    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    +    # We'll do this by abusing the pre segment, but we _only_ want to do this
    +    # if there is not a pre or a post segment. If we have one of those then
    +    # the normal sorting rules will handle this case correctly.
    +    if pre is None and post is None and dev is not None:
    +        _pre: CmpPrePostDevType = NegativeInfinity
    +    # Versions without a pre-release (except as noted above) should sort after
    +    # those with one.
    +    elif pre is None:
    +        _pre = Infinity
    +    else:
    +        _pre = pre
    +
    +    # Versions without a post segment should sort before those with one.
    +    if post is None:
    +        _post: CmpPrePostDevType = NegativeInfinity
    +
    +    else:
    +        _post = post
    +
    +    # Versions without a development segment should sort after those with one.
    +    if dev is None:
    +        _dev: CmpPrePostDevType = Infinity
    +
    +    else:
    +        _dev = dev
    +
    +    if local is None:
    +        # Versions without a local segment should sort before those with one.
    +        _local: CmpLocalType = NegativeInfinity
    +    else:
    +        # Versions with a local segment need that segment parsed to implement
    +        # the sorting rules in PEP440.
    +        # - Alpha numeric segments sort before numeric segments
    +        # - Alpha numeric segments sort lexicographically
    +        # - Numeric segments sort numerically
    +        # - Shorter versions sort before longer versions when the prefixes
    +        #   match exactly
    +        _local = tuple(
    +            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
    +        )
    +
    +    return epoch, _release, _pre, _post, _dev, _local
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
    new file mode 100644
    index 0000000..57ce7f1
    --- /dev/null
    +++ b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
    @@ -0,0 +1,3676 @@
    +# TODO: Add Generic type annotations to initialized collections.
    +# For now we'd simply use implicit Any/Unknown which would add redundant annotations
    +# mypy: disable-error-code="var-annotated"
    +"""
    +Package resource API
    +--------------------
    +
    +A resource is a logical file contained within a package, or a logical
    +subdirectory thereof.  The package resource API expects resource names
    +to have their path parts separated with ``/``, *not* whatever the local
    +path separator is.  Do not use os.path operations to manipulate resource
    +names being passed into the API.
    +
    +The package resource API is designed to work with normal filesystem packages,
    +.egg files, and unpacked .egg files.  It can also work in a limited way with
    +.zip files and with custom PEP 302 loaders that support the ``get_data()``
    +method.
    +
    +This module is deprecated. Users are directed to :mod:`importlib.resources`,
    +:mod:`importlib.metadata` and :pypi:`packaging` instead.
    +"""
    +
    +from __future__ import annotations
    +
    +import sys
    +
    +if sys.version_info < (3, 8):  # noqa: UP036 # Check for unsupported versions
    +    raise RuntimeError("Python 3.8 or later is required")
    +
    +import os
    +import io
    +import time
    +import re
    +import types
    +from typing import (
    +    Any,
    +    Literal,
    +    Dict,
    +    Iterator,
    +    Mapping,
    +    MutableSequence,
    +    NamedTuple,
    +    NoReturn,
    +    Tuple,
    +    Union,
    +    TYPE_CHECKING,
    +    Protocol,
    +    Callable,
    +    Iterable,
    +    TypeVar,
    +    overload,
    +)
    +import zipfile
    +import zipimport
    +import warnings
    +import stat
    +import functools
    +import pkgutil
    +import operator
    +import platform
    +import collections
    +import plistlib
    +import email.parser
    +import errno
    +import tempfile
    +import textwrap
    +import inspect
    +import ntpath
    +import posixpath
    +import importlib
    +import importlib.abc
    +import importlib.machinery
    +from pkgutil import get_importer
    +
    +import _imp
    +
    +# capture these to bypass sandboxing
    +from os import utime
    +from os import open as os_open
    +from os.path import isdir, split
    +
    +try:
    +    from os import mkdir, rename, unlink
    +
    +    WRITE_SUPPORT = True
    +except ImportError:
    +    # no write support, probably under GAE
    +    WRITE_SUPPORT = False
    +
    +from pip._internal.utils._jaraco_text import (
    +    yield_lines,
    +    drop_comment,
    +    join_continuation,
    +)
    +from pip._vendor.packaging import markers as _packaging_markers
    +from pip._vendor.packaging import requirements as _packaging_requirements
    +from pip._vendor.packaging import utils as _packaging_utils
    +from pip._vendor.packaging import version as _packaging_version
    +from pip._vendor.platformdirs import user_cache_dir as _user_cache_dir
    +
    +if TYPE_CHECKING:
    +    from _typeshed import BytesPath, StrPath, StrOrBytesPath
    +    from pip._vendor.typing_extensions import Self
    +
    +
    +# Patch: Remove deprecation warning from vendored pkg_resources.
    +# Setting PYTHONWARNINGS=error to verify builds produce no warnings
    +# causes immediate exceptions.
    +# See https://github.com/pypa/pip/issues/12243
    +
    +
    +_T = TypeVar("_T")
    +_DistributionT = TypeVar("_DistributionT", bound="Distribution")
    +# Type aliases
    +_NestedStr = Union[str, Iterable[Union[str, Iterable["_NestedStr"]]]]
    +_InstallerTypeT = Callable[["Requirement"], "_DistributionT"]
    +_InstallerType = Callable[["Requirement"], Union["Distribution", None]]
    +_PkgReqType = Union[str, "Requirement"]
    +_EPDistType = Union["Distribution", _PkgReqType]
    +_MetadataType = Union["IResourceProvider", None]
    +_ResolvedEntryPoint = Any  # Can be any attribute in the module
    +_ResourceStream = Any  # TODO / Incomplete: A readable file-like object
    +# Any object works, but let's indicate we expect something like a module (optionally has __loader__ or __file__)
    +_ModuleLike = Union[object, types.ModuleType]
    +# Any: Should be _ModuleLike but we end up with issues where _ModuleLike doesn't have _ZipLoaderModule's __loader__
    +_ProviderFactoryType = Callable[[Any], "IResourceProvider"]
    +_DistFinderType = Callable[[_T, str, bool], Iterable["Distribution"]]
    +_NSHandlerType = Callable[[_T, str, str, types.ModuleType], Union[str, None]]
    +_AdapterT = TypeVar(
    +    "_AdapterT", _DistFinderType[Any], _ProviderFactoryType, _NSHandlerType[Any]
    +)
    +
    +
    +# Use _typeshed.importlib.LoaderProtocol once available https://github.com/python/typeshed/pull/11890
    +class _LoaderProtocol(Protocol):
    +    def load_module(self, fullname: str, /) -> types.ModuleType: ...
    +
    +
    +class _ZipLoaderModule(Protocol):
    +    __loader__: zipimport.zipimporter
    +
    +
    +_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I)
    +
    +
    +class PEP440Warning(RuntimeWarning):
    +    """
    +    Used when there is an issue with a version or specifier not complying with
    +    PEP 440.
    +    """
    +
    +
    +parse_version = _packaging_version.Version
    +
    +
    +_state_vars: dict[str, str] = {}
    +
    +
    +def _declare_state(vartype: str, varname: str, initial_value: _T) -> _T:
    +    _state_vars[varname] = vartype
    +    return initial_value
    +
    +
    +def __getstate__() -> dict[str, Any]:
    +    state = {}
    +    g = globals()
    +    for k, v in _state_vars.items():
    +        state[k] = g['_sget_' + v](g[k])
    +    return state
    +
    +
    +def __setstate__(state: dict[str, Any]) -> dict[str, Any]:
    +    g = globals()
    +    for k, v in state.items():
    +        g['_sset_' + _state_vars[k]](k, g[k], v)
    +    return state
    +
    +
    +def _sget_dict(val):
    +    return val.copy()
    +
    +
    +def _sset_dict(key, ob, state):
    +    ob.clear()
    +    ob.update(state)
    +
    +
    +def _sget_object(val):
    +    return val.__getstate__()
    +
    +
    +def _sset_object(key, ob, state):
    +    ob.__setstate__(state)
    +
    +
    +_sget_none = _sset_none = lambda *args: None
    +
    +
    +def get_supported_platform():
    +    """Return this platform's maximum compatible version.
    +
    +    distutils.util.get_platform() normally reports the minimum version
    +    of macOS that would be required to *use* extensions produced by
    +    distutils.  But what we want when checking compatibility is to know the
    +    version of macOS that we are *running*.  To allow usage of packages that
    +    explicitly require a newer version of macOS, we must also know the
    +    current version of the OS.
    +
    +    If this condition occurs for any other platform with a version in its
    +    platform strings, this function should be extended accordingly.
    +    """
    +    plat = get_build_platform()
    +    m = macosVersionString.match(plat)
    +    if m is not None and sys.platform == "darwin":
    +        try:
    +            plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3))
    +        except ValueError:
    +            # not macOS
    +            pass
    +    return plat
    +
    +
    +__all__ = [
    +    # Basic resource access and distribution/entry point discovery
    +    'require',
    +    'run_script',
    +    'get_provider',
    +    'get_distribution',
    +    'load_entry_point',
    +    'get_entry_map',
    +    'get_entry_info',
    +    'iter_entry_points',
    +    'resource_string',
    +    'resource_stream',
    +    'resource_filename',
    +    'resource_listdir',
    +    'resource_exists',
    +    'resource_isdir',
    +    # Environmental control
    +    'declare_namespace',
    +    'working_set',
    +    'add_activation_listener',
    +    'find_distributions',
    +    'set_extraction_path',
    +    'cleanup_resources',
    +    'get_default_cache',
    +    # Primary implementation classes
    +    'Environment',
    +    'WorkingSet',
    +    'ResourceManager',
    +    'Distribution',
    +    'Requirement',
    +    'EntryPoint',
    +    # Exceptions
    +    'ResolutionError',
    +    'VersionConflict',
    +    'DistributionNotFound',
    +    'UnknownExtra',
    +    'ExtractionError',
    +    # Warnings
    +    'PEP440Warning',
    +    # Parsing functions and string utilities
    +    'parse_requirements',
    +    'parse_version',
    +    'safe_name',
    +    'safe_version',
    +    'get_platform',
    +    'compatible_platforms',
    +    'yield_lines',
    +    'split_sections',
    +    'safe_extra',
    +    'to_filename',
    +    'invalid_marker',
    +    'evaluate_marker',
    +    # filesystem utilities
    +    'ensure_directory',
    +    'normalize_path',
    +    # Distribution "precedence" constants
    +    'EGG_DIST',
    +    'BINARY_DIST',
    +    'SOURCE_DIST',
    +    'CHECKOUT_DIST',
    +    'DEVELOP_DIST',
    +    # "Provider" interfaces, implementations, and registration/lookup APIs
    +    'IMetadataProvider',
    +    'IResourceProvider',
    +    'FileMetadata',
    +    'PathMetadata',
    +    'EggMetadata',
    +    'EmptyProvider',
    +    'empty_provider',
    +    'NullProvider',
    +    'EggProvider',
    +    'DefaultProvider',
    +    'ZipProvider',
    +    'register_finder',
    +    'register_namespace_handler',
    +    'register_loader_type',
    +    'fixup_namespace_packages',
    +    'get_importer',
    +    # Warnings
    +    'PkgResourcesDeprecationWarning',
    +    # Deprecated/backward compatibility only
    +    'run_main',
    +    'AvailableDistributions',
    +]
    +
    +
    +class ResolutionError(Exception):
    +    """Abstract base for dependency resolution errors"""
    +
    +    def __repr__(self):
    +        return self.__class__.__name__ + repr(self.args)
    +
    +
    +class VersionConflict(ResolutionError):
    +    """
    +    An already-installed version conflicts with the requested version.
    +
    +    Should be initialized with the installed Distribution and the requested
    +    Requirement.
    +    """
    +
    +    _template = "{self.dist} is installed but {self.req} is required"
    +
    +    @property
    +    def dist(self) -> Distribution:
    +        return self.args[0]
    +
    +    @property
    +    def req(self) -> Requirement:
    +        return self.args[1]
    +
    +    def report(self):
    +        return self._template.format(**locals())
    +
    +    def with_context(self, required_by: set[Distribution | str]):
    +        """
    +        If required_by is non-empty, return a version of self that is a
    +        ContextualVersionConflict.
    +        """
    +        if not required_by:
    +            return self
    +        args = self.args + (required_by,)
    +        return ContextualVersionConflict(*args)
    +
    +
    +class ContextualVersionConflict(VersionConflict):
    +    """
    +    A VersionConflict that accepts a third parameter, the set of the
    +    requirements that required the installed Distribution.
    +    """
    +
    +    _template = VersionConflict._template + ' by {self.required_by}'
    +
    +    @property
    +    def required_by(self) -> set[str]:
    +        return self.args[2]
    +
    +
    +class DistributionNotFound(ResolutionError):
    +    """A requested distribution was not found"""
    +
    +    _template = (
    +        "The '{self.req}' distribution was not found "
    +        "and is required by {self.requirers_str}"
    +    )
    +
    +    @property
    +    def req(self) -> Requirement:
    +        return self.args[0]
    +
    +    @property
    +    def requirers(self) -> set[str] | None:
    +        return self.args[1]
    +
    +    @property
    +    def requirers_str(self):
    +        if not self.requirers:
    +            return 'the application'
    +        return ', '.join(self.requirers)
    +
    +    def report(self):
    +        return self._template.format(**locals())
    +
    +    def __str__(self):
    +        return self.report()
    +
    +
    +class UnknownExtra(ResolutionError):
    +    """Distribution doesn't have an "extra feature" of the given name"""
    +
    +
    +_provider_factories: dict[type[_ModuleLike], _ProviderFactoryType] = {}
    +
    +PY_MAJOR = '{}.{}'.format(*sys.version_info)
    +EGG_DIST = 3
    +BINARY_DIST = 2
    +SOURCE_DIST = 1
    +CHECKOUT_DIST = 0
    +DEVELOP_DIST = -1
    +
    +
    +def register_loader_type(
    +    loader_type: type[_ModuleLike], provider_factory: _ProviderFactoryType
    +):
    +    """Register `provider_factory` to make providers for `loader_type`
    +
    +    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
    +    and `provider_factory` is a function that, passed a *module* object,
    +    returns an ``IResourceProvider`` for that module.
    +    """
    +    _provider_factories[loader_type] = provider_factory
    +
    +
    +@overload
    +def get_provider(moduleOrReq: str) -> IResourceProvider: ...
    +@overload
    +def get_provider(moduleOrReq: Requirement) -> Distribution: ...
    +def get_provider(moduleOrReq: str | Requirement) -> IResourceProvider | Distribution:
    +    """Return an IResourceProvider for the named module or requirement"""
    +    if isinstance(moduleOrReq, Requirement):
    +        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
    +    try:
    +        module = sys.modules[moduleOrReq]
    +    except KeyError:
    +        __import__(moduleOrReq)
    +        module = sys.modules[moduleOrReq]
    +    loader = getattr(module, '__loader__', None)
    +    return _find_adapter(_provider_factories, loader)(module)
    +
    +
    +@functools.lru_cache(maxsize=None)
    +def _macos_vers():
    +    version = platform.mac_ver()[0]
    +    # fallback for MacPorts
    +    if version == '':
    +        plist = '/System/Library/CoreServices/SystemVersion.plist'
    +        if os.path.exists(plist):
    +            with open(plist, 'rb') as fh:
    +                plist_content = plistlib.load(fh)
    +            if 'ProductVersion' in plist_content:
    +                version = plist_content['ProductVersion']
    +    return version.split('.')
    +
    +
    +def _macos_arch(machine):
    +    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
    +
    +
    +def get_build_platform():
    +    """Return this platform's string for platform-specific distributions
    +
    +    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
    +    needs some hacks for Linux and macOS.
    +    """
    +    from sysconfig import get_platform
    +
    +    plat = get_platform()
    +    if sys.platform == "darwin" and not plat.startswith('macosx-'):
    +        try:
    +            version = _macos_vers()
    +            machine = os.uname()[4].replace(" ", "_")
    +            return "macosx-%d.%d-%s" % (
    +                int(version[0]),
    +                int(version[1]),
    +                _macos_arch(machine),
    +            )
    +        except ValueError:
    +            # if someone is running a non-Mac darwin system, this will fall
    +            # through to the default implementation
    +            pass
    +    return plat
    +
    +
    +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
    +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
    +# XXX backward compat
    +get_platform = get_build_platform
    +
    +
    +def compatible_platforms(provided: str | None, required: str | None):
    +    """Can code for the `provided` platform run on the `required` platform?
    +
    +    Returns true if either platform is ``None``, or the platforms are equal.
    +
    +    XXX Needs compatibility checks for Linux and other unixy OSes.
    +    """
    +    if provided is None or required is None or provided == required:
    +        # easy case
    +        return True
    +
    +    # macOS special cases
    +    reqMac = macosVersionString.match(required)
    +    if reqMac:
    +        provMac = macosVersionString.match(provided)
    +
    +        # is this a Mac package?
    +        if not provMac:
    +            # this is backwards compatibility for packages built before
    +            # setuptools 0.6. All packages built after this point will
    +            # use the new macOS designation.
    +            provDarwin = darwinVersionString.match(provided)
    +            if provDarwin:
    +                dversion = int(provDarwin.group(1))
    +                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
    +                if (
    +                    dversion == 7
    +                    and macosversion >= "10.3"
    +                    or dversion == 8
    +                    and macosversion >= "10.4"
    +                ):
    +                    return True
    +            # egg isn't macOS or legacy darwin
    +            return False
    +
    +        # are they the same major version and machine type?
    +        if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3):
    +            return False
    +
    +        # is the required OS major update >= the provided one?
    +        if int(provMac.group(2)) > int(reqMac.group(2)):
    +            return False
    +
    +        return True
    +
    +    # XXX Linux and other platforms' special cases should go here
    +    return False
    +
    +
    +@overload
    +def get_distribution(dist: _DistributionT) -> _DistributionT: ...
    +@overload
    +def get_distribution(dist: _PkgReqType) -> Distribution: ...
    +def get_distribution(dist: Distribution | _PkgReqType) -> Distribution:
    +    """Return a current distribution object for a Requirement or string"""
    +    if isinstance(dist, str):
    +        dist = Requirement.parse(dist)
    +    if isinstance(dist, Requirement):
    +        # Bad type narrowing, dist has to be a Requirement here, so get_provider has to return Distribution
    +        dist = get_provider(dist)  # type: ignore[assignment]
    +    if not isinstance(dist, Distribution):
    +        raise TypeError("Expected str, Requirement, or Distribution", dist)
    +    return dist
    +
    +
    +def load_entry_point(dist: _EPDistType, group: str, name: str) -> _ResolvedEntryPoint:
    +    """Return `name` entry point of `group` for `dist` or raise ImportError"""
    +    return get_distribution(dist).load_entry_point(group, name)
    +
    +
    +@overload
    +def get_entry_map(
    +    dist: _EPDistType, group: None = None
    +) -> dict[str, dict[str, EntryPoint]]: ...
    +@overload
    +def get_entry_map(dist: _EPDistType, group: str) -> dict[str, EntryPoint]: ...
    +def get_entry_map(dist: _EPDistType, group: str | None = None):
    +    """Return the entry point map for `group`, or the full entry map"""
    +    return get_distribution(dist).get_entry_map(group)
    +
    +
    +def get_entry_info(dist: _EPDistType, group: str, name: str):
    +    """Return the EntryPoint object for `group`+`name`, or ``None``"""
    +    return get_distribution(dist).get_entry_info(group, name)
    +
    +
    +class IMetadataProvider(Protocol):
    +    def has_metadata(self, name: str) -> bool:
    +        """Does the package's distribution contain the named metadata?"""
    +
    +    def get_metadata(self, name: str) -> str:
    +        """The named metadata resource as a string"""
    +
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
    +        """Yield named metadata resource as list of non-blank non-comment lines
    +
    +        Leading and trailing whitespace is stripped from each line, and lines
    +        with ``#`` as the first non-blank character are omitted."""
    +
    +    def metadata_isdir(self, name: str) -> bool:
    +        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
    +
    +    def metadata_listdir(self, name: str) -> list[str]:
    +        """List of metadata names in the directory (like ``os.listdir()``)"""
    +
    +    def run_script(self, script_name: str, namespace: dict[str, Any]) -> None:
    +        """Execute the named script in the supplied namespace dictionary"""
    +
    +
    +class IResourceProvider(IMetadataProvider, Protocol):
    +    """An object that provides access to package resources"""
    +
    +    def get_resource_filename(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> str:
    +        """Return a true filesystem path for `resource_name`
    +
    +        `manager` must be a ``ResourceManager``"""
    +
    +    def get_resource_stream(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> _ResourceStream:
    +        """Return a readable file-like object for `resource_name`
    +
    +        `manager` must be a ``ResourceManager``"""
    +
    +    def get_resource_string(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> bytes:
    +        """Return the contents of `resource_name` as :obj:`bytes`
    +
    +        `manager` must be a ``ResourceManager``"""
    +
    +    def has_resource(self, resource_name: str) -> bool:
    +        """Does the package contain the named resource?"""
    +
    +    def resource_isdir(self, resource_name: str) -> bool:
    +        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
    +
    +    def resource_listdir(self, resource_name: str) -> list[str]:
    +        """List of resource names in the directory (like ``os.listdir()``)"""
    +
    +
    +class WorkingSet:
    +    """A collection of active distributions on sys.path (or a similar list)"""
    +
    +    def __init__(self, entries: Iterable[str] | None = None):
    +        """Create working set from list of path entries (default=sys.path)"""
    +        self.entries: list[str] = []
    +        self.entry_keys = {}
    +        self.by_key = {}
    +        self.normalized_to_canonical_keys = {}
    +        self.callbacks = []
    +
    +        if entries is None:
    +            entries = sys.path
    +
    +        for entry in entries:
    +            self.add_entry(entry)
    +
    +    @classmethod
    +    def _build_master(cls):
    +        """
    +        Prepare the master working set.
    +        """
    +        ws = cls()
    +        try:
    +            from __main__ import __requires__
    +        except ImportError:
    +            # The main program does not list any requirements
    +            return ws
    +
    +        # ensure the requirements are met
    +        try:
    +            ws.require(__requires__)
    +        except VersionConflict:
    +            return cls._build_from_requirements(__requires__)
    +
    +        return ws
    +
    +    @classmethod
    +    def _build_from_requirements(cls, req_spec):
    +        """
    +        Build a working set from a requirement spec. Rewrites sys.path.
    +        """
    +        # try it without defaults already on sys.path
    +        # by starting with an empty path
    +        ws = cls([])
    +        reqs = parse_requirements(req_spec)
    +        dists = ws.resolve(reqs, Environment())
    +        for dist in dists:
    +            ws.add(dist)
    +
    +        # add any missing entries from sys.path
    +        for entry in sys.path:
    +            if entry not in ws.entries:
    +                ws.add_entry(entry)
    +
    +        # then copy back to sys.path
    +        sys.path[:] = ws.entries
    +        return ws
    +
    +    def add_entry(self, entry: str):
    +        """Add a path item to ``.entries``, finding any distributions on it
    +
    +        ``find_distributions(entry, True)`` is used to find distributions
    +        corresponding to the path entry, and they are added.  `entry` is
    +        always appended to ``.entries``, even if it is already present.
    +        (This is because ``sys.path`` can contain the same value more than
    +        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
    +        equal ``sys.path``.)
    +        """
    +        self.entry_keys.setdefault(entry, [])
    +        self.entries.append(entry)
    +        for dist in find_distributions(entry, True):
    +            self.add(dist, entry, False)
    +
    +    def __contains__(self, dist: Distribution) -> bool:
    +        """True if `dist` is the active distribution for its project"""
    +        return self.by_key.get(dist.key) == dist
    +
    +    def find(self, req: Requirement) -> Distribution | None:
    +        """Find a distribution matching requirement `req`
    +
    +        If there is an active distribution for the requested project, this
    +        returns it as long as it meets the version requirement specified by
    +        `req`.  But, if there is an active distribution for the project and it
    +        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
    +        If there is no active distribution for the requested project, ``None``
    +        is returned.
    +        """
    +        dist = self.by_key.get(req.key)
    +
    +        if dist is None:
    +            canonical_key = self.normalized_to_canonical_keys.get(req.key)
    +
    +            if canonical_key is not None:
    +                req.key = canonical_key
    +                dist = self.by_key.get(canonical_key)
    +
    +        if dist is not None and dist not in req:
    +            # XXX add more info
    +            raise VersionConflict(dist, req)
    +        return dist
    +
    +    def iter_entry_points(self, group: str, name: str | None = None):
    +        """Yield entry point objects from `group` matching `name`
    +
    +        If `name` is None, yields all entry points in `group` from all
    +        distributions in the working set, otherwise only ones matching
    +        both `group` and `name` are yielded (in distribution order).
    +        """
    +        return (
    +            entry
    +            for dist in self
    +            for entry in dist.get_entry_map(group).values()
    +            if name is None or name == entry.name
    +        )
    +
    +    def run_script(self, requires: str, script_name: str):
    +        """Locate distribution for `requires` and run `script_name` script"""
    +        ns = sys._getframe(1).f_globals
    +        name = ns['__name__']
    +        ns.clear()
    +        ns['__name__'] = name
    +        self.require(requires)[0].run_script(script_name, ns)
    +
    +    def __iter__(self) -> Iterator[Distribution]:
    +        """Yield distributions for non-duplicate projects in the working set
    +
    +        The yield order is the order in which the items' path entries were
    +        added to the working set.
    +        """
    +        seen = set()
    +        for item in self.entries:
    +            if item not in self.entry_keys:
    +                # workaround a cache issue
    +                continue
    +
    +            for key in self.entry_keys[item]:
    +                if key not in seen:
    +                    seen.add(key)
    +                    yield self.by_key[key]
    +
    +    def add(
    +        self,
    +        dist: Distribution,
    +        entry: str | None = None,
    +        insert: bool = True,
    +        replace: bool = False,
    +    ):
    +        """Add `dist` to working set, associated with `entry`
    +
    +        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
    +        On exit from this routine, `entry` is added to the end of the working
    +        set's ``.entries`` (if it wasn't already present).
    +
    +        `dist` is only added to the working set if it's for a project that
    +        doesn't already have a distribution in the set, unless `replace=True`.
    +        If it's added, any callbacks registered with the ``subscribe()`` method
    +        will be called.
    +        """
    +        if insert:
    +            dist.insert_on(self.entries, entry, replace=replace)
    +
    +        if entry is None:
    +            entry = dist.location
    +        keys = self.entry_keys.setdefault(entry, [])
    +        keys2 = self.entry_keys.setdefault(dist.location, [])
    +        if not replace and dist.key in self.by_key:
    +            # ignore hidden distros
    +            return
    +
    +        self.by_key[dist.key] = dist
    +        normalized_name = _packaging_utils.canonicalize_name(dist.key)
    +        self.normalized_to_canonical_keys[normalized_name] = dist.key
    +        if dist.key not in keys:
    +            keys.append(dist.key)
    +        if dist.key not in keys2:
    +            keys2.append(dist.key)
    +        self._added_new(dist)
    +
    +    @overload
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[_DistributionT]: ...
    +    @overload
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        *,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[_DistributionT]: ...
    +    @overload
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[Distribution]: ...
    +    def resolve(
    +        self,
    +        requirements: Iterable[Requirement],
    +        env: Environment | None = None,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        replace_conflicting: bool = False,
    +        extras: tuple[str, ...] | None = None,
    +    ) -> list[Distribution] | list[_DistributionT]:
    +        """List all distributions needed to (recursively) meet `requirements`
    +
    +        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
    +        if supplied, should be an ``Environment`` instance.  If
    +        not supplied, it defaults to all distributions available within any
    +        entry or distribution in the working set.  `installer`, if supplied,
    +        will be invoked with each requirement that cannot be met by an
    +        already-installed distribution; it should return a ``Distribution`` or
    +        ``None``.
    +
    +        Unless `replace_conflicting=True`, raises a VersionConflict exception
    +        if
    +        any requirements are found on the path that have the correct name but
    +        the wrong version.  Otherwise, if an `installer` is supplied it will be
    +        invoked to obtain the correct version of the requirement and activate
    +        it.
    +
    +        `extras` is a list of the extras to be used with these requirements.
    +        This is important because extra requirements may look like `my_req;
    +        extra = "my_extra"`, which would otherwise be interpreted as a purely
    +        optional requirement.  Instead, we want to be able to assert that these
    +        requirements are truly required.
    +        """
    +
    +        # set up the stack
    +        requirements = list(requirements)[::-1]
    +        # set of processed requirements
    +        processed = set()
    +        # key -> dist
    +        best = {}
    +        to_activate = []
    +
    +        req_extras = _ReqExtras()
    +
    +        # Mapping of requirement to set of distributions that required it;
    +        # useful for reporting info about conflicts.
    +        required_by = collections.defaultdict(set)
    +
    +        while requirements:
    +            # process dependencies breadth-first
    +            req = requirements.pop(0)
    +            if req in processed:
    +                # Ignore cyclic or redundant dependencies
    +                continue
    +
    +            if not req_extras.markers_pass(req, extras):
    +                continue
    +
    +            dist = self._resolve_dist(
    +                req, best, replace_conflicting, env, installer, required_by, to_activate
    +            )
    +
    +            # push the new requirements onto the stack
    +            new_requirements = dist.requires(req.extras)[::-1]
    +            requirements.extend(new_requirements)
    +
    +            # Register the new requirements needed by req
    +            for new_requirement in new_requirements:
    +                required_by[new_requirement].add(req.project_name)
    +                req_extras[new_requirement] = req.extras
    +
    +            processed.add(req)
    +
    +        # return list of distros to activate
    +        return to_activate
    +
    +    def _resolve_dist(
    +        self, req, best, replace_conflicting, env, installer, required_by, to_activate
    +    ) -> Distribution:
    +        dist = best.get(req.key)
    +        if dist is None:
    +            # Find the best distribution and add it to the map
    +            dist = self.by_key.get(req.key)
    +            if dist is None or (dist not in req and replace_conflicting):
    +                ws = self
    +                if env is None:
    +                    if dist is None:
    +                        env = Environment(self.entries)
    +                    else:
    +                        # Use an empty environment and workingset to avoid
    +                        # any further conflicts with the conflicting
    +                        # distribution
    +                        env = Environment([])
    +                        ws = WorkingSet([])
    +                dist = best[req.key] = env.best_match(
    +                    req, ws, installer, replace_conflicting=replace_conflicting
    +                )
    +                if dist is None:
    +                    requirers = required_by.get(req, None)
    +                    raise DistributionNotFound(req, requirers)
    +            to_activate.append(dist)
    +        if dist not in req:
    +            # Oops, the "best" so far conflicts with a dependency
    +            dependent_req = required_by[req]
    +            raise VersionConflict(dist, req).with_context(dependent_req)
    +        return dist
    +
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None,
    +        installer: _InstallerTypeT[_DistributionT],
    +        fallback: bool = True,
    +    ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        *,
    +        installer: _InstallerTypeT[_DistributionT],
    +        fallback: bool = True,
    +    ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
    +    @overload
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +        fallback: bool = True,
    +    ) -> tuple[list[Distribution], dict[Distribution, Exception]]: ...
    +    def find_plugins(
    +        self,
    +        plugin_env: Environment,
    +        full_env: Environment | None = None,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        fallback: bool = True,
    +    ) -> tuple[
    +        list[Distribution] | list[_DistributionT],
    +        dict[Distribution, Exception],
    +    ]:
    +        """Find all activatable distributions in `plugin_env`
    +
    +        Example usage::
    +
    +            distributions, errors = working_set.find_plugins(
    +                Environment(plugin_dirlist)
    +            )
    +            # add plugins+libs to sys.path
    +            map(working_set.add, distributions)
    +            # display errors
    +            print('Could not load', errors)
    +
    +        The `plugin_env` should be an ``Environment`` instance that contains
    +        only distributions that are in the project's "plugin directory" or
    +        directories. The `full_env`, if supplied, should be an ``Environment``
    +        contains all currently-available distributions.  If `full_env` is not
    +        supplied, one is created automatically from the ``WorkingSet`` this
    +        method is called on, which will typically mean that every directory on
    +        ``sys.path`` will be scanned for distributions.
    +
    +        `installer` is a standard installer callback as used by the
    +        ``resolve()`` method. The `fallback` flag indicates whether we should
    +        attempt to resolve older versions of a plugin if the newest version
    +        cannot be resolved.
    +
    +        This method returns a 2-tuple: (`distributions`, `error_info`), where
    +        `distributions` is a list of the distributions found in `plugin_env`
    +        that were loadable, along with any other distributions that are needed
    +        to resolve their dependencies.  `error_info` is a dictionary mapping
    +        unloadable plugin distributions to an exception instance describing the
    +        error that occurred. Usually this will be a ``DistributionNotFound`` or
    +        ``VersionConflict`` instance.
    +        """
    +
    +        plugin_projects = list(plugin_env)
    +        # scan project names in alphabetic order
    +        plugin_projects.sort()
    +
    +        error_info: dict[Distribution, Exception] = {}
    +        distributions: dict[Distribution, Exception | None] = {}
    +
    +        if full_env is None:
    +            env = Environment(self.entries)
    +            env += plugin_env
    +        else:
    +            env = full_env + plugin_env
    +
    +        shadow_set = self.__class__([])
    +        # put all our entries in shadow_set
    +        list(map(shadow_set.add, self))
    +
    +        for project_name in plugin_projects:
    +            for dist in plugin_env[project_name]:
    +                req = [dist.as_requirement()]
    +
    +                try:
    +                    resolvees = shadow_set.resolve(req, env, installer)
    +
    +                except ResolutionError as v:
    +                    # save error info
    +                    error_info[dist] = v
    +                    if fallback:
    +                        # try the next older version of project
    +                        continue
    +                    else:
    +                        # give up on this project, keep going
    +                        break
    +
    +                else:
    +                    list(map(shadow_set.add, resolvees))
    +                    distributions.update(dict.fromkeys(resolvees))
    +
    +                    # success, no need to try any more versions of this project
    +                    break
    +
    +        sorted_distributions = list(distributions)
    +        sorted_distributions.sort()
    +
    +        return sorted_distributions, error_info
    +
    +    def require(self, *requirements: _NestedStr):
    +        """Ensure that distributions matching `requirements` are activated
    +
    +        `requirements` must be a string or a (possibly-nested) sequence
    +        thereof, specifying the distributions and versions required.  The
    +        return value is a sequence of the distributions that needed to be
    +        activated to fulfill the requirements; all relevant distributions are
    +        included, even if they were already activated in this working set.
    +        """
    +        needed = self.resolve(parse_requirements(requirements))
    +
    +        for dist in needed:
    +            self.add(dist)
    +
    +        return needed
    +
    +    def subscribe(
    +        self, callback: Callable[[Distribution], object], existing: bool = True
    +    ):
    +        """Invoke `callback` for all distributions
    +
    +        If `existing=True` (default),
    +        call on all existing ones, as well.
    +        """
    +        if callback in self.callbacks:
    +            return
    +        self.callbacks.append(callback)
    +        if not existing:
    +            return
    +        for dist in self:
    +            callback(dist)
    +
    +    def _added_new(self, dist):
    +        for callback in self.callbacks:
    +            callback(dist)
    +
    +    def __getstate__(self):
    +        return (
    +            self.entries[:],
    +            self.entry_keys.copy(),
    +            self.by_key.copy(),
    +            self.normalized_to_canonical_keys.copy(),
    +            self.callbacks[:],
    +        )
    +
    +    def __setstate__(self, e_k_b_n_c):
    +        entries, keys, by_key, normalized_to_canonical_keys, callbacks = e_k_b_n_c
    +        self.entries = entries[:]
    +        self.entry_keys = keys.copy()
    +        self.by_key = by_key.copy()
    +        self.normalized_to_canonical_keys = normalized_to_canonical_keys.copy()
    +        self.callbacks = callbacks[:]
    +
    +
    +class _ReqExtras(Dict["Requirement", Tuple[str, ...]]):
    +    """
    +    Map each requirement to the extras that demanded it.
    +    """
    +
    +    def markers_pass(self, req: Requirement, extras: tuple[str, ...] | None = None):
    +        """
    +        Evaluate markers for req against each extra that
    +        demanded it.
    +
    +        Return False if the req has a marker and fails
    +        evaluation. Otherwise, return True.
    +        """
    +        extra_evals = (
    +            req.marker.evaluate({'extra': extra})
    +            for extra in self.get(req, ()) + (extras or (None,))
    +        )
    +        return not req.marker or any(extra_evals)
    +
    +
    +class Environment:
    +    """Searchable snapshot of distributions on a search path"""
    +
    +    def __init__(
    +        self,
    +        search_path: Iterable[str] | None = None,
    +        platform: str | None = get_supported_platform(),
    +        python: str | None = PY_MAJOR,
    +    ):
    +        """Snapshot distributions available on a search path
    +
    +        Any distributions found on `search_path` are added to the environment.
    +        `search_path` should be a sequence of ``sys.path`` items.  If not
    +        supplied, ``sys.path`` is used.
    +
    +        `platform` is an optional string specifying the name of the platform
    +        that platform-specific distributions must be compatible with.  If
    +        unspecified, it defaults to the current platform.  `python` is an
    +        optional string naming the desired version of Python (e.g. ``'3.6'``);
    +        it defaults to the current version.
    +
    +        You may explicitly set `platform` (and/or `python`) to ``None`` if you
    +        wish to map *all* distributions, not just those compatible with the
    +        running platform or Python version.
    +        """
    +        self._distmap = {}
    +        self.platform = platform
    +        self.python = python
    +        self.scan(search_path)
    +
    +    def can_add(self, dist: Distribution):
    +        """Is distribution `dist` acceptable for this environment?
    +
    +        The distribution must match the platform and python version
    +        requirements specified when this environment was created, or False
    +        is returned.
    +        """
    +        py_compat = (
    +            self.python is None
    +            or dist.py_version is None
    +            or dist.py_version == self.python
    +        )
    +        return py_compat and compatible_platforms(dist.platform, self.platform)
    +
    +    def remove(self, dist: Distribution):
    +        """Remove `dist` from the environment"""
    +        self._distmap[dist.key].remove(dist)
    +
    +    def scan(self, search_path: Iterable[str] | None = None):
    +        """Scan `search_path` for distributions usable in this environment
    +
    +        Any distributions found are added to the environment.
    +        `search_path` should be a sequence of ``sys.path`` items.  If not
    +        supplied, ``sys.path`` is used.  Only distributions conforming to
    +        the platform/python version defined at initialization are added.
    +        """
    +        if search_path is None:
    +            search_path = sys.path
    +
    +        for item in search_path:
    +            for dist in find_distributions(item):
    +                self.add(dist)
    +
    +    def __getitem__(self, project_name: str) -> list[Distribution]:
    +        """Return a newest-to-oldest list of distributions for `project_name`
    +
    +        Uses case-insensitive `project_name` comparison, assuming all the
    +        project's distributions use their project's name converted to all
    +        lowercase as their key.
    +
    +        """
    +        distribution_key = project_name.lower()
    +        return self._distmap.get(distribution_key, [])
    +
    +    def add(self, dist: Distribution):
    +        """Add `dist` if we ``can_add()`` it and it has not already been added"""
    +        if self.can_add(dist) and dist.has_version():
    +            dists = self._distmap.setdefault(dist.key, [])
    +            if dist not in dists:
    +                dists.append(dist)
    +                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
    +
    +    @overload
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerTypeT[_DistributionT],
    +        replace_conflicting: bool = False,
    +    ) -> _DistributionT: ...
    +    @overload
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerType | None = None,
    +        replace_conflicting: bool = False,
    +    ) -> Distribution | None: ...
    +    def best_match(
    +        self,
    +        req: Requirement,
    +        working_set: WorkingSet,
    +        installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
    +        replace_conflicting: bool = False,
    +    ) -> Distribution | None:
    +        """Find distribution best matching `req` and usable on `working_set`
    +
    +        This calls the ``find(req)`` method of the `working_set` to see if a
    +        suitable distribution is already active.  (This may raise
    +        ``VersionConflict`` if an unsuitable version of the project is already
    +        active in the specified `working_set`.)  If a suitable distribution
    +        isn't active, this method returns the newest distribution in the
    +        environment that meets the ``Requirement`` in `req`.  If no suitable
    +        distribution is found, and `installer` is supplied, then the result of
    +        calling the environment's ``obtain(req, installer)`` method will be
    +        returned.
    +        """
    +        try:
    +            dist = working_set.find(req)
    +        except VersionConflict:
    +            if not replace_conflicting:
    +                raise
    +            dist = None
    +        if dist is not None:
    +            return dist
    +        for dist in self[req.key]:
    +            if dist in req:
    +                return dist
    +        # try to download/install
    +        return self.obtain(req, installer)
    +
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: _InstallerTypeT[_DistributionT],
    +    ) -> _DistributionT: ...
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: Callable[[Requirement], None] | None = None,
    +    ) -> None: ...
    +    @overload
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: _InstallerType | None = None,
    +    ) -> Distribution | None: ...
    +    def obtain(
    +        self,
    +        requirement: Requirement,
    +        installer: Callable[[Requirement], None]
    +        | _InstallerType
    +        | None
    +        | _InstallerTypeT[_DistributionT] = None,
    +    ) -> Distribution | None:
    +        """Obtain a distribution matching `requirement` (e.g. via download)
    +
    +        Obtain a distro that matches requirement (e.g. via download).  In the
    +        base ``Environment`` class, this routine just returns
    +        ``installer(requirement)``, unless `installer` is None, in which case
    +        None is returned instead.  This method is a hook that allows subclasses
    +        to attempt other ways of obtaining a distribution before falling back
    +        to the `installer` argument."""
    +        return installer(requirement) if installer else None
    +
    +    def __iter__(self) -> Iterator[str]:
    +        """Yield the unique project names of the available distributions"""
    +        for key in self._distmap.keys():
    +            if self[key]:
    +                yield key
    +
    +    def __iadd__(self, other: Distribution | Environment):
    +        """In-place addition of a distribution or environment"""
    +        if isinstance(other, Distribution):
    +            self.add(other)
    +        elif isinstance(other, Environment):
    +            for project in other:
    +                for dist in other[project]:
    +                    self.add(dist)
    +        else:
    +            raise TypeError("Can't add %r to environment" % (other,))
    +        return self
    +
    +    def __add__(self, other: Distribution | Environment):
    +        """Add an environment or distribution to an environment"""
    +        new = self.__class__([], platform=None, python=None)
    +        for env in self, other:
    +            new += env
    +        return new
    +
    +
    +# XXX backward compatibility
    +AvailableDistributions = Environment
    +
    +
    +class ExtractionError(RuntimeError):
    +    """An error occurred extracting a resource
    +
    +    The following attributes are available from instances of this exception:
    +
    +    manager
    +        The resource manager that raised this exception
    +
    +    cache_path
    +        The base directory for resource extraction
    +
    +    original_error
    +        The exception instance that caused extraction to fail
    +    """
    +
    +    manager: ResourceManager
    +    cache_path: str
    +    original_error: BaseException | None
    +
    +
    +class ResourceManager:
    +    """Manage resource extraction and packages"""
    +
    +    extraction_path: str | None = None
    +
    +    def __init__(self):
    +        self.cached_files = {}
    +
    +    def resource_exists(self, package_or_requirement: _PkgReqType, resource_name: str):
    +        """Does the named resource exist?"""
    +        return get_provider(package_or_requirement).has_resource(resource_name)
    +
    +    def resource_isdir(self, package_or_requirement: _PkgReqType, resource_name: str):
    +        """Is the named resource an existing directory?"""
    +        return get_provider(package_or_requirement).resource_isdir(resource_name)
    +
    +    def resource_filename(
    +        self, package_or_requirement: _PkgReqType, resource_name: str
    +    ):
    +        """Return a true filesystem path for specified resource"""
    +        return get_provider(package_or_requirement).get_resource_filename(
    +            self, resource_name
    +        )
    +
    +    def resource_stream(self, package_or_requirement: _PkgReqType, resource_name: str):
    +        """Return a readable file-like object for specified resource"""
    +        return get_provider(package_or_requirement).get_resource_stream(
    +            self, resource_name
    +        )
    +
    +    def resource_string(
    +        self, package_or_requirement: _PkgReqType, resource_name: str
    +    ) -> bytes:
    +        """Return specified resource as :obj:`bytes`"""
    +        return get_provider(package_or_requirement).get_resource_string(
    +            self, resource_name
    +        )
    +
    +    def resource_listdir(self, package_or_requirement: _PkgReqType, resource_name: str):
    +        """List the contents of the named resource directory"""
    +        return get_provider(package_or_requirement).resource_listdir(resource_name)
    +
    +    def extraction_error(self) -> NoReturn:
    +        """Give an error message for problems extracting file(s)"""
    +
    +        old_exc = sys.exc_info()[1]
    +        cache_path = self.extraction_path or get_default_cache()
    +
    +        tmpl = textwrap.dedent(
    +            """
    +            Can't extract file(s) to egg cache
    +
    +            The following error occurred while trying to extract file(s)
    +            to the Python egg cache:
    +
    +              {old_exc}
    +
    +            The Python egg cache directory is currently set to:
    +
    +              {cache_path}
    +
    +            Perhaps your account does not have write access to this directory?
    +            You can change the cache directory by setting the PYTHON_EGG_CACHE
    +            environment variable to point to an accessible directory.
    +            """
    +        ).lstrip()
    +        err = ExtractionError(tmpl.format(**locals()))
    +        err.manager = self
    +        err.cache_path = cache_path
    +        err.original_error = old_exc
    +        raise err
    +
    +    def get_cache_path(self, archive_name: str, names: Iterable[StrPath] = ()):
    +        """Return absolute location in cache for `archive_name` and `names`
    +
    +        The parent directory of the resulting path will be created if it does
    +        not already exist.  `archive_name` should be the base filename of the
    +        enclosing egg (which may not be the name of the enclosing zipfile!),
    +        including its ".egg" extension.  `names`, if provided, should be a
    +        sequence of path name parts "under" the egg's extraction location.
    +
    +        This method should only be called by resource providers that need to
    +        obtain an extraction location, and only for names they intend to
    +        extract, as it tracks the generated names for possible cleanup later.
    +        """
    +        extract_path = self.extraction_path or get_default_cache()
    +        target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
    +        try:
    +            _bypass_ensure_directory(target_path)
    +        except Exception:
    +            self.extraction_error()
    +
    +        self._warn_unsafe_extraction_path(extract_path)
    +
    +        self.cached_files[target_path] = True
    +        return target_path
    +
    +    @staticmethod
    +    def _warn_unsafe_extraction_path(path):
    +        """
    +        If the default extraction path is overridden and set to an insecure
    +        location, such as /tmp, it opens up an opportunity for an attacker to
    +        replace an extracted file with an unauthorized payload. Warn the user
    +        if a known insecure location is used.
    +
    +        See Distribute #375 for more details.
    +        """
    +        if os.name == 'nt' and not path.startswith(os.environ['windir']):
    +            # On Windows, permissions are generally restrictive by default
    +            #  and temp directories are not writable by other users, so
    +            #  bypass the warning.
    +            return
    +        mode = os.stat(path).st_mode
    +        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
    +            msg = (
    +                "Extraction path is writable by group/others "
    +                "and vulnerable to attack when "
    +                "used with get_resource_filename ({path}). "
    +                "Consider a more secure "
    +                "location (set with .set_extraction_path or the "
    +                "PYTHON_EGG_CACHE environment variable)."
    +            ).format(**locals())
    +            warnings.warn(msg, UserWarning)
    +
    +    def postprocess(self, tempname: StrOrBytesPath, filename: StrOrBytesPath):
    +        """Perform any platform-specific postprocessing of `tempname`
    +
    +        This is where Mac header rewrites should be done; other platforms don't
    +        have anything special they should do.
    +
    +        Resource providers should call this method ONLY after successfully
    +        extracting a compressed resource.  They must NOT call it on resources
    +        that are already in the filesystem.
    +
    +        `tempname` is the current (temporary) name of the file, and `filename`
    +        is the name it will be renamed to by the caller after this routine
    +        returns.
    +        """
    +
    +        if os.name == 'posix':
    +            # Make the resource executable
    +            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
    +            os.chmod(tempname, mode)
    +
    +    def set_extraction_path(self, path: str):
    +        """Set the base path where resources will be extracted to, if needed.
    +
    +        If you do not call this routine before any extractions take place, the
    +        path defaults to the return value of ``get_default_cache()``.  (Which
    +        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
    +        platform-specific fallbacks.  See that routine's documentation for more
    +        details.)
    +
    +        Resources are extracted to subdirectories of this path based upon
    +        information given by the ``IResourceProvider``.  You may set this to a
    +        temporary directory, but then you must call ``cleanup_resources()`` to
    +        delete the extracted files when done.  There is no guarantee that
    +        ``cleanup_resources()`` will be able to remove all extracted files.
    +
    +        (Note: you may not change the extraction path for a given resource
    +        manager once resources have been extracted, unless you first call
    +        ``cleanup_resources()``.)
    +        """
    +        if self.cached_files:
    +            raise ValueError("Can't change extraction path, files already extracted")
    +
    +        self.extraction_path = path
    +
    +    def cleanup_resources(self, force: bool = False) -> list[str]:
    +        """
    +        Delete all extracted resource files and directories, returning a list
    +        of the file and directory names that could not be successfully removed.
    +        This function does not have any concurrency protection, so it should
    +        generally only be called when the extraction path is a temporary
    +        directory exclusive to a single process.  This method is not
    +        automatically called; you must call it explicitly or register it as an
    +        ``atexit`` function if you wish to ensure cleanup of a temporary
    +        directory used for extractions.
    +        """
    +        # XXX
    +        return []
    +
    +
    +def get_default_cache() -> str:
    +    """
    +    Return the ``PYTHON_EGG_CACHE`` environment variable
    +    or a platform-relevant user cache dir for an app
    +    named "Python-Eggs".
    +    """
    +    return os.environ.get('PYTHON_EGG_CACHE') or _user_cache_dir(appname='Python-Eggs')
    +
    +
    +def safe_name(name: str):
    +    """Convert an arbitrary string to a standard distribution name
    +
    +    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    +    """
    +    return re.sub('[^A-Za-z0-9.]+', '-', name)
    +
    +
    +def safe_version(version: str):
    +    """
    +    Convert an arbitrary string to a standard version string
    +    """
    +    try:
    +        # normalize the version
    +        return str(_packaging_version.Version(version))
    +    except _packaging_version.InvalidVersion:
    +        version = version.replace(' ', '.')
    +        return re.sub('[^A-Za-z0-9.]+', '-', version)
    +
    +
    +def _forgiving_version(version):
    +    """Fallback when ``safe_version`` is not safe enough
    +    >>> parse_version(_forgiving_version('0.23ubuntu1'))
    +    
    +    >>> parse_version(_forgiving_version('0.23-'))
    +    
    +    >>> parse_version(_forgiving_version('0.-_'))
    +    
    +    >>> parse_version(_forgiving_version('42.+?1'))
    +    
    +    >>> parse_version(_forgiving_version('hello world'))
    +    
    +    """
    +    version = version.replace(' ', '.')
    +    match = _PEP440_FALLBACK.search(version)
    +    if match:
    +        safe = match["safe"]
    +        rest = version[len(safe) :]
    +    else:
    +        safe = "0"
    +        rest = version
    +    local = f"sanitized.{_safe_segment(rest)}".strip(".")
    +    return f"{safe}.dev0+{local}"
    +
    +
    +def _safe_segment(segment):
    +    """Convert an arbitrary string into a safe segment"""
    +    segment = re.sub('[^A-Za-z0-9.]+', '-', segment)
    +    segment = re.sub('-[^A-Za-z0-9]+', '-', segment)
    +    return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-")
    +
    +
    +def safe_extra(extra: str):
    +    """Convert an arbitrary string to a standard 'extra' name
    +
    +    Any runs of non-alphanumeric characters are replaced with a single '_',
    +    and the result is always lowercased.
    +    """
    +    return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
    +
    +
    +def to_filename(name: str):
    +    """Convert a project or version name to its filename-escaped form
    +
    +    Any '-' characters are currently replaced with '_'.
    +    """
    +    return name.replace('-', '_')
    +
    +
    +def invalid_marker(text: str):
    +    """
    +    Validate text as a PEP 508 environment marker; return an exception
    +    if invalid or False otherwise.
    +    """
    +    try:
    +        evaluate_marker(text)
    +    except SyntaxError as e:
    +        e.filename = None
    +        e.lineno = None
    +        return e
    +    return False
    +
    +
    +def evaluate_marker(text: str, extra: str | None = None) -> bool:
    +    """
    +    Evaluate a PEP 508 environment marker.
    +    Return a boolean indicating the marker result in this environment.
    +    Raise SyntaxError if marker is invalid.
    +
    +    This implementation uses the 'pyparsing' module.
    +    """
    +    try:
    +        marker = _packaging_markers.Marker(text)
    +        return marker.evaluate()
    +    except _packaging_markers.InvalidMarker as e:
    +        raise SyntaxError(e) from e
    +
    +
    +class NullProvider:
    +    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
    +
    +    egg_name: str | None = None
    +    egg_info: str | None = None
    +    loader: _LoaderProtocol | None = None
    +
    +    def __init__(self, module: _ModuleLike):
    +        self.loader = getattr(module, '__loader__', None)
    +        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
    +
    +    def get_resource_filename(self, manager: ResourceManager, resource_name: str):
    +        return self._fn(self.module_path, resource_name)
    +
    +    def get_resource_stream(self, manager: ResourceManager, resource_name: str):
    +        return io.BytesIO(self.get_resource_string(manager, resource_name))
    +
    +    def get_resource_string(
    +        self, manager: ResourceManager, resource_name: str
    +    ) -> bytes:
    +        return self._get(self._fn(self.module_path, resource_name))
    +
    +    def has_resource(self, resource_name: str):
    +        return self._has(self._fn(self.module_path, resource_name))
    +
    +    def _get_metadata_path(self, name):
    +        return self._fn(self.egg_info, name)
    +
    +    def has_metadata(self, name: str) -> bool:
    +        if not self.egg_info:
    +            return False
    +
    +        path = self._get_metadata_path(name)
    +        return self._has(path)
    +
    +    def get_metadata(self, name: str):
    +        if not self.egg_info:
    +            return ""
    +        path = self._get_metadata_path(name)
    +        value = self._get(path)
    +        try:
    +            return value.decode('utf-8')
    +        except UnicodeDecodeError as exc:
    +            # Include the path in the error message to simplify
    +            # troubleshooting, and without changing the exception type.
    +            exc.reason += ' in {} file at path: {}'.format(name, path)
    +            raise
    +
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
    +        return yield_lines(self.get_metadata(name))
    +
    +    def resource_isdir(self, resource_name: str):
    +        return self._isdir(self._fn(self.module_path, resource_name))
    +
    +    def metadata_isdir(self, name: str) -> bool:
    +        return bool(self.egg_info and self._isdir(self._fn(self.egg_info, name)))
    +
    +    def resource_listdir(self, resource_name: str):
    +        return self._listdir(self._fn(self.module_path, resource_name))
    +
    +    def metadata_listdir(self, name: str) -> list[str]:
    +        if self.egg_info:
    +            return self._listdir(self._fn(self.egg_info, name))
    +        return []
    +
    +    def run_script(self, script_name: str, namespace: dict[str, Any]):
    +        script = 'scripts/' + script_name
    +        if not self.has_metadata(script):
    +            raise ResolutionError(
    +                "Script {script!r} not found in metadata at {self.egg_info!r}".format(
    +                    **locals()
    +                ),
    +            )
    +
    +        script_text = self.get_metadata(script).replace('\r\n', '\n')
    +        script_text = script_text.replace('\r', '\n')
    +        script_filename = self._fn(self.egg_info, script)
    +        namespace['__file__'] = script_filename
    +        if os.path.exists(script_filename):
    +            source = _read_utf8_with_fallback(script_filename)
    +            code = compile(source, script_filename, 'exec')
    +            exec(code, namespace, namespace)
    +        else:
    +            from linecache import cache
    +
    +            cache[script_filename] = (
    +                len(script_text),
    +                0,
    +                script_text.split('\n'),
    +                script_filename,
    +            )
    +            script_code = compile(script_text, script_filename, 'exec')
    +            exec(script_code, namespace, namespace)
    +
    +    def _has(self, path) -> bool:
    +        raise NotImplementedError(
    +            "Can't perform this operation for unregistered loader type"
    +        )
    +
    +    def _isdir(self, path) -> bool:
    +        raise NotImplementedError(
    +            "Can't perform this operation for unregistered loader type"
    +        )
    +
    +    def _listdir(self, path) -> list[str]:
    +        raise NotImplementedError(
    +            "Can't perform this operation for unregistered loader type"
    +        )
    +
    +    def _fn(self, base: str | None, resource_name: str):
    +        if base is None:
    +            raise TypeError(
    +                "`base` parameter in `_fn` is `None`. Either override this method or check the parameter first."
    +            )
    +        self._validate_resource_path(resource_name)
    +        if resource_name:
    +            return os.path.join(base, *resource_name.split('/'))
    +        return base
    +
    +    @staticmethod
    +    def _validate_resource_path(path):
    +        """
    +        Validate the resource paths according to the docs.
    +        https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access
    +
    +        >>> warned = getfixture('recwarn')
    +        >>> warnings.simplefilter('always')
    +        >>> vrp = NullProvider._validate_resource_path
    +        >>> vrp('foo/bar.txt')
    +        >>> bool(warned)
    +        False
    +        >>> vrp('../foo/bar.txt')
    +        >>> bool(warned)
    +        True
    +        >>> warned.clear()
    +        >>> vrp('/foo/bar.txt')
    +        >>> bool(warned)
    +        True
    +        >>> vrp('foo/../../bar.txt')
    +        >>> bool(warned)
    +        True
    +        >>> warned.clear()
    +        >>> vrp('foo/f../bar.txt')
    +        >>> bool(warned)
    +        False
    +
    +        Windows path separators are straight-up disallowed.
    +        >>> vrp(r'\\foo/bar.txt')
    +        Traceback (most recent call last):
    +        ...
    +        ValueError: Use of .. or absolute path in a resource path \
    +is not allowed.
    +
    +        >>> vrp(r'C:\\foo/bar.txt')
    +        Traceback (most recent call last):
    +        ...
    +        ValueError: Use of .. or absolute path in a resource path \
    +is not allowed.
    +
    +        Blank values are allowed
    +
    +        >>> vrp('')
    +        >>> bool(warned)
    +        False
    +
    +        Non-string values are not.
    +
    +        >>> vrp(None)
    +        Traceback (most recent call last):
    +        ...
    +        AttributeError: ...
    +        """
    +        invalid = (
    +            os.path.pardir in path.split(posixpath.sep)
    +            or posixpath.isabs(path)
    +            or ntpath.isabs(path)
    +            or path.startswith("\\")
    +        )
    +        if not invalid:
    +            return
    +
    +        msg = "Use of .. or absolute path in a resource path is not allowed."
    +
    +        # Aggressively disallow Windows absolute paths
    +        if (path.startswith("\\") or ntpath.isabs(path)) and not posixpath.isabs(path):
    +            raise ValueError(msg)
    +
    +        # for compatibility, warn; in future
    +        # raise ValueError(msg)
    +        issue_warning(
    +            msg[:-1] + " and will raise exceptions in a future release.",
    +            DeprecationWarning,
    +        )
    +
    +    def _get(self, path) -> bytes:
    +        if hasattr(self.loader, 'get_data') and self.loader:
    +            # Already checked get_data exists
    +            return self.loader.get_data(path)  # type: ignore[attr-defined]
    +        raise NotImplementedError(
    +            "Can't perform this operation for loaders without 'get_data()'"
    +        )
    +
    +
    +register_loader_type(object, NullProvider)
    +
    +
    +def _parents(path):
    +    """
    +    yield all parents of path including path
    +    """
    +    last = None
    +    while path != last:
    +        yield path
    +        last = path
    +        path, _ = os.path.split(path)
    +
    +
    +class EggProvider(NullProvider):
    +    """Provider based on a virtual filesystem"""
    +
    +    def __init__(self, module: _ModuleLike):
    +        super().__init__(module)
    +        self._setup_prefix()
    +
    +    def _setup_prefix(self):
    +        # Assume that metadata may be nested inside a "basket"
    +        # of multiple eggs and use module_path instead of .archive.
    +        eggs = filter(_is_egg_path, _parents(self.module_path))
    +        egg = next(eggs, None)
    +        egg and self._set_egg(egg)
    +
    +    def _set_egg(self, path: str):
    +        self.egg_name = os.path.basename(path)
    +        self.egg_info = os.path.join(path, 'EGG-INFO')
    +        self.egg_root = path
    +
    +
    +class DefaultProvider(EggProvider):
    +    """Provides access to package resources in the filesystem"""
    +
    +    def _has(self, path) -> bool:
    +        return os.path.exists(path)
    +
    +    def _isdir(self, path) -> bool:
    +        return os.path.isdir(path)
    +
    +    def _listdir(self, path):
    +        return os.listdir(path)
    +
    +    def get_resource_stream(self, manager: object, resource_name: str):
    +        return open(self._fn(self.module_path, resource_name), 'rb')
    +
    +    def _get(self, path) -> bytes:
    +        with open(path, 'rb') as stream:
    +            return stream.read()
    +
    +    @classmethod
    +    def _register(cls):
    +        loader_names = (
    +            'SourceFileLoader',
    +            'SourcelessFileLoader',
    +        )
    +        for name in loader_names:
    +            loader_cls = getattr(importlib.machinery, name, type(None))
    +            register_loader_type(loader_cls, cls)
    +
    +
    +DefaultProvider._register()
    +
    +
    +class EmptyProvider(NullProvider):
    +    """Provider that returns nothing for all requests"""
    +
    +    # A special case, we don't want all Providers inheriting from NullProvider to have a potentially None module_path
    +    module_path: str | None = None  # type: ignore[assignment]
    +
    +    _isdir = _has = lambda self, path: False
    +
    +    def _get(self, path) -> bytes:
    +        return b''
    +
    +    def _listdir(self, path):
    +        return []
    +
    +    def __init__(self):
    +        pass
    +
    +
    +empty_provider = EmptyProvider()
    +
    +
    +class ZipManifests(Dict[str, "MemoizedZipManifests.manifest_mod"]):
    +    """
    +    zip manifest builder
    +    """
    +
    +    # `path` could be `StrPath | IO[bytes]` but that violates the LSP for `MemoizedZipManifests.load`
    +    @classmethod
    +    def build(cls, path: str):
    +        """
    +        Build a dictionary similar to the zipimport directory
    +        caches, except instead of tuples, store ZipInfo objects.
    +
    +        Use a platform-specific path separator (os.sep) for the path keys
    +        for compatibility with pypy on Windows.
    +        """
    +        with zipfile.ZipFile(path) as zfile:
    +            items = (
    +                (
    +                    name.replace('/', os.sep),
    +                    zfile.getinfo(name),
    +                )
    +                for name in zfile.namelist()
    +            )
    +            return dict(items)
    +
    +    load = build
    +
    +
    +class MemoizedZipManifests(ZipManifests):
    +    """
    +    Memoized zipfile manifests.
    +    """
    +
    +    class manifest_mod(NamedTuple):
    +        manifest: dict[str, zipfile.ZipInfo]
    +        mtime: float
    +
    +    def load(self, path: str) -> dict[str, zipfile.ZipInfo]:  # type: ignore[override] # ZipManifests.load is a classmethod
    +        """
    +        Load a manifest at path or return a suitable manifest already loaded.
    +        """
    +        path = os.path.normpath(path)
    +        mtime = os.stat(path).st_mtime
    +
    +        if path not in self or self[path].mtime != mtime:
    +            manifest = self.build(path)
    +            self[path] = self.manifest_mod(manifest, mtime)
    +
    +        return self[path].manifest
    +
    +
    +class ZipProvider(EggProvider):
    +    """Resource support for zips and eggs"""
    +
    +    eagers: list[str] | None = None
    +    _zip_manifests = MemoizedZipManifests()
    +    # ZipProvider's loader should always be a zipimporter or equivalent
    +    loader: zipimport.zipimporter
    +
    +    def __init__(self, module: _ZipLoaderModule):
    +        super().__init__(module)
    +        self.zip_pre = self.loader.archive + os.sep
    +
    +    def _zipinfo_name(self, fspath):
    +        # Convert a virtual filename (full path to file) into a zipfile subpath
    +        # usable with the zipimport directory cache for our target archive
    +        fspath = fspath.rstrip(os.sep)
    +        if fspath == self.loader.archive:
    +            return ''
    +        if fspath.startswith(self.zip_pre):
    +            return fspath[len(self.zip_pre) :]
    +        raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre))
    +
    +    def _parts(self, zip_path):
    +        # Convert a zipfile subpath into an egg-relative path part list.
    +        # pseudo-fs path
    +        fspath = self.zip_pre + zip_path
    +        if fspath.startswith(self.egg_root + os.sep):
    +            return fspath[len(self.egg_root) + 1 :].split(os.sep)
    +        raise AssertionError("%s is not a subpath of %s" % (fspath, self.egg_root))
    +
    +    @property
    +    def zipinfo(self):
    +        return self._zip_manifests.load(self.loader.archive)
    +
    +    def get_resource_filename(self, manager: ResourceManager, resource_name: str):
    +        if not self.egg_name:
    +            raise NotImplementedError(
    +                "resource_filename() only supported for .egg, not .zip"
    +            )
    +        # no need to lock for extraction, since we use temp names
    +        zip_path = self._resource_to_zip(resource_name)
    +        eagers = self._get_eager_resources()
    +        if '/'.join(self._parts(zip_path)) in eagers:
    +            for name in eagers:
    +                self._extract_resource(manager, self._eager_to_zip(name))
    +        return self._extract_resource(manager, zip_path)
    +
    +    @staticmethod
    +    def _get_date_and_size(zip_stat):
    +        size = zip_stat.file_size
    +        # ymdhms+wday, yday, dst
    +        date_time = zip_stat.date_time + (0, 0, -1)
    +        # 1980 offset already done
    +        timestamp = time.mktime(date_time)
    +        return timestamp, size
    +
    +    # FIXME: 'ZipProvider._extract_resource' is too complex (12)
    +    def _extract_resource(self, manager: ResourceManager, zip_path) -> str:  # noqa: C901
    +        if zip_path in self._index():
    +            for name in self._index()[zip_path]:
    +                last = self._extract_resource(manager, os.path.join(zip_path, name))
    +            # return the extracted directory name
    +            return os.path.dirname(last)
    +
    +        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
    +
    +        if not WRITE_SUPPORT:
    +            raise OSError(
    +                '"os.rename" and "os.unlink" are not supported on this platform'
    +            )
    +        try:
    +            if not self.egg_name:
    +                raise OSError(
    +                    '"egg_name" is empty. This likely means no egg could be found from the "module_path".'
    +                )
    +            real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
    +
    +            if self._is_current(real_path, zip_path):
    +                return real_path
    +
    +            outf, tmpnam = _mkstemp(
    +                ".$extract",
    +                dir=os.path.dirname(real_path),
    +            )
    +            os.write(outf, self.loader.get_data(zip_path))
    +            os.close(outf)
    +            utime(tmpnam, (timestamp, timestamp))
    +            manager.postprocess(tmpnam, real_path)
    +
    +            try:
    +                rename(tmpnam, real_path)
    +
    +            except OSError:
    +                if os.path.isfile(real_path):
    +                    if self._is_current(real_path, zip_path):
    +                        # the file became current since it was checked above,
    +                        #  so proceed.
    +                        return real_path
    +                    # Windows, del old file and retry
    +                    elif os.name == 'nt':
    +                        unlink(real_path)
    +                        rename(tmpnam, real_path)
    +                        return real_path
    +                raise
    +
    +        except OSError:
    +            # report a user-friendly error
    +            manager.extraction_error()
    +
    +        return real_path
    +
    +    def _is_current(self, file_path, zip_path):
    +        """
    +        Return True if the file_path is current for this zip_path
    +        """
    +        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
    +        if not os.path.isfile(file_path):
    +            return False
    +        stat = os.stat(file_path)
    +        if stat.st_size != size or stat.st_mtime != timestamp:
    +            return False
    +        # check that the contents match
    +        zip_contents = self.loader.get_data(zip_path)
    +        with open(file_path, 'rb') as f:
    +            file_contents = f.read()
    +        return zip_contents == file_contents
    +
    +    def _get_eager_resources(self):
    +        if self.eagers is None:
    +            eagers = []
    +            for name in ('native_libs.txt', 'eager_resources.txt'):
    +                if self.has_metadata(name):
    +                    eagers.extend(self.get_metadata_lines(name))
    +            self.eagers = eagers
    +        return self.eagers
    +
    +    def _index(self):
    +        try:
    +            return self._dirindex
    +        except AttributeError:
    +            ind = {}
    +            for path in self.zipinfo:
    +                parts = path.split(os.sep)
    +                while parts:
    +                    parent = os.sep.join(parts[:-1])
    +                    if parent in ind:
    +                        ind[parent].append(parts[-1])
    +                        break
    +                    else:
    +                        ind[parent] = [parts.pop()]
    +            self._dirindex = ind
    +            return ind
    +
    +    def _has(self, fspath) -> bool:
    +        zip_path = self._zipinfo_name(fspath)
    +        return zip_path in self.zipinfo or zip_path in self._index()
    +
    +    def _isdir(self, fspath) -> bool:
    +        return self._zipinfo_name(fspath) in self._index()
    +
    +    def _listdir(self, fspath):
    +        return list(self._index().get(self._zipinfo_name(fspath), ()))
    +
    +    def _eager_to_zip(self, resource_name: str):
    +        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
    +
    +    def _resource_to_zip(self, resource_name: str):
    +        return self._zipinfo_name(self._fn(self.module_path, resource_name))
    +
    +
    +register_loader_type(zipimport.zipimporter, ZipProvider)
    +
    +
    +class FileMetadata(EmptyProvider):
    +    """Metadata handler for standalone PKG-INFO files
    +
    +    Usage::
    +
    +        metadata = FileMetadata("/path/to/PKG-INFO")
    +
    +    This provider rejects all data and metadata requests except for PKG-INFO,
    +    which is treated as existing, and will be the contents of the file at
    +    the provided location.
    +    """
    +
    +    def __init__(self, path: StrPath):
    +        self.path = path
    +
    +    def _get_metadata_path(self, name):
    +        return self.path
    +
    +    def has_metadata(self, name: str) -> bool:
    +        return name == 'PKG-INFO' and os.path.isfile(self.path)
    +
    +    def get_metadata(self, name: str):
    +        if name != 'PKG-INFO':
    +            raise KeyError("No metadata except PKG-INFO is available")
    +
    +        with open(self.path, encoding='utf-8', errors="replace") as f:
    +            metadata = f.read()
    +        self._warn_on_replacement(metadata)
    +        return metadata
    +
    +    def _warn_on_replacement(self, metadata):
    +        replacement_char = '�'
    +        if replacement_char in metadata:
    +            tmpl = "{self.path} could not be properly decoded in UTF-8"
    +            msg = tmpl.format(**locals())
    +            warnings.warn(msg)
    +
    +    def get_metadata_lines(self, name: str) -> Iterator[str]:
    +        return yield_lines(self.get_metadata(name))
    +
    +
    +class PathMetadata(DefaultProvider):
    +    """Metadata provider for egg directories
    +
    +    Usage::
    +
    +        # Development eggs:
    +
    +        egg_info = "/path/to/PackageName.egg-info"
    +        base_dir = os.path.dirname(egg_info)
    +        metadata = PathMetadata(base_dir, egg_info)
    +        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
    +        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
    +
    +        # Unpacked egg directories:
    +
    +        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
    +        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
    +        dist = Distribution.from_filename(egg_path, metadata=metadata)
    +    """
    +
    +    def __init__(self, path: str, egg_info: str):
    +        self.module_path = path
    +        self.egg_info = egg_info
    +
    +
    +class EggMetadata(ZipProvider):
    +    """Metadata provider for .egg files"""
    +
    +    def __init__(self, importer: zipimport.zipimporter):
    +        """Create a metadata provider from a zipimporter"""
    +
    +        self.zip_pre = importer.archive + os.sep
    +        self.loader = importer
    +        if importer.prefix:
    +            self.module_path = os.path.join(importer.archive, importer.prefix)
    +        else:
    +            self.module_path = importer.archive
    +        self._setup_prefix()
    +
    +
    +_distribution_finders: dict[type, _DistFinderType[Any]] = _declare_state(
    +    'dict', '_distribution_finders', {}
    +)
    +
    +
    +def register_finder(importer_type: type[_T], distribution_finder: _DistFinderType[_T]):
    +    """Register `distribution_finder` to find distributions in sys.path items
    +
    +    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    +    handler), and `distribution_finder` is a callable that, passed a path
    +    item and the importer instance, yields ``Distribution`` instances found on
    +    that path item.  See ``pkg_resources.find_on_path`` for an example."""
    +    _distribution_finders[importer_type] = distribution_finder
    +
    +
    +def find_distributions(path_item: str, only: bool = False):
    +    """Yield distributions accessible via `path_item`"""
    +    importer = get_importer(path_item)
    +    finder = _find_adapter(_distribution_finders, importer)
    +    return finder(importer, path_item, only)
    +
    +
    +def find_eggs_in_zip(
    +    importer: zipimport.zipimporter, path_item: str, only: bool = False
    +) -> Iterator[Distribution]:
    +    """
    +    Find eggs in zip files; possibly multiple nested eggs.
    +    """
    +    if importer.archive.endswith('.whl'):
    +        # wheels are not supported with this finder
    +        # they don't have PKG-INFO metadata, and won't ever contain eggs
    +        return
    +    metadata = EggMetadata(importer)
    +    if metadata.has_metadata('PKG-INFO'):
    +        yield Distribution.from_filename(path_item, metadata=metadata)
    +    if only:
    +        # don't yield nested distros
    +        return
    +    for subitem in metadata.resource_listdir(''):
    +        if _is_egg_path(subitem):
    +            subpath = os.path.join(path_item, subitem)
    +            dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
    +            yield from dists
    +        elif subitem.lower().endswith(('.dist-info', '.egg-info')):
    +            subpath = os.path.join(path_item, subitem)
    +            submeta = EggMetadata(zipimport.zipimporter(subpath))
    +            submeta.egg_info = subpath
    +            yield Distribution.from_location(path_item, subitem, submeta)
    +
    +
    +register_finder(zipimport.zipimporter, find_eggs_in_zip)
    +
    +
    +def find_nothing(
    +    importer: object | None, path_item: str | None, only: bool | None = False
    +):
    +    return ()
    +
    +
    +register_finder(object, find_nothing)
    +
    +
    +def find_on_path(importer: object | None, path_item, only=False):
    +    """Yield distributions accessible on a sys.path directory"""
    +    path_item = _normalize_cached(path_item)
    +
    +    if _is_unpacked_egg(path_item):
    +        yield Distribution.from_filename(
    +            path_item,
    +            metadata=PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')),
    +        )
    +        return
    +
    +    entries = (os.path.join(path_item, child) for child in safe_listdir(path_item))
    +
    +    # scan for .egg and .egg-info in directory
    +    for entry in sorted(entries):
    +        fullpath = os.path.join(path_item, entry)
    +        factory = dist_factory(path_item, entry, only)
    +        yield from factory(fullpath)
    +
    +
    +def dist_factory(path_item, entry, only):
    +    """Return a dist_factory for the given entry."""
    +    lower = entry.lower()
    +    is_egg_info = lower.endswith('.egg-info')
    +    is_dist_info = lower.endswith('.dist-info') and os.path.isdir(
    +        os.path.join(path_item, entry)
    +    )
    +    is_meta = is_egg_info or is_dist_info
    +    return (
    +        distributions_from_metadata
    +        if is_meta
    +        else find_distributions
    +        if not only and _is_egg_path(entry)
    +        else resolve_egg_link
    +        if not only and lower.endswith('.egg-link')
    +        else NoDists()
    +    )
    +
    +
    +class NoDists:
    +    """
    +    >>> bool(NoDists())
    +    False
    +
    +    >>> list(NoDists()('anything'))
    +    []
    +    """
    +
    +    def __bool__(self):
    +        return False
    +
    +    def __call__(self, fullpath):
    +        return iter(())
    +
    +
    +def safe_listdir(path: StrOrBytesPath):
    +    """
    +    Attempt to list contents of path, but suppress some exceptions.
    +    """
    +    try:
    +        return os.listdir(path)
    +    except (PermissionError, NotADirectoryError):
    +        pass
    +    except OSError as e:
    +        # Ignore the directory if does not exist, not a directory or
    +        # permission denied
    +        if e.errno not in (errno.ENOTDIR, errno.EACCES, errno.ENOENT):
    +            raise
    +    return ()
    +
    +
    +def distributions_from_metadata(path: str):
    +    root = os.path.dirname(path)
    +    if os.path.isdir(path):
    +        if len(os.listdir(path)) == 0:
    +            # empty metadata dir; skip
    +            return
    +        metadata: _MetadataType = PathMetadata(root, path)
    +    else:
    +        metadata = FileMetadata(path)
    +    entry = os.path.basename(path)
    +    yield Distribution.from_location(
    +        root,
    +        entry,
    +        metadata,
    +        precedence=DEVELOP_DIST,
    +    )
    +
    +
    +def non_empty_lines(path):
    +    """
    +    Yield non-empty lines from file at path
    +    """
    +    for line in _read_utf8_with_fallback(path).splitlines():
    +        line = line.strip()
    +        if line:
    +            yield line
    +
    +
    +def resolve_egg_link(path):
    +    """
    +    Given a path to an .egg-link, resolve distributions
    +    present in the referenced path.
    +    """
    +    referenced_paths = non_empty_lines(path)
    +    resolved_paths = (
    +        os.path.join(os.path.dirname(path), ref) for ref in referenced_paths
    +    )
    +    dist_groups = map(find_distributions, resolved_paths)
    +    return next(dist_groups, ())
    +
    +
    +if hasattr(pkgutil, 'ImpImporter'):
    +    register_finder(pkgutil.ImpImporter, find_on_path)
    +
    +register_finder(importlib.machinery.FileFinder, find_on_path)
    +
    +_namespace_handlers: dict[type, _NSHandlerType[Any]] = _declare_state(
    +    'dict', '_namespace_handlers', {}
    +)
    +_namespace_packages: dict[str | None, list[str]] = _declare_state(
    +    'dict', '_namespace_packages', {}
    +)
    +
    +
    +def register_namespace_handler(
    +    importer_type: type[_T], namespace_handler: _NSHandlerType[_T]
    +):
    +    """Register `namespace_handler` to declare namespace packages
    +
    +    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
    +    handler), and `namespace_handler` is a callable like this::
    +
    +        def namespace_handler(importer, path_entry, moduleName, module):
    +            # return a path_entry to use for child packages
    +
    +    Namespace handlers are only called if the importer object has already
    +    agreed that it can handle the relevant path item, and they should only
    +    return a subpath if the module __path__ does not already contain an
    +    equivalent subpath.  For an example namespace handler, see
    +    ``pkg_resources.file_ns_handler``.
    +    """
    +    _namespace_handlers[importer_type] = namespace_handler
    +
    +
    +def _handle_ns(packageName, path_item):
    +    """Ensure that named package includes a subpath of path_item (if needed)"""
    +
    +    importer = get_importer(path_item)
    +    if importer is None:
    +        return None
    +
    +    # use find_spec (PEP 451) and fall-back to find_module (PEP 302)
    +    try:
    +        spec = importer.find_spec(packageName)
    +    except AttributeError:
    +        # capture warnings due to #1111
    +        with warnings.catch_warnings():
    +            warnings.simplefilter("ignore")
    +            loader = importer.find_module(packageName)
    +    else:
    +        loader = spec.loader if spec else None
    +
    +    if loader is None:
    +        return None
    +    module = sys.modules.get(packageName)
    +    if module is None:
    +        module = sys.modules[packageName] = types.ModuleType(packageName)
    +        module.__path__ = []
    +        _set_parent_ns(packageName)
    +    elif not hasattr(module, '__path__'):
    +        raise TypeError("Not a package:", packageName)
    +    handler = _find_adapter(_namespace_handlers, importer)
    +    subpath = handler(importer, path_item, packageName, module)
    +    if subpath is not None:
    +        path = module.__path__
    +        path.append(subpath)
    +        importlib.import_module(packageName)
    +        _rebuild_mod_path(path, packageName, module)
    +    return subpath
    +
    +
    +def _rebuild_mod_path(orig_path, package_name, module: types.ModuleType):
    +    """
    +    Rebuild module.__path__ ensuring that all entries are ordered
    +    corresponding to their sys.path order
    +    """
    +    sys_path = [_normalize_cached(p) for p in sys.path]
    +
    +    def safe_sys_path_index(entry):
    +        """
    +        Workaround for #520 and #513.
    +        """
    +        try:
    +            return sys_path.index(entry)
    +        except ValueError:
    +            return float('inf')
    +
    +    def position_in_sys_path(path):
    +        """
    +        Return the ordinal of the path based on its position in sys.path
    +        """
    +        path_parts = path.split(os.sep)
    +        module_parts = package_name.count('.') + 1
    +        parts = path_parts[:-module_parts]
    +        return safe_sys_path_index(_normalize_cached(os.sep.join(parts)))
    +
    +    new_path = sorted(orig_path, key=position_in_sys_path)
    +    new_path = [_normalize_cached(p) for p in new_path]
    +
    +    if isinstance(module.__path__, list):
    +        module.__path__[:] = new_path
    +    else:
    +        module.__path__ = new_path
    +
    +
    +def declare_namespace(packageName: str):
    +    """Declare that package 'packageName' is a namespace package"""
    +
    +    msg = (
    +        f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n"
    +        "Implementing implicit namespace packages (as specified in PEP 420) "
    +        "is preferred to `pkg_resources.declare_namespace`. "
    +        "See https://setuptools.pypa.io/en/latest/references/"
    +        "keywords.html#keyword-namespace-packages"
    +    )
    +    warnings.warn(msg, DeprecationWarning, stacklevel=2)
    +
    +    _imp.acquire_lock()
    +    try:
    +        if packageName in _namespace_packages:
    +            return
    +
    +        path: MutableSequence[str] = sys.path
    +        parent, _, _ = packageName.rpartition('.')
    +
    +        if parent:
    +            declare_namespace(parent)
    +            if parent not in _namespace_packages:
    +                __import__(parent)
    +            try:
    +                path = sys.modules[parent].__path__
    +            except AttributeError as e:
    +                raise TypeError("Not a package:", parent) from e
    +
    +        # Track what packages are namespaces, so when new path items are added,
    +        # they can be updated
    +        _namespace_packages.setdefault(parent or None, []).append(packageName)
    +        _namespace_packages.setdefault(packageName, [])
    +
    +        for path_item in path:
    +            # Ensure all the parent's path items are reflected in the child,
    +            # if they apply
    +            _handle_ns(packageName, path_item)
    +
    +    finally:
    +        _imp.release_lock()
    +
    +
    +def fixup_namespace_packages(path_item: str, parent: str | None = None):
    +    """Ensure that previously-declared namespace packages include path_item"""
    +    _imp.acquire_lock()
    +    try:
    +        for package in _namespace_packages.get(parent, ()):
    +            subpath = _handle_ns(package, path_item)
    +            if subpath:
    +                fixup_namespace_packages(subpath, package)
    +    finally:
    +        _imp.release_lock()
    +
    +
    +def file_ns_handler(
    +    importer: object,
    +    path_item: StrPath,
    +    packageName: str,
    +    module: types.ModuleType,
    +):
    +    """Compute an ns-package subpath for a filesystem or zipfile importer"""
    +
    +    subpath = os.path.join(path_item, packageName.split('.')[-1])
    +    normalized = _normalize_cached(subpath)
    +    for item in module.__path__:
    +        if _normalize_cached(item) == normalized:
    +            break
    +    else:
    +        # Only return the path if it's not already there
    +        return subpath
    +
    +
    +if hasattr(pkgutil, 'ImpImporter'):
    +    register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
    +
    +register_namespace_handler(zipimport.zipimporter, file_ns_handler)
    +register_namespace_handler(importlib.machinery.FileFinder, file_ns_handler)
    +
    +
    +def null_ns_handler(
    +    importer: object,
    +    path_item: str | None,
    +    packageName: str | None,
    +    module: _ModuleLike | None,
    +):
    +    return None
    +
    +
    +register_namespace_handler(object, null_ns_handler)
    +
    +
    +@overload
    +def normalize_path(filename: StrPath) -> str: ...
    +@overload
    +def normalize_path(filename: BytesPath) -> bytes: ...
    +def normalize_path(filename: StrOrBytesPath):
    +    """Normalize a file/dir name for comparison purposes"""
    +    return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
    +
    +
    +def _cygwin_patch(filename: StrOrBytesPath):  # pragma: nocover
    +    """
    +    Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
    +    symlink components. Using
    +    os.path.abspath() works around this limitation. A fix in os.getcwd()
    +    would probably better, in Cygwin even more so, except
    +    that this seems to be by design...
    +    """
    +    return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
    +
    +
    +if TYPE_CHECKING:
    +    # https://github.com/python/mypy/issues/16261
    +    # https://github.com/python/typeshed/issues/6347
    +    @overload
    +    def _normalize_cached(filename: StrPath) -> str: ...
    +    @overload
    +    def _normalize_cached(filename: BytesPath) -> bytes: ...
    +    def _normalize_cached(filename: StrOrBytesPath) -> str | bytes: ...
    +else:
    +
    +    @functools.lru_cache(maxsize=None)
    +    def _normalize_cached(filename):
    +        return normalize_path(filename)
    +
    +
    +def _is_egg_path(path):
    +    """
    +    Determine if given path appears to be an egg.
    +    """
    +    return _is_zip_egg(path) or _is_unpacked_egg(path)
    +
    +
    +def _is_zip_egg(path):
    +    return (
    +        path.lower().endswith('.egg')
    +        and os.path.isfile(path)
    +        and zipfile.is_zipfile(path)
    +    )
    +
    +
    +def _is_unpacked_egg(path):
    +    """
    +    Determine if given path appears to be an unpacked egg.
    +    """
    +    return path.lower().endswith('.egg') and os.path.isfile(
    +        os.path.join(path, 'EGG-INFO', 'PKG-INFO')
    +    )
    +
    +
    +def _set_parent_ns(packageName):
    +    parts = packageName.split('.')
    +    name = parts.pop()
    +    if parts:
    +        parent = '.'.join(parts)
    +        setattr(sys.modules[parent], name, sys.modules[packageName])
    +
    +
    +MODULE = re.compile(r"\w+(\.\w+)*$").match
    +EGG_NAME = re.compile(
    +    r"""
    +    (?P[^-]+) (
    +        -(?P[^-]+) (
    +            -py(?P[^-]+) (
    +                -(?P.+)
    +            )?
    +        )?
    +    )?
    +    """,
    +    re.VERBOSE | re.IGNORECASE,
    +).match
    +
    +
    +class EntryPoint:
    +    """Object representing an advertised importable object"""
    +
    +    def __init__(
    +        self,
    +        name: str,
    +        module_name: str,
    +        attrs: Iterable[str] = (),
    +        extras: Iterable[str] = (),
    +        dist: Distribution | None = None,
    +    ):
    +        if not MODULE(module_name):
    +            raise ValueError("Invalid module name", module_name)
    +        self.name = name
    +        self.module_name = module_name
    +        self.attrs = tuple(attrs)
    +        self.extras = tuple(extras)
    +        self.dist = dist
    +
    +    def __str__(self):
    +        s = "%s = %s" % (self.name, self.module_name)
    +        if self.attrs:
    +            s += ':' + '.'.join(self.attrs)
    +        if self.extras:
    +            s += ' [%s]' % ','.join(self.extras)
    +        return s
    +
    +    def __repr__(self):
    +        return "EntryPoint.parse(%r)" % str(self)
    +
    +    @overload
    +    def load(
    +        self,
    +        require: Literal[True] = True,
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +    ) -> _ResolvedEntryPoint: ...
    +    @overload
    +    def load(
    +        self,
    +        require: Literal[False],
    +        *args: Any,
    +        **kwargs: Any,
    +    ) -> _ResolvedEntryPoint: ...
    +    def load(
    +        self,
    +        require: bool = True,
    +        *args: Environment | _InstallerType | None,
    +        **kwargs: Environment | _InstallerType | None,
    +    ) -> _ResolvedEntryPoint:
    +        """
    +        Require packages for this EntryPoint, then resolve it.
    +        """
    +        if not require or args or kwargs:
    +            warnings.warn(
    +                "Parameters to load are deprecated.  Call .resolve and "
    +                ".require separately.",
    +                PkgResourcesDeprecationWarning,
    +                stacklevel=2,
    +            )
    +        if require:
    +            # We could pass `env` and `installer` directly,
    +            # but keeping `*args` and `**kwargs` for backwards compatibility
    +            self.require(*args, **kwargs)  # type: ignore
    +        return self.resolve()
    +
    +    def resolve(self) -> _ResolvedEntryPoint:
    +        """
    +        Resolve the entry point from its module and attrs.
    +        """
    +        module = __import__(self.module_name, fromlist=['__name__'], level=0)
    +        try:
    +            return functools.reduce(getattr, self.attrs, module)
    +        except AttributeError as exc:
    +            raise ImportError(str(exc)) from exc
    +
    +    def require(
    +        self,
    +        env: Environment | None = None,
    +        installer: _InstallerType | None = None,
    +    ):
    +        if not self.dist:
    +            error_cls = UnknownExtra if self.extras else AttributeError
    +            raise error_cls("Can't require() without a distribution", self)
    +
    +        # Get the requirements for this entry point with all its extras and
    +        # then resolve them. We have to pass `extras` along when resolving so
    +        # that the working set knows what extras we want. Otherwise, for
    +        # dist-info distributions, the working set will assume that the
    +        # requirements for that extra are purely optional and skip over them.
    +        reqs = self.dist.requires(self.extras)
    +        items = working_set.resolve(reqs, env, installer, extras=self.extras)
    +        list(map(working_set.add, items))
    +
    +    pattern = re.compile(
    +        r'\s*'
    +        r'(?P.+?)\s*'
    +        r'=\s*'
    +        r'(?P[\w.]+)\s*'
    +        r'(:\s*(?P[\w.]+))?\s*'
    +        r'(?P\[.*\])?\s*$'
    +    )
    +
    +    @classmethod
    +    def parse(cls, src: str, dist: Distribution | None = None):
    +        """Parse a single entry point from string `src`
    +
    +        Entry point syntax follows the form::
    +
    +            name = some.module:some.attr [extra1, extra2]
    +
    +        The entry name and module name are required, but the ``:attrs`` and
    +        ``[extras]`` parts are optional
    +        """
    +        m = cls.pattern.match(src)
    +        if not m:
    +            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
    +            raise ValueError(msg, src)
    +        res = m.groupdict()
    +        extras = cls._parse_extras(res['extras'])
    +        attrs = res['attr'].split('.') if res['attr'] else ()
    +        return cls(res['name'], res['module'], attrs, extras, dist)
    +
    +    @classmethod
    +    def _parse_extras(cls, extras_spec):
    +        if not extras_spec:
    +            return ()
    +        req = Requirement.parse('x' + extras_spec)
    +        if req.specs:
    +            raise ValueError
    +        return req.extras
    +
    +    @classmethod
    +    def parse_group(
    +        cls,
    +        group: str,
    +        lines: _NestedStr,
    +        dist: Distribution | None = None,
    +    ):
    +        """Parse an entry point group"""
    +        if not MODULE(group):
    +            raise ValueError("Invalid group name", group)
    +        this: dict[str, Self] = {}
    +        for line in yield_lines(lines):
    +            ep = cls.parse(line, dist)
    +            if ep.name in this:
    +                raise ValueError("Duplicate entry point", group, ep.name)
    +            this[ep.name] = ep
    +        return this
    +
    +    @classmethod
    +    def parse_map(
    +        cls,
    +        data: str | Iterable[str] | dict[str, str | Iterable[str]],
    +        dist: Distribution | None = None,
    +    ):
    +        """Parse a map of entry point groups"""
    +        _data: Iterable[tuple[str | None, str | Iterable[str]]]
    +        if isinstance(data, dict):
    +            _data = data.items()
    +        else:
    +            _data = split_sections(data)
    +        maps: dict[str, dict[str, Self]] = {}
    +        for group, lines in _data:
    +            if group is None:
    +                if not lines:
    +                    continue
    +                raise ValueError("Entry points must be listed in groups")
    +            group = group.strip()
    +            if group in maps:
    +                raise ValueError("Duplicate group name", group)
    +            maps[group] = cls.parse_group(group, lines, dist)
    +        return maps
    +
    +
    +def _version_from_file(lines):
    +    """
    +    Given an iterable of lines from a Metadata file, return
    +    the value of the Version field, if present, or None otherwise.
    +    """
    +
    +    def is_version_line(line):
    +        return line.lower().startswith('version:')
    +
    +    version_lines = filter(is_version_line, lines)
    +    line = next(iter(version_lines), '')
    +    _, _, value = line.partition(':')
    +    return safe_version(value.strip()) or None
    +
    +
    +class Distribution:
    +    """Wrap an actual or potential sys.path entry w/metadata"""
    +
    +    PKG_INFO = 'PKG-INFO'
    +
    +    def __init__(
    +        self,
    +        location: str | None = None,
    +        metadata: _MetadataType = None,
    +        project_name: str | None = None,
    +        version: str | None = None,
    +        py_version: str | None = PY_MAJOR,
    +        platform: str | None = None,
    +        precedence: int = EGG_DIST,
    +    ):
    +        self.project_name = safe_name(project_name or 'Unknown')
    +        if version is not None:
    +            self._version = safe_version(version)
    +        self.py_version = py_version
    +        self.platform = platform
    +        self.location = location
    +        self.precedence = precedence
    +        self._provider = metadata or empty_provider
    +
    +    @classmethod
    +    def from_location(
    +        cls,
    +        location: str,
    +        basename: StrPath,
    +        metadata: _MetadataType = None,
    +        **kw: int,  # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
    +    ) -> Distribution:
    +        project_name, version, py_version, platform = [None] * 4
    +        basename, ext = os.path.splitext(basename)
    +        if ext.lower() in _distributionImpl:
    +            cls = _distributionImpl[ext.lower()]
    +
    +            match = EGG_NAME(basename)
    +            if match:
    +                project_name, version, py_version, platform = match.group(
    +                    'name', 'ver', 'pyver', 'plat'
    +                )
    +        return cls(
    +            location,
    +            metadata,
    +            project_name=project_name,
    +            version=version,
    +            py_version=py_version,
    +            platform=platform,
    +            **kw,
    +        )._reload_version()
    +
    +    def _reload_version(self):
    +        return self
    +
    +    @property
    +    def hashcmp(self):
    +        return (
    +            self._forgiving_parsed_version,
    +            self.precedence,
    +            self.key,
    +            self.location,
    +            self.py_version or '',
    +            self.platform or '',
    +        )
    +
    +    def __hash__(self):
    +        return hash(self.hashcmp)
    +
    +    def __lt__(self, other: Distribution):
    +        return self.hashcmp < other.hashcmp
    +
    +    def __le__(self, other: Distribution):
    +        return self.hashcmp <= other.hashcmp
    +
    +    def __gt__(self, other: Distribution):
    +        return self.hashcmp > other.hashcmp
    +
    +    def __ge__(self, other: Distribution):
    +        return self.hashcmp >= other.hashcmp
    +
    +    def __eq__(self, other: object):
    +        if not isinstance(other, self.__class__):
    +            # It's not a Distribution, so they are not equal
    +            return False
    +        return self.hashcmp == other.hashcmp
    +
    +    def __ne__(self, other: object):
    +        return not self == other
    +
    +    # These properties have to be lazy so that we don't have to load any
    +    # metadata until/unless it's actually needed.  (i.e., some distributions
    +    # may not know their name or version without loading PKG-INFO)
    +
    +    @property
    +    def key(self):
    +        try:
    +            return self._key
    +        except AttributeError:
    +            self._key = key = self.project_name.lower()
    +            return key
    +
    +    @property
    +    def parsed_version(self):
    +        if not hasattr(self, "_parsed_version"):
    +            try:
    +                self._parsed_version = parse_version(self.version)
    +            except _packaging_version.InvalidVersion as ex:
    +                info = f"(package: {self.project_name})"
    +                if hasattr(ex, "add_note"):
    +                    ex.add_note(info)  # PEP 678
    +                    raise
    +                raise _packaging_version.InvalidVersion(f"{str(ex)} {info}") from None
    +
    +        return self._parsed_version
    +
    +    @property
    +    def _forgiving_parsed_version(self):
    +        try:
    +            return self.parsed_version
    +        except _packaging_version.InvalidVersion as ex:
    +            self._parsed_version = parse_version(_forgiving_version(self.version))
    +
    +            notes = "\n".join(getattr(ex, "__notes__", []))  # PEP 678
    +            msg = f"""!!\n\n
    +            *************************************************************************
    +            {str(ex)}\n{notes}
    +
    +            This is a long overdue deprecation.
    +            For the time being, `pkg_resources` will use `{self._parsed_version}`
    +            as a replacement to avoid breaking existing environments,
    +            but no future compatibility is guaranteed.
    +
    +            If you maintain package {self.project_name} you should implement
    +            the relevant changes to adequate the project to PEP 440 immediately.
    +            *************************************************************************
    +            \n\n!!
    +            """
    +            warnings.warn(msg, DeprecationWarning)
    +
    +            return self._parsed_version
    +
    +    @property
    +    def version(self):
    +        try:
    +            return self._version
    +        except AttributeError as e:
    +            version = self._get_version()
    +            if version is None:
    +                path = self._get_metadata_path_for_display(self.PKG_INFO)
    +                msg = ("Missing 'Version:' header and/or {} file at path: {}").format(
    +                    self.PKG_INFO, path
    +                )
    +                raise ValueError(msg, self) from e
    +
    +            return version
    +
    +    @property
    +    def _dep_map(self):
    +        """
    +        A map of extra to its list of (direct) requirements
    +        for this distribution, including the null extra.
    +        """
    +        try:
    +            return self.__dep_map
    +        except AttributeError:
    +            self.__dep_map = self._filter_extras(self._build_dep_map())
    +        return self.__dep_map
    +
    +    @staticmethod
    +    def _filter_extras(dm: dict[str | None, list[Requirement]]):
    +        """
    +        Given a mapping of extras to dependencies, strip off
    +        environment markers and filter out any dependencies
    +        not matching the markers.
    +        """
    +        for extra in list(filter(None, dm)):
    +            new_extra: str | None = extra
    +            reqs = dm.pop(extra)
    +            new_extra, _, marker = extra.partition(':')
    +            fails_marker = marker and (
    +                invalid_marker(marker) or not evaluate_marker(marker)
    +            )
    +            if fails_marker:
    +                reqs = []
    +            new_extra = safe_extra(new_extra) or None
    +
    +            dm.setdefault(new_extra, []).extend(reqs)
    +        return dm
    +
    +    def _build_dep_map(self):
    +        dm = {}
    +        for name in 'requires.txt', 'depends.txt':
    +            for extra, reqs in split_sections(self._get_metadata(name)):
    +                dm.setdefault(extra, []).extend(parse_requirements(reqs))
    +        return dm
    +
    +    def requires(self, extras: Iterable[str] = ()):
    +        """List of Requirements needed for this distro if `extras` are used"""
    +        dm = self._dep_map
    +        deps: list[Requirement] = []
    +        deps.extend(dm.get(None, ()))
    +        for ext in extras:
    +            try:
    +                deps.extend(dm[safe_extra(ext)])
    +            except KeyError as e:
    +                raise UnknownExtra(
    +                    "%s has no such extra feature %r" % (self, ext)
    +                ) from e
    +        return deps
    +
    +    def _get_metadata_path_for_display(self, name):
    +        """
    +        Return the path to the given metadata file, if available.
    +        """
    +        try:
    +            # We need to access _get_metadata_path() on the provider object
    +            # directly rather than through this class's __getattr__()
    +            # since _get_metadata_path() is marked private.
    +            path = self._provider._get_metadata_path(name)
    +
    +        # Handle exceptions e.g. in case the distribution's metadata
    +        # provider doesn't support _get_metadata_path().
    +        except Exception:
    +            return '[could not detect]'
    +
    +        return path
    +
    +    def _get_metadata(self, name):
    +        if self.has_metadata(name):
    +            yield from self.get_metadata_lines(name)
    +
    +    def _get_version(self):
    +        lines = self._get_metadata(self.PKG_INFO)
    +        return _version_from_file(lines)
    +
    +    def activate(self, path: list[str] | None = None, replace: bool = False):
    +        """Ensure distribution is importable on `path` (default=sys.path)"""
    +        if path is None:
    +            path = sys.path
    +        self.insert_on(path, replace=replace)
    +        if path is sys.path and self.location is not None:
    +            fixup_namespace_packages(self.location)
    +            for pkg in self._get_metadata('namespace_packages.txt'):
    +                if pkg in sys.modules:
    +                    declare_namespace(pkg)
    +
    +    def egg_name(self):
    +        """Return what this distribution's standard .egg filename should be"""
    +        filename = "%s-%s-py%s" % (
    +            to_filename(self.project_name),
    +            to_filename(self.version),
    +            self.py_version or PY_MAJOR,
    +        )
    +
    +        if self.platform:
    +            filename += '-' + self.platform
    +        return filename
    +
    +    def __repr__(self):
    +        if self.location:
    +            return "%s (%s)" % (self, self.location)
    +        else:
    +            return str(self)
    +
    +    def __str__(self):
    +        try:
    +            version = getattr(self, 'version', None)
    +        except ValueError:
    +            version = None
    +        version = version or "[unknown version]"
    +        return "%s %s" % (self.project_name, version)
    +
    +    def __getattr__(self, attr):
    +        """Delegate all unrecognized public attributes to .metadata provider"""
    +        if attr.startswith('_'):
    +            raise AttributeError(attr)
    +        return getattr(self._provider, attr)
    +
    +    def __dir__(self):
    +        return list(
    +            set(super().__dir__())
    +            | set(attr for attr in self._provider.__dir__() if not attr.startswith('_'))
    +        )
    +
    +    @classmethod
    +    def from_filename(
    +        cls,
    +        filename: StrPath,
    +        metadata: _MetadataType = None,
    +        **kw: int,  # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
    +    ):
    +        return cls.from_location(
    +            _normalize_cached(filename), os.path.basename(filename), metadata, **kw
    +        )
    +
    +    def as_requirement(self):
    +        """Return a ``Requirement`` that matches this distribution exactly"""
    +        if isinstance(self.parsed_version, _packaging_version.Version):
    +            spec = "%s==%s" % (self.project_name, self.parsed_version)
    +        else:
    +            spec = "%s===%s" % (self.project_name, self.parsed_version)
    +
    +        return Requirement.parse(spec)
    +
    +    def load_entry_point(self, group: str, name: str) -> _ResolvedEntryPoint:
    +        """Return the `name` entry point of `group` or raise ImportError"""
    +        ep = self.get_entry_info(group, name)
    +        if ep is None:
    +            raise ImportError("Entry point %r not found" % ((group, name),))
    +        return ep.load()
    +
    +    @overload
    +    def get_entry_map(self, group: None = None) -> dict[str, dict[str, EntryPoint]]: ...
    +    @overload
    +    def get_entry_map(self, group: str) -> dict[str, EntryPoint]: ...
    +    def get_entry_map(self, group: str | None = None):
    +        """Return the entry point map for `group`, or the full entry map"""
    +        if not hasattr(self, "_ep_map"):
    +            self._ep_map = EntryPoint.parse_map(
    +                self._get_metadata('entry_points.txt'), self
    +            )
    +        if group is not None:
    +            return self._ep_map.get(group, {})
    +        return self._ep_map
    +
    +    def get_entry_info(self, group: str, name: str):
    +        """Return the EntryPoint object for `group`+`name`, or ``None``"""
    +        return self.get_entry_map(group).get(name)
    +
    +    # FIXME: 'Distribution.insert_on' is too complex (13)
    +    def insert_on(  # noqa: C901
    +        self,
    +        path: list[str],
    +        loc=None,
    +        replace: bool = False,
    +    ):
    +        """Ensure self.location is on path
    +
    +        If replace=False (default):
    +            - If location is already in path anywhere, do nothing.
    +            - Else:
    +              - If it's an egg and its parent directory is on path,
    +                insert just ahead of the parent.
    +              - Else: add to the end of path.
    +        If replace=True:
    +            - If location is already on path anywhere (not eggs)
    +              or higher priority than its parent (eggs)
    +              do nothing.
    +            - Else:
    +              - If it's an egg and its parent directory is on path,
    +                insert just ahead of the parent,
    +                removing any lower-priority entries.
    +              - Else: add it to the front of path.
    +        """
    +
    +        loc = loc or self.location
    +        if not loc:
    +            return
    +
    +        nloc = _normalize_cached(loc)
    +        bdir = os.path.dirname(nloc)
    +        npath = [(p and _normalize_cached(p) or p) for p in path]
    +
    +        for p, item in enumerate(npath):
    +            if item == nloc:
    +                if replace:
    +                    break
    +                else:
    +                    # don't modify path (even removing duplicates) if
    +                    # found and not replace
    +                    return
    +            elif item == bdir and self.precedence == EGG_DIST:
    +                # if it's an .egg, give it precedence over its directory
    +                # UNLESS it's already been added to sys.path and replace=False
    +                if (not replace) and nloc in npath[p:]:
    +                    return
    +                if path is sys.path:
    +                    self.check_version_conflict()
    +                path.insert(p, loc)
    +                npath.insert(p, nloc)
    +                break
    +        else:
    +            if path is sys.path:
    +                self.check_version_conflict()
    +            if replace:
    +                path.insert(0, loc)
    +            else:
    +                path.append(loc)
    +            return
    +
    +        # p is the spot where we found or inserted loc; now remove duplicates
    +        while True:
    +            try:
    +                np = npath.index(nloc, p + 1)
    +            except ValueError:
    +                break
    +            else:
    +                del npath[np], path[np]
    +                # ha!
    +                p = np
    +
    +        return
    +
    +    def check_version_conflict(self):
    +        if self.key == 'setuptools':
    +            # ignore the inevitable setuptools self-conflicts  :(
    +            return
    +
    +        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
    +        loc = normalize_path(self.location)
    +        for modname in self._get_metadata('top_level.txt'):
    +            if (
    +                modname not in sys.modules
    +                or modname in nsp
    +                or modname in _namespace_packages
    +            ):
    +                continue
    +            if modname in ('pkg_resources', 'setuptools', 'site'):
    +                continue
    +            fn = getattr(sys.modules[modname], '__file__', None)
    +            if fn and (
    +                normalize_path(fn).startswith(loc) or fn.startswith(self.location)
    +            ):
    +                continue
    +            issue_warning(
    +                "Module %s was already imported from %s, but %s is being added"
    +                " to sys.path" % (modname, fn, self.location),
    +            )
    +
    +    def has_version(self):
    +        try:
    +            self.version
    +        except ValueError:
    +            issue_warning("Unbuilt egg for " + repr(self))
    +            return False
    +        except SystemError:
    +            # TODO: remove this except clause when python/cpython#103632 is fixed.
    +            return False
    +        return True
    +
    +    def clone(self, **kw: str | int | IResourceProvider | None):
    +        """Copy this distribution, substituting in any changed keyword args"""
    +        names = 'project_name version py_version platform location precedence'
    +        for attr in names.split():
    +            kw.setdefault(attr, getattr(self, attr, None))
    +        kw.setdefault('metadata', self._provider)
    +        # Unsafely unpacking. But keeping **kw for backwards and subclassing compatibility
    +        return self.__class__(**kw)  # type:ignore[arg-type]
    +
    +    @property
    +    def extras(self):
    +        return [dep for dep in self._dep_map if dep]
    +
    +
    +class EggInfoDistribution(Distribution):
    +    def _reload_version(self):
    +        """
    +        Packages installed by distutils (e.g. numpy or scipy),
    +        which uses an old safe_version, and so
    +        their version numbers can get mangled when
    +        converted to filenames (e.g., 1.11.0.dev0+2329eae to
    +        1.11.0.dev0_2329eae). These distributions will not be
    +        parsed properly
    +        downstream by Distribution and safe_version, so
    +        take an extra step and try to get the version number from
    +        the metadata file itself instead of the filename.
    +        """
    +        md_version = self._get_version()
    +        if md_version:
    +            self._version = md_version
    +        return self
    +
    +
    +class DistInfoDistribution(Distribution):
    +    """
    +    Wrap an actual or potential sys.path entry
    +    w/metadata, .dist-info style.
    +    """
    +
    +    PKG_INFO = 'METADATA'
    +    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
    +
    +    @property
    +    def _parsed_pkg_info(self):
    +        """Parse and cache metadata"""
    +        try:
    +            return self._pkg_info
    +        except AttributeError:
    +            metadata = self.get_metadata(self.PKG_INFO)
    +            self._pkg_info = email.parser.Parser().parsestr(metadata)
    +            return self._pkg_info
    +
    +    @property
    +    def _dep_map(self):
    +        try:
    +            return self.__dep_map
    +        except AttributeError:
    +            self.__dep_map = self._compute_dependencies()
    +            return self.__dep_map
    +
    +    def _compute_dependencies(self) -> dict[str | None, list[Requirement]]:
    +        """Recompute this distribution's dependencies."""
    +        self.__dep_map: dict[str | None, list[Requirement]] = {None: []}
    +
    +        reqs: list[Requirement] = []
    +        # Including any condition expressions
    +        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
    +            reqs.extend(parse_requirements(req))
    +
    +        def reqs_for_extra(extra):
    +            for req in reqs:
    +                if not req.marker or req.marker.evaluate({'extra': extra}):
    +                    yield req
    +
    +        common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None)))
    +        self.__dep_map[None].extend(common)
    +
    +        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
    +            s_extra = safe_extra(extra.strip())
    +            self.__dep_map[s_extra] = [
    +                r for r in reqs_for_extra(extra) if r not in common
    +            ]
    +
    +        return self.__dep_map
    +
    +
    +_distributionImpl = {
    +    '.egg': Distribution,
    +    '.egg-info': EggInfoDistribution,
    +    '.dist-info': DistInfoDistribution,
    +}
    +
    +
    +def issue_warning(*args, **kw):
    +    level = 1
    +    g = globals()
    +    try:
    +        # find the first stack frame that is *not* code in
    +        # the pkg_resources module, to use for the warning
    +        while sys._getframe(level).f_globals is g:
    +            level += 1
    +    except ValueError:
    +        pass
    +    warnings.warn(stacklevel=level + 1, *args, **kw)
    +
    +
    +def parse_requirements(strs: _NestedStr):
    +    """
    +    Yield ``Requirement`` objects for each specification in `strs`.
    +
    +    `strs` must be a string, or a (possibly-nested) iterable thereof.
    +    """
    +    return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs))))
    +
    +
    +class RequirementParseError(_packaging_requirements.InvalidRequirement):
    +    "Compatibility wrapper for InvalidRequirement"
    +
    +
    +class Requirement(_packaging_requirements.Requirement):
    +    def __init__(self, requirement_string: str):
    +        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
    +        super().__init__(requirement_string)
    +        self.unsafe_name = self.name
    +        project_name = safe_name(self.name)
    +        self.project_name, self.key = project_name, project_name.lower()
    +        self.specs = [(spec.operator, spec.version) for spec in self.specifier]
    +        # packaging.requirements.Requirement uses a set for its extras. We use a variable-length tuple
    +        self.extras: tuple[str] = tuple(map(safe_extra, self.extras))
    +        self.hashCmp = (
    +            self.key,
    +            self.url,
    +            self.specifier,
    +            frozenset(self.extras),
    +            str(self.marker) if self.marker else None,
    +        )
    +        self.__hash = hash(self.hashCmp)
    +
    +    def __eq__(self, other: object):
    +        return isinstance(other, Requirement) and self.hashCmp == other.hashCmp
    +
    +    def __ne__(self, other):
    +        return not self == other
    +
    +    def __contains__(self, item: Distribution | str | tuple[str, ...]) -> bool:
    +        if isinstance(item, Distribution):
    +            if item.key != self.key:
    +                return False
    +
    +            item = item.version
    +
    +        # Allow prereleases always in order to match the previous behavior of
    +        # this method. In the future this should be smarter and follow PEP 440
    +        # more accurately.
    +        return self.specifier.contains(item, prereleases=True)
    +
    +    def __hash__(self):
    +        return self.__hash
    +
    +    def __repr__(self):
    +        return "Requirement.parse(%r)" % str(self)
    +
    +    @staticmethod
    +    def parse(s: str | Iterable[str]):
    +        (req,) = parse_requirements(s)
    +        return req
    +
    +
    +def _always_object(classes):
    +    """
    +    Ensure object appears in the mro even
    +    for old-style classes.
    +    """
    +    if object not in classes:
    +        return classes + (object,)
    +    return classes
    +
    +
    +def _find_adapter(registry: Mapping[type, _AdapterT], ob: object) -> _AdapterT:
    +    """Return an adapter factory for `ob` from `registry`"""
    +    types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
    +    for t in types:
    +        if t in registry:
    +            return registry[t]
    +    # _find_adapter would previously return None, and immediately be called.
    +    # So we're raising a TypeError to keep backward compatibility if anyone depended on that behaviour.
    +    raise TypeError(f"Could not find adapter for {registry} and {ob}")
    +
    +
    +def ensure_directory(path: StrOrBytesPath):
    +    """Ensure that the parent directory of `path` exists"""
    +    dirname = os.path.dirname(path)
    +    os.makedirs(dirname, exist_ok=True)
    +
    +
    +def _bypass_ensure_directory(path):
    +    """Sandbox-bypassing version of ensure_directory()"""
    +    if not WRITE_SUPPORT:
    +        raise OSError('"os.mkdir" not supported on this platform.')
    +    dirname, filename = split(path)
    +    if dirname and filename and not isdir(dirname):
    +        _bypass_ensure_directory(dirname)
    +        try:
    +            mkdir(dirname, 0o755)
    +        except FileExistsError:
    +            pass
    +
    +
    +def split_sections(s: _NestedStr) -> Iterator[tuple[str | None, list[str]]]:
    +    """Split a string or iterable thereof into (section, content) pairs
    +
    +    Each ``section`` is a stripped version of the section header ("[section]")
    +    and each ``content`` is a list of stripped lines excluding blank lines and
    +    comment-only lines.  If there are any such lines before the first section
    +    header, they're returned in a first ``section`` of ``None``.
    +    """
    +    section = None
    +    content = []
    +    for line in yield_lines(s):
    +        if line.startswith("["):
    +            if line.endswith("]"):
    +                if section or content:
    +                    yield section, content
    +                section = line[1:-1].strip()
    +                content = []
    +            else:
    +                raise ValueError("Invalid section heading", line)
    +        else:
    +            content.append(line)
    +
    +    # wrap up last segment
    +    yield section, content
    +
    +
    +def _mkstemp(*args, **kw):
    +    old_open = os.open
    +    try:
    +        # temporarily bypass sandboxing
    +        os.open = os_open
    +        return tempfile.mkstemp(*args, **kw)
    +    finally:
    +        # and then put it back
    +        os.open = old_open
    +
    +
    +# Silence the PEP440Warning by default, so that end users don't get hit by it
    +# randomly just because they use pkg_resources. We want to append the rule
    +# because we want earlier uses of filterwarnings to take precedence over this
    +# one.
    +warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
    +
    +
    +class PkgResourcesDeprecationWarning(Warning):
    +    """
    +    Base class for warning about deprecations in ``pkg_resources``
    +
    +    This class is not derived from ``DeprecationWarning``, and as such is
    +    visible by default.
    +    """
    +
    +
    +# Ported from ``setuptools`` to avoid introducing an import inter-dependency:
    +_LOCALE_ENCODING = "locale" if sys.version_info >= (3, 10) else None
    +
    +
    +def _read_utf8_with_fallback(file: str, fallback_encoding=_LOCALE_ENCODING) -> str:
    +    """See setuptools.unicode_utils._read_utf8_with_fallback"""
    +    try:
    +        with open(file, "r", encoding="utf-8") as f:
    +            return f.read()
    +    except UnicodeDecodeError:  # pragma: no cover
    +        msg = f"""\
    +        ********************************************************************************
    +        `encoding="utf-8"` fails with {file!r}, trying `encoding={fallback_encoding!r}`.
    +
    +        This fallback behaviour is considered **deprecated** and future versions of
    +        `setuptools/pkg_resources` may not implement it.
    +
    +        Please encode {file!r} with "utf-8" to ensure future builds will succeed.
    +
    +        If this file was produced by `setuptools` itself, cleaning up the cached files
    +        and re-building/re-installing the package with a newer version of `setuptools`
    +        (e.g. by updating `build-system.requires` in its `pyproject.toml`)
    +        might solve the problem.
    +        ********************************************************************************
    +        """
    +        # TODO: Add a deadline?
    +        #       See comment in setuptools.unicode_utils._Utf8EncodingNeeded
    +        warnings.warn(msg, PkgResourcesDeprecationWarning, stacklevel=2)
    +        with open(file, "r", encoding=fallback_encoding) as f:
    +            return f.read()
    +
    +
    +# from jaraco.functools 1.3
    +def _call_aside(f, *args, **kwargs):
    +    f(*args, **kwargs)
    +    return f
    +
    +
    +@_call_aside
    +def _initialize(g=globals()):
    +    "Set up global resource manager (deliberately not state-saved)"
    +    manager = ResourceManager()
    +    g['_manager'] = manager
    +    g.update(
    +        (name, getattr(manager, name))
    +        for name in dir(manager)
    +        if not name.startswith('_')
    +    )
    +
    +
    +@_call_aside
    +def _initialize_master_working_set():
    +    """
    +    Prepare the master working set and make the ``require()``
    +    API available.
    +
    +    This function has explicit effects on the global state
    +    of pkg_resources. It is intended to be invoked once at
    +    the initialization of this module.
    +
    +    Invocation by other packages is unsupported and done
    +    at their own risk.
    +    """
    +    working_set = _declare_state('object', 'working_set', WorkingSet._build_master())
    +
    +    require = working_set.require
    +    iter_entry_points = working_set.iter_entry_points
    +    add_activation_listener = working_set.subscribe
    +    run_script = working_set.run_script
    +    # backward compatibility
    +    run_main = run_script
    +    # Activate all distributions already on sys.path with replace=False and
    +    # ensure that all distributions added to the working set in the future
    +    # (e.g. by calling ``require()``) will get activated as well,
    +    # with higher priority (replace=True).
    +    tuple(dist.activate(replace=False) for dist in working_set)
    +    add_activation_listener(
    +        lambda dist: dist.activate(replace=True),
    +        existing=False,
    +    )
    +    working_set.entries = []
    +    # match order
    +    list(map(working_set.add_entry, sys.path))
    +    globals().update(locals())
    +
    +
    +if TYPE_CHECKING:
    +    # All of these are set by the @_call_aside methods above
    +    __resource_manager = ResourceManager()  # Won't exist at runtime
    +    resource_exists = __resource_manager.resource_exists
    +    resource_isdir = __resource_manager.resource_isdir
    +    resource_filename = __resource_manager.resource_filename
    +    resource_stream = __resource_manager.resource_stream
    +    resource_string = __resource_manager.resource_string
    +    resource_listdir = __resource_manager.resource_listdir
    +    set_extraction_path = __resource_manager.set_extraction_path
    +    cleanup_resources = __resource_manager.cleanup_resources
    +
    +    working_set = WorkingSet()
    +    require = working_set.require
    +    iter_entry_points = working_set.iter_entry_points
    +    add_activation_listener = working_set.subscribe
    +    run_script = working_set.run_script
    +    run_main = run_script
    diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc
    new file mode 100644
    index 0000000000000000000000000000000000000000..37b89f5e7670da99491739d09d31202ce3b3eb6c
    GIT binary patch
    literal 161280
    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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py new file mode 100644 index 0000000..afd3141 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py @@ -0,0 +1,249 @@ +"""Android.""" + +from __future__ import annotations + +import os +import re +import sys +from functools import lru_cache +from typing import TYPE_CHECKING, cast + +from .api import PlatformDirsABC + + +class Android(PlatformDirsABC): + """ + Follows the guidance `from here `_. + + Makes use of the `appname `, `version + `, `ensure_exists `. + + """ + + @property + def user_data_dir(self) -> str: + """:return: data directory tied to the user, e.g. ``/data/user///files/``""" + return self._append_app_name_and_version(cast(str, _android_folder()), "files") + + @property + def site_data_dir(self) -> str: + """:return: data directory shared by users, same as `user_data_dir`""" + return self.user_data_dir + + @property + def user_config_dir(self) -> str: + """ + :return: config directory tied to the user, e.g. \ + ``/data/user///shared_prefs/`` + """ + return self._append_app_name_and_version(cast(str, _android_folder()), "shared_prefs") + + @property + def site_config_dir(self) -> str: + """:return: config directory shared by the users, same as `user_config_dir`""" + return self.user_config_dir + + @property + def user_cache_dir(self) -> str: + """:return: cache directory tied to the user, e.g.,``/data/user///cache/``""" + return self._append_app_name_and_version(cast(str, _android_folder()), "cache") + + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, same as `user_cache_dir`""" + return self.user_cache_dir + + @property + def user_state_dir(self) -> str: + """:return: state directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir + + @property + def user_log_dir(self) -> str: + """ + :return: log directory tied to the user, same as `user_cache_dir` if not opinionated else ``log`` in it, + e.g. ``/data/user///cache//log`` + """ + path = self.user_cache_dir + if self.opinion: + path = os.path.join(path, "log") # noqa: PTH118 + return path + + @property + def user_documents_dir(self) -> str: + """:return: documents directory tied to the user e.g. ``/storage/emulated/0/Documents``""" + return _android_documents_folder() + + @property + def user_downloads_dir(self) -> str: + """:return: downloads directory tied to the user e.g. ``/storage/emulated/0/Downloads``""" + return _android_downloads_folder() + + @property + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user e.g. ``/storage/emulated/0/Pictures``""" + return _android_pictures_folder() + + @property + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user e.g. ``/storage/emulated/0/DCIM/Camera``""" + return _android_videos_folder() + + @property + def user_music_dir(self) -> str: + """:return: music directory tied to the user e.g. ``/storage/emulated/0/Music``""" + return _android_music_folder() + + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user e.g. ``/storage/emulated/0/Desktop``""" + return "/storage/emulated/0/Desktop" + + @property + def user_runtime_dir(self) -> str: + """ + :return: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it, + e.g. ``/data/user///cache//tmp`` + """ + path = self.user_cache_dir + if self.opinion: + path = os.path.join(path, "tmp") # noqa: PTH118 + return path + + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + + +@lru_cache(maxsize=1) +def _android_folder() -> str | None: # noqa: C901, PLR0912 + """:return: base folder for the Android OS or None if it cannot be found""" + result: str | None = None + # type checker isn't happy with our "import android", just don't do this when type checking see + # https://stackoverflow.com/a/61394121 + if not TYPE_CHECKING: + try: + # First try to get a path to android app using python4android (if available)... + from android import mActivity # noqa: PLC0415 + + context = cast("android.content.Context", mActivity.getApplicationContext()) # noqa: F821 + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + try: + # ...and fall back to using plain pyjnius, if python4android isn't available or doesn't deliver any useful + # result... + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + # and if that fails, too, find an android folder looking at path on the sys.path + # warning: only works for apps installed under /data, not adopted storage etc. + pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") + for path in sys.path: + if pattern.match(path): + result = path.split("/files")[0] + break + else: + result = None + if result is None: + # one last try: find an android folder looking at path on the sys.path taking adopted storage paths into + # account + pattern = re.compile(r"/mnt/expand/[a-fA-F0-9-]{36}/(data|user/\d+)/(.+)/files") + for path in sys.path: + if pattern.match(path): + result = path.split("/files")[0] + break + else: + result = None + return result + + +@lru_cache(maxsize=1) +def _android_documents_folder() -> str: + """:return: documents folder for the Android OS""" + # Get directories with pyjnius + try: + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + environment = autoclass("android.os.Environment") + documents_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + except Exception: # noqa: BLE001 + documents_dir = "/storage/emulated/0/Documents" + + return documents_dir + + +@lru_cache(maxsize=1) +def _android_downloads_folder() -> str: + """:return: downloads folder for the Android OS""" + # Get directories with pyjnius + try: + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + environment = autoclass("android.os.Environment") + downloads_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + except Exception: # noqa: BLE001 + downloads_dir = "/storage/emulated/0/Downloads" + + return downloads_dir + + +@lru_cache(maxsize=1) +def _android_pictures_folder() -> str: + """:return: pictures folder for the Android OS""" + # Get directories with pyjnius + try: + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + environment = autoclass("android.os.Environment") + pictures_dir: str = context.getExternalFilesDir(environment.DIRECTORY_PICTURES).getAbsolutePath() + except Exception: # noqa: BLE001 + pictures_dir = "/storage/emulated/0/Pictures" + + return pictures_dir + + +@lru_cache(maxsize=1) +def _android_videos_folder() -> str: + """:return: videos folder for the Android OS""" + # Get directories with pyjnius + try: + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + environment = autoclass("android.os.Environment") + videos_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DCIM).getAbsolutePath() + except Exception: # noqa: BLE001 + videos_dir = "/storage/emulated/0/DCIM/Camera" + + return videos_dir + + +@lru_cache(maxsize=1) +def _android_music_folder() -> str: + """:return: music folder for the Android OS""" + # Get directories with pyjnius + try: + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + environment = autoclass("android.os.Environment") + music_dir: str = context.getExternalFilesDir(environment.DIRECTORY_MUSIC).getAbsolutePath() + except Exception: # noqa: BLE001 + music_dir = "/storage/emulated/0/Music" + + return music_dir + + +__all__ = [ + "Android", +] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py new file mode 100644 index 0000000..c50caa6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py @@ -0,0 +1,292 @@ +"""Base API.""" + +from __future__ import annotations + +import os +from abc import ABC, abstractmethod +from pathlib import Path +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from typing import Iterator, Literal + + +class PlatformDirsABC(ABC): # noqa: PLR0904 + """Abstract base class for platform directories.""" + + def __init__( # noqa: PLR0913, PLR0917 + self, + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + multipath: bool = False, # noqa: FBT001, FBT002 + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 + ) -> None: + """ + Create a new platform directory. + + :param appname: See `appname`. + :param appauthor: See `appauthor`. + :param version: See `version`. + :param roaming: See `roaming`. + :param multipath: See `multipath`. + :param opinion: See `opinion`. + :param ensure_exists: See `ensure_exists`. + + """ + self.appname = appname #: The name of application. + self.appauthor = appauthor + """ + The name of the app author or distributing body for this application. + + Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it. + + """ + self.version = version + """ + An optional version path element to append to the path. + + You might want to use this if you want multiple versions of your app to be able to run independently. If used, + this would typically be ``.``. + + """ + self.roaming = roaming + """ + Whether to use the roaming appdata directory on Windows. + + That means that for users on a Windows network setup for roaming profiles, this user data will be synced on + login (see + `here `_). + + """ + self.multipath = multipath + """ + An optional parameter which indicates that the entire list of data dirs should be returned. + + By default, the first item would only be returned. + + """ + self.opinion = opinion #: A flag to indicating to use opinionated values. + self.ensure_exists = ensure_exists + """ + Optionally create the directory (and any missing parents) upon access if it does not exist. + + By default, no directories are created. + + """ + + def _append_app_name_and_version(self, *base: str) -> str: + params = list(base[1:]) + if self.appname: + params.append(self.appname) + if self.version: + params.append(self.version) + path = os.path.join(base[0], *params) # noqa: PTH118 + self._optionally_create_directory(path) + return path + + def _optionally_create_directory(self, path: str) -> None: + if self.ensure_exists: + Path(path).mkdir(parents=True, exist_ok=True) + + @property + @abstractmethod + def user_data_dir(self) -> str: + """:return: data directory tied to the user""" + + @property + @abstractmethod + def site_data_dir(self) -> str: + """:return: data directory shared by users""" + + @property + @abstractmethod + def user_config_dir(self) -> str: + """:return: config directory tied to the user""" + + @property + @abstractmethod + def site_config_dir(self) -> str: + """:return: config directory shared by the users""" + + @property + @abstractmethod + def user_cache_dir(self) -> str: + """:return: cache directory tied to the user""" + + @property + @abstractmethod + def site_cache_dir(self) -> str: + """:return: cache directory shared by users""" + + @property + @abstractmethod + def user_state_dir(self) -> str: + """:return: state directory tied to the user""" + + @property + @abstractmethod + def user_log_dir(self) -> str: + """:return: log directory tied to the user""" + + @property + @abstractmethod + def user_documents_dir(self) -> str: + """:return: documents directory tied to the user""" + + @property + @abstractmethod + def user_downloads_dir(self) -> str: + """:return: downloads directory tied to the user""" + + @property + @abstractmethod + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user""" + + @property + @abstractmethod + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user""" + + @property + @abstractmethod + def user_music_dir(self) -> str: + """:return: music directory tied to the user""" + + @property + @abstractmethod + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user""" + + @property + @abstractmethod + def user_runtime_dir(self) -> str: + """:return: runtime directory tied to the user""" + + @property + @abstractmethod + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users""" + + @property + def user_data_path(self) -> Path: + """:return: data path tied to the user""" + return Path(self.user_data_dir) + + @property + def site_data_path(self) -> Path: + """:return: data path shared by users""" + return Path(self.site_data_dir) + + @property + def user_config_path(self) -> Path: + """:return: config path tied to the user""" + return Path(self.user_config_dir) + + @property + def site_config_path(self) -> Path: + """:return: config path shared by the users""" + return Path(self.site_config_dir) + + @property + def user_cache_path(self) -> Path: + """:return: cache path tied to the user""" + return Path(self.user_cache_dir) + + @property + def site_cache_path(self) -> Path: + """:return: cache path shared by users""" + return Path(self.site_cache_dir) + + @property + def user_state_path(self) -> Path: + """:return: state path tied to the user""" + return Path(self.user_state_dir) + + @property + def user_log_path(self) -> Path: + """:return: log path tied to the user""" + return Path(self.user_log_dir) + + @property + def user_documents_path(self) -> Path: + """:return: documents a path tied to the user""" + return Path(self.user_documents_dir) + + @property + def user_downloads_path(self) -> Path: + """:return: downloads path tied to the user""" + return Path(self.user_downloads_dir) + + @property + def user_pictures_path(self) -> Path: + """:return: pictures path tied to the user""" + return Path(self.user_pictures_dir) + + @property + def user_videos_path(self) -> Path: + """:return: videos path tied to the user""" + return Path(self.user_videos_dir) + + @property + def user_music_path(self) -> Path: + """:return: music path tied to the user""" + return Path(self.user_music_dir) + + @property + def user_desktop_path(self) -> Path: + """:return: desktop path tied to the user""" + return Path(self.user_desktop_dir) + + @property + def user_runtime_path(self) -> Path: + """:return: runtime path tied to the user""" + return Path(self.user_runtime_dir) + + @property + def site_runtime_path(self) -> Path: + """:return: runtime path shared by users""" + return Path(self.site_runtime_dir) + + def iter_config_dirs(self) -> Iterator[str]: + """:yield: all user and site configuration directories.""" + yield self.user_config_dir + yield self.site_config_dir + + def iter_data_dirs(self) -> Iterator[str]: + """:yield: all user and site data directories.""" + yield self.user_data_dir + yield self.site_data_dir + + def iter_cache_dirs(self) -> Iterator[str]: + """:yield: all user and site cache directories.""" + yield self.user_cache_dir + yield self.site_cache_dir + + def iter_runtime_dirs(self) -> Iterator[str]: + """:yield: all user and site runtime directories.""" + yield self.user_runtime_dir + yield self.site_runtime_dir + + def iter_config_paths(self) -> Iterator[Path]: + """:yield: all user and site configuration paths.""" + for path in self.iter_config_dirs(): + yield Path(path) + + def iter_data_paths(self) -> Iterator[Path]: + """:yield: all user and site data paths.""" + for path in self.iter_data_dirs(): + yield Path(path) + + def iter_cache_paths(self) -> Iterator[Path]: + """:yield: all user and site cache paths.""" + for path in self.iter_cache_dirs(): + yield Path(path) + + def iter_runtime_paths(self) -> Iterator[Path]: + """:yield: all user and site runtime paths.""" + for path in self.iter_runtime_dirs(): + yield Path(path) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py new file mode 100644 index 0000000..eb1ba5d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py @@ -0,0 +1,130 @@ +"""macOS.""" + +from __future__ import annotations + +import os.path +import sys + +from .api import PlatformDirsABC + + +class MacOS(PlatformDirsABC): + """ + Platform directories for the macOS operating system. + + Follows the guidance from + `Apple documentation `_. + Makes use of the `appname `, + `version `, + `ensure_exists `. + + """ + + @property + def user_data_dir(self) -> str: + """:return: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``""" + return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support")) # noqa: PTH111 + + @property + def site_data_dir(self) -> str: + """ + :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``. + If we're using a Python binary managed by `Homebrew `_, the directory + will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``. + If `multipath ` is enabled, and we're in Homebrew, + the response is a multi-path string separated by ":", e.g. + ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version`` + """ + is_homebrew = sys.prefix.startswith("/opt/homebrew") + path_list = [self._append_app_name_and_version("/opt/homebrew/share")] if is_homebrew else [] + path_list.append(self._append_app_name_and_version("/Library/Application Support")) + if self.multipath: + return os.pathsep.join(path_list) + return path_list[0] + + @property + def user_config_dir(self) -> str: + """:return: config directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir + + @property + def site_config_dir(self) -> str: + """:return: config directory shared by the users, same as `site_data_dir`""" + return self.site_data_dir + + @property + def user_cache_dir(self) -> str: + """:return: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``""" + return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) # noqa: PTH111 + + @property + def site_cache_dir(self) -> str: + """ + :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``. + If we're using a Python binary managed by `Homebrew `_, the directory + will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``. + If `multipath ` is enabled, and we're in Homebrew, + the response is a multi-path string separated by ":", e.g. + ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version`` + """ + is_homebrew = sys.prefix.startswith("/opt/homebrew") + path_list = [self._append_app_name_and_version("/opt/homebrew/var/cache")] if is_homebrew else [] + path_list.append(self._append_app_name_and_version("/Library/Caches")) + if self.multipath: + return os.pathsep.join(path_list) + return path_list[0] + + @property + def user_state_dir(self) -> str: + """:return: state directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir + + @property + def user_log_dir(self) -> str: + """:return: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``""" + return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs")) # noqa: PTH111 + + @property + def user_documents_dir(self) -> str: + """:return: documents directory tied to the user, e.g. ``~/Documents``""" + return os.path.expanduser("~/Documents") # noqa: PTH111 + + @property + def user_downloads_dir(self) -> str: + """:return: downloads directory tied to the user, e.g. ``~/Downloads``""" + return os.path.expanduser("~/Downloads") # noqa: PTH111 + + @property + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user, e.g. ``~/Pictures``""" + return os.path.expanduser("~/Pictures") # noqa: PTH111 + + @property + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user, e.g. ``~/Movies``""" + return os.path.expanduser("~/Movies") # noqa: PTH111 + + @property + def user_music_dir(self) -> str: + """:return: music directory tied to the user, e.g. ``~/Music``""" + return os.path.expanduser("~/Music") # noqa: PTH111 + + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``~/Desktop``""" + return os.path.expanduser("~/Desktop") # noqa: PTH111 + + @property + def user_runtime_dir(self) -> str: + """:return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``""" + return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111 + + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + + +__all__ = [ + "MacOS", +] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py new file mode 100644 index 0000000..9500ade --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py @@ -0,0 +1,275 @@ +"""Unix.""" + +from __future__ import annotations + +import os +import sys +from configparser import ConfigParser +from pathlib import Path +from typing import Iterator, NoReturn + +from .api import PlatformDirsABC + +if sys.platform == "win32": + + def getuid() -> NoReturn: + msg = "should only be used on Unix" + raise RuntimeError(msg) + +else: + from os import getuid + + +class Unix(PlatformDirsABC): # noqa: PLR0904 + """ + On Unix/Linux, we follow the `XDG Basedir Spec `_. + + The spec allows overriding directories with environment variables. The examples shown are the default values, + alongside the name of the environment variable that overrides them. Makes use of the `appname + `, `version `, `multipath + `, `opinion `, `ensure_exists + `. + + """ + + @property + def user_data_dir(self) -> str: + """ + :return: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or + ``$XDG_DATA_HOME/$appname/$version`` + """ + path = os.environ.get("XDG_DATA_HOME", "") + if not path.strip(): + path = os.path.expanduser("~/.local/share") # noqa: PTH111 + return self._append_app_name_and_version(path) + + @property + def _site_data_dirs(self) -> list[str]: + path = os.environ.get("XDG_DATA_DIRS", "") + if not path.strip(): + path = f"/usr/local/share{os.pathsep}/usr/share" + return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)] + + @property + def site_data_dir(self) -> str: + """ + :return: data directories shared by users (if `multipath ` is + enabled and ``XDG_DATA_DIRS`` is set and a multi path the response is also a multi path separated by the + OS path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version`` + """ + # XDG default for $XDG_DATA_DIRS; only first, if multipath is False + dirs = self._site_data_dirs + if not self.multipath: + return dirs[0] + return os.pathsep.join(dirs) + + @property + def user_config_dir(self) -> str: + """ + :return: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or + ``$XDG_CONFIG_HOME/$appname/$version`` + """ + path = os.environ.get("XDG_CONFIG_HOME", "") + if not path.strip(): + path = os.path.expanduser("~/.config") # noqa: PTH111 + return self._append_app_name_and_version(path) + + @property + def _site_config_dirs(self) -> list[str]: + path = os.environ.get("XDG_CONFIG_DIRS", "") + if not path.strip(): + path = "/etc/xdg" + return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)] + + @property + def site_config_dir(self) -> str: + """ + :return: config directories shared by users (if `multipath ` + is enabled and ``XDG_CONFIG_DIRS`` is set and a multi path the response is also a multi path separated by + the OS path separator), e.g. ``/etc/xdg/$appname/$version`` + """ + # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False + dirs = self._site_config_dirs + if not self.multipath: + return dirs[0] + return os.pathsep.join(dirs) + + @property + def user_cache_dir(self) -> str: + """ + :return: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or + ``~/$XDG_CACHE_HOME/$appname/$version`` + """ + path = os.environ.get("XDG_CACHE_HOME", "") + if not path.strip(): + path = os.path.expanduser("~/.cache") # noqa: PTH111 + return self._append_app_name_and_version(path) + + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, e.g. ``/var/cache/$appname/$version``""" + return self._append_app_name_and_version("/var/cache") + + @property + def user_state_dir(self) -> str: + """ + :return: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or + ``$XDG_STATE_HOME/$appname/$version`` + """ + path = os.environ.get("XDG_STATE_HOME", "") + if not path.strip(): + path = os.path.expanduser("~/.local/state") # noqa: PTH111 + return self._append_app_name_and_version(path) + + @property + def user_log_dir(self) -> str: + """:return: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it""" + path = self.user_state_dir + if self.opinion: + path = os.path.join(path, "log") # noqa: PTH118 + self._optionally_create_directory(path) + return path + + @property + def user_documents_dir(self) -> str: + """:return: documents directory tied to the user, e.g. ``~/Documents``""" + return _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents") + + @property + def user_downloads_dir(self) -> str: + """:return: downloads directory tied to the user, e.g. ``~/Downloads``""" + return _get_user_media_dir("XDG_DOWNLOAD_DIR", "~/Downloads") + + @property + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user, e.g. ``~/Pictures``""" + return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures") + + @property + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user, e.g. ``~/Videos``""" + return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos") + + @property + def user_music_dir(self) -> str: + """:return: music directory tied to the user, e.g. ``~/Music``""" + return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music") + + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``~/Desktop``""" + return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop") + + @property + def user_runtime_dir(self) -> str: + """ + :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or + ``$XDG_RUNTIME_DIR/$appname/$version``. + + For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/user/$(id -u)/$appname/$version`` if + exists, otherwise ``/tmp/runtime-$(id -u)/$appname/$version``, if``$XDG_RUNTIME_DIR`` + is not set. + """ + path = os.environ.get("XDG_RUNTIME_DIR", "") + if not path.strip(): + if sys.platform.startswith(("freebsd", "openbsd", "netbsd")): + path = f"/var/run/user/{getuid()}" + if not Path(path).exists(): + path = f"/tmp/runtime-{getuid()}" # noqa: S108 + else: + path = f"/run/user/{getuid()}" + return self._append_app_name_and_version(path) + + @property + def site_runtime_dir(self) -> str: + """ + :return: runtime directory shared by users, e.g. ``/run/$appname/$version`` or \ + ``$XDG_RUNTIME_DIR/$appname/$version``. + + Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will + fall back to paths associated to the root user instead of a regular logged-in user if it's not set. + + If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir` + instead. + + For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set. + """ + path = os.environ.get("XDG_RUNTIME_DIR", "") + if not path.strip(): + if sys.platform.startswith(("freebsd", "openbsd", "netbsd")): + path = "/var/run" + else: + path = "/run" + return self._append_app_name_and_version(path) + + @property + def site_data_path(self) -> Path: + """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_data_dir) + + @property + def site_config_path(self) -> Path: + """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_config_dir) + + @property + def site_cache_path(self) -> Path: + """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_cache_dir) + + def _first_item_as_path_if_multipath(self, directory: str) -> Path: + if self.multipath: + # If multipath is True, the first path is returned. + directory = directory.split(os.pathsep)[0] + return Path(directory) + + def iter_config_dirs(self) -> Iterator[str]: + """:yield: all user and site configuration directories.""" + yield self.user_config_dir + yield from self._site_config_dirs + + def iter_data_dirs(self) -> Iterator[str]: + """:yield: all user and site data directories.""" + yield self.user_data_dir + yield from self._site_data_dirs + + +def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: + media_dir = _get_user_dirs_folder(env_var) + if media_dir is None: + media_dir = os.environ.get(env_var, "").strip() + if not media_dir: + media_dir = os.path.expanduser(fallback_tilde_path) # noqa: PTH111 + + return media_dir + + +def _get_user_dirs_folder(key: str) -> str | None: + """ + Return directory from user-dirs.dirs config file. + + See https://freedesktop.org/wiki/Software/xdg-user-dirs/. + + """ + user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs" + if user_dirs_config_path.exists(): + parser = ConfigParser() + + with user_dirs_config_path.open() as stream: + # Add fake section header, so ConfigParser doesn't complain + parser.read_string(f"[top]\n{stream.read()}") + + if key not in parser["top"]: + return None + + path = parser["top"][key].strip('"') + # Handle relative home paths + return path.replace("$HOME", os.path.expanduser("~")) # noqa: PTH111 + + return None + + +__all__ = [ + "Unix", +] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py new file mode 100644 index 0000000..6483ddc --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py @@ -0,0 +1,16 @@ +# file generated by setuptools_scm +# don't change, don't track in version control +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple, Union + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '4.2.2' +__version_tuple__ = version_tuple = (4, 2, 2) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py new file mode 100644 index 0000000..d7bc960 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py @@ -0,0 +1,272 @@ +"""Windows.""" + +from __future__ import annotations + +import os +import sys +from functools import lru_cache +from typing import TYPE_CHECKING + +from .api import PlatformDirsABC + +if TYPE_CHECKING: + from collections.abc import Callable + + +class Windows(PlatformDirsABC): + """ + `MSDN on where to store app data files `_. + + Makes use of the `appname `, `appauthor + `, `version `, `roaming + `, `opinion `, `ensure_exists + `. + + """ + + @property + def user_data_dir(self) -> str: + """ + :return: data directory tied to the user, e.g. + ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname`` (not roaming) or + ``%USERPROFILE%\\AppData\\Roaming\\$appauthor\\$appname`` (roaming) + """ + const = "CSIDL_APPDATA" if self.roaming else "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(get_win_folder(const)) + return self._append_parts(path) + + def _append_parts(self, path: str, *, opinion_value: str | None = None) -> str: + params = [] + if self.appname: + if self.appauthor is not False: + author = self.appauthor or self.appname + params.append(author) + params.append(self.appname) + if opinion_value is not None and self.opinion: + params.append(opinion_value) + if self.version: + params.append(self.version) + path = os.path.join(path, *params) # noqa: PTH118 + self._optionally_create_directory(path) + return path + + @property + def site_data_dir(self) -> str: + """:return: data directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname``""" + path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) + return self._append_parts(path) + + @property + def user_config_dir(self) -> str: + """:return: config directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir + + @property + def site_config_dir(self) -> str: + """:return: config directory shared by the users, same as `site_data_dir`""" + return self.site_data_dir + + @property + def user_cache_dir(self) -> str: + """ + :return: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g. + ``%USERPROFILE%\\AppData\\Local\\$appauthor\\$appname\\Cache\\$version`` + """ + path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA")) + return self._append_parts(path, opinion_value="Cache") + + @property + def site_cache_dir(self) -> str: + """:return: cache directory shared by users, e.g. ``C:\\ProgramData\\$appauthor\\$appname\\Cache\\$version``""" + path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) + return self._append_parts(path, opinion_value="Cache") + + @property + def user_state_dir(self) -> str: + """:return: state directory tied to the user, same as `user_data_dir`""" + return self.user_data_dir + + @property + def user_log_dir(self) -> str: + """:return: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it""" + path = self.user_data_dir + if self.opinion: + path = os.path.join(path, "Logs") # noqa: PTH118 + self._optionally_create_directory(path) + return path + + @property + def user_documents_dir(self) -> str: + """:return: documents directory tied to the user e.g. ``%USERPROFILE%\\Documents``""" + return os.path.normpath(get_win_folder("CSIDL_PERSONAL")) + + @property + def user_downloads_dir(self) -> str: + """:return: downloads directory tied to the user e.g. ``%USERPROFILE%\\Downloads``""" + return os.path.normpath(get_win_folder("CSIDL_DOWNLOADS")) + + @property + def user_pictures_dir(self) -> str: + """:return: pictures directory tied to the user e.g. ``%USERPROFILE%\\Pictures``""" + return os.path.normpath(get_win_folder("CSIDL_MYPICTURES")) + + @property + def user_videos_dir(self) -> str: + """:return: videos directory tied to the user e.g. ``%USERPROFILE%\\Videos``""" + return os.path.normpath(get_win_folder("CSIDL_MYVIDEO")) + + @property + def user_music_dir(self) -> str: + """:return: music directory tied to the user e.g. ``%USERPROFILE%\\Music``""" + return os.path.normpath(get_win_folder("CSIDL_MYMUSIC")) + + @property + def user_desktop_dir(self) -> str: + """:return: desktop directory tied to the user, e.g. ``%USERPROFILE%\\Desktop``""" + return os.path.normpath(get_win_folder("CSIDL_DESKTOPDIRECTORY")) + + @property + def user_runtime_dir(self) -> str: + """ + :return: runtime directory tied to the user, e.g. + ``%USERPROFILE%\\AppData\\Local\\Temp\\$appauthor\\$appname`` + """ + path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) # noqa: PTH118 + return self._append_parts(path) + + @property + def site_runtime_dir(self) -> str: + """:return: runtime directory shared by users, same as `user_runtime_dir`""" + return self.user_runtime_dir + + +def get_win_folder_from_env_vars(csidl_name: str) -> str: + """Get folder from environment variables.""" + result = get_win_folder_if_csidl_name_not_env_var(csidl_name) + if result is not None: + return result + + env_var_name = { + "CSIDL_APPDATA": "APPDATA", + "CSIDL_COMMON_APPDATA": "ALLUSERSPROFILE", + "CSIDL_LOCAL_APPDATA": "LOCALAPPDATA", + }.get(csidl_name) + if env_var_name is None: + msg = f"Unknown CSIDL name: {csidl_name}" + raise ValueError(msg) + result = os.environ.get(env_var_name) + if result is None: + msg = f"Unset environment variable: {env_var_name}" + raise ValueError(msg) + return result + + +def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: + """Get a folder for a CSIDL name that does not exist as an environment variable.""" + if csidl_name == "CSIDL_PERSONAL": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118 + + if csidl_name == "CSIDL_DOWNLOADS": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Downloads") # noqa: PTH118 + + if csidl_name == "CSIDL_MYPICTURES": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Pictures") # noqa: PTH118 + + if csidl_name == "CSIDL_MYVIDEO": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Videos") # noqa: PTH118 + + if csidl_name == "CSIDL_MYMUSIC": + return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Music") # noqa: PTH118 + return None + + +def get_win_folder_from_registry(csidl_name: str) -> str: + """ + Get folder from the registry. + + This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer + for all CSIDL_* names. + + """ + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + "CSIDL_PERSONAL": "Personal", + "CSIDL_DOWNLOADS": "{374DE290-123F-4565-9164-39C4925E467B}", + "CSIDL_MYPICTURES": "My Pictures", + "CSIDL_MYVIDEO": "My Video", + "CSIDL_MYMUSIC": "My Music", + }.get(csidl_name) + if shell_folder_name is None: + msg = f"Unknown CSIDL name: {csidl_name}" + raise ValueError(msg) + if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows + raise NotImplementedError + import winreg # noqa: PLC0415 + + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") + directory, _ = winreg.QueryValueEx(key, shell_folder_name) + return str(directory) + + +def get_win_folder_via_ctypes(csidl_name: str) -> str: + """Get folder with ctypes.""" + # There is no 'CSIDL_DOWNLOADS'. + # Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead. + # https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid + + import ctypes # noqa: PLC0415 + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + "CSIDL_PERSONAL": 5, + "CSIDL_MYPICTURES": 39, + "CSIDL_MYVIDEO": 14, + "CSIDL_MYMUSIC": 13, + "CSIDL_DOWNLOADS": 40, + "CSIDL_DESKTOPDIRECTORY": 16, + }.get(csidl_name) + if csidl_const is None: + msg = f"Unknown CSIDL name: {csidl_name}" + raise ValueError(msg) + + buf = ctypes.create_unicode_buffer(1024) + windll = getattr(ctypes, "windll") # noqa: B009 # using getattr to avoid false positive with mypy type checker + windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if it has high-bit chars. + if any(ord(c) > 255 for c in buf): # noqa: PLR2004 + buf2 = ctypes.create_unicode_buffer(1024) + if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + if csidl_name == "CSIDL_DOWNLOADS": + return os.path.join(buf.value, "Downloads") # noqa: PTH118 + + return buf.value + + +def _pick_get_win_folder() -> Callable[[str], str]: + try: + import ctypes # noqa: PLC0415 + except ImportError: + pass + else: + if hasattr(ctypes, "windll"): + return get_win_folder_via_ctypes + try: + import winreg # noqa: PLC0415, F401 + except ImportError: + return get_win_folder_from_env_vars + else: + return get_win_folder_from_registry + + +get_win_folder = lru_cache(maxsize=None)(_pick_get_win_folder()) + +__all__ = [ + "Windows", +] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py new file mode 100644 index 0000000..60ae9bb --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py @@ -0,0 +1,82 @@ +""" + Pygments + ~~~~~~~~ + + Pygments is a syntax highlighting package written in Python. + + It is a generic syntax highlighter for general use in all kinds of software + such as forum systems, wikis or other applications that need to prettify + source code. Highlights are: + + * a wide range of common languages and markup formats is supported + * special attention is paid to details, increasing quality by a fair amount + * support for new languages and formats are added easily + * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image + formats that PIL supports, and ANSI sequences + * it is usable as a command-line tool and as a library + * ... and it highlights even Brainfuck! + + The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``. + + .. _Pygments master branch: + https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +from io import StringIO, BytesIO + +__version__ = '2.18.0' +__docformat__ = 'restructuredtext' + +__all__ = ['lex', 'format', 'highlight'] + + +def lex(code, lexer): + """ + Lex `code` with the `lexer` (must be a `Lexer` instance) + and return an iterable of tokens. Currently, this only calls + `lexer.get_tokens()`. + """ + try: + return lexer.get_tokens(code) + except TypeError: + # Heuristic to catch a common mistake. + from pip._vendor.pygments.lexer import RegexLexer + if isinstance(lexer, type) and issubclass(lexer, RegexLexer): + raise TypeError('lex() argument must be a lexer instance, ' + 'not a class') + raise + + +def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builtin + """ + Format ``tokens`` (an iterable of tokens) with the formatter ``formatter`` + (a `Formatter` instance). + + If ``outfile`` is given and a valid file object (an object with a + ``write`` method), the result will be written to it, otherwise it + is returned as a string. + """ + try: + if not outfile: + realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO() + formatter.format(tokens, realoutfile) + return realoutfile.getvalue() + else: + formatter.format(tokens, outfile) + except TypeError: + # Heuristic to catch a common mistake. + from pip._vendor.pygments.formatter import Formatter + if isinstance(formatter, type) and issubclass(formatter, Formatter): + raise TypeError('format() argument must be a formatter instance, ' + 'not a class') + raise + + +def highlight(code, lexer, formatter, outfile=None): + """ + This is the most high-level highlighting function. It combines `lex` and + `format` in one function. + """ + return format(lex(code, lexer), formatter, outfile) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py new file mode 100644 index 0000000..dcc6e5a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py @@ -0,0 +1,17 @@ +""" + pygments.__main__ + ~~~~~~~~~~~~~~~~~ + + Main entry point for ``python -m pygments``. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import sys +from pip._vendor.pygments.cmdline import main + +try: + sys.exit(main(sys.argv)) +except KeyboardInterrupt: + sys.exit(1) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fbb3b19d24c65f7aeaf20c699dd6f6d74e99413 GIT binary patch literal 3508 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a72298e99cf57a7fca4aeebadc2c2dcd6a800de7 GIT binary patch literal 4740 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 HC@udlIY}6C literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da33294f76be4dba77bf5e6682f56244b4d53d41 GIT binary patch literal 38381 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2e7d52485c8397b99ae81cc4b32b2897ddbface GIT binary patch literal 2628 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 R_@&__u6Py4MtoXf^Iw1A(53(Y literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a85636a8b9176fe6dcdc2b791d5ad9fc36bf9377 GIT binary patch literal 4776 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 G!TJkMcA_)@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6341e5fc53e21387221f67504ee6fcbafb27eb52 GIT binary patch literal 8209 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 EAHlLwlmGw# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38f8cd02c2a3e0efee39a2d105d49431bca80ff2 GIT binary patch literal 14089 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 XZ(D7!^MS`Di2N^H`$rBx3^V@^EKm;j literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py new file mode 100644 index 0000000..0a7072e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py @@ -0,0 +1,668 @@ +""" + pygments.cmdline + ~~~~~~~~~~~~~~~~ + + Command line interface. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import os +import sys +import shutil +import argparse +from textwrap import dedent + +from pip._vendor.pygments import __version__, highlight +from pip._vendor.pygments.util import ClassNotFound, OptionError, docstring_headline, \ + guess_decode, guess_decode_from_terminal, terminal_encoding, \ + UnclosingTextIOWrapper +from pip._vendor.pygments.lexers import get_all_lexers, get_lexer_by_name, guess_lexer, \ + load_lexer_from_file, get_lexer_for_filename, find_lexer_class_for_filename +from pip._vendor.pygments.lexers.special import TextLexer +from pip._vendor.pygments.formatters.latex import LatexEmbeddedLexer, LatexFormatter +from pip._vendor.pygments.formatters import get_all_formatters, get_formatter_by_name, \ + load_formatter_from_file, get_formatter_for_filename, find_formatter_class +from pip._vendor.pygments.formatters.terminal import TerminalFormatter +from pip._vendor.pygments.formatters.terminal256 import Terminal256Formatter, TerminalTrueColorFormatter +from pip._vendor.pygments.filters import get_all_filters, find_filter_class +from pip._vendor.pygments.styles import get_all_styles, get_style_by_name + + +def _parse_options(o_strs): + opts = {} + if not o_strs: + return opts + for o_str in o_strs: + if not o_str.strip(): + continue + o_args = o_str.split(',') + for o_arg in o_args: + o_arg = o_arg.strip() + try: + o_key, o_val = o_arg.split('=', 1) + o_key = o_key.strip() + o_val = o_val.strip() + except ValueError: + opts[o_arg] = True + else: + opts[o_key] = o_val + return opts + + +def _parse_filters(f_strs): + filters = [] + if not f_strs: + return filters + for f_str in f_strs: + if ':' in f_str: + fname, fopts = f_str.split(':', 1) + filters.append((fname, _parse_options([fopts]))) + else: + filters.append((f_str, {})) + return filters + + +def _print_help(what, name): + try: + if what == 'lexer': + cls = get_lexer_by_name(name) + print(f"Help on the {cls.name} lexer:") + print(dedent(cls.__doc__)) + elif what == 'formatter': + cls = find_formatter_class(name) + print(f"Help on the {cls.name} formatter:") + print(dedent(cls.__doc__)) + elif what == 'filter': + cls = find_filter_class(name) + print(f"Help on the {name} filter:") + print(dedent(cls.__doc__)) + return 0 + except (AttributeError, ValueError): + print(f"{what} not found!", file=sys.stderr) + return 1 + + +def _print_list(what): + if what == 'lexer': + print() + print("Lexers:") + print("~~~~~~~") + + info = [] + for fullname, names, exts, _ in get_all_lexers(): + tup = (', '.join(names)+':', fullname, + exts and '(filenames ' + ', '.join(exts) + ')' or '') + info.append(tup) + info.sort() + for i in info: + print(('* {}\n {} {}').format(*i)) + + elif what == 'formatter': + print() + print("Formatters:") + print("~~~~~~~~~~~") + + info = [] + for cls in get_all_formatters(): + doc = docstring_headline(cls) + tup = (', '.join(cls.aliases) + ':', doc, cls.filenames and + '(filenames ' + ', '.join(cls.filenames) + ')' or '') + info.append(tup) + info.sort() + for i in info: + print(('* {}\n {} {}').format(*i)) + + elif what == 'filter': + print() + print("Filters:") + print("~~~~~~~~") + + for name in get_all_filters(): + cls = find_filter_class(name) + print("* " + name + ':') + print(f" {docstring_headline(cls)}") + + elif what == 'style': + print() + print("Styles:") + print("~~~~~~~") + + for name in get_all_styles(): + cls = get_style_by_name(name) + print("* " + name + ':') + print(f" {docstring_headline(cls)}") + + +def _print_list_as_json(requested_items): + import json + result = {} + if 'lexer' in requested_items: + info = {} + for fullname, names, filenames, mimetypes in get_all_lexers(): + info[fullname] = { + 'aliases': names, + 'filenames': filenames, + 'mimetypes': mimetypes + } + result['lexers'] = info + + if 'formatter' in requested_items: + info = {} + for cls in get_all_formatters(): + doc = docstring_headline(cls) + info[cls.name] = { + 'aliases': cls.aliases, + 'filenames': cls.filenames, + 'doc': doc + } + result['formatters'] = info + + if 'filter' in requested_items: + info = {} + for name in get_all_filters(): + cls = find_filter_class(name) + info[name] = { + 'doc': docstring_headline(cls) + } + result['filters'] = info + + if 'style' in requested_items: + info = {} + for name in get_all_styles(): + cls = get_style_by_name(name) + info[name] = { + 'doc': docstring_headline(cls) + } + result['styles'] = info + + json.dump(result, sys.stdout) + +def main_inner(parser, argns): + if argns.help: + parser.print_help() + return 0 + + if argns.V: + print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus ' + 'Chajdas and contributors.') + return 0 + + def is_only_option(opt): + return not any(v for (k, v) in vars(argns).items() if k != opt) + + # handle ``pygmentize -L`` + if argns.L is not None: + arg_set = set() + for k, v in vars(argns).items(): + if v: + arg_set.add(k) + + arg_set.discard('L') + arg_set.discard('json') + + if arg_set: + parser.print_help(sys.stderr) + return 2 + + # print version + if not argns.json: + main(['', '-V']) + allowed_types = {'lexer', 'formatter', 'filter', 'style'} + largs = [arg.rstrip('s') for arg in argns.L] + if any(arg not in allowed_types for arg in largs): + parser.print_help(sys.stderr) + return 0 + if not largs: + largs = allowed_types + if not argns.json: + for arg in largs: + _print_list(arg) + else: + _print_list_as_json(largs) + return 0 + + # handle ``pygmentize -H`` + if argns.H: + if not is_only_option('H'): + parser.print_help(sys.stderr) + return 2 + what, name = argns.H + if what not in ('lexer', 'formatter', 'filter'): + parser.print_help(sys.stderr) + return 2 + return _print_help(what, name) + + # parse -O options + parsed_opts = _parse_options(argns.O or []) + + # parse -P options + for p_opt in argns.P or []: + try: + name, value = p_opt.split('=', 1) + except ValueError: + parsed_opts[p_opt] = True + else: + parsed_opts[name] = value + + # encodings + inencoding = parsed_opts.get('inencoding', parsed_opts.get('encoding')) + outencoding = parsed_opts.get('outencoding', parsed_opts.get('encoding')) + + # handle ``pygmentize -N`` + if argns.N: + lexer = find_lexer_class_for_filename(argns.N) + if lexer is None: + lexer = TextLexer + + print(lexer.aliases[0]) + return 0 + + # handle ``pygmentize -C`` + if argns.C: + inp = sys.stdin.buffer.read() + try: + lexer = guess_lexer(inp, inencoding=inencoding) + except ClassNotFound: + lexer = TextLexer + + print(lexer.aliases[0]) + return 0 + + # handle ``pygmentize -S`` + S_opt = argns.S + a_opt = argns.a + if S_opt is not None: + f_opt = argns.f + if not f_opt: + parser.print_help(sys.stderr) + return 2 + if argns.l or argns.INPUTFILE: + parser.print_help(sys.stderr) + return 2 + + try: + parsed_opts['style'] = S_opt + fmter = get_formatter_by_name(f_opt, **parsed_opts) + except ClassNotFound as err: + print(err, file=sys.stderr) + return 1 + + print(fmter.get_style_defs(a_opt or '')) + return 0 + + # if no -S is given, -a is not allowed + if argns.a is not None: + parser.print_help(sys.stderr) + return 2 + + # parse -F options + F_opts = _parse_filters(argns.F or []) + + # -x: allow custom (eXternal) lexers and formatters + allow_custom_lexer_formatter = bool(argns.x) + + # select lexer + lexer = None + + # given by name? + lexername = argns.l + if lexername: + # custom lexer, located relative to user's cwd + if allow_custom_lexer_formatter and '.py' in lexername: + try: + filename = None + name = None + if ':' in lexername: + filename, name = lexername.rsplit(':', 1) + + if '.py' in name: + # This can happen on Windows: If the lexername is + # C:\lexer.py -- return to normal load path in that case + name = None + + if filename and name: + lexer = load_lexer_from_file(filename, name, + **parsed_opts) + else: + lexer = load_lexer_from_file(lexername, **parsed_opts) + except ClassNotFound as err: + print('Error:', err, file=sys.stderr) + return 1 + else: + try: + lexer = get_lexer_by_name(lexername, **parsed_opts) + except (OptionError, ClassNotFound) as err: + print('Error:', err, file=sys.stderr) + return 1 + + # read input code + code = None + + if argns.INPUTFILE: + if argns.s: + print('Error: -s option not usable when input file specified', + file=sys.stderr) + return 2 + + infn = argns.INPUTFILE + try: + with open(infn, 'rb') as infp: + code = infp.read() + except Exception as err: + print('Error: cannot read infile:', err, file=sys.stderr) + return 1 + if not inencoding: + code, inencoding = guess_decode(code) + + # do we have to guess the lexer? + if not lexer: + try: + lexer = get_lexer_for_filename(infn, code, **parsed_opts) + except ClassNotFound as err: + if argns.g: + try: + lexer = guess_lexer(code, **parsed_opts) + except ClassNotFound: + lexer = TextLexer(**parsed_opts) + else: + print('Error:', err, file=sys.stderr) + return 1 + except OptionError as err: + print('Error:', err, file=sys.stderr) + return 1 + + elif not argns.s: # treat stdin as full file (-s support is later) + # read code from terminal, always in binary mode since we want to + # decode ourselves and be tolerant with it + code = sys.stdin.buffer.read() # use .buffer to get a binary stream + if not inencoding: + code, inencoding = guess_decode_from_terminal(code, sys.stdin) + # else the lexer will do the decoding + if not lexer: + try: + lexer = guess_lexer(code, **parsed_opts) + except ClassNotFound: + lexer = TextLexer(**parsed_opts) + + else: # -s option needs a lexer with -l + if not lexer: + print('Error: when using -s a lexer has to be selected with -l', + file=sys.stderr) + return 2 + + # process filters + for fname, fopts in F_opts: + try: + lexer.add_filter(fname, **fopts) + except ClassNotFound as err: + print('Error:', err, file=sys.stderr) + return 1 + + # select formatter + outfn = argns.o + fmter = argns.f + if fmter: + # custom formatter, located relative to user's cwd + if allow_custom_lexer_formatter and '.py' in fmter: + try: + filename = None + name = None + if ':' in fmter: + # Same logic as above for custom lexer + filename, name = fmter.rsplit(':', 1) + + if '.py' in name: + name = None + + if filename and name: + fmter = load_formatter_from_file(filename, name, + **parsed_opts) + else: + fmter = load_formatter_from_file(fmter, **parsed_opts) + except ClassNotFound as err: + print('Error:', err, file=sys.stderr) + return 1 + else: + try: + fmter = get_formatter_by_name(fmter, **parsed_opts) + except (OptionError, ClassNotFound) as err: + print('Error:', err, file=sys.stderr) + return 1 + + if outfn: + if not fmter: + try: + fmter = get_formatter_for_filename(outfn, **parsed_opts) + except (OptionError, ClassNotFound) as err: + print('Error:', err, file=sys.stderr) + return 1 + try: + outfile = open(outfn, 'wb') + except Exception as err: + print('Error: cannot open outfile:', err, file=sys.stderr) + return 1 + else: + if not fmter: + if os.environ.get('COLORTERM','') in ('truecolor', '24bit'): + fmter = TerminalTrueColorFormatter(**parsed_opts) + elif '256' in os.environ.get('TERM', ''): + fmter = Terminal256Formatter(**parsed_opts) + else: + fmter = TerminalFormatter(**parsed_opts) + outfile = sys.stdout.buffer + + # determine output encoding if not explicitly selected + if not outencoding: + if outfn: + # output file? use lexer encoding for now (can still be None) + fmter.encoding = inencoding + else: + # else use terminal encoding + fmter.encoding = terminal_encoding(sys.stdout) + + # provide coloring under Windows, if possible + if not outfn and sys.platform in ('win32', 'cygwin') and \ + fmter.name in ('Terminal', 'Terminal256'): # pragma: no cover + # unfortunately colorama doesn't support binary streams on Py3 + outfile = UnclosingTextIOWrapper(outfile, encoding=fmter.encoding) + fmter.encoding = None + try: + import colorama.initialise + except ImportError: + pass + else: + outfile = colorama.initialise.wrap_stream( + outfile, convert=None, strip=None, autoreset=False, wrap=True) + + # When using the LaTeX formatter and the option `escapeinside` is + # specified, we need a special lexer which collects escaped text + # before running the chosen language lexer. + escapeinside = parsed_opts.get('escapeinside', '') + if len(escapeinside) == 2 and isinstance(fmter, LatexFormatter): + left = escapeinside[0] + right = escapeinside[1] + lexer = LatexEmbeddedLexer(left, right, lexer) + + # ... and do it! + if not argns.s: + # process whole input as per normal... + try: + highlight(code, lexer, fmter, outfile) + finally: + if outfn: + outfile.close() + return 0 + else: + # line by line processing of stdin (eg: for 'tail -f')... + try: + while 1: + line = sys.stdin.buffer.readline() + if not line: + break + if not inencoding: + line = guess_decode_from_terminal(line, sys.stdin)[0] + highlight(line, lexer, fmter, outfile) + if hasattr(outfile, 'flush'): + outfile.flush() + return 0 + except KeyboardInterrupt: # pragma: no cover + return 0 + finally: + if outfn: + outfile.close() + + +class HelpFormatter(argparse.HelpFormatter): + def __init__(self, prog, indent_increment=2, max_help_position=16, width=None): + if width is None: + try: + width = shutil.get_terminal_size().columns - 2 + except Exception: + pass + argparse.HelpFormatter.__init__(self, prog, indent_increment, + max_help_position, width) + + +def main(args=sys.argv): + """ + Main command line entry point. + """ + desc = "Highlight an input file and write the result to an output file." + parser = argparse.ArgumentParser(description=desc, add_help=False, + formatter_class=HelpFormatter) + + operation = parser.add_argument_group('Main operation') + lexersel = operation.add_mutually_exclusive_group() + lexersel.add_argument( + '-l', metavar='LEXER', + help='Specify the lexer to use. (Query names with -L.) If not ' + 'given and -g is not present, the lexer is guessed from the filename.') + lexersel.add_argument( + '-g', action='store_true', + help='Guess the lexer from the file contents, or pass through ' + 'as plain text if nothing can be guessed.') + operation.add_argument( + '-F', metavar='FILTER[:options]', action='append', + help='Add a filter to the token stream. (Query names with -L.) ' + 'Filter options are given after a colon if necessary.') + operation.add_argument( + '-f', metavar='FORMATTER', + help='Specify the formatter to use. (Query names with -L.) ' + 'If not given, the formatter is guessed from the output filename, ' + 'and defaults to the terminal formatter if the output is to the ' + 'terminal or an unknown file extension.') + operation.add_argument( + '-O', metavar='OPTION=value[,OPTION=value,...]', action='append', + help='Give options to the lexer and formatter as a comma-separated ' + 'list of key-value pairs. ' + 'Example: `-O bg=light,python=cool`.') + operation.add_argument( + '-P', metavar='OPTION=value', action='append', + help='Give a single option to the lexer and formatter - with this ' + 'you can pass options whose value contains commas and equal signs. ' + 'Example: `-P "heading=Pygments, the Python highlighter"`.') + operation.add_argument( + '-o', metavar='OUTPUTFILE', + help='Where to write the output. Defaults to standard output.') + + operation.add_argument( + 'INPUTFILE', nargs='?', + help='Where to read the input. Defaults to standard input.') + + flags = parser.add_argument_group('Operation flags') + flags.add_argument( + '-v', action='store_true', + help='Print a detailed traceback on unhandled exceptions, which ' + 'is useful for debugging and bug reports.') + flags.add_argument( + '-s', action='store_true', + help='Process lines one at a time until EOF, rather than waiting to ' + 'process the entire file. This only works for stdin, only for lexers ' + 'with no line-spanning constructs, and is intended for streaming ' + 'input such as you get from `tail -f`. ' + 'Example usage: `tail -f sql.log | pygmentize -s -l sql`.') + flags.add_argument( + '-x', action='store_true', + help='Allow custom lexers and formatters to be loaded from a .py file ' + 'relative to the current working directory. For example, ' + '`-l ./customlexer.py -x`. By default, this option expects a file ' + 'with a class named CustomLexer or CustomFormatter; you can also ' + 'specify your own class name with a colon (`-l ./lexer.py:MyLexer`). ' + 'Users should be very careful not to use this option with untrusted ' + 'files, because it will import and run them.') + flags.add_argument('--json', help='Output as JSON. This can ' + 'be only used in conjunction with -L.', + default=False, + action='store_true') + + special_modes_group = parser.add_argument_group( + 'Special modes - do not do any highlighting') + special_modes = special_modes_group.add_mutually_exclusive_group() + special_modes.add_argument( + '-S', metavar='STYLE -f formatter', + help='Print style definitions for STYLE for a formatter ' + 'given with -f. The argument given by -a is formatter ' + 'dependent.') + special_modes.add_argument( + '-L', nargs='*', metavar='WHAT', + help='List lexers, formatters, styles or filters -- ' + 'give additional arguments for the thing(s) you want to list ' + '(e.g. "styles"), or omit them to list everything.') + special_modes.add_argument( + '-N', metavar='FILENAME', + help='Guess and print out a lexer name based solely on the given ' + 'filename. Does not take input or highlight anything. If no specific ' + 'lexer can be determined, "text" is printed.') + special_modes.add_argument( + '-C', action='store_true', + help='Like -N, but print out a lexer name based solely on ' + 'a given content from standard input.') + special_modes.add_argument( + '-H', action='store', nargs=2, metavar=('NAME', 'TYPE'), + help='Print detailed help for the object of type , ' + 'where is one of "lexer", "formatter" or "filter".') + special_modes.add_argument( + '-V', action='store_true', + help='Print the package version.') + special_modes.add_argument( + '-h', '--help', action='store_true', + help='Print this help.') + special_modes_group.add_argument( + '-a', metavar='ARG', + help='Formatter-specific additional argument for the -S (print ' + 'style sheet) mode.') + + argns = parser.parse_args(args[1:]) + + try: + return main_inner(parser, argns) + except BrokenPipeError: + # someone closed our stdout, e.g. by quitting a pager. + return 0 + except Exception: + if argns.v: + print(file=sys.stderr) + print('*' * 65, file=sys.stderr) + print('An unhandled exception occurred while highlighting.', + file=sys.stderr) + print('Please report the whole traceback to the issue tracker at', + file=sys.stderr) + print('.', + file=sys.stderr) + print('*' * 65, file=sys.stderr) + print(file=sys.stderr) + raise + import traceback + info = traceback.format_exception(*sys.exc_info()) + msg = info[-1].strip() + if len(info) >= 3: + # extract relevant file and position info + msg += '\n (f{})'.format(info[-2].split('\n')[0].strip()[1:]) + print(file=sys.stderr) + print('*** Error while highlighting:', file=sys.stderr) + print(msg, file=sys.stderr) + print('*** If this is a bug you want to report, please rerun with -v.', + file=sys.stderr) + return 1 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py new file mode 100644 index 0000000..4c1a062 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/console.py @@ -0,0 +1,70 @@ +""" + pygments.console + ~~~~~~~~~~~~~~~~ + + Format colored console output. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +esc = "\x1b[" + +codes = {} +codes[""] = "" +codes["reset"] = esc + "39;49;00m" + +codes["bold"] = esc + "01m" +codes["faint"] = esc + "02m" +codes["standout"] = esc + "03m" +codes["underline"] = esc + "04m" +codes["blink"] = esc + "05m" +codes["overline"] = esc + "06m" + +dark_colors = ["black", "red", "green", "yellow", "blue", + "magenta", "cyan", "gray"] +light_colors = ["brightblack", "brightred", "brightgreen", "brightyellow", "brightblue", + "brightmagenta", "brightcyan", "white"] + +x = 30 +for dark, light in zip(dark_colors, light_colors): + codes[dark] = esc + "%im" % x + codes[light] = esc + "%im" % (60 + x) + x += 1 + +del dark, light, x + +codes["white"] = codes["bold"] + + +def reset_color(): + return codes["reset"] + + +def colorize(color_key, text): + return codes[color_key] + text + codes["reset"] + + +def ansiformat(attr, text): + """ + Format ``text`` with a color and/or some attributes:: + + color normal color + *color* bold color + _color_ underlined color + +color+ blinking color + """ + result = [] + if attr[:1] == attr[-1:] == '+': + result.append(codes['blink']) + attr = attr[1:-1] + if attr[:1] == attr[-1:] == '*': + result.append(codes['bold']) + attr = attr[1:-1] + if attr[:1] == attr[-1:] == '_': + result.append(codes['underline']) + attr = attr[1:-1] + result.append(codes[attr]) + result.append(text) + result.append(codes['reset']) + return ''.join(result) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py new file mode 100644 index 0000000..aa6f760 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py @@ -0,0 +1,70 @@ +""" + pygments.filter + ~~~~~~~~~~~~~~~ + + Module that implements the default filter. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +def apply_filters(stream, filters, lexer=None): + """ + Use this method to apply an iterable of filters to + a stream. If lexer is given it's forwarded to the + filter, otherwise the filter receives `None`. + """ + def _apply(filter_, stream): + yield from filter_.filter(lexer, stream) + for filter_ in filters: + stream = _apply(filter_, stream) + return stream + + +def simplefilter(f): + """ + Decorator that converts a function into a filter:: + + @simplefilter + def lowercase(self, lexer, stream, options): + for ttype, value in stream: + yield ttype, value.lower() + """ + return type(f.__name__, (FunctionFilter,), { + '__module__': getattr(f, '__module__'), + '__doc__': f.__doc__, + 'function': f, + }) + + +class Filter: + """ + Default filter. Subclass this class or use the `simplefilter` + decorator to create own filters. + """ + + def __init__(self, **options): + self.options = options + + def filter(self, lexer, stream): + raise NotImplementedError() + + +class FunctionFilter(Filter): + """ + Abstract class used by `simplefilter` to create simple + function filters on the fly. The `simplefilter` decorator + automatically creates subclasses of this class for + functions passed to it. + """ + function = None + + def __init__(self, **options): + if not hasattr(self, 'function'): + raise TypeError(f'{self.__class__.__name__!r} used without bound function') + Filter.__init__(self, **options) + + def filter(self, lexer, stream): + # pylint: disable=not-callable + yield from self.function(lexer, stream, self.options) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py new file mode 100644 index 0000000..9255ca2 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py @@ -0,0 +1,940 @@ +""" + pygments.filters + ~~~~~~~~~~~~~~~~ + + Module containing filter lookup functions and default + filters. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from pip._vendor.pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \ + string_to_tokentype +from pip._vendor.pygments.filter import Filter +from pip._vendor.pygments.util import get_list_opt, get_int_opt, get_bool_opt, \ + get_choice_opt, ClassNotFound, OptionError +from pip._vendor.pygments.plugin import find_plugin_filters + + +def find_filter_class(filtername): + """Lookup a filter by name. Return None if not found.""" + if filtername in FILTERS: + return FILTERS[filtername] + for name, cls in find_plugin_filters(): + if name == filtername: + return cls + return None + + +def get_filter_by_name(filtername, **options): + """Return an instantiated filter. + + Options are passed to the filter initializer if wanted. + Raise a ClassNotFound if not found. + """ + cls = find_filter_class(filtername) + if cls: + return cls(**options) + else: + raise ClassNotFound(f'filter {filtername!r} not found') + + +def get_all_filters(): + """Return a generator of all filter names.""" + yield from FILTERS + for name, _ in find_plugin_filters(): + yield name + + +def _replace_special(ttype, value, regex, specialttype, + replacefunc=lambda x: x): + last = 0 + for match in regex.finditer(value): + start, end = match.start(), match.end() + if start != last: + yield ttype, value[last:start] + yield specialttype, replacefunc(value[start:end]) + last = end + if last != len(value): + yield ttype, value[last:] + + +class CodeTagFilter(Filter): + """Highlight special code tags in comments and docstrings. + + Options accepted: + + `codetags` : list of strings + A list of strings that are flagged as code tags. The default is to + highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``. + + .. versionchanged:: 2.13 + Now recognizes ``FIXME`` by default. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + tags = get_list_opt(options, 'codetags', + ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) + self.tag_re = re.compile(r'\b({})\b'.format('|'.join([ + re.escape(tag) for tag in tags if tag + ]))) + + def filter(self, lexer, stream): + regex = self.tag_re + for ttype, value in stream: + if ttype in String.Doc or \ + ttype in Comment and \ + ttype not in Comment.Preproc: + yield from _replace_special(ttype, value, regex, Comment.Special) + else: + yield ttype, value + + +class SymbolFilter(Filter): + """Convert mathematical symbols such as \\ in Isabelle + or \\longrightarrow in LaTeX into Unicode characters. + + This is mostly useful for HTML or console output when you want to + approximate the source rendering you'd see in an IDE. + + Options accepted: + + `lang` : string + The symbol language. Must be one of ``'isabelle'`` or + ``'latex'``. The default is ``'isabelle'``. + """ + + latex_symbols = { + '\\alpha' : '\U000003b1', + '\\beta' : '\U000003b2', + '\\gamma' : '\U000003b3', + '\\delta' : '\U000003b4', + '\\varepsilon' : '\U000003b5', + '\\zeta' : '\U000003b6', + '\\eta' : '\U000003b7', + '\\vartheta' : '\U000003b8', + '\\iota' : '\U000003b9', + '\\kappa' : '\U000003ba', + '\\lambda' : '\U000003bb', + '\\mu' : '\U000003bc', + '\\nu' : '\U000003bd', + '\\xi' : '\U000003be', + '\\pi' : '\U000003c0', + '\\varrho' : '\U000003c1', + '\\sigma' : '\U000003c3', + '\\tau' : '\U000003c4', + '\\upsilon' : '\U000003c5', + '\\varphi' : '\U000003c6', + '\\chi' : '\U000003c7', + '\\psi' : '\U000003c8', + '\\omega' : '\U000003c9', + '\\Gamma' : '\U00000393', + '\\Delta' : '\U00000394', + '\\Theta' : '\U00000398', + '\\Lambda' : '\U0000039b', + '\\Xi' : '\U0000039e', + '\\Pi' : '\U000003a0', + '\\Sigma' : '\U000003a3', + '\\Upsilon' : '\U000003a5', + '\\Phi' : '\U000003a6', + '\\Psi' : '\U000003a8', + '\\Omega' : '\U000003a9', + '\\leftarrow' : '\U00002190', + '\\longleftarrow' : '\U000027f5', + '\\rightarrow' : '\U00002192', + '\\longrightarrow' : '\U000027f6', + '\\Leftarrow' : '\U000021d0', + '\\Longleftarrow' : '\U000027f8', + '\\Rightarrow' : '\U000021d2', + '\\Longrightarrow' : '\U000027f9', + '\\leftrightarrow' : '\U00002194', + '\\longleftrightarrow' : '\U000027f7', + '\\Leftrightarrow' : '\U000021d4', + '\\Longleftrightarrow' : '\U000027fa', + '\\mapsto' : '\U000021a6', + '\\longmapsto' : '\U000027fc', + '\\relbar' : '\U00002500', + '\\Relbar' : '\U00002550', + '\\hookleftarrow' : '\U000021a9', + '\\hookrightarrow' : '\U000021aa', + '\\leftharpoondown' : '\U000021bd', + '\\rightharpoondown' : '\U000021c1', + '\\leftharpoonup' : '\U000021bc', + '\\rightharpoonup' : '\U000021c0', + '\\rightleftharpoons' : '\U000021cc', + '\\leadsto' : '\U0000219d', + '\\downharpoonleft' : '\U000021c3', + '\\downharpoonright' : '\U000021c2', + '\\upharpoonleft' : '\U000021bf', + '\\upharpoonright' : '\U000021be', + '\\restriction' : '\U000021be', + '\\uparrow' : '\U00002191', + '\\Uparrow' : '\U000021d1', + '\\downarrow' : '\U00002193', + '\\Downarrow' : '\U000021d3', + '\\updownarrow' : '\U00002195', + '\\Updownarrow' : '\U000021d5', + '\\langle' : '\U000027e8', + '\\rangle' : '\U000027e9', + '\\lceil' : '\U00002308', + '\\rceil' : '\U00002309', + '\\lfloor' : '\U0000230a', + '\\rfloor' : '\U0000230b', + '\\flqq' : '\U000000ab', + '\\frqq' : '\U000000bb', + '\\bot' : '\U000022a5', + '\\top' : '\U000022a4', + '\\wedge' : '\U00002227', + '\\bigwedge' : '\U000022c0', + '\\vee' : '\U00002228', + '\\bigvee' : '\U000022c1', + '\\forall' : '\U00002200', + '\\exists' : '\U00002203', + '\\nexists' : '\U00002204', + '\\neg' : '\U000000ac', + '\\Box' : '\U000025a1', + '\\Diamond' : '\U000025c7', + '\\vdash' : '\U000022a2', + '\\models' : '\U000022a8', + '\\dashv' : '\U000022a3', + '\\surd' : '\U0000221a', + '\\le' : '\U00002264', + '\\ge' : '\U00002265', + '\\ll' : '\U0000226a', + '\\gg' : '\U0000226b', + '\\lesssim' : '\U00002272', + '\\gtrsim' : '\U00002273', + '\\lessapprox' : '\U00002a85', + '\\gtrapprox' : '\U00002a86', + '\\in' : '\U00002208', + '\\notin' : '\U00002209', + '\\subset' : '\U00002282', + '\\supset' : '\U00002283', + '\\subseteq' : '\U00002286', + '\\supseteq' : '\U00002287', + '\\sqsubset' : '\U0000228f', + '\\sqsupset' : '\U00002290', + '\\sqsubseteq' : '\U00002291', + '\\sqsupseteq' : '\U00002292', + '\\cap' : '\U00002229', + '\\bigcap' : '\U000022c2', + '\\cup' : '\U0000222a', + '\\bigcup' : '\U000022c3', + '\\sqcup' : '\U00002294', + '\\bigsqcup' : '\U00002a06', + '\\sqcap' : '\U00002293', + '\\Bigsqcap' : '\U00002a05', + '\\setminus' : '\U00002216', + '\\propto' : '\U0000221d', + '\\uplus' : '\U0000228e', + '\\bigplus' : '\U00002a04', + '\\sim' : '\U0000223c', + '\\doteq' : '\U00002250', + '\\simeq' : '\U00002243', + '\\approx' : '\U00002248', + '\\asymp' : '\U0000224d', + '\\cong' : '\U00002245', + '\\equiv' : '\U00002261', + '\\Join' : '\U000022c8', + '\\bowtie' : '\U00002a1d', + '\\prec' : '\U0000227a', + '\\succ' : '\U0000227b', + '\\preceq' : '\U0000227c', + '\\succeq' : '\U0000227d', + '\\parallel' : '\U00002225', + '\\mid' : '\U000000a6', + '\\pm' : '\U000000b1', + '\\mp' : '\U00002213', + '\\times' : '\U000000d7', + '\\div' : '\U000000f7', + '\\cdot' : '\U000022c5', + '\\star' : '\U000022c6', + '\\circ' : '\U00002218', + '\\dagger' : '\U00002020', + '\\ddagger' : '\U00002021', + '\\lhd' : '\U000022b2', + '\\rhd' : '\U000022b3', + '\\unlhd' : '\U000022b4', + '\\unrhd' : '\U000022b5', + '\\triangleleft' : '\U000025c3', + '\\triangleright' : '\U000025b9', + '\\triangle' : '\U000025b3', + '\\triangleq' : '\U0000225c', + '\\oplus' : '\U00002295', + '\\bigoplus' : '\U00002a01', + '\\otimes' : '\U00002297', + '\\bigotimes' : '\U00002a02', + '\\odot' : '\U00002299', + '\\bigodot' : '\U00002a00', + '\\ominus' : '\U00002296', + '\\oslash' : '\U00002298', + '\\dots' : '\U00002026', + '\\cdots' : '\U000022ef', + '\\sum' : '\U00002211', + '\\prod' : '\U0000220f', + '\\coprod' : '\U00002210', + '\\infty' : '\U0000221e', + '\\int' : '\U0000222b', + '\\oint' : '\U0000222e', + '\\clubsuit' : '\U00002663', + '\\diamondsuit' : '\U00002662', + '\\heartsuit' : '\U00002661', + '\\spadesuit' : '\U00002660', + '\\aleph' : '\U00002135', + '\\emptyset' : '\U00002205', + '\\nabla' : '\U00002207', + '\\partial' : '\U00002202', + '\\flat' : '\U0000266d', + '\\natural' : '\U0000266e', + '\\sharp' : '\U0000266f', + '\\angle' : '\U00002220', + '\\copyright' : '\U000000a9', + '\\textregistered' : '\U000000ae', + '\\textonequarter' : '\U000000bc', + '\\textonehalf' : '\U000000bd', + '\\textthreequarters' : '\U000000be', + '\\textordfeminine' : '\U000000aa', + '\\textordmasculine' : '\U000000ba', + '\\euro' : '\U000020ac', + '\\pounds' : '\U000000a3', + '\\yen' : '\U000000a5', + '\\textcent' : '\U000000a2', + '\\textcurrency' : '\U000000a4', + '\\textdegree' : '\U000000b0', + } + + isabelle_symbols = { + '\\' : '\U0001d7ec', + '\\' : '\U0001d7ed', + '\\' : '\U0001d7ee', + '\\' : '\U0001d7ef', + '\\' : '\U0001d7f0', + '\\' : '\U0001d7f1', + '\\' : '\U0001d7f2', + '\\' : '\U0001d7f3', + '\\' : '\U0001d7f4', + '\\' : '\U0001d7f5', + '\\' : '\U0001d49c', + '\\' : '\U0000212c', + '\\' : '\U0001d49e', + '\\' : '\U0001d49f', + '\\' : '\U00002130', + '\\' : '\U00002131', + '\\' : '\U0001d4a2', + '\\' : '\U0000210b', + '\\' : '\U00002110', + '\\' : '\U0001d4a5', + '\\' : '\U0001d4a6', + '\\' : '\U00002112', + '\\' : '\U00002133', + '\\' : '\U0001d4a9', + '\\' : '\U0001d4aa', + '\\

    ' : '\U0001d4ab', + '\\' : '\U0001d4ac', + '\\' : '\U0000211b', + '\\' : '\U0001d4ae', + '\\' : '\U0001d4af', + '\\' : '\U0001d4b0', + '\\' : '\U0001d4b1', + '\\' : '\U0001d4b2', + '\\' : '\U0001d4b3', + '\\' : '\U0001d4b4', + '\\' : '\U0001d4b5', + '\\' : '\U0001d5ba', + '\\' : '\U0001d5bb', + '\\' : '\U0001d5bc', + '\\' : '\U0001d5bd', + '\\' : '\U0001d5be', + '\\' : '\U0001d5bf', + '\\' : '\U0001d5c0', + '\\' : '\U0001d5c1', + '\\' : '\U0001d5c2', + '\\' : '\U0001d5c3', + '\\' : '\U0001d5c4', + '\\' : '\U0001d5c5', + '\\' : '\U0001d5c6', + '\\' : '\U0001d5c7', + '\\' : '\U0001d5c8', + '\\

    ' : '\U0001d5c9', + '\\' : '\U0001d5ca', + '\\' : '\U0001d5cb', + '\\' : '\U0001d5cc', + '\\' : '\U0001d5cd', + '\\' : '\U0001d5ce', + '\\' : '\U0001d5cf', + '\\' : '\U0001d5d0', + '\\' : '\U0001d5d1', + '\\' : '\U0001d5d2', + '\\' : '\U0001d5d3', + '\\' : '\U0001d504', + '\\' : '\U0001d505', + '\\' : '\U0000212d', + '\\

    ' : '\U0001d507', + '\\' : '\U0001d508', + '\\' : '\U0001d509', + '\\' : '\U0001d50a', + '\\' : '\U0000210c', + '\\' : '\U00002111', + '\\' : '\U0001d50d', + '\\' : '\U0001d50e', + '\\' : '\U0001d50f', + '\\' : '\U0001d510', + '\\' : '\U0001d511', + '\\' : '\U0001d512', + '\\' : '\U0001d513', + '\\' : '\U0001d514', + '\\' : '\U0000211c', + '\\' : '\U0001d516', + '\\' : '\U0001d517', + '\\' : '\U0001d518', + '\\' : '\U0001d519', + '\\' : '\U0001d51a', + '\\' : '\U0001d51b', + '\\' : '\U0001d51c', + '\\' : '\U00002128', + '\\' : '\U0001d51e', + '\\' : '\U0001d51f', + '\\' : '\U0001d520', + '\\

    S;+a1~IH!Y4dN@|*4 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ⅇbc;*6FNT7&6 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 for details and usage. + +""" + +from __future__ import annotations + +import os +import sys +from typing import TYPE_CHECKING + +from .api import PlatformDirsABC +from .version import __version__ +from .version import __version_tuple__ as __version_info__ + +if TYPE_CHECKING: + from pathlib import Path + from typing import Literal + + +def _set_platform_dir_class() -> type[PlatformDirsABC]: + if sys.platform == "win32": + from pip._vendor.platformdirs.windows import Windows as Result # noqa: PLC0415 + elif sys.platform == "darwin": + from pip._vendor.platformdirs.macos import MacOS as Result # noqa: PLC0415 + else: + from pip._vendor.platformdirs.unix import Unix as Result # noqa: PLC0415 + + if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": + if os.getenv("SHELL") or os.getenv("PREFIX"): + return Result + + from pip._vendor.platformdirs.android import _android_folder # noqa: PLC0415 + + if _android_folder() is not None: + from pip._vendor.platformdirs.android import Android # noqa: PLC0415 + + return Android # return to avoid redefinition of a result + + return Result + + +PlatformDirs = _set_platform_dir_class() #: Currently active platform +AppDirs = PlatformDirs #: Backwards compatibility with appdirs + + +def user_data_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: data directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_data_dir + + +def site_data_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + multipath: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: data directory shared by users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_data_dir + + +def user_config_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: config directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_config_dir + + +def site_config_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + multipath: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: config directory shared by the users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_config_dir + + +def user_cache_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: cache directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_cache_dir + + +def site_cache_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: cache directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_cache_dir + + +def user_state_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: state directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_state_dir + + +def user_log_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: log directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_log_dir + + +def user_documents_dir() -> str: + """:returns: documents directory tied to the user""" + return PlatformDirs().user_documents_dir + + +def user_downloads_dir() -> str: + """:returns: downloads directory tied to the user""" + return PlatformDirs().user_downloads_dir + + +def user_pictures_dir() -> str: + """:returns: pictures directory tied to the user""" + return PlatformDirs().user_pictures_dir + + +def user_videos_dir() -> str: + """:returns: videos directory tied to the user""" + return PlatformDirs().user_videos_dir + + +def user_music_dir() -> str: + """:returns: music directory tied to the user""" + return PlatformDirs().user_music_dir + + +def user_desktop_dir() -> str: + """:returns: desktop directory tied to the user""" + return PlatformDirs().user_desktop_dir + + +def user_runtime_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: runtime directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_runtime_dir + + +def site_runtime_dir( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> str: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: runtime directory shared by users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_runtime_dir + + +def user_data_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: data path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_data_path + + +def site_data_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + multipath: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param multipath: See `multipath `. + :param ensure_exists: See `ensure_exists `. + :returns: data path shared by users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_data_path + + +def user_config_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: config path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_config_path + + +def site_config_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + multipath: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param multipath: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: config path shared by the users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + multipath=multipath, + ensure_exists=ensure_exists, + ).site_config_path + + +def site_cache_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: cache directory tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_cache_path + + +def user_cache_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: cache path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_cache_path + + +def user_state_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + roaming: bool = False, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param roaming: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: state path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + roaming=roaming, + ensure_exists=ensure_exists, + ).user_state_path + + +def user_log_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `roaming `. + :param ensure_exists: See `ensure_exists `. + :returns: log path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_log_path + + +def user_documents_path() -> Path: + """:returns: documents a path tied to the user""" + return PlatformDirs().user_documents_path + + +def user_downloads_path() -> Path: + """:returns: downloads path tied to the user""" + return PlatformDirs().user_downloads_path + + +def user_pictures_path() -> Path: + """:returns: pictures path tied to the user""" + return PlatformDirs().user_pictures_path + + +def user_videos_path() -> Path: + """:returns: videos path tied to the user""" + return PlatformDirs().user_videos_path + + +def user_music_path() -> Path: + """:returns: music path tied to the user""" + return PlatformDirs().user_music_path + + +def user_desktop_path() -> Path: + """:returns: desktop path tied to the user""" + return PlatformDirs().user_desktop_path + + +def user_runtime_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: runtime path tied to the user + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).user_runtime_path + + +def site_runtime_path( + appname: str | None = None, + appauthor: str | None | Literal[False] = None, + version: str | None = None, + opinion: bool = True, # noqa: FBT001, FBT002 + ensure_exists: bool = False, # noqa: FBT001, FBT002 +) -> Path: + """ + :param appname: See `appname `. + :param appauthor: See `appauthor `. + :param version: See `version `. + :param opinion: See `opinion `. + :param ensure_exists: See `ensure_exists `. + :returns: runtime path shared by users + """ + return PlatformDirs( + appname=appname, + appauthor=appauthor, + version=version, + opinion=opinion, + ensure_exists=ensure_exists, + ).site_runtime_path + + +__all__ = [ + "AppDirs", + "PlatformDirs", + "PlatformDirsABC", + "__version__", + "__version_info__", + "site_cache_dir", + "site_cache_path", + "site_config_dir", + "site_config_path", + "site_data_dir", + "site_data_path", + "site_runtime_dir", + "site_runtime_path", + "user_cache_dir", + "user_cache_path", + "user_config_dir", + "user_config_path", + "user_data_dir", + "user_data_path", + "user_desktop_dir", + "user_desktop_path", + "user_documents_dir", + "user_documents_path", + "user_downloads_dir", + "user_downloads_path", + "user_log_dir", + "user_log_path", + "user_music_dir", + "user_music_path", + "user_pictures_dir", + "user_pictures_path", + "user_runtime_dir", + "user_runtime_path", + "user_state_dir", + "user_state_path", + "user_videos_dir", + "user_videos_path", +] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py new file mode 100644 index 0000000..fa8a677 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py @@ -0,0 +1,55 @@ +"""Main entry point.""" + +from __future__ import annotations + +from pip._vendor.platformdirs import PlatformDirs, __version__ + +PROPS = ( + "user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "user_documents_dir", + "user_downloads_dir", + "user_pictures_dir", + "user_videos_dir", + "user_music_dir", + "user_runtime_dir", + "site_data_dir", + "site_config_dir", + "site_cache_dir", + "site_runtime_dir", +) + + +def main() -> None: + """Run the main entry point.""" + app_name = "MyApp" + app_author = "MyCompany" + + print(f"-- platformdirs {__version__} --") # noqa: T201 + + print("-- app dirs (with optional 'version')") # noqa: T201 + dirs = PlatformDirs(app_name, app_author, version="1.0") + for prop in PROPS: + print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 + + print("\n-- app dirs (without optional 'version')") # noqa: T201 + dirs = PlatformDirs(app_name, app_author) + for prop in PROPS: + print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 + + print("\n-- app dirs (without optional 'appauthor')") # noqa: T201 + dirs = PlatformDirs(app_name) + for prop in PROPS: + print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 + + print("\n-- app dirs (with disabled 'appauthor')") # noqa: T201 + dirs = PlatformDirs(app_name, appauthor=False) + for prop in PROPS: + print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 + + +if __name__ == "__main__": + main() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ded4f72b1edab84d0e6fc6390d77965dff11cc4f GIT binary patch literal 19848 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 K@(xcW{{97rj16A^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5090f64fb6f8195d1413b149c2a11cf1468a51ef GIT binary patch literal 10716 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bd6c14992b586fd430fa0bf2d02d8eb61c679a8 GIT binary patch literal 15056 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f818c06882a65c1e0d7d73ff1d21f0707e52a9f GIT binary patch literal 13693 zcmd5@eQ*>v(Dpg5U{#mg~X>W|HoVr|9$Y0__%8rw& z{^Ch{CmjU zU_@q+5n0g^Wn-2>3yXPc)H-OTzqUae{Mw@Sm}AgE%j{8Sj2q-2?+~5QvY2bo#WE5{ z98iyomdD(KZkDky#~88f3M0BC*L|zj-=IgV6w9yJ1}nrW(G9;mynEo+3%?ccTPgZP z9)7DVz%MyO>j&QZti}uPRrj?lW6%bDqHB~Lte&*`tEae^B5^S>AvZq4T7Fh755?mN zC8R_Wak&TH%c3L|42QyF61;c@&YtWD299?GPIUGhdxV_;l|LB`DI*CIYmX4Q?MMJf zTp$#UhR#K$u--ZS(Lab?Yz596jKmDGAViDE4q7FfSR-1l*o?sr+C{5qdzTegiS{cX zLR#)9D0fndvw*@;3RgfWqm;4&ii=WQ1(b410r8qWyD0?(ZBjgx0wOml6_f(PHz_=& zz%-Z?FQs@3D3z2_SwN|xl&S)Xk5YUElxj+;E}+!F)U8&X`qYIMK$$?Q&b9(cw;OQCJ8w)qBMpRu_h_r zkdm7wG_Anj=G{&5m=ujRosTCb;vTVdyR% zib+CCQr8O+^rA78j5ID$6rjrxNv22Sk?feCDjUHoIn z++fnoI3*V+1nevhaCM1QEJn$=&B*0{$DR4SkyFZyT$;VF_iX%LvOs_3MtS}>Z82)} zGk)vTJpEkM(t|`&QY3y*Q%TSbDGXXVDJT(1M4d$)0(Bzwg48(LXtD{z!<$d{cl4d? z>pj}p)vxSPrfd$at$8C#C`&GQ>)`Hgq#vi#Nz zw{;QtnVx&F_UMKbyby|}q_CmGsEw$_RR2GQw;RkTbIH1b4g4w44Nh!We?&ILk{zYX zF0wK#%%$7AWJ_Deb+^E13xCr#L-&ERbd8cWTEJzw{5AWnE_ml}j>8&5>y>bhVeiLMKHACti_kwS`u3aTND-%hHH z`eY5{R0kMXC?-P(bmft8D#5A*fvm!cK1lMqU1XG7ph$iXl4&Ma>6>xn%K2+8KWYK> zz4rRm*YBL3<+tZ*pTE8S*7^sv`|s}gu;pIMbw|#->W1eX&&`oJ@8+Dl>RR{J?wfVD z>u=T1xwq!{bs2u!-GL8>{$j|e7n}3eV~gn@r45pJJ9;ZR=iQ+j(6#i{^v(7Rzx~d> z2mE$0AI?3``DZ!*-MTrh33zA9$#XEu(#wScB{vvMwWpM6lu~cSTq4Bf%K=Wexm*}6 zgGrb*ajK^VR$2w*u@HfE;M^o#17vLx0JIJq96Cu7qcB|*^h?6MTCIU^ptrlbx5t3w zd-lAV5L84`g$YjXJxg9AWW)u1=2Z_uVhMaJBJTwTxe1bK=81#xRuv*zrl}(<9L@5_ zNY6nz}6mj8w+^W&Bj97gU&Ojb6Xi%|T#Gab?Lf%U$=Zh;!urvAZ2VG5GG z%y5tP6m<}`MMeZ2Kmis-VIrc8pYph+J<-qP4%gCYv@HzBhU$Ww2r zgojFYDacQsQeI){B^Q=wy)D|V>Bku@6)wx*HBv8ZYSa{AH1Unr7Xg3<_g#fxBSj%V zFg)Cq7?lBQ0AM1DYQs0bgDys71B|I)o!*GAFJQ6^3*2M?~c8auhCVLI-RL9E3aV{;EUJgin|9?{8;zW&~xwyt}&0vYFhp{2@RrCEeA0xIY= zMS?a*hh^tb+&FaTS6CE%s`T2j!jUW=$Z&ygLwd(e>0OA3 zQsV2&?hIuE$?0*X?z3k)+dFzotDWY*Yduk+nJzAsXTIQ75ZU5-NJ?1j-QUj&hqC

    ' : '\U0001d521', + '\\' : '\U0001d522', + '\\' : '\U0001d523', + '\\' : '\U0001d524', + '\\' : '\U0001d525', + '\\' : '\U0001d526', + '\\' : '\U0001d527', + '\\' : '\U0001d528', + '\\' : '\U0001d529', + '\\' : '\U0001d52a', + '\\' : '\U0001d52b', + '\\' : '\U0001d52c', + '\\' : '\U0001d52d', + '\\' : '\U0001d52e', + '\\' : '\U0001d52f', + '\\' : '\U0001d530', + '\\' : '\U0001d531', + '\\' : '\U0001d532', + '\\' : '\U0001d533', + '\\' : '\U0001d534', + '\\' : '\U0001d535', + '\\' : '\U0001d536', + '\\' : '\U0001d537', + '\\' : '\U000003b1', + '\\' : '\U000003b2', + '\\' : '\U000003b3', + '\\' : '\U000003b4', + '\\' : '\U000003b5', + '\\' : '\U000003b6', + '\\' : '\U000003b7', + '\\' : '\U000003b8', + '\\' : '\U000003b9', + '\\' : '\U000003ba', + '\\' : '\U000003bb', + '\\' : '\U000003bc', + '\\' : '\U000003bd', + '\\' : '\U000003be', + '\\' : '\U000003c0', + '\\' : '\U000003c1', + '\\' : '\U000003c3', + '\\' : '\U000003c4', + '\\' : '\U000003c5', + '\\' : '\U000003c6', + '\\' : '\U000003c7', + '\\' : '\U000003c8', + '\\' : '\U000003c9', + '\\' : '\U00000393', + '\\' : '\U00000394', + '\\' : '\U00000398', + '\\' : '\U0000039b', + '\\' : '\U0000039e', + '\\' : '\U000003a0', + '\\' : '\U000003a3', + '\\' : '\U000003a5', + '\\' : '\U000003a6', + '\\' : '\U000003a8', + '\\' : '\U000003a9', + '\\' : '\U0001d539', + '\\' : '\U00002102', + '\\' : '\U00002115', + '\\' : '\U0000211a', + '\\' : '\U0000211d', + '\\' : '\U00002124', + '\\' : '\U00002190', + '\\' : '\U000027f5', + '\\' : '\U00002192', + '\\' : '\U000027f6', + '\\' : '\U000021d0', + '\\' : '\U000027f8', + '\\' : '\U000021d2', + '\\' : '\U000027f9', + '\\' : '\U00002194', + '\\' : '\U000027f7', + '\\' : '\U000021d4', + '\\' : '\U000027fa', + '\\' : '\U000021a6', + '\\' : '\U000027fc', + '\\' : '\U00002500', + '\\' : '\U00002550', + '\\' : '\U000021a9', + '\\' : '\U000021aa', + '\\' : '\U000021bd', + '\\' : '\U000021c1', + '\\' : '\U000021bc', + '\\' : '\U000021c0', + '\\' : '\U000021cc', + '\\' : '\U0000219d', + '\\' : '\U000021c3', + '\\' : '\U000021c2', + '\\' : '\U000021bf', + '\\' : '\U000021be', + '\\' : '\U000021be', + '\\' : '\U00002237', + '\\' : '\U00002191', + '\\' : '\U000021d1', + '\\' : '\U00002193', + '\\' : '\U000021d3', + '\\' : '\U00002195', + '\\' : '\U000021d5', + '\\' : '\U000027e8', + '\\' : '\U000027e9', + '\\' : '\U00002308', + '\\' : '\U00002309', + '\\' : '\U0000230a', + '\\' : '\U0000230b', + '\\' : '\U00002987', + '\\' : '\U00002988', + '\\' : '\U000027e6', + '\\' : '\U000027e7', + '\\' : '\U00002983', + '\\' : '\U00002984', + '\\' : '\U000000ab', + '\\' : '\U000000bb', + '\\' : '\U000022a5', + '\\' : '\U000022a4', + '\\' : '\U00002227', + '\\' : '\U000022c0', + '\\' : '\U00002228', + '\\' : '\U000022c1', + '\\' : '\U00002200', + '\\' : '\U00002203', + '\\' : '\U00002204', + '\\' : '\U000000ac', + '\\' : '\U000025a1', + '\\' : '\U000025c7', + '\\' : '\U000022a2', + '\\' : '\U000022a8', + '\\' : '\U000022a9', + '\\' : '\U000022ab', + '\\' : '\U000022a3', + '\\' : '\U0000221a', + '\\' : '\U00002264', + '\\' : '\U00002265', + '\\' : '\U0000226a', + '\\' : '\U0000226b', + '\\' : '\U00002272', + '\\' : '\U00002273', + '\\' : '\U00002a85', + '\\' : '\U00002a86', + '\\' : '\U00002208', + '\\' : '\U00002209', + '\\' : '\U00002282', + '\\' : '\U00002283', + '\\' : '\U00002286', + '\\' : '\U00002287', + '\\' : '\U0000228f', + '\\' : '\U00002290', + '\\' : '\U00002291', + '\\' : '\U00002292', + '\\' : '\U00002229', + '\\' : '\U000022c2', + '\\' : '\U0000222a', + '\\' : '\U000022c3', + '\\' : '\U00002294', + '\\' : '\U00002a06', + '\\' : '\U00002293', + '\\' : '\U00002a05', + '\\' : '\U00002216', + '\\' : '\U0000221d', + '\\' : '\U0000228e', + '\\' : '\U00002a04', + '\\' : '\U00002260', + '\\' : '\U0000223c', + '\\' : '\U00002250', + '\\' : '\U00002243', + '\\' : '\U00002248', + '\\' : '\U0000224d', + '\\' : '\U00002245', + '\\' : '\U00002323', + '\\' : '\U00002261', + '\\' : '\U00002322', + '\\' : '\U000022c8', + '\\' : '\U00002a1d', + '\\' : '\U0000227a', + '\\' : '\U0000227b', + '\\' : '\U0000227c', + '\\' : '\U0000227d', + '\\' : '\U00002225', + '\\' : '\U000000a6', + '\\' : '\U000000b1', + '\\' : '\U00002213', + '\\' : '\U000000d7', + '\\
    ' : '\U000000f7', + '\\' : '\U000022c5', + '\\' : '\U000022c6', + '\\' : '\U00002219', + '\\' : '\U00002218', + '\\' : '\U00002020', + '\\' : '\U00002021', + '\\' : '\U000022b2', + '\\' : '\U000022b3', + '\\' : '\U000022b4', + '\\' : '\U000022b5', + '\\' : '\U000025c3', + '\\' : '\U000025b9', + '\\' : '\U000025b3', + '\\' : '\U0000225c', + '\\' : '\U00002295', + '\\' : '\U00002a01', + '\\' : '\U00002297', + '\\' : '\U00002a02', + '\\' : '\U00002299', + '\\' : '\U00002a00', + '\\' : '\U00002296', + '\\' : '\U00002298', + '\\' : '\U00002026', + '\\' : '\U000022ef', + '\\' : '\U00002211', + '\\' : '\U0000220f', + '\\' : '\U00002210', + '\\' : '\U0000221e', + '\\' : '\U0000222b', + '\\' : '\U0000222e', + '\\' : '\U00002663', + '\\' : '\U00002662', + '\\' : '\U00002661', + '\\' : '\U00002660', + '\\' : '\U00002135', + '\\' : '\U00002205', + '\\' : '\U00002207', + '\\' : '\U00002202', + '\\' : '\U0000266d', + '\\' : '\U0000266e', + '\\' : '\U0000266f', + '\\' : '\U00002220', + '\\' : '\U000000a9', + '\\' : '\U000000ae', + '\\' : '\U000000ad', + '\\' : '\U000000af', + '\\' : '\U000000bc', + '\\' : '\U000000bd', + '\\' : '\U000000be', + '\\' : '\U000000aa', + '\\' : '\U000000ba', + '\\
    ' : '\U000000a7', + '\\' : '\U000000b6', + '\\' : '\U000000a1', + '\\' : '\U000000bf', + '\\' : '\U000020ac', + '\\' : '\U000000a3', + '\\' : '\U000000a5', + '\\' : '\U000000a2', + '\\' : '\U000000a4', + '\\' : '\U000000b0', + '\\' : '\U00002a3f', + '\\' : '\U00002127', + '\\' : '\U000025ca', + '\\' : '\U00002118', + '\\' : '\U00002240', + '\\' : '\U000022c4', + '\\' : '\U000000b4', + '\\' : '\U00000131', + '\\' : '\U000000a8', + '\\' : '\U000000b8', + '\\' : '\U000002dd', + '\\' : '\U000003f5', + '\\' : '\U000023ce', + '\\' : '\U00002039', + '\\' : '\U0000203a', + '\\' : '\U00002302', + '\\<^sub>' : '\U000021e9', + '\\<^sup>' : '\U000021e7', + '\\<^bold>' : '\U00002759', + '\\<^bsub>' : '\U000021d8', + '\\<^esub>' : '\U000021d9', + '\\<^bsup>' : '\U000021d7', + '\\<^esup>' : '\U000021d6', + } + + lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols} + + def __init__(self, **options): + Filter.__init__(self, **options) + lang = get_choice_opt(options, 'lang', + ['isabelle', 'latex'], 'isabelle') + self.symbols = self.lang_map[lang] + + def filter(self, lexer, stream): + for ttype, value in stream: + if value in self.symbols: + yield ttype, self.symbols[value] + else: + yield ttype, value + + +class KeywordCaseFilter(Filter): + """Convert keywords to lowercase or uppercase or capitalize them, which + means first letter uppercase, rest lowercase. + + This can be useful e.g. if you highlight Pascal code and want to adapt the + code to your styleguide. + + Options accepted: + + `case` : string + The casing to convert keywords to. Must be one of ``'lower'``, + ``'upper'`` or ``'capitalize'``. The default is ``'lower'``. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + case = get_choice_opt(options, 'case', + ['lower', 'upper', 'capitalize'], 'lower') + self.convert = getattr(str, case) + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Keyword: + yield ttype, self.convert(value) + else: + yield ttype, value + + +class NameHighlightFilter(Filter): + """Highlight a normal Name (and Name.*) token with a different token type. + + Example:: + + filter = NameHighlightFilter( + names=['foo', 'bar', 'baz'], + tokentype=Name.Function, + ) + + This would highlight the names "foo", "bar" and "baz" + as functions. `Name.Function` is the default token type. + + Options accepted: + + `names` : list of strings + A list of names that should be given the different token type. + There is no default. + `tokentype` : TokenType or string + A token type or a string containing a token type name that is + used for highlighting the strings in `names`. The default is + `Name.Function`. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.names = set(get_list_opt(options, 'names', [])) + tokentype = options.get('tokentype') + if tokentype: + self.tokentype = string_to_tokentype(tokentype) + else: + self.tokentype = Name.Function + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Name and value in self.names: + yield self.tokentype, value + else: + yield ttype, value + + +class ErrorToken(Exception): + pass + + +class RaiseOnErrorTokenFilter(Filter): + """Raise an exception when the lexer generates an error token. + + Options accepted: + + `excclass` : Exception class + The exception class to raise. + The default is `pygments.filters.ErrorToken`. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.exception = options.get('excclass', ErrorToken) + try: + # issubclass() will raise TypeError if first argument is not a class + if not issubclass(self.exception, Exception): + raise TypeError + except TypeError: + raise OptionError('excclass option is not an exception class') + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype is Error: + raise self.exception(value) + yield ttype, value + + +class VisibleWhitespaceFilter(Filter): + """Convert tabs, newlines and/or spaces to visible characters. + + Options accepted: + + `spaces` : string or bool + If this is a one-character string, spaces will be replaces by this string. + If it is another true value, spaces will be replaced by ``·`` (unicode + MIDDLE DOT). If it is a false value, spaces will not be replaced. The + default is ``False``. + `tabs` : string or bool + The same as for `spaces`, but the default replacement character is ``»`` + (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value + is ``False``. Note: this will not work if the `tabsize` option for the + lexer is nonzero, as tabs will already have been expanded then. + `tabsize` : int + If tabs are to be replaced by this filter (see the `tabs` option), this + is the total number of characters that a tab should be expanded to. + The default is ``8``. + `newlines` : string or bool + The same as for `spaces`, but the default replacement character is ``¶`` + (unicode PILCROW SIGN). The default value is ``False``. + `wstokentype` : bool + If true, give whitespace the special `Whitespace` token type. This allows + styling the visible whitespace differently (e.g. greyed out), but it can + disrupt background colors. The default is ``True``. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + for name, default in [('spaces', '·'), + ('tabs', '»'), + ('newlines', '¶')]: + opt = options.get(name, False) + if isinstance(opt, str) and len(opt) == 1: + setattr(self, name, opt) + else: + setattr(self, name, (opt and default or '')) + tabsize = get_int_opt(options, 'tabsize', 8) + if self.tabs: + self.tabs += ' ' * (tabsize - 1) + if self.newlines: + self.newlines += '\n' + self.wstt = get_bool_opt(options, 'wstokentype', True) + + def filter(self, lexer, stream): + if self.wstt: + spaces = self.spaces or ' ' + tabs = self.tabs or '\t' + newlines = self.newlines or '\n' + regex = re.compile(r'\s') + + def replacefunc(wschar): + if wschar == ' ': + return spaces + elif wschar == '\t': + return tabs + elif wschar == '\n': + return newlines + return wschar + + for ttype, value in stream: + yield from _replace_special(ttype, value, regex, Whitespace, + replacefunc) + else: + spaces, tabs, newlines = self.spaces, self.tabs, self.newlines + # simpler processing + for ttype, value in stream: + if spaces: + value = value.replace(' ', spaces) + if tabs: + value = value.replace('\t', tabs) + if newlines: + value = value.replace('\n', newlines) + yield ttype, value + + +class GobbleFilter(Filter): + """Gobbles source code lines (eats initial characters). + + This filter drops the first ``n`` characters off every line of code. This + may be useful when the source code fed to the lexer is indented by a fixed + amount of space that isn't desired in the output. + + Options accepted: + + `n` : int + The number of characters to gobble. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + self.n = get_int_opt(options, 'n', 0) + + def gobble(self, value, left): + if left < len(value): + return value[left:], 0 + else: + return '', left - len(value) + + def filter(self, lexer, stream): + n = self.n + left = n # How many characters left to gobble. + for ttype, value in stream: + # Remove ``left`` tokens from first line, ``n`` from all others. + parts = value.split('\n') + (parts[0], left) = self.gobble(parts[0], left) + for i in range(1, len(parts)): + (parts[i], left) = self.gobble(parts[i], n) + value = '\n'.join(parts) + + if value != '': + yield ttype, value + + +class TokenMergeFilter(Filter): + """Merges consecutive tokens with the same token type in the output + stream of a lexer. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + + def filter(self, lexer, stream): + current_type = None + current_value = None + for ttype, value in stream: + if ttype is current_type: + current_value += value + else: + if current_type is not None: + yield current_type, current_value + current_type = ttype + current_value = value + if current_type is not None: + yield current_type, current_value + + +FILTERS = { + 'codetagify': CodeTagFilter, + 'keywordcase': KeywordCaseFilter, + 'highlight': NameHighlightFilter, + 'raiseonerror': RaiseOnErrorTokenFilter, + 'whitespace': VisibleWhitespaceFilter, + 'gobble': GobbleFilter, + 'tokenmerge': TokenMergeFilter, + 'symbols': SymbolFilter, +} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03aae314d6f4a02774be8b80e241d69f3c432db1 GIT binary patch literal 37931 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, + the `arg` is then given by the ``-a`` option. + """ + return '' + + def format(self, tokensource, outfile): + """ + This method must format the tokens from the `tokensource` iterable and + write the formatted version to the file object `outfile`. + + Formatter options can control how exactly the tokens are converted. + """ + if self.encoding: + # wrap the outfile in a StreamWriter + outfile = codecs.lookup(self.encoding)[3](outfile) + return self.format_unencoded(tokensource, outfile) + + # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to + # Formatter. This helps when using third-party type stubs from typeshed. + def __class_getitem__(cls, name): + return cls diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py new file mode 100644 index 0000000..f19e993 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py @@ -0,0 +1,157 @@ +""" + pygments.formatters + ~~~~~~~~~~~~~~~~~~~ + + Pygments formatters. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +import sys +import types +import fnmatch +from os.path import basename + +from pip._vendor.pygments.formatters._mapping import FORMATTERS +from pip._vendor.pygments.plugin import find_plugin_formatters +from pip._vendor.pygments.util import ClassNotFound + +__all__ = ['get_formatter_by_name', 'get_formatter_for_filename', + 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) + +_formatter_cache = {} # classes by name +_pattern_cache = {} + + +def _fn_matches(fn, glob): + """Return whether the supplied file name fn matches pattern filename.""" + if glob not in _pattern_cache: + pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) + return pattern.match(fn) + return _pattern_cache[glob].match(fn) + + +def _load_formatters(module_name): + """Load a formatter (and all others in the module too).""" + mod = __import__(module_name, None, None, ['__all__']) + for formatter_name in mod.__all__: + cls = getattr(mod, formatter_name) + _formatter_cache[cls.name] = cls + + +def get_all_formatters(): + """Return a generator for all formatter classes.""" + # NB: this returns formatter classes, not info like get_all_lexers(). + for info in FORMATTERS.values(): + if info[1] not in _formatter_cache: + _load_formatters(info[0]) + yield _formatter_cache[info[1]] + for _, formatter in find_plugin_formatters(): + yield formatter + + +def find_formatter_class(alias): + """Lookup a formatter by alias. + + Returns None if not found. + """ + for module_name, name, aliases, _, _ in FORMATTERS.values(): + if alias in aliases: + if name not in _formatter_cache: + _load_formatters(module_name) + return _formatter_cache[name] + for _, cls in find_plugin_formatters(): + if alias in cls.aliases: + return cls + + +def get_formatter_by_name(_alias, **options): + """ + Return an instance of a :class:`.Formatter` subclass that has `alias` in its + aliases list. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that + alias is found. + """ + cls = find_formatter_class(_alias) + if cls is None: + raise ClassNotFound(f"no formatter found for name {_alias!r}") + return cls(**options) + + +def load_formatter_from_file(filename, formattername="CustomFormatter", **options): + """ + Return a `Formatter` subclass instance loaded from the provided file, relative + to the current directory. + + The file is expected to contain a Formatter class named ``formattername`` + (by default, CustomFormatter). Users should be very careful with the input, because + this method is equivalent to running ``eval()`` on the input file. The formatter is + given the `options` at its instantiation. + + :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading + the formatter. + + .. versionadded:: 2.2 + """ + try: + # This empty dict will contain the namespace for the exec'd file + custom_namespace = {} + with open(filename, 'rb') as f: + exec(f.read(), custom_namespace) + # Retrieve the class `formattername` from that namespace + if formattername not in custom_namespace: + raise ClassNotFound(f'no valid {formattername} class found in {filename}') + formatter_class = custom_namespace[formattername] + # And finally instantiate it with the options + return formatter_class(**options) + except OSError as err: + raise ClassNotFound(f'cannot read {filename}: {err}') + except ClassNotFound: + raise + except Exception as err: + raise ClassNotFound(f'error when loading custom formatter: {err}') + + +def get_formatter_for_filename(fn, **options): + """ + Return a :class:`.Formatter` subclass instance that has a filename pattern + matching `fn`. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename + is found. + """ + fn = basename(fn) + for modname, name, _, filenames, _ in FORMATTERS.values(): + for filename in filenames: + if _fn_matches(fn, filename): + if name not in _formatter_cache: + _load_formatters(modname) + return _formatter_cache[name](**options) + for _name, cls in find_plugin_formatters(): + for filename in cls.filenames: + if _fn_matches(fn, filename): + return cls(**options) + raise ClassNotFound(f"no formatter found for file name {fn!r}") + + +class _automodule(types.ModuleType): + """Automatically import formatters.""" + + def __getattr__(self, name): + info = FORMATTERS.get(name) + if info: + _load_formatters(info[0]) + cls = _formatter_cache[info[1]] + setattr(self, name, cls) + return cls + raise AttributeError(name) + + +oldmod = sys.modules[__name__] +newmod = _automodule(__name__) +newmod.__dict__.update(oldmod.__dict__) +sys.modules[__name__] = newmod +del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e3e4879ad7645104d5b7bf591958aad7115e11b GIT binary patch literal 6922 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..261f1f40e25fe06028760d3207193211679a77ae GIT binary patch literal 4235 zcmd5<&2JmW6(_l*EbGfwEL*Z{$KyCo!@wf#wDlI>7jo|kLjVuVow3`4{VW}PyM}}B|*hJ1*lO1oSirG-kbM+^FDUJ zU0j^2;P>M7Z@r`ImCE--jDA)*`QZ$cKUZYMsW{a?Rh^n+VXQk1j5E#^jI+*FjC0OB z#sy~) zuPcKOn~$<qT5S z$zzs8Y!Ic)<{|4#ukYipX+>ctRkk2K=B$y)tS4}eU~!Z{k;kNFx-XPyWy_mEycck9 z($zPsBe_XeW#DC3Fud*sF&wq-5>j*W)VWh zW>31!YGxG=vK5n|9^1OJxBboxUD{ER>zcSQfpvQt+8%LbjpEU?6tbj}HFU99r%}yd zWw<>hz6ud05}U__Zp7?94{-;8Oe&z|M~d;#LEwd&C3@f^3Kn;D;7{7LHqE9!n6mnA z=U^XL)`@D?hBKeEXhxvoIsERjMLc1|&wjzW-OrMkho5)5Omh$6zd2xzaCz$M$3+a- zum|bI5Emk}{fJTkLC;AtR-zPqjMzLIX%rsSg->)J_D?2Y7G*}~rO)+AKZlSSE?1x88~ zscf~1+cH=7(Pe;&k^si?ViNJY6yA#@Tbdrt7BUd=uukz{?H%l7RvdaJ|1g<|>7&D) zcNWvjFJo`IxkbVFCiVyiJhJ*Xu_(<2IZVeX`10t*yR&y`9~I?d@)D=!pif*`W1n}# zZ{R?~&=wXA;Ft`*ynLOA_kw-0%7sEWrp$F+9@>L5)$0}+*e#N=izGxoqO`M^+ovd( z2@>)UMSsG;H&YFa5Ta^$wIePxi$Z?@BkM3qXY~-`rI8nU`1Dn(W8?%yH0`rAG)2KF z+C+pcYBa9tYpB4jY~=_=BRb&fG>s?h7~Y>&7?9Uq6coI}g+h=SNkXmI%;qO}rq(VX zHz`>HxTlMxgyCp^f+-O?Xj=}IHFUp|uXfPEj`?|q`s;+5>LaR-bJ!_cFU6nY=h=+u z#0DBH41Z;$N;U>7IKw(lLd{7~k2qBgf(F+VDe6vz3Q*{D0j_G{SYImVQ|p1!Ze|^K zwy6nWUY@Vr;XmFwA6)4BggccgR70F?UP2g8HDK1#=Dt5*xHeoW_HoyYq@2i3i#HV0 z{7tEsp^+yqsO%RpL!B35a3Xcx7CREk6}B$C+=}8s!Fa?IG;$dN>H}%3D2ZJC@o|&= zI#Lcj$EN{;lQYlwVLIAW2$C}|vv6Ys0pUIa1 z*%2I-A!+~`19}seA>BSYhaNSuQc?M0N7*Gqv=!;3+#iPt8Z4q@r6W`TZT_dfd^Q2q zo2mH(6i2+-{DffB%H}8c=3rM6`2spK3xi3lZ!hCnbeJy=Pxjyi_5N{-d0gDLi6YZ! zp<=@@jZR?@C=bB}?8{Sfk#$EljXfc_E-5cwV@oX>3ClGL#W`Jzd4bh^ti_`MjKRaH%Qo3O<`pZwosHmS~NVfhrUayZ_ z=%`c_XN-|SkWqtRO=8r=C)rQAAHg2yf{87wETcesJ!`o zyB`Ij9i)981l(yqAC=(tj?}wpul@ANla1$mkZiniH@5Iy))wJe+n2p|TzvBUy!G_c zb|SUd81?>kEaUd;Gc>wLfysPww%t(=NZPOQ5foF8jtAN7XF=qozW7|dgf&(ClSdeH zt6Ht*vp1G%|E}N6E0wjOm0O^`tFMAu|JuqMpz@hYV~yxTE5AbYY^6cmt6nX?O7vW% zu>$(mAL{u$(F>Kvjeo7^e36KylDT8$*NDDeD*MXHmx+F_+}E}I2GJ{}vXfeVljvKO z#vLfXcTvk%iC!z^`?dTw(d#%2`!_rF{0`A~OIp|Sdqlrq%I`Mv`$V%+{&_urK=cQd d#skPd{IZchB>Ka0|7Gnzk3j!%PVEA&{{p0;wyFRC literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df67f94d544a1e32eca0914673914f9589773bd2 GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99088df4eca94f8500065a987bcb9153fd8743ae GIT binary patch literal 7313 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 X(9(3v{Abh84P^7`NB>QrFBbN{ihOG8 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6f480cb3b5fcfeef8c8b64b38975bee1a004acb GIT binary patch literal 41046 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 a;4|j2`cF&;t-2psvkw*#xmMh&ll#y~T#8%gwl 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a1d721b3d320266d10af0b031ed610d11ebb3df GIT binary patch literal 6075 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f87d5557ea9452c6b5e70db3f96bc13d78461c GIT binary patch literal 20145 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8847393fed97793fdae6d2e629c75638c9f519ab GIT binary patch literal 6897 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57ea89cd9e71db8af57b34c634d148e123cd2d68 GIT binary patch literal 2978 zcmcImO>7(25q|qet|-cqC0f?6y^#~iv@EV7$4V?IL=#E=Q6k5v+N5C95=-tQwbqi$ z?k;7MUbzD517!%cbP@vuumS|AQy=Qya?HIKQ+6A6k%Nk$hu);Bx%AX|Z%JAZ)ZY4l zefxH1-pst2Z)V@0T3P}K#%%o4^zTK4z9%2`A=DNJzl6mWQc(=4jLPavhK;cdQn@q} z<5+}wm4C{3vZ_G8eT{Fw#>NCJq!?9vz{Gqkx`x!I2e22jPdRT-%wGtEn~Q%BNHB7R zbOvW_E0QwIjAGl^v?4hrn>I3vxs=aQnfw2H1gOx}`hE#CNwUG~J2>{z1+hX56NRe{P66H&4&^ipmTYg+V2g zn{=6}B0s3xlS$T#7oAD$$aC;IOk2o7w`&=o+}h+YPixc#uvwI5t)!B}(x9YdRcY!_ zU_9dy;+JhISxZ-J9A;hK#&>O3u$6?4En;1g{=F(M8W}8S@{39)qp0$Xk<8PK$=5Xd zdOjh)IXXHrqZF)>k5VJkhKgmJU6yq%A?FJAqLIB6d2>v*G#iiPl;o0<#+IDZa&mkb zXH~-lAus z(d1!Eap@4uB->bm>`RJOLz)**DGBF~NH=ULsbmR^vQh#|CY%(TScOfH2x;NtYc(iF zBGNM8T{E(Zs$z9wLK=%)p;n4P55S&USD+Dbn-2vhc{u$(@UI!3gNs1jLUx09yMAh5 z)`x>qjD{TMOXjx>gJ6Z?4Jm*X(RF0ZpkFK^^eITKuq&L(tnly%4#ce+B+WhtqIbLL z$R_x#OVmMGYyl0>JRG42T&h8!8UmofSL6B*am5C=sm2W);x;$9!5X)v!37&B7EVJl zcVsy16j0WIRY2hrH(lfkNkccxVra^O086Pf{d{-e+`W~7Xwg3<6LQq$6Nau9xv507 z$WO_MsO!^g1-bx`G)mH;hDnE6}&= z^ROTGxx9t-l76lNwlCy`Z5+vNaE7ReFxP8cRhyGiPx*nf-kyd!NTQnxt- zBGxxBt)lP5li!Lx6|txMRz)1%etSn8-tFuv@$1dIebVE(&*#=YEX{6Qu7)~Gv(@%c zX}a1P+W6$*{c78(=iTzR-Q$(+@n`w3Kl$VR7u{DYZC5vhYUkPQbDPEnMK@}~4}X0;u6-41_0RrMT%@;#peism_{ws)g!dbn7xj09F_pX z|9ua$4!azF={#hp)!}S^U8B?ZT~gd~>(dTrhL5-H@Fe@xL;s3+{FxlT!;y+|L^8iR z-*FaKI7e9F*Bu_J^Z#MNWY>b)F>mj&8x$BK8v%YldHuyj;*PqV()?~>n|{^B2q8@YRBo4xGT0kYFTU9 zNWB#MzwaBW)l~cGvi(a7YcS%&kg-<@{7qQcPr=KsRX6cTv@CJJ08ui z&6h81->LLOo^@4vuDlFR)V)vtSv*54?q;}&G_b6a!O*}0@p#5i^Ez1v7{c`xqN=?fMmjb9(e{yOl6Lg~?X$cf?gde> zXLY99+F5RSeqwO-TD7fx^~OK>kPtbz*eRT?xhI-3>~YV))<43n5x?nuU#I$~ZTE|GRaJ#@t>@61v29iWkatThMI9>*}uJ}WZ(4`2ybG?-QEAOX^)SkedWLI0@OoNvW5X-#wufW^P+47Yi5WJ|Z F{{Y8L`D*|G literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..242e7013c403c74cab7121853d8ec2f0636e21d1 GIT binary patch literal 13793 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 T-`L)>(5=g7e+N+^t#kcVbSN4!=b~Dl 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 tags. By default, the content is enclosed in a ``
    `` tag, itself wrapped in a ``
    `` tag (but see the `nowrap` option). The ``
    ``'s CSS class can be set by the `cssclass` option."), + 'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'), + 'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'), + 'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'), + 'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'), + 'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'), + 'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'), + 'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file. This formatter is still experimental. Each line of code is a ```` element with explicit ``x`` and ``y`` coordinates containing ```` elements with the individual token styles.'), + 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), +} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py new file mode 100644 index 0000000..5a05bd9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py @@ -0,0 +1,108 @@ +""" + pygments.formatters.bbcode + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + BBcode formatter. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.util import get_bool_opt + +__all__ = ['BBCodeFormatter'] + + +class BBCodeFormatter(Formatter): + """ + Format tokens with BBcodes. These formatting codes are used by many + bulletin boards, so you can highlight your sourcecode with pygments before + posting it there. + + This formatter has no support for background colors and borders, as there + are no common BBcode tags for that. + + Some board systems (e.g. phpBB) don't support colors in their [code] tag, + so you can't use the highlighting together with that tag. + Text in a [code] tag usually is shown with a monospace font (which this + formatter can do with the ``monofont`` option) and no spaces (which you + need for indentation) are removed. + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `codetag` + If set to true, put the output into ``[code]`` tags (default: + ``false``) + + `monofont` + If set to true, add a tag to show the code with a monospace font + (default: ``false``). + """ + name = 'BBCode' + aliases = ['bbcode', 'bb'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + self._code = get_bool_opt(options, 'codetag', False) + self._mono = get_bool_opt(options, 'monofont', False) + + self.styles = {} + self._make_styles() + + def _make_styles(self): + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '[color=#{}]'.format(ndef['color']) + end = '[/color]' + end + if ndef['bold']: + start += '[b]' + end = '[/b]' + end + if ndef['italic']: + start += '[i]' + end = '[/i]' + end + if ndef['underline']: + start += '[u]' + end = '[/u]' + end + # there are no common BBcodes for background-color and border + + self.styles[ttype] = start, end + + def format_unencoded(self, tokensource, outfile): + if self._code: + outfile.write('[code]') + if self._mono: + outfile.write('[font=monospace]') + + lastval = '' + lasttype = None + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + if ttype == lasttype: + lastval += value + else: + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + lastval = value + lasttype = ttype + + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + + if self._mono: + outfile.write('[/font]') + if self._code: + outfile.write('[/code]') + if self._code or self._mono: + outfile.write('\n') diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py new file mode 100644 index 0000000..5c8a958 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py @@ -0,0 +1,170 @@ +""" + pygments.formatters.groff + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for groff output. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import math +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.util import get_bool_opt, get_int_opt + +__all__ = ['GroffFormatter'] + + +class GroffFormatter(Formatter): + """ + Format tokens with groff escapes to change their color and font style. + + .. versionadded:: 2.11 + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `monospaced` + If set to true, monospace font will be used (default: ``true``). + + `linenos` + If set to true, print the line numbers (default: ``false``). + + `wrap` + Wrap lines to the specified number of characters. Disabled if set to 0 + (default: ``0``). + """ + + name = 'groff' + aliases = ['groff','troff','roff'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + + self.monospaced = get_bool_opt(options, 'monospaced', True) + self.linenos = get_bool_opt(options, 'linenos', False) + self._lineno = 0 + self.wrap = get_int_opt(options, 'wrap', 0) + self._linelen = 0 + + self.styles = {} + self._make_styles() + + + def _make_styles(self): + regular = '\\f[CR]' if self.monospaced else '\\f[R]' + bold = '\\f[CB]' if self.monospaced else '\\f[B]' + italic = '\\f[CI]' if self.monospaced else '\\f[I]' + + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '\\m[{}]'.format(ndef['color']) + end = '\\m[]' + end + if ndef['bold']: + start += bold + end = regular + end + if ndef['italic']: + start += italic + end = regular + end + if ndef['bgcolor']: + start += '\\M[{}]'.format(ndef['bgcolor']) + end = '\\M[]' + end + + self.styles[ttype] = start, end + + + def _define_colors(self, outfile): + colors = set() + for _, ndef in self.style: + if ndef['color'] is not None: + colors.add(ndef['color']) + + for color in sorted(colors): + outfile.write('.defcolor ' + color + ' rgb #' + color + '\n') + + + def _write_lineno(self, outfile): + self._lineno += 1 + outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno)) + + + def _wrap_line(self, line): + length = len(line.rstrip('\n')) + space = ' ' if self.linenos else '' + newline = '' + + if length > self.wrap: + for i in range(0, math.floor(length / self.wrap)): + chunk = line[i*self.wrap:i*self.wrap+self.wrap] + newline += (chunk + '\n' + space) + remainder = length % self.wrap + if remainder > 0: + newline += line[-remainder-1:] + self._linelen = remainder + elif self._linelen + length > self.wrap: + newline = ('\n' + space) + line + self._linelen = length + else: + newline = line + self._linelen += length + + return newline + + + def _escape_chars(self, text): + text = text.replace('\\', '\\[u005C]'). \ + replace('.', '\\[char46]'). \ + replace('\'', '\\[u0027]'). \ + replace('`', '\\[u0060]'). \ + replace('~', '\\[u007E]') + copy = text + + for char in copy: + if len(char) != len(char.encode()): + uni = char.encode('unicode_escape') \ + .decode()[1:] \ + .replace('x', 'u00') \ + .upper() + text = text.replace(char, '\\[u' + uni[1:] + ']') + + return text + + + def format_unencoded(self, tokensource, outfile): + self._define_colors(outfile) + + outfile.write('.nf\n\\f[CR]\n') + + if self.linenos: + self._write_lineno(outfile) + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + start, end = self.styles[ttype] + + for line in value.splitlines(True): + if self.wrap > 0: + line = self._wrap_line(line) + + if start and end: + text = self._escape_chars(line.rstrip('\n')) + if text != '': + outfile.write(''.join((start, text, end))) + else: + outfile.write(self._escape_chars(line.rstrip('\n'))) + + if line.endswith('\n'): + if self.linenos: + self._write_lineno(outfile) + self._linelen = 0 + else: + outfile.write('\n') + self._linelen = 0 + + outfile.write('\n.fi') diff --git a/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py new file mode 100644 index 0000000..7aa938f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py @@ -0,0 +1,987 @@ +""" + pygments.formatters.html + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for HTML output. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import functools +import os +import sys +import os.path +from io import StringIO + +from pip._vendor.pygments.formatter import Formatter +from pip._vendor.pygments.token import Token, Text, STANDARD_TYPES +from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt + +try: + import ctags +except ImportError: + ctags = None + +__all__ = ['HtmlFormatter'] + + +_escape_html_table = { + ord('&'): '&', + ord('<'): '<', + ord('>'): '>', + ord('"'): '"', + ord("'"): ''', +} + + +def escape_html(text, table=_escape_html_table): + """Escape &, <, > as well as single and double quotes for HTML.""" + return text.translate(table) + + +def webify(color): + if color.startswith('calc') or color.startswith('var'): + return color + else: + return '#' + color + + +def _get_ttype_class(ttype): + fname = STANDARD_TYPES.get(ttype) + if fname: + return fname + aname = '' + while fname is None: + aname = '-' + ttype[-1] + aname + ttype = ttype.parent + fname = STANDARD_TYPES.get(ttype) + return fname + aname + + +CSSFILE_TEMPLATE = '''\ +/* +generated by Pygments +Copyright 2006-2024 by the Pygments team. +Licensed under the BSD license, see LICENSE for details. +*/ +%(styledefs)s +''' + +DOC_HEADER = '''\ + + + + + %(title)s + + + + +

    %(title)s

    + +''' + +DOC_HEADER_EXTERNALCSS = '''\ + + + + + %(title)s + + + + +

    %(title)s

    + +''' + +DOC_FOOTER = '''\ + + +''' + + +class HtmlFormatter(Formatter): + r""" + Format tokens as HTML 4 ```` tags. By default, the content is enclosed + in a ``
    `` tag, itself wrapped in a ``
    `` tag (but see the `nowrap` option). + The ``
    ``'s CSS class can be set by the `cssclass` option. + + If the `linenos` option is set to ``"table"``, the ``
    `` is
    +    additionally wrapped inside a ```` which has one row and two
    +    cells: one containing the line numbers and one containing the code.
    +    Example:
    +
    +    .. sourcecode:: html
    +
    +        
    +
    + + +
    +
    1
    +            2
    +
    +
    def foo(bar):
    +              pass
    +            
    +
    + + (whitespace added to improve clarity). + + A list of lines can be specified using the `hl_lines` option to make these + lines highlighted (as of Pygments 0.11). + + With the `full` option, a complete HTML 4 document is output, including + the style definitions inside a `` + + +
    {code}
    + + +""" + +CONSOLE_SVG_FORMAT = """\ + + + + + + + + + {lines} + + + {chrome} + + {backgrounds} + + {matrix} + + + +""" + +_SVG_FONT_FAMILY = "Rich Fira Code" +_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py new file mode 100644 index 0000000..cbd6da9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py @@ -0,0 +1,10 @@ +from typing import Any + + +def load_ipython_extension(ip: Any) -> None: # pragma: no cover + # prevent circular import + from pip._vendor.rich.pretty import install + from pip._vendor.rich.traceback import install as tr_install + + install() + tr_install() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py new file mode 100644 index 0000000..b17ee65 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import IO, Callable + + +def get_fileno(file_like: IO[str]) -> int | None: + """Get fileno() from a file, accounting for poorly implemented file-like objects. + + Args: + file_like (IO): A file-like object. + + Returns: + int | None: The result of fileno if available, or None if operation failed. + """ + fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) + if fileno is not None: + try: + return fileno() + except Exception: + # `fileno` is documented as potentially raising a OSError + # Alas, from the issues, there are so many poorly implemented file-like objects, + # that `fileno()` can raise just about anything. + return None + return None diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py new file mode 100644 index 0000000..30446ce --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py @@ -0,0 +1,270 @@ +from __future__ import absolute_import + +import inspect +from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature +from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union + +from .console import Group, RenderableType +from .control import escape_control_codes +from .highlighter import ReprHighlighter +from .jupyter import JupyterMixin +from .panel import Panel +from .pretty import Pretty +from .table import Table +from .text import Text, TextType + + +def _first_paragraph(doc: str) -> str: + """Get the first paragraph from a docstring.""" + paragraph, _, _ = doc.partition("\n\n") + return paragraph + + +class Inspect(JupyterMixin): + """A renderable to inspect any Python Object. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value of object. Defaults to True. + """ + + def __init__( + self, + obj: Any, + *, + title: Optional[TextType] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = True, + value: bool = True, + ) -> None: + self.highlighter = ReprHighlighter() + self.obj = obj + self.title = title or self._make_title(obj) + if all: + methods = private = dunder = True + self.help = help + self.methods = methods + self.docs = docs or help + self.private = private or dunder + self.dunder = dunder + self.sort = sort + self.value = value + + def _make_title(self, obj: Any) -> Text: + """Make a default title.""" + title_str = ( + str(obj) + if (isclass(obj) or callable(obj) or ismodule(obj)) + else str(type(obj)) + ) + title_text = self.highlighter(title_str) + return title_text + + def __rich__(self) -> Panel: + return Panel.fit( + Group(*self._render()), + title=self.title, + border_style="scope.border", + padding=(0, 1), + ) + + def _get_signature(self, name: str, obj: Any) -> Optional[Text]: + """Get a signature for a callable.""" + try: + _signature = str(signature(obj)) + ":" + except ValueError: + _signature = "(...)" + except TypeError: + return None + + source_filename: Optional[str] = None + try: + source_filename = getfile(obj) + except (OSError, TypeError): + # OSError is raised if obj has no source file, e.g. when defined in REPL. + pass + + callable_name = Text(name, style="inspect.callable") + if source_filename: + callable_name.stylize(f"link file://{source_filename}") + signature_text = self.highlighter(_signature) + + qualname = name or getattr(obj, "__qualname__", name) + + # If obj is a module, there may be classes (which are callable) to display + if inspect.isclass(obj): + prefix = "class" + elif inspect.iscoroutinefunction(obj): + prefix = "async def" + else: + prefix = "def" + + qual_signature = Text.assemble( + (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), + (qualname, "inspect.callable"), + signature_text, + ) + + return qual_signature + + def _render(self) -> Iterable[RenderableType]: + """Render object.""" + + def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: + key, (_error, value) = item + return (callable(value), key.strip("_").lower()) + + def safe_getattr(attr_name: str) -> Tuple[Any, Any]: + """Get attribute or any exception.""" + try: + return (None, getattr(obj, attr_name)) + except Exception as error: + return (error, None) + + obj = self.obj + keys = dir(obj) + total_items = len(keys) + if not self.dunder: + keys = [key for key in keys if not key.startswith("__")] + if not self.private: + keys = [key for key in keys if not key.startswith("_")] + not_shown_count = total_items - len(keys) + items = [(key, safe_getattr(key)) for key in keys] + if self.sort: + items.sort(key=sort_items) + + items_table = Table.grid(padding=(0, 1), expand=False) + items_table.add_column(justify="right") + add_row = items_table.add_row + highlighter = self.highlighter + + if callable(obj): + signature = self._get_signature("", obj) + if signature is not None: + yield signature + yield "" + + if self.docs: + _doc = self._get_formatted_doc(obj) + if _doc is not None: + doc_text = Text(_doc, style="inspect.help") + doc_text = highlighter(doc_text) + yield doc_text + yield "" + + if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): + yield Panel( + Pretty(obj, indent_guides=True, max_length=10, max_string=60), + border_style="inspect.value.border", + ) + yield "" + + for key, (error, value) in items: + key_text = Text.assemble( + ( + key, + "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", + ), + (" =", "inspect.equals"), + ) + if error is not None: + warning = key_text.copy() + warning.stylize("inspect.error") + add_row(warning, highlighter(repr(error))) + continue + + if callable(value): + if not self.methods: + continue + + _signature_text = self._get_signature(key, value) + if _signature_text is None: + add_row(key_text, Pretty(value, highlighter=highlighter)) + else: + if self.docs: + docs = self._get_formatted_doc(value) + if docs is not None: + _signature_text.append("\n" if "\n" in docs else " ") + doc = highlighter(docs) + doc.stylize("inspect.doc") + _signature_text.append(doc) + + add_row(key_text, _signature_text) + else: + add_row(key_text, Pretty(value, highlighter=highlighter)) + if items_table.row_count: + yield items_table + elif not_shown_count: + yield Text.from_markup( + f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " + f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." + ) + + def _get_formatted_doc(self, object_: Any) -> Optional[str]: + """ + Extract the docstring of an object, process it and returns it. + The processing consists in cleaning up the doctring's indentation, + taking only its 1st paragraph if `self.help` is not True, + and escape its control codes. + + Args: + object_ (Any): the object to get the docstring from. + + Returns: + Optional[str]: the processed docstring, or None if no docstring was found. + """ + docs = getdoc(object_) + if docs is None: + return None + docs = cleandoc(docs).strip() + if not self.help: + docs = _first_paragraph(docs) + return escape_control_codes(docs) + + +def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: + """Returns the MRO of an object's class, or of the object itself if it's a class.""" + if not hasattr(obj, "__mro__"): + # N.B. we cannot use `if type(obj) is type` here because it doesn't work with + # some types of classes, such as the ones that use abc.ABCMeta. + obj = type(obj) + return getattr(obj, "__mro__", ()) + + +def get_object_types_mro_as_strings(obj: object) -> Collection[str]: + """ + Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. + + Examples: + `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` + """ + return [ + f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' + for type_ in get_object_types_mro(obj) + ] + + +def is_object_one_of_types( + obj: object, fully_qualified_types_names: Collection[str] +) -> bool: + """ + Returns `True` if the given object's class (or the object itself, if it's a class) has one of the + fully qualified names in its MRO. + """ + for type_name in get_object_types_mro_as_strings(obj): + if type_name in fully_qualified_types_names: + return True + return False diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py new file mode 100644 index 0000000..fc16c84 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py @@ -0,0 +1,94 @@ +from datetime import datetime +from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable + + +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import Console, ConsoleRenderable, RenderableType + from .table import Table + +FormatTimeCallable = Callable[[datetime], Text] + + +class LogRender: + def __init__( + self, + show_time: bool = True, + show_level: bool = False, + show_path: bool = True, + time_format: Union[str, FormatTimeCallable] = "[%x %X]", + omit_repeated_times: bool = True, + level_width: Optional[int] = 8, + ) -> None: + self.show_time = show_time + self.show_level = show_level + self.show_path = show_path + self.time_format = time_format + self.omit_repeated_times = omit_repeated_times + self.level_width = level_width + self._last_time: Optional[Text] = None + + def __call__( + self, + console: "Console", + renderables: Iterable["ConsoleRenderable"], + log_time: Optional[datetime] = None, + time_format: Optional[Union[str, FormatTimeCallable]] = None, + level: TextType = "", + path: Optional[str] = None, + line_no: Optional[int] = None, + link_path: Optional[str] = None, + ) -> "Table": + from .containers import Renderables + from .table import Table + + output = Table.grid(padding=(0, 1)) + output.expand = True + if self.show_time: + output.add_column(style="log.time") + if self.show_level: + output.add_column(style="log.level", width=self.level_width) + output.add_column(ratio=1, style="log.message", overflow="fold") + if self.show_path and path: + output.add_column(style="log.path") + row: List["RenderableType"] = [] + if self.show_time: + log_time = log_time or console.get_datetime() + time_format = time_format or self.time_format + if callable(time_format): + log_time_display = time_format(log_time) + else: + log_time_display = Text(log_time.strftime(time_format)) + if log_time_display == self._last_time and self.omit_repeated_times: + row.append(Text(" " * len(log_time_display))) + else: + row.append(log_time_display) + self._last_time = log_time_display + if self.show_level: + row.append(level) + + row.append(Renderables(renderables)) + if self.show_path and path: + path_text = Text() + path_text.append( + path, style=f"link file://{link_path}" if link_path else "" + ) + if line_no: + path_text.append(":") + path_text.append( + f"{line_no}", + style=f"link file://{link_path}#{line_no}" if link_path else "", + ) + row.append(path_text) + + output.add_row(*row) + return output + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + c = Console() + c.print("[on blue]Hello", justify="right") + c.log("[on blue]hello", justify="right") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py new file mode 100644 index 0000000..01c6caf --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py @@ -0,0 +1,43 @@ +from typing import Iterable, Tuple, TypeVar + +T = TypeVar("T") + + +def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for first value.""" + iter_values = iter(values) + try: + value = next(iter_values) + except StopIteration: + return + yield True, value + for value in iter_values: + yield False, value + + +def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value + + +def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: + """Iterate and generate a tuple with a flag for first and last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + first = True + for value in iter_values: + yield first, False, previous_value + first = False + previous_value = value + yield first, True, previous_value diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py new file mode 100644 index 0000000..b659673 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py @@ -0,0 +1,69 @@ +from types import TracebackType +from typing import IO, Iterable, Iterator, List, Optional, Type + + +class NullFile(IO[str]): + def close(self) -> None: + pass + + def isatty(self) -> bool: + return False + + def read(self, __n: int = 1) -> str: + return "" + + def readable(self) -> bool: + return False + + def readline(self, __limit: int = 1) -> str: + return "" + + def readlines(self, __hint: int = 1) -> List[str]: + return [] + + def seek(self, __offset: int, __whence: int = 1) -> int: + return 0 + + def seekable(self) -> bool: + return False + + def tell(self) -> int: + return 0 + + def truncate(self, __size: Optional[int] = 1) -> int: + return 0 + + def writable(self) -> bool: + return False + + def writelines(self, __lines: Iterable[str]) -> None: + pass + + def __next__(self) -> str: + return "" + + def __iter__(self) -> Iterator[str]: + return iter([""]) + + def __enter__(self) -> IO[str]: + pass + + def __exit__( + self, + __t: Optional[Type[BaseException]], + __value: Optional[BaseException], + __traceback: Optional[TracebackType], + ) -> None: + pass + + def write(self, text: str) -> int: + return 0 + + def flush(self) -> None: + pass + + def fileno(self) -> int: + return -1 + + +NULL_FILE = NullFile() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py new file mode 100644 index 0000000..3c748d3 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py @@ -0,0 +1,309 @@ +from .palette import Palette + + +# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) +WINDOWS_PALETTE = Palette( + [ + (12, 12, 12), + (197, 15, 31), + (19, 161, 14), + (193, 156, 0), + (0, 55, 218), + (136, 23, 152), + (58, 150, 221), + (204, 204, 204), + (118, 118, 118), + (231, 72, 86), + (22, 198, 12), + (249, 241, 165), + (59, 120, 255), + (180, 0, 158), + (97, 214, 214), + (242, 242, 242), + ] +) + +# # The standard ansi colors (including bright variants) +STANDARD_PALETTE = Palette( + [ + (0, 0, 0), + (170, 0, 0), + (0, 170, 0), + (170, 85, 0), + (0, 0, 170), + (170, 0, 170), + (0, 170, 170), + (170, 170, 170), + (85, 85, 85), + (255, 85, 85), + (85, 255, 85), + (255, 255, 85), + (85, 85, 255), + (255, 85, 255), + (85, 255, 255), + (255, 255, 255), + ] +) + + +# The 256 color palette +EIGHT_BIT_PALETTE = Palette( + [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + (0, 0, 0), + (0, 0, 95), + (0, 0, 135), + (0, 0, 175), + (0, 0, 215), + (0, 0, 255), + (0, 95, 0), + (0, 95, 95), + (0, 95, 135), + (0, 95, 175), + (0, 95, 215), + (0, 95, 255), + (0, 135, 0), + (0, 135, 95), + (0, 135, 135), + (0, 135, 175), + (0, 135, 215), + (0, 135, 255), + (0, 175, 0), + (0, 175, 95), + (0, 175, 135), + (0, 175, 175), + (0, 175, 215), + (0, 175, 255), + (0, 215, 0), + (0, 215, 95), + (0, 215, 135), + (0, 215, 175), + (0, 215, 215), + (0, 215, 255), + (0, 255, 0), + (0, 255, 95), + (0, 255, 135), + (0, 255, 175), + (0, 255, 215), + (0, 255, 255), + (95, 0, 0), + (95, 0, 95), + (95, 0, 135), + (95, 0, 175), + (95, 0, 215), + (95, 0, 255), + (95, 95, 0), + (95, 95, 95), + (95, 95, 135), + (95, 95, 175), + (95, 95, 215), + (95, 95, 255), + (95, 135, 0), + (95, 135, 95), + (95, 135, 135), + (95, 135, 175), + (95, 135, 215), + (95, 135, 255), + (95, 175, 0), + (95, 175, 95), + (95, 175, 135), + (95, 175, 175), + (95, 175, 215), + (95, 175, 255), + (95, 215, 0), + (95, 215, 95), + (95, 215, 135), + (95, 215, 175), + (95, 215, 215), + (95, 215, 255), + (95, 255, 0), + (95, 255, 95), + (95, 255, 135), + (95, 255, 175), + (95, 255, 215), + (95, 255, 255), + (135, 0, 0), + (135, 0, 95), + (135, 0, 135), + (135, 0, 175), + (135, 0, 215), + (135, 0, 255), + (135, 95, 0), + (135, 95, 95), + (135, 95, 135), + (135, 95, 175), + (135, 95, 215), + (135, 95, 255), + (135, 135, 0), + (135, 135, 95), + (135, 135, 135), + (135, 135, 175), + (135, 135, 215), + (135, 135, 255), + (135, 175, 0), + (135, 175, 95), + (135, 175, 135), + (135, 175, 175), + (135, 175, 215), + (135, 175, 255), + (135, 215, 0), + (135, 215, 95), + (135, 215, 135), + (135, 215, 175), + (135, 215, 215), + (135, 215, 255), + (135, 255, 0), + (135, 255, 95), + (135, 255, 135), + (135, 255, 175), + (135, 255, 215), + (135, 255, 255), + (175, 0, 0), + (175, 0, 95), + (175, 0, 135), + (175, 0, 175), + (175, 0, 215), + (175, 0, 255), + (175, 95, 0), + (175, 95, 95), + (175, 95, 135), + (175, 95, 175), + (175, 95, 215), + (175, 95, 255), + (175, 135, 0), + (175, 135, 95), + (175, 135, 135), + (175, 135, 175), + (175, 135, 215), + (175, 135, 255), + (175, 175, 0), + (175, 175, 95), + (175, 175, 135), + (175, 175, 175), + (175, 175, 215), + (175, 175, 255), + (175, 215, 0), + (175, 215, 95), + (175, 215, 135), + (175, 215, 175), + (175, 215, 215), + (175, 215, 255), + (175, 255, 0), + (175, 255, 95), + (175, 255, 135), + (175, 255, 175), + (175, 255, 215), + (175, 255, 255), + (215, 0, 0), + (215, 0, 95), + (215, 0, 135), + (215, 0, 175), + (215, 0, 215), + (215, 0, 255), + (215, 95, 0), + (215, 95, 95), + (215, 95, 135), + (215, 95, 175), + (215, 95, 215), + (215, 95, 255), + (215, 135, 0), + (215, 135, 95), + (215, 135, 135), + (215, 135, 175), + (215, 135, 215), + (215, 135, 255), + (215, 175, 0), + (215, 175, 95), + (215, 175, 135), + (215, 175, 175), + (215, 175, 215), + (215, 175, 255), + (215, 215, 0), + (215, 215, 95), + (215, 215, 135), + (215, 215, 175), + (215, 215, 215), + (215, 215, 255), + (215, 255, 0), + (215, 255, 95), + (215, 255, 135), + (215, 255, 175), + (215, 255, 215), + (215, 255, 255), + (255, 0, 0), + (255, 0, 95), + (255, 0, 135), + (255, 0, 175), + (255, 0, 215), + (255, 0, 255), + (255, 95, 0), + (255, 95, 95), + (255, 95, 135), + (255, 95, 175), + (255, 95, 215), + (255, 95, 255), + (255, 135, 0), + (255, 135, 95), + (255, 135, 135), + (255, 135, 175), + (255, 135, 215), + (255, 135, 255), + (255, 175, 0), + (255, 175, 95), + (255, 175, 135), + (255, 175, 175), + (255, 175, 215), + (255, 175, 255), + (255, 215, 0), + (255, 215, 95), + (255, 215, 135), + (255, 215, 175), + (255, 215, 215), + (255, 215, 255), + (255, 255, 0), + (255, 255, 95), + (255, 255, 135), + (255, 255, 175), + (255, 255, 215), + (255, 255, 255), + (8, 8, 8), + (18, 18, 18), + (28, 28, 28), + (38, 38, 38), + (48, 48, 48), + (58, 58, 58), + (68, 68, 68), + (78, 78, 78), + (88, 88, 88), + (98, 98, 98), + (108, 108, 108), + (118, 118, 118), + (128, 128, 128), + (138, 138, 138), + (148, 148, 148), + (158, 158, 158), + (168, 168, 168), + (178, 178, 178), + (188, 188, 188), + (198, 198, 198), + (208, 208, 208), + (218, 218, 218), + (228, 228, 228), + (238, 238, 238), + ] +) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py new file mode 100644 index 0000000..4f6d8b2 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py @@ -0,0 +1,17 @@ +from typing import Optional + + +def pick_bool(*values: Optional[bool]) -> bool: + """Pick the first non-none bool or return the last value. + + Args: + *values (bool): Any number of boolean or None values. + + Returns: + bool: First non-none boolean. + """ + assert values, "1 or more values required" + for value in values: + if value is not None: + return value + return bool(value) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py new file mode 100644 index 0000000..95267b0 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py @@ -0,0 +1,159 @@ +import sys +from fractions import Fraction +from math import ceil +from typing import cast, List, Optional, Sequence + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from pip._vendor.typing_extensions import Protocol # pragma: no cover + + +class Edge(Protocol): + """Any object that defines an edge (such as Layout).""" + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + +def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: + """Divide total space to satisfy size, ratio, and minimum_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (List[Edge]): Edges within total space. + + Returns: + List[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + _Fraction = Fraction + + # While any edges haven't been calculated + while None in sizes: + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.minimum_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + # Calculate number of characters in a ratio portion + portion = _Fraction( + remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) + ) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = _Fraction(0) + for index, edge in flexible_edges: + size, remainder = divmod(portion * edge.ratio + remainder, 1) + sizes[index] = size + break + # Sizes now contains integers only + return cast(List[int], sizes) + + +def ratio_reduce( + total: int, ratios: List[int], maximums: List[int], values: List[int] +) -> List[int]: + """Divide an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + maximums (List[int]): List of maximums values for each slot. + values (List[int]): List of values + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] + total_ratio = sum(ratios) + if not total_ratio: + return values[:] + total_remaining = total + result: List[int] = [] + append = result.append + for ratio, maximum, value in zip(ratios, maximums, values): + if ratio and total_ratio > 0: + distributed = min(maximum, round(ratio * total_remaining / total_ratio)) + append(value - distributed) + total_remaining -= distributed + total_ratio -= ratio + else: + append(value) + return result + + +def ratio_distribute( + total: int, ratios: List[int], minimums: Optional[List[int]] = None +) -> List[int]: + """Distribute an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + minimums (List[int]): List of minimum values for each slot. + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + if minimums: + ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] + total_ratio = sum(ratios) + assert total_ratio > 0, "Sum of ratios must be > 0" + + total_remaining = total + distributed_total: List[int] = [] + append = distributed_total.append + if minimums is None: + _minimums = [0] * len(ratios) + else: + _minimums = minimums + for ratio, minimum in zip(ratios, _minimums): + if total_ratio > 0: + distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) + else: + distributed = total_remaining + append(distributed) + total_ratio -= ratio + total_remaining -= distributed + return distributed_total + + +if __name__ == "__main__": + from dataclasses import dataclass + + @dataclass + class E: + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) + print(sum(resolved)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py new file mode 100644 index 0000000..d0bb1fe --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py @@ -0,0 +1,482 @@ +""" +Spinners are from: +* cli-spinners: + MIT License + Copyright (c) Sindre Sorhus (sindresorhus.com) + 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. +""" + +SPINNERS = { + "dots": { + "interval": 80, + "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", + }, + "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, + "dots3": { + "interval": 80, + "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", + }, + "dots4": { + "interval": 80, + "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", + }, + "dots5": { + "interval": 80, + "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", + }, + "dots6": { + "interval": 80, + "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", + }, + "dots7": { + "interval": 80, + "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", + }, + "dots8": { + "interval": 80, + "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", + }, + "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, + "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, + "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, + "dots12": { + "interval": 80, + "frames": [ + "⢀⠀", + "⡀⠀", + "⠄⠀", + "⢂⠀", + "⡂⠀", + "⠅⠀", + "⢃⠀", + "⡃⠀", + "⠍⠀", + "⢋⠀", + "⡋⠀", + "⠍⠁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⢈⠩", + "⡀⢙", + "⠄⡙", + "⢂⠩", + "⡂⢘", + "⠅⡘", + "⢃⠨", + "⡃⢐", + "⠍⡐", + "⢋⠠", + "⡋⢀", + "⠍⡁", + "⢋⠁", + "⡋⠁", + "⠍⠉", + "⠋⠉", + "⠋⠉", + "⠉⠙", + "⠉⠙", + "⠉⠩", + "⠈⢙", + "⠈⡙", + "⠈⠩", + "⠀⢙", + "⠀⡙", + "⠀⠩", + "⠀⢘", + "⠀⡘", + "⠀⠨", + "⠀⢐", + "⠀⡐", + "⠀⠠", + "⠀⢀", + "⠀⡀", + ], + }, + "dots8Bit": { + "interval": 80, + "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" + "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" + "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" + "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" + "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", + }, + "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, + "line2": {"interval": 100, "frames": "⠂-–—–-"}, + "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, + "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "], + }, + "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, + "star2": {"interval": 80, "frames": "+x*"}, + "flip": { + "interval": 70, + "frames": "___-``'´-___", + }, + "hamburger": {"interval": 100, "frames": "☱☲☴"}, + "growVertical": { + "interval": 120, + "frames": "▁▃▄▅▆▇▆▅▄▃", + }, + "growHorizontal": { + "interval": 120, + "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", + }, + "balloon": {"interval": 140, "frames": " .oO@* "}, + "balloon2": {"interval": 120, "frames": ".oO°Oo."}, + "noise": {"interval": 100, "frames": "▓▒░"}, + "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, + "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, + "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, + "triangle": {"interval": 50, "frames": "◢◣◤◥"}, + "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, + "circle": {"interval": 120, "frames": "◡⊙◠"}, + "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, + "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, + "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, + "squish": {"interval": 100, "frames": "╫╪"}, + "toggle": {"interval": 250, "frames": "⊶⊷"}, + "toggle2": {"interval": 80, "frames": "▫▪"}, + "toggle3": {"interval": 120, "frames": "□■"}, + "toggle4": {"interval": 100, "frames": "■□▪▫"}, + "toggle5": {"interval": 100, "frames": "▮▯"}, + "toggle6": {"interval": 300, "frames": "ဝ၀"}, + "toggle7": {"interval": 80, "frames": "⦾⦿"}, + "toggle8": {"interval": 100, "frames": "◍◌"}, + "toggle9": {"interval": 100, "frames": "◉◎"}, + "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, + "toggle11": {"interval": 50, "frames": "⧇⧆"}, + "toggle12": {"interval": 120, "frames": "☗☖"}, + "toggle13": {"interval": 80, "frames": "=*-"}, + "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, + "arrow2": { + "interval": 80, + "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], + }, + "arrow3": { + "interval": 120, + "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], + }, + "bouncingBar": { + "interval": 80, + "frames": [ + "[ ]", + "[= ]", + "[== ]", + "[=== ]", + "[ ===]", + "[ ==]", + "[ =]", + "[ ]", + "[ =]", + "[ ==]", + "[ ===]", + "[====]", + "[=== ]", + "[== ]", + "[= ]", + ], + }, + "bouncingBall": { + "interval": 80, + "frames": [ + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "( ●)", + "( ● )", + "( ● )", + "( ● )", + "( ● )", + "(● )", + ], + }, + "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, + "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, + "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, + "clock": { + "interval": 100, + "frames": [ + "🕛 ", + "🕐 ", + "🕑 ", + "🕒 ", + "🕓 ", + "🕔 ", + "🕕 ", + "🕖 ", + "🕗 ", + "🕘 ", + "🕙 ", + "🕚 ", + ], + }, + "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, + "material": { + "interval": 17, + "frames": [ + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "██████████▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "█████████████▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁██████████████▁▁▁▁", + "▁▁▁██████████████▁▁▁", + "▁▁▁▁█████████████▁▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁██████████████▁▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁██████████████▁", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁██████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁█████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁████████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁███████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁██████████", + "▁▁▁▁▁▁▁▁▁▁▁▁████████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "████████▁▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "█████████▁▁▁▁▁▁▁▁▁▁▁", + "███████████▁▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "████████████▁▁▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "██████████████▁▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁██████████████▁▁▁▁▁", + "▁▁▁█████████████▁▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁████████████▁▁▁", + "▁▁▁▁▁▁███████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁█████████▁▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁█████████▁▁", + "▁▁▁▁▁▁▁▁▁▁█████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁████████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", + ], + }, + "moon": { + "interval": 80, + "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], + }, + "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, + "pong": { + "interval": 80, + "frames": [ + "▐⠂ ▌", + "▐⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂▌", + "▐ ⠠▌", + "▐ ⡀▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐ ⠠ ▌", + "▐ ⠂ ▌", + "▐ ⠈ ▌", + "▐ ⠂ ▌", + "▐ ⠠ ▌", + "▐ ⡀ ▌", + "▐⠠ ▌", + ], + }, + "shark": { + "interval": 120, + "frames": [ + "▐|\\____________▌", + "▐_|\\___________▌", + "▐__|\\__________▌", + "▐___|\\_________▌", + "▐____|\\________▌", + "▐_____|\\_______▌", + "▐______|\\______▌", + "▐_______|\\_____▌", + "▐________|\\____▌", + "▐_________|\\___▌", + "▐__________|\\__▌", + "▐___________|\\_▌", + "▐____________|\\▌", + "▐____________/|▌", + "▐___________/|_▌", + "▐__________/|__▌", + "▐_________/|___▌", + "▐________/|____▌", + "▐_______/|_____▌", + "▐______/|______▌", + "▐_____/|_______▌", + "▐____/|________▌", + "▐___/|_________▌", + "▐__/|__________▌", + "▐_/|___________▌", + "▐/|____________▌", + ], + }, + "dqpb": {"interval": 100, "frames": "dqpb"}, + "weather": { + "interval": 100, + "frames": [ + "☀️ ", + "☀️ ", + "☀️ ", + "🌤 ", + "⛅️ ", + "🌥 ", + "☁️ ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "🌧 ", + "🌨 ", + "⛈ ", + "🌨 ", + "🌧 ", + "🌨 ", + "☁️ ", + "🌥 ", + "⛅️ ", + "🌤 ", + "☀️ ", + "☀️ ", + ], + }, + "christmas": {"interval": 400, "frames": "🌲🎄"}, + "grenade": { + "interval": 80, + "frames": [ + "، ", + "′ ", + " ´ ", + " ‾ ", + " ⸌", + " ⸊", + " |", + " ⁎", + " ⁕", + " ෴ ", + " ⁓", + " ", + " ", + " ", + ], + }, + "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, + "layer": {"interval": 150, "frames": "-=≡"}, + "betaWave": { + "interval": 80, + "frames": [ + "ρββββββ", + "βρβββββ", + "ββρββββ", + "βββρβββ", + "ββββρββ", + "βββββρβ", + "ββββββρ", + ], + }, + "aesthetic": { + "interval": 80, + "frames": [ + "▰▱▱▱▱▱▱", + "▰▰▱▱▱▱▱", + "▰▰▰▱▱▱▱", + "▰▰▰▰▱▱▱", + "▰▰▰▰▰▱▱", + "▰▰▰▰▰▰▱", + "▰▰▰▰▰▰▰", + "▰▱▱▱▱▱▱", + ], + }, +} diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py new file mode 100644 index 0000000..194564e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py @@ -0,0 +1,16 @@ +from typing import List, TypeVar + +T = TypeVar("T") + + +class Stack(List[T]): + """A small shim over builtin list.""" + + @property + def top(self) -> T: + """Get top of stack.""" + return self[-1] + + def push(self, item: T) -> None: + """Push an item on to the stack (append in stack nomenclature).""" + self.append(item) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py new file mode 100644 index 0000000..a2ca6be --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py @@ -0,0 +1,19 @@ +""" +Timer context manager, only used in debug. + +""" + +from time import time + +import contextlib +from typing import Generator + + +@contextlib.contextmanager +def timer(subject: str = "time") -> Generator[None, None, None]: + """print the elapsed time. (only used in debugging)""" + start = time() + yield + elapsed = time() - start + elapsed_ms = elapsed * 1000 + print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py new file mode 100644 index 0000000..81b1082 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py @@ -0,0 +1,662 @@ +"""Light wrapper around the Win32 Console API - this module should only be imported on Windows + +The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions +""" +import ctypes +import sys +from typing import Any + +windll: Any = None +if sys.platform == "win32": + windll = ctypes.LibraryLoader(ctypes.WinDLL) +else: + raise ImportError(f"{__name__} can only be imported on Windows") + +import time +from ctypes import Structure, byref, wintypes +from typing import IO, NamedTuple, Type, cast + +from pip._vendor.rich.color import ColorSystem +from pip._vendor.rich.style import Style + +STDOUT = -11 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 + +COORD = wintypes._COORD + + +class LegacyWindowsError(Exception): + pass + + +class WindowsCoordinates(NamedTuple): + """Coordinates in the Windows Console API are (y, x), not (x, y). + This class is intended to prevent that confusion. + Rows and columns are indexed from 0. + This class can be used in place of wintypes._COORD in arguments and argtypes. + """ + + row: int + col: int + + @classmethod + def from_param(cls, value: "WindowsCoordinates") -> COORD: + """Converts a WindowsCoordinates into a wintypes _COORD structure. + This classmethod is internally called by ctypes to perform the conversion. + + Args: + value (WindowsCoordinates): The input coordinates to convert. + + Returns: + wintypes._COORD: The converted coordinates struct. + """ + return COORD(value.col, value.row) + + +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + + +class CONSOLE_CURSOR_INFO(ctypes.Structure): + _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] + + +_GetStdHandle = windll.kernel32.GetStdHandle +_GetStdHandle.argtypes = [ + wintypes.DWORD, +] +_GetStdHandle.restype = wintypes.HANDLE + + +def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: + """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). + + Args: + handle (int): Integer identifier for the handle. Defaults to -11 (stdout). + + Returns: + wintypes.HANDLE: The handle + """ + return cast(wintypes.HANDLE, _GetStdHandle(handle)) + + +_GetConsoleMode = windll.kernel32.GetConsoleMode +_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] +_GetConsoleMode.restype = wintypes.BOOL + + +def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: + """Retrieves the current input mode of a console's input buffer + or the current output mode of a console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Raises: + LegacyWindowsError: If any error occurs while calling the Windows console API. + + Returns: + int: Value representing the current console mode as documented at + https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters + """ + + console_mode = wintypes.DWORD() + success = bool(_GetConsoleMode(std_handle, console_mode)) + if not success: + raise LegacyWindowsError("Unable to get legacy Windows Console Mode") + return console_mode.value + + +_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW +_FillConsoleOutputCharacterW.argtypes = [ + wintypes.HANDLE, + ctypes.c_char, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputCharacterW.restype = wintypes.BOOL + + +def FillConsoleOutputCharacter( + std_handle: wintypes.HANDLE, + char: str, + length: int, + start: WindowsCoordinates, +) -> int: + """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + char (str): The character to write. Must be a string of length 1. + length (int): The number of times to write the character. + start (WindowsCoordinates): The coordinates to start writing at. + + Returns: + int: The number of characters written. + """ + character = ctypes.c_char(char.encode()) + num_characters = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + _FillConsoleOutputCharacterW( + std_handle, + character, + num_characters, + start, + byref(num_written), + ) + return num_written.value + + +_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute +_FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + cast(Type[COORD], WindowsCoordinates), + ctypes.POINTER(wintypes.DWORD), +] +_FillConsoleOutputAttribute.restype = wintypes.BOOL + + +def FillConsoleOutputAttribute( + std_handle: wintypes.HANDLE, + attributes: int, + length: int, + start: WindowsCoordinates, +) -> int: + """Sets the character attributes for a specified number of character cells, + beginning at the specified coordinates in a screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours of the cells. + length (int): The number of cells to set the output attribute of. + start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. + + Returns: + int: The number of cells whose attributes were actually set. + """ + num_cells = wintypes.DWORD(length) + style_attrs = wintypes.WORD(attributes) + num_written = wintypes.DWORD(0) + _FillConsoleOutputAttribute( + std_handle, style_attrs, num_cells, start, byref(num_written) + ) + return num_written.value + + +_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute +_SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, +] +_SetConsoleTextAttribute.restype = wintypes.BOOL + + +def SetConsoleTextAttribute( + std_handle: wintypes.HANDLE, attributes: wintypes.WORD +) -> bool: + """Set the colour attributes for all text written after this function is called. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + attributes (int): Integer value representing the foreground and background colours. + + + Returns: + bool: True if the attribute was set successfully, otherwise False. + """ + return bool(_SetConsoleTextAttribute(std_handle, attributes)) + + +_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo +_GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), +] +_GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + +def GetConsoleScreenBufferInfo( + std_handle: wintypes.HANDLE, +) -> CONSOLE_SCREEN_BUFFER_INFO: + """Retrieves information about the specified console screen buffer. + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + + Returns: + CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about + screen size, cursor position, colour attributes, and more.""" + console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() + _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) + return console_screen_buffer_info + + +_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition +_SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + cast(Type[COORD], WindowsCoordinates), +] +_SetConsoleCursorPosition.restype = wintypes.BOOL + + +def SetConsoleCursorPosition( + std_handle: wintypes.HANDLE, coords: WindowsCoordinates +) -> bool: + """Set the position of the cursor in the console screen + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + coords (WindowsCoordinates): The coordinates to move the cursor to. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorPosition(std_handle, coords)) + + +_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo +_GetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_GetConsoleCursorInfo.restype = wintypes.BOOL + + +def GetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Get the cursor info - used to get cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information + about the console's cursor. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo +_SetConsoleCursorInfo.argtypes = [ + wintypes.HANDLE, + ctypes.POINTER(CONSOLE_CURSOR_INFO), +] +_SetConsoleCursorInfo.restype = wintypes.BOOL + + +def SetConsoleCursorInfo( + std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO +) -> bool: + """Set the cursor info - used for adjusting cursor visibility and width + + Args: + std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. + cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) + + +_SetConsoleTitle = windll.kernel32.SetConsoleTitleW +_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] +_SetConsoleTitle.restype = wintypes.BOOL + + +def SetConsoleTitle(title: str) -> bool: + """Sets the title of the current console window + + Args: + title (str): The new title of the console window. + + Returns: + bool: True if the function succeeds, otherwise False. + """ + return bool(_SetConsoleTitle(title)) + + +class LegacyWindowsTerm: + """This class allows interaction with the legacy Windows Console API. It should only be used in the context + of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, + the entire API should work. + + Args: + file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. + """ + + BRIGHT_BIT = 8 + + # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers + ANSI_TO_WINDOWS = [ + 0, # black The Windows colours are defined in wincon.h as follows: + 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 + 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 + 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 + 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 + 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 + 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 + 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 + 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 + 12, # bright red + 10, # bright green + 14, # bright yellow + 9, # bright blue + 13, # bright magenta + 11, # bright cyan + 15, # bright white + ] + + def __init__(self, file: "IO[str]") -> None: + handle = GetStdHandle(STDOUT) + self._handle = handle + default_text = GetConsoleScreenBufferInfo(handle).wAttributes + self._default_text = default_text + + self._default_fore = default_text & 7 + self._default_back = (default_text >> 4) & 7 + self._default_attrs = self._default_fore | (self._default_back << 4) + + self._file = file + self.write = file.write + self.flush = file.flush + + @property + def cursor_position(self) -> WindowsCoordinates: + """Returns the current position of the cursor (0-based) + + Returns: + WindowsCoordinates: The current cursor position. + """ + coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition + return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) + + @property + def screen_size(self) -> WindowsCoordinates: + """Returns the current size of the console screen buffer, in character columns and rows + + Returns: + WindowsCoordinates: The width and height of the screen as WindowsCoordinates. + """ + screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize + return WindowsCoordinates( + row=cast(int, screen_size.Y), col=cast(int, screen_size.X) + ) + + def write_text(self, text: str) -> None: + """Write text directly to the terminal without any modification of styles + + Args: + text (str): The text to write to the console + """ + self.write(text) + self.flush() + + def write_styled(self, text: str, style: Style) -> None: + """Write styled text to the terminal. + + Args: + text (str): The text to write + style (Style): The style of the text + """ + color = style.color + bgcolor = style.bgcolor + if style.reverse: + color, bgcolor = bgcolor, color + + if color: + fore = color.downgrade(ColorSystem.WINDOWS).number + fore = fore if fore is not None else 7 # Default to ANSI 7: White + if style.bold: + fore = fore | self.BRIGHT_BIT + if style.dim: + fore = fore & ~self.BRIGHT_BIT + fore = self.ANSI_TO_WINDOWS[fore] + else: + fore = self._default_fore + + if bgcolor: + back = bgcolor.downgrade(ColorSystem.WINDOWS).number + back = back if back is not None else 0 # Default to ANSI 0: Black + back = self.ANSI_TO_WINDOWS[back] + else: + back = self._default_back + + assert fore is not None + assert back is not None + + SetConsoleTextAttribute( + self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) + ) + self.write_text(text) + SetConsoleTextAttribute(self._handle, attributes=self._default_text) + + def move_cursor_to(self, new_position: WindowsCoordinates) -> None: + """Set the position of the cursor + + Args: + new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. + """ + if new_position.col < 0 or new_position.row < 0: + return + SetConsoleCursorPosition(self._handle, coords=new_position) + + def erase_line(self) -> None: + """Erase all content on the line the cursor is currently located at""" + screen_size = self.screen_size + cursor_position = self.cursor_position + cells_to_erase = screen_size.col + start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=start_coordinates + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=start_coordinates, + ) + + def erase_end_of_line(self) -> None: + """Erase all content from the cursor position to the end of that line""" + cursor_position = self.cursor_position + cells_to_erase = self.screen_size.col - cursor_position.col + FillConsoleOutputCharacter( + self._handle, " ", length=cells_to_erase, start=cursor_position + ) + FillConsoleOutputAttribute( + self._handle, + self._default_attrs, + length=cells_to_erase, + start=cursor_position, + ) + + def erase_start_of_line(self) -> None: + """Erase all content from the cursor position to the start of that line""" + row, col = self.cursor_position + start = WindowsCoordinates(row, 0) + FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) + FillConsoleOutputAttribute( + self._handle, self._default_attrs, length=col, start=start + ) + + def move_cursor_up(self) -> None: + """Move the cursor up a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row - 1, col=cursor_position.col + ), + ) + + def move_cursor_down(self) -> None: + """Move the cursor down a single cell""" + cursor_position = self.cursor_position + SetConsoleCursorPosition( + self._handle, + coords=WindowsCoordinates( + row=cursor_position.row + 1, + col=cursor_position.col, + ), + ) + + def move_cursor_forward(self) -> None: + """Move the cursor forward a single cell. Wrap to the next line if required.""" + row, col = self.cursor_position + if col == self.screen_size.col - 1: + row += 1 + col = 0 + else: + col += 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def move_cursor_to_column(self, column: int) -> None: + """Move cursor to the column specified by the zero-based column index, staying on the same row + + Args: + column (int): The zero-based column index to move the cursor to. + """ + row, _ = self.cursor_position + SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) + + def move_cursor_backward(self) -> None: + """Move the cursor backward a single cell. Wrap to the previous line if required.""" + row, col = self.cursor_position + if col == 0: + row -= 1 + col = self.screen_size.col - 1 + else: + col -= 1 + SetConsoleCursorPosition( + self._handle, coords=WindowsCoordinates(row=row, col=col) + ) + + def hide_cursor(self) -> None: + """Hide the cursor""" + current_cursor_size = self._get_cursor_size() + invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) + SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) + + def show_cursor(self) -> None: + """Show the cursor""" + current_cursor_size = self._get_cursor_size() + visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) + SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) + + def set_title(self, title: str) -> None: + """Set the title of the terminal window + + Args: + title (str): The new title of the console window + """ + assert len(title) < 255, "Console title must be less than 255 characters" + SetConsoleTitle(title) + + def _get_cursor_size(self) -> int: + """Get the percentage of the character cell that is filled by the cursor""" + cursor_info = CONSOLE_CURSOR_INFO() + GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) + return int(cursor_info.dwSize) + + +if __name__ == "__main__": + handle = GetStdHandle() + + from pip._vendor.rich.console import Console + + console = Console() + + term = LegacyWindowsTerm(sys.stdout) + term.set_title("Win32 Console Examples") + + style = Style(color="black", bgcolor="red") + + heading = Style.parse("black on green") + + # Check colour output + console.rule("Checking colour output") + console.print("[on red]on red!") + console.print("[blue]blue!") + console.print("[yellow]yellow!") + console.print("[bold yellow]bold yellow!") + console.print("[bright_yellow]bright_yellow!") + console.print("[dim bright_yellow]dim bright_yellow!") + console.print("[italic cyan]italic cyan!") + console.print("[bold white on blue]bold white on blue!") + console.print("[reverse bold white on blue]reverse bold white on blue!") + console.print("[bold black on cyan]bold black on cyan!") + console.print("[black on green]black on green!") + console.print("[blue on green]blue on green!") + console.print("[white on black]white on black!") + console.print("[black on white]black on white!") + console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") + + # Check cursor movement + console.rule("Checking cursor movement") + console.print() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("went back and wrapped to prev line") + time.sleep(1) + term.move_cursor_up() + term.write_text("we go up") + time.sleep(1) + term.move_cursor_down() + term.write_text("and down") + time.sleep(1) + term.move_cursor_up() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went up and back 2") + time.sleep(1) + term.move_cursor_down() + term.move_cursor_backward() + term.move_cursor_backward() + term.write_text("we went down and back 2") + time.sleep(1) + + # Check erasing of lines + term.hide_cursor() + console.print() + console.rule("Checking line erasing") + console.print("\n...Deleting to the start of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + term.move_cursor_to_column(16) + term.write_styled("<", Style.parse("black on red")) + term.move_cursor_backward() + time.sleep(1) + term.erase_start_of_line() + time.sleep(1) + + console.print("\n\n...And to the end of the line...") + term.write_text("The red arrow shows the cursor location, and direction of erase") + time.sleep(1) + + term.move_cursor_to_column(16) + term.write_styled(">", Style.parse("black on red")) + time.sleep(1) + term.erase_end_of_line() + time.sleep(1) + + console.print("\n\n...Now the whole line will be erased...") + term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) + time.sleep(1) + term.erase_line() + + term.show_cursor() + print("\n") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py new file mode 100644 index 0000000..7520a9f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py @@ -0,0 +1,71 @@ +import sys +from dataclasses import dataclass + + +@dataclass +class WindowsConsoleFeatures: + """Windows features available.""" + + vt: bool = False + """The console supports VT codes.""" + truecolor: bool = False + """The console supports truecolor.""" + + +try: + import ctypes + from ctypes import LibraryLoader + + if sys.platform == "win32": + windll = LibraryLoader(ctypes.WinDLL) + else: + windll = None + raise ImportError("Not windows") + + from pip._vendor.rich._win32_console import ( + ENABLE_VIRTUAL_TERMINAL_PROCESSING, + GetConsoleMode, + GetStdHandle, + LegacyWindowsError, + ) + +except (AttributeError, ImportError, ValueError): + # Fallback if we can't load the Windows DLL + def get_windows_console_features() -> WindowsConsoleFeatures: + features = WindowsConsoleFeatures() + return features + +else: + + def get_windows_console_features() -> WindowsConsoleFeatures: + """Get windows console features. + + Returns: + WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. + """ + handle = GetStdHandle() + try: + console_mode = GetConsoleMode(handle) + success = True + except LegacyWindowsError: + console_mode = 0 + success = False + vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) + truecolor = False + if vt: + win_version = sys.getwindowsversion() + truecolor = win_version.major > 10 or ( + win_version.major == 10 and win_version.build >= 15063 + ) + features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) + return features + + +if __name__ == "__main__": + import platform + + features = get_windows_console_features() + from pip._vendor.rich import print + + print(f'platform="{platform.system()}"') + print(repr(features)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py new file mode 100644 index 0000000..5ece056 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py @@ -0,0 +1,56 @@ +from typing import Iterable, Sequence, Tuple, cast + +from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates +from pip._vendor.rich.segment import ControlCode, ControlType, Segment + + +def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: + """Makes appropriate Windows Console API calls based on the segments in the buffer. + + Args: + buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. + term (LegacyWindowsTerm): Used to call the Windows Console API. + """ + for text, style, control in buffer: + if not control: + if style: + term.write_styled(text, style) + else: + term.write_text(text) + else: + control_codes: Sequence[ControlCode] = control + for control_code in control_codes: + control_type = control_code[0] + if control_type == ControlType.CURSOR_MOVE_TO: + _, x, y = cast(Tuple[ControlType, int, int], control_code) + term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) + elif control_type == ControlType.CARRIAGE_RETURN: + term.write_text("\r") + elif control_type == ControlType.HOME: + term.move_cursor_to(WindowsCoordinates(0, 0)) + elif control_type == ControlType.CURSOR_UP: + term.move_cursor_up() + elif control_type == ControlType.CURSOR_DOWN: + term.move_cursor_down() + elif control_type == ControlType.CURSOR_FORWARD: + term.move_cursor_forward() + elif control_type == ControlType.CURSOR_BACKWARD: + term.move_cursor_backward() + elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: + _, column = cast(Tuple[ControlType, int], control_code) + term.move_cursor_to_column(column - 1) + elif control_type == ControlType.HIDE_CURSOR: + term.hide_cursor() + elif control_type == ControlType.SHOW_CURSOR: + term.show_cursor() + elif control_type == ControlType.ERASE_IN_LINE: + _, mode = cast(Tuple[ControlType, int], control_code) + if mode == 0: + term.erase_end_of_line() + elif mode == 1: + term.erase_start_of_line() + elif mode == 2: + term.erase_line() + elif control_type == ControlType.SET_WINDOW_TITLE: + _, title = cast(Tuple[ControlType, str], control_code) + term.set_title(title) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py new file mode 100644 index 0000000..2e94ff6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +import re +from typing import Iterable + +from ._loop import loop_last +from .cells import cell_len, chop_cells + +re_word = re.compile(r"\s*\S+\s*") + + +def words(text: str) -> Iterable[tuple[int, int, str]]: + """Yields each word from the text as a tuple + containing (start_index, end_index, word). A "word" in this context may + include the actual word and any whitespace to the right. + """ + position = 0 + word_match = re_word.match(text, position) + while word_match is not None: + start, end = word_match.span() + word = word_match.group(0) + yield start, end, word + word_match = re_word.match(text, end) + + +def divide_line(text: str, width: int, fold: bool = True) -> list[int]: + """Given a string of text, and a width (measured in cells), return a list + of cell offsets which the string should be split at in order for it to fit + within the given width. + + Args: + text: The text to examine. + width: The available cell width. + fold: If True, words longer than `width` will be folded onto a new line. + + Returns: + A list of indices to break the line at. + """ + break_positions: list[int] = [] # offsets to insert the breaks at + append = break_positions.append + cell_offset = 0 + _cell_len = cell_len + + for start, _end, word in words(text): + word_length = _cell_len(word.rstrip()) + remaining_space = width - cell_offset + word_fits_remaining_space = remaining_space >= word_length + + if word_fits_remaining_space: + # Simplest case - the word fits within the remaining width for this line. + cell_offset += _cell_len(word) + else: + # Not enough space remaining for this word on the current line. + if word_length > width: + # The word doesn't fit on any line, so we can't simply + # place it on the next line... + if fold: + # Fold the word across multiple lines. + folded_word = chop_cells(word, width=width) + for last, line in loop_last(folded_word): + if start: + append(start) + if last: + cell_offset = _cell_len(line) + else: + start += len(line) + else: + # Folding isn't allowed, so crop the word. + if start: + append(start) + cell_offset = _cell_len(word) + elif cell_offset and start: + # The word doesn't fit within the remaining space on the current + # line, but it *can* fit on to the next (empty) line. + append(start) + cell_offset = _cell_len(word) + + return break_positions + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + console = Console(width=10) + console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") + print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10)) + + console = Console(width=20) + console.rule() + console.print("TextualはPythonの高速アプリケーション開発フレームワークです") + + console.rule() + console.print("アプリケーションは1670万色を使用でき") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/abc.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/abc.py new file mode 100644 index 0000000..e6e498e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/abc.py @@ -0,0 +1,33 @@ +from abc import ABC + + +class RichRenderable(ABC): + """An abstract base class for Rich renderables. + + Note that there is no need to extend this class, the intended use is to check if an + object supports the Rich renderable protocol. For example:: + + if isinstance(my_object, RichRenderable): + console.print(my_object) + + """ + + @classmethod + def __subclasshook__(cls, other: type) -> bool: + """Check if this class supports the rich render protocol.""" + return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.text import Text + + t = Text() + print(isinstance(Text, RichRenderable)) + print(isinstance(t, RichRenderable)) + + class Foo: + pass + + f = Foo() + print(isinstance(f, RichRenderable)) + print(isinstance("", RichRenderable)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py new file mode 100644 index 0000000..f7b734f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/align.py @@ -0,0 +1,311 @@ +import sys +from itertools import chain +from typing import TYPE_CHECKING, Iterable, Optional + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + +from .constrain import Constrain +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + +AlignMethod = Literal["left", "center", "right"] +VerticalAlignMethod = Literal["top", "middle", "bottom"] + + +class Align(JupyterMixin): + """Align a renderable by adding spaces if necessary. + + Args: + renderable (RenderableType): A console renderable. + align (AlignMethod): One of "left", "center", or "right"" + style (StyleType, optional): An optional style to apply to the background. + vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. + pad (bool, optional): Pad the right with spaces. Defaults to True. + width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. + height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. + + Raises: + ValueError: if ``align`` is not one of the expected values. + """ + + def __init__( + self, + renderable: "RenderableType", + align: AlignMethod = "left", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> None: + if align not in ("left", "center", "right"): + raise ValueError( + f'invalid value for align, expected "left", "center", or "right" (not {align!r})' + ) + if vertical is not None and vertical not in ("top", "middle", "bottom"): + raise ValueError( + f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' + ) + self.renderable = renderable + self.align = align + self.style = style + self.vertical = vertical + self.pad = pad + self.width = width + self.height = height + + def __repr__(self) -> str: + return f"Align({self.renderable!r}, {self.align!r})" + + @classmethod + def left( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the left.""" + return cls( + renderable, + "left", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def center( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the center.""" + return cls( + renderable, + "center", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + @classmethod + def right( + cls, + renderable: "RenderableType", + style: Optional[StyleType] = None, + *, + vertical: Optional[VerticalAlignMethod] = None, + pad: bool = True, + width: Optional[int] = None, + height: Optional[int] = None, + ) -> "Align": + """Align a renderable to the right.""" + return cls( + renderable, + "right", + style=style, + vertical=vertical, + pad=pad, + width=width, + height=height, + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + align = self.align + width = console.measure(self.renderable, options=options).maximum + rendered = console.render( + Constrain( + self.renderable, width if self.width is None else min(width, self.width) + ), + options.update(height=None), + ) + lines = list(Segment.split_lines(rendered)) + width, height = Segment.get_shape(lines) + lines = Segment.set_shape(lines, width, height) + new_line = Segment.line() + excess_space = options.max_width - width + style = console.get_style(self.style) if self.style is not None else None + + def generate_segments() -> Iterable[Segment]: + if excess_space <= 0: + # Exact fit + for line in lines: + yield from line + yield new_line + + elif align == "left": + # Pad on the right + pad = Segment(" " * excess_space, style) if self.pad else None + for line in lines: + yield from line + if pad: + yield pad + yield new_line + + elif align == "center": + # Pad left and right + left = excess_space // 2 + pad = Segment(" " * left, style) + pad_right = ( + Segment(" " * (excess_space - left), style) if self.pad else None + ) + for line in lines: + if left: + yield pad + yield from line + if pad_right: + yield pad_right + yield new_line + + elif align == "right": + # Padding on left + pad = Segment(" " * excess_space, style) + for line in lines: + yield pad + yield from line + yield new_line + + blank_line = ( + Segment(f"{' ' * (self.width or options.max_width)}\n", style) + if self.pad + else Segment("\n") + ) + + def blank_lines(count: int) -> Iterable[Segment]: + if count > 0: + for _ in range(count): + yield blank_line + + vertical_height = self.height or options.height + iter_segments: Iterable[Segment] + if self.vertical and vertical_height is not None: + if self.vertical == "top": + bottom_space = vertical_height - height + iter_segments = chain(generate_segments(), blank_lines(bottom_space)) + elif self.vertical == "middle": + top_space = (vertical_height - height) // 2 + bottom_space = vertical_height - top_space - height + iter_segments = chain( + blank_lines(top_space), + generate_segments(), + blank_lines(bottom_space), + ) + else: # self.vertical == "bottom": + top_space = vertical_height - height + iter_segments = chain(blank_lines(top_space), generate_segments()) + else: + iter_segments = generate_segments() + if self.style: + style = console.get_style(self.style) + iter_segments = Segment.apply_style(iter_segments, style) + yield from iter_segments + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +class VerticalCenter(JupyterMixin): + """Vertically aligns a renderable. + + Warn: + This class is deprecated and may be removed in a future version. Use Align class with + `vertical="middle"`. + + Args: + renderable (RenderableType): A renderable object. + """ + + def __init__( + self, + renderable: "RenderableType", + style: Optional[StyleType] = None, + ) -> None: + self.renderable = renderable + self.style = style + + def __repr__(self) -> str: + return f"VerticalCenter({self.renderable!r})" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) if self.style is not None else None + lines = console.render_lines( + self.renderable, options.update(height=None), pad=False + ) + width, _height = Segment.get_shape(lines) + new_line = Segment.line() + height = options.height or options.size.height + top_space = (height - len(lines)) // 2 + bottom_space = height - top_space - len(lines) + blank_line = Segment(f"{' ' * width}", style) + + def blank_lines(count: int) -> Iterable[Segment]: + for _ in range(count): + yield blank_line + yield new_line + + if top_space > 0: + yield from blank_lines(top_space) + for line in lines: + yield from line + yield new_line + if bottom_space > 0: + yield from blank_lines(bottom_space) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + measurement = Measurement.get(console, options, self.renderable) + return measurement + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console, Group + from pip._vendor.rich.highlighter import ReprHighlighter + from pip._vendor.rich.panel import Panel + + highlighter = ReprHighlighter() + console = Console() + + panel = Panel( + Group( + Align.left(highlighter("align='left'")), + Align.center(highlighter("align='center'")), + Align.right(highlighter("align='right'")), + ), + width=60, + style="on dark_blue", + title="Align", + ) + + console.print( + Align.center(panel, vertical="middle", style="on red", height=console.height) + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py new file mode 100644 index 0000000..66365e6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py @@ -0,0 +1,240 @@ +import re +import sys +from contextlib import suppress +from typing import Iterable, NamedTuple, Optional + +from .color import Color +from .style import Style +from .text import Text + +re_ansi = re.compile( + r""" +(?:\x1b\](.*?)\x1b\\)| +(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) +""", + re.VERBOSE, +) + + +class _AnsiToken(NamedTuple): + """Result of ansi tokenized string.""" + + plain: str = "" + sgr: Optional[str] = "" + osc: Optional[str] = "" + + +def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: + """Tokenize a string in to plain text and ANSI codes. + + Args: + ansi_text (str): A String containing ANSI codes. + + Yields: + AnsiToken: A named tuple of (plain, sgr, osc) + """ + + position = 0 + sgr: Optional[str] + osc: Optional[str] + for match in re_ansi.finditer(ansi_text): + start, end = match.span(0) + osc, sgr = match.groups() + if start > position: + yield _AnsiToken(ansi_text[position:start]) + if sgr: + if sgr == "(": + position = end + 1 + continue + if sgr.endswith("m"): + yield _AnsiToken("", sgr[1:-1], osc) + else: + yield _AnsiToken("", sgr, osc) + position = end + if position < len(ansi_text): + yield _AnsiToken(ansi_text[position:]) + + +SGR_STYLE_MAP = { + 1: "bold", + 2: "dim", + 3: "italic", + 4: "underline", + 5: "blink", + 6: "blink2", + 7: "reverse", + 8: "conceal", + 9: "strike", + 21: "underline2", + 22: "not dim not bold", + 23: "not italic", + 24: "not underline", + 25: "not blink", + 26: "not blink2", + 27: "not reverse", + 28: "not conceal", + 29: "not strike", + 30: "color(0)", + 31: "color(1)", + 32: "color(2)", + 33: "color(3)", + 34: "color(4)", + 35: "color(5)", + 36: "color(6)", + 37: "color(7)", + 39: "default", + 40: "on color(0)", + 41: "on color(1)", + 42: "on color(2)", + 43: "on color(3)", + 44: "on color(4)", + 45: "on color(5)", + 46: "on color(6)", + 47: "on color(7)", + 49: "on default", + 51: "frame", + 52: "encircle", + 53: "overline", + 54: "not frame not encircle", + 55: "not overline", + 90: "color(8)", + 91: "color(9)", + 92: "color(10)", + 93: "color(11)", + 94: "color(12)", + 95: "color(13)", + 96: "color(14)", + 97: "color(15)", + 100: "on color(8)", + 101: "on color(9)", + 102: "on color(10)", + 103: "on color(11)", + 104: "on color(12)", + 105: "on color(13)", + 106: "on color(14)", + 107: "on color(15)", +} + + +class AnsiDecoder: + """Translate ANSI code in to styled Text.""" + + def __init__(self) -> None: + self.style = Style.null() + + def decode(self, terminal_text: str) -> Iterable[Text]: + """Decode ANSI codes in an iterable of lines. + + Args: + lines (Iterable[str]): An iterable of lines of terminal output. + + Yields: + Text: Marked up Text. + """ + for line in terminal_text.splitlines(): + yield self.decode_line(line) + + def decode_line(self, line: str) -> Text: + """Decode a line containing ansi codes. + + Args: + line (str): A line of terminal output. + + Returns: + Text: A Text instance marked up according to ansi codes. + """ + from_ansi = Color.from_ansi + from_rgb = Color.from_rgb + _Style = Style + text = Text() + append = text.append + line = line.rsplit("\r", 1)[-1] + for plain_text, sgr, osc in _ansi_tokenize(line): + if plain_text: + append(plain_text, self.style or None) + elif osc is not None: + if osc.startswith("8;"): + _params, semicolon, link = osc[2:].partition(";") + if semicolon: + self.style = self.style.update_link(link or None) + elif sgr is not None: + # Translate in to semi-colon separated codes + # Ignore invalid codes, because we want to be lenient + codes = [ + min(255, int(_code) if _code else 0) + for _code in sgr.split(";") + if _code.isdigit() or _code == "" + ] + iter_codes = iter(codes) + for code in iter_codes: + if code == 0: + # reset + self.style = _Style.null() + elif code in SGR_STYLE_MAP: + # styles + self.style += _Style.parse(SGR_STYLE_MAP[code]) + elif code == 38: + #  Foreground + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ) + ) + elif code == 48: + # Background + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + None, from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + None, + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ), + ) + + return text + + +if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover + import io + import os + import pty + import sys + + decoder = AnsiDecoder() + + stdout = io.BytesIO() + + def read(fd: int) -> bytes: + data = os.read(fd, 1024) + stdout.write(data) + return data + + pty.spawn(sys.argv[1:], read) + + from .console import Console + + console = Console(record=True) + + stdout_result = stdout.getvalue().decode("utf-8") + print(stdout_result) + + for line in decoder.decode(stdout_result): + console.print(line) + + console.save_html("stdout.html") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py new file mode 100644 index 0000000..022284b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/bar.py @@ -0,0 +1,93 @@ +from typing import Optional, Union + +from .color import Color +from .console import Console, ConsoleOptions, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style + +# There are left-aligned characters for 1/8 to 7/8, but +# the right-aligned characters exist only for 1/8 and 4/8. +BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"] +END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"] +FULL_BLOCK = "█" + + +class Bar(JupyterMixin): + """Renders a solid block bar. + + Args: + size (float): Value for the end of the bar. + begin (float): Begin point (between 0 and size, inclusive). + end (float): End point (between 0 and size, inclusive). + width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. + color (Union[Color, str], optional): Color of the bar. Defaults to "default". + bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". + """ + + def __init__( + self, + size: float, + begin: float, + end: float, + *, + width: Optional[int] = None, + color: Union[Color, str] = "default", + bgcolor: Union[Color, str] = "default", + ): + self.size = size + self.begin = max(begin, 0) + self.end = min(end, size) + self.width = width + self.style = Style(color=color, bgcolor=bgcolor) + + def __repr__(self) -> str: + return f"Bar({self.size}, {self.begin}, {self.end})" + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + width = min( + self.width if self.width is not None else options.max_width, + options.max_width, + ) + + if self.begin >= self.end: + yield Segment(" " * width, self.style) + yield Segment.line() + return + + prefix_complete_eights = int(width * 8 * self.begin / self.size) + prefix_bar_count = prefix_complete_eights // 8 + prefix_eights_count = prefix_complete_eights % 8 + + body_complete_eights = int(width * 8 * self.end / self.size) + body_bar_count = body_complete_eights // 8 + body_eights_count = body_complete_eights % 8 + + # When start and end fall into the same cell, we ideally should render + # a symbol that's "center-aligned", but there is no good symbol in Unicode. + # In this case, we fall back to right-aligned block symbol for simplicity. + + prefix = " " * prefix_bar_count + if prefix_eights_count: + prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] + + body = FULL_BLOCK * body_bar_count + if body_eights_count: + body += END_BLOCK_ELEMENTS[body_eights_count] + + suffix = " " * (width - len(body)) + + yield Segment(prefix + body[len(prefix) :] + suffix, self.style) + yield Segment.line() + + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: + return ( + Measurement(self.width, self.width) + if self.width is not None + else Measurement(4, options.max_width) + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py new file mode 100644 index 0000000..0511a9e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/box.py @@ -0,0 +1,480 @@ +import sys +from typing import TYPE_CHECKING, Iterable, List + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +from ._loop import loop_last + +if TYPE_CHECKING: + from pip._vendor.rich.console import ConsoleOptions + + +class Box: + """Defines characters to render boxes. + + ┌─┬┐ top + │ ││ head + ├─┼┤ head_row + │ ││ mid + ├─┼┤ row + ├─┼┤ foot_row + │ ││ foot + └─┴┘ bottom + + Args: + box (str): Characters making up box. + ascii (bool, optional): True if this box uses ascii characters only. Default is False. + """ + + def __init__(self, box: str, *, ascii: bool = False) -> None: + self._box = box + self.ascii = ascii + line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() + # top + self.top_left, self.top, self.top_divider, self.top_right = iter(line1) + # head + self.head_left, _, self.head_vertical, self.head_right = iter(line2) + # head_row + ( + self.head_row_left, + self.head_row_horizontal, + self.head_row_cross, + self.head_row_right, + ) = iter(line3) + + # mid + self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) + # row + self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) + # foot_row + ( + self.foot_row_left, + self.foot_row_horizontal, + self.foot_row_cross, + self.foot_row_right, + ) = iter(line6) + # foot + self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) + # bottom + self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( + line8 + ) + + def __repr__(self) -> str: + return "Box(...)" + + def __str__(self) -> str: + return self._box + + def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": + """Substitute this box for another if it won't render due to platform issues. + + Args: + options (ConsoleOptions): Console options used in rendering. + safe (bool, optional): Substitute this for another Box if there are known problems + displaying on the platform (currently only relevant on Windows). Default is True. + + Returns: + Box: A different Box or the same Box. + """ + box = self + if options.legacy_windows and safe: + box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) + if options.ascii_only and not box.ascii: + box = ASCII + return box + + def get_plain_headed_box(self) -> "Box": + """If this box uses special characters for the borders of the header, then + return the equivalent box that does not. + + Returns: + Box: The most similar Box that doesn't use header-specific box characters. + If the current Box already satisfies this criterion, then it's returned. + """ + return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) + + def get_top(self, widths: Iterable[int]) -> str: + """Get the top of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.top_left) + for last, width in loop_last(widths): + append(self.top * width) + if not last: + append(self.top_divider) + append(self.top_right) + return "".join(parts) + + def get_row( + self, + widths: Iterable[int], + level: Literal["head", "row", "foot", "mid"] = "row", + edge: bool = True, + ) -> str: + """Get the top of a simple box. + + Args: + width (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + if level == "head": + left = self.head_row_left + horizontal = self.head_row_horizontal + cross = self.head_row_cross + right = self.head_row_right + elif level == "row": + left = self.row_left + horizontal = self.row_horizontal + cross = self.row_cross + right = self.row_right + elif level == "mid": + left = self.mid_left + horizontal = " " + cross = self.mid_vertical + right = self.mid_right + elif level == "foot": + left = self.foot_row_left + horizontal = self.foot_row_horizontal + cross = self.foot_row_cross + right = self.foot_row_right + else: + raise ValueError("level must be 'head', 'row' or 'foot'") + + parts: List[str] = [] + append = parts.append + if edge: + append(left) + for last, width in loop_last(widths): + append(horizontal * width) + if not last: + append(cross) + if edge: + append(right) + return "".join(parts) + + def get_bottom(self, widths: Iterable[int]) -> str: + """Get the bottom of a simple box. + + Args: + widths (List[int]): Widths of columns. + + Returns: + str: A string of box characters. + """ + + parts: List[str] = [] + append = parts.append + append(self.bottom_left) + for last, width in loop_last(widths): + append(self.bottom * width) + if not last: + append(self.bottom_divider) + append(self.bottom_right) + return "".join(parts) + + +# fmt: off +ASCII: Box = Box( + "+--+\n" + "| ||\n" + "|-+|\n" + "| ||\n" + "|-+|\n" + "|-+|\n" + "| ||\n" + "+--+\n", + ascii=True, +) + +ASCII2: Box = Box( + "+-++\n" + "| ||\n" + "+-++\n" + "| ||\n" + "+-++\n" + "+-++\n" + "| ||\n" + "+-++\n", + ascii=True, +) + +ASCII_DOUBLE_HEAD: Box = Box( + "+-++\n" + "| ||\n" + "+=++\n" + "| ||\n" + "+-++\n" + "+-++\n" + "| ||\n" + "+-++\n", + ascii=True, +) + +SQUARE: Box = Box( + "┌─┬┐\n" + "│ ││\n" + "├─┼┤\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" +) + +SQUARE_DOUBLE_HEAD: Box = Box( + "┌─┬┐\n" + "│ ││\n" + "╞═╪╡\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" +) + +MINIMAL: Box = Box( + " ╷ \n" + " │ \n" + "╶─┼╴\n" + " │ \n" + "╶─┼╴\n" + "╶─┼╴\n" + " │ \n" + " ╵ \n" +) + + +MINIMAL_HEAVY_HEAD: Box = Box( + " ╷ \n" + " │ \n" + "╺━┿╸\n" + " │ \n" + "╶─┼╴\n" + "╶─┼╴\n" + " │ \n" + " ╵ \n" +) + +MINIMAL_DOUBLE_HEAD: Box = Box( + " ╷ \n" + " │ \n" + " ═╪ \n" + " │ \n" + " ─┼ \n" + " ─┼ \n" + " │ \n" + " ╵ \n" +) + + +SIMPLE: Box = Box( + " \n" + " \n" + " ── \n" + " \n" + " \n" + " ── \n" + " \n" + " \n" +) + +SIMPLE_HEAD: Box = Box( + " \n" + " \n" + " ── \n" + " \n" + " \n" + " \n" + " \n" + " \n" +) + + +SIMPLE_HEAVY: Box = Box( + " \n" + " \n" + " ━━ \n" + " \n" + " \n" + " ━━ \n" + " \n" + " \n" +) + + +HORIZONTALS: Box = Box( + " ── \n" + " \n" + " ── \n" + " \n" + " ── \n" + " ── \n" + " \n" + " ── \n" +) + +ROUNDED: Box = Box( + "╭─┬╮\n" + "│ ││\n" + "├─┼┤\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "╰─┴╯\n" +) + +HEAVY: Box = Box( + "┏━┳┓\n" + "┃ ┃┃\n" + "┣━╋┫\n" + "┃ ┃┃\n" + "┣━╋┫\n" + "┣━╋┫\n" + "┃ ┃┃\n" + "┗━┻┛\n" +) + +HEAVY_EDGE: Box = Box( + "┏━┯┓\n" + "┃ │┃\n" + "┠─┼┨\n" + "┃ │┃\n" + "┠─┼┨\n" + "┠─┼┨\n" + "┃ │┃\n" + "┗━┷┛\n" +) + +HEAVY_HEAD: Box = Box( + "┏━┳┓\n" + "┃ ┃┃\n" + "┡━╇┩\n" + "│ ││\n" + "├─┼┤\n" + "├─┼┤\n" + "│ ││\n" + "└─┴┘\n" +) + +DOUBLE: Box = Box( + "╔═╦╗\n" + "║ ║║\n" + "╠═╬╣\n" + "║ ║║\n" + "╠═╬╣\n" + "╠═╬╣\n" + "║ ║║\n" + "╚═╩╝\n" +) + +DOUBLE_EDGE: Box = Box( + "╔═╤╗\n" + "║ │║\n" + "╟─┼╢\n" + "║ │║\n" + "╟─┼╢\n" + "╟─┼╢\n" + "║ │║\n" + "╚═╧╝\n" +) + +MARKDOWN: Box = Box( + " \n" + "| ||\n" + "|-||\n" + "| ||\n" + "|-||\n" + "|-||\n" + "| ||\n" + " \n", + ascii=True, +) +# fmt: on + +# Map Boxes that don't render with raster fonts on to equivalent that do +LEGACY_WINDOWS_SUBSTITUTIONS = { + ROUNDED: SQUARE, + MINIMAL_HEAVY_HEAD: MINIMAL, + SIMPLE_HEAVY: SIMPLE, + HEAVY: SQUARE, + HEAVY_EDGE: SQUARE, + HEAVY_HEAD: SQUARE, +} + +# Map headed boxes to their headerless equivalents +PLAIN_HEADED_SUBSTITUTIONS = { + HEAVY_HEAD: SQUARE, + SQUARE_DOUBLE_HEAD: SQUARE, + MINIMAL_DOUBLE_HEAD: MINIMAL, + MINIMAL_HEAVY_HEAD: MINIMAL, + ASCII_DOUBLE_HEAD: ASCII2, +} + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.panel import Panel + + from . import box as box + from .console import Console + from .table import Table + from .text import Text + + console = Console(record=True) + + BOXES = [ + "ASCII", + "ASCII2", + "ASCII_DOUBLE_HEAD", + "SQUARE", + "SQUARE_DOUBLE_HEAD", + "MINIMAL", + "MINIMAL_HEAVY_HEAD", + "MINIMAL_DOUBLE_HEAD", + "SIMPLE", + "SIMPLE_HEAD", + "SIMPLE_HEAVY", + "HORIZONTALS", + "ROUNDED", + "HEAVY", + "HEAVY_EDGE", + "HEAVY_HEAD", + "DOUBLE", + "DOUBLE_EDGE", + "MARKDOWN", + ] + + console.print(Panel("[bold green]Box Constants", style="green"), justify="center") + console.print() + + columns = Columns(expand=True, padding=2) + for box_name in sorted(BOXES): + table = Table( + show_footer=True, style="dim", border_style="not dim", expand=True + ) + table.add_column("Header 1", "Footer 1") + table.add_column("Header 2", "Footer 2") + table.add_row("Cell", "Cell") + table.add_row("Cell", "Cell") + table.box = getattr(box, box_name) + table.title = Text(f"box.{box_name}", style="magenta") + columns.add_renderable(table) + console.print(columns) + + # console.save_svg("box.svg") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py new file mode 100644 index 0000000..f85f928 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/cells.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import re +from functools import lru_cache +from typing import Callable + +from ._cell_widths import CELL_WIDTHS + +# Regex to match sequence of the most common character ranges +_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match + + +@lru_cache(4096) +def cached_cell_len(text: str) -> int: + """Get the number of cells required to display text. + + This method always caches, which may use up a lot of memory. It is recommended to use + `cell_len` over this method. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: + """Get the number of cells required to display text. + + Args: + text (str): Text to display. + + Returns: + int: Get the number of cells required to display text. + """ + if len(text) < 512: + return _cell_len(text) + _get_size = get_character_cell_size + total_size = sum(_get_size(character) for character in text) + return total_size + + +@lru_cache(maxsize=4096) +def get_character_cell_size(character: str) -> int: + """Get the cell size of a character. + + Args: + character (str): A single character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + return _get_codepoint_cell_size(ord(character)) + + +@lru_cache(maxsize=4096) +def _get_codepoint_cell_size(codepoint: int) -> int: + """Get the cell size of a character. + + Args: + codepoint (int): Codepoint of a character. + + Returns: + int: Number of cells (0, 1 or 2) occupied by that character. + """ + + _table = CELL_WIDTHS + lower_bound = 0 + upper_bound = len(_table) - 1 + index = (lower_bound + upper_bound) // 2 + while True: + start, end, width = _table[index] + if codepoint < start: + upper_bound = index - 1 + elif codepoint > end: + lower_bound = index + 1 + else: + return 0 if width == -1 else width + if upper_bound < lower_bound: + break + index = (lower_bound + upper_bound) // 2 + return 1 + + +def set_cell_size(text: str, total: int) -> str: + """Set the length of a string to fit within given number of cells.""" + + if _is_single_cell_widths(text): + size = len(text) + if size < total: + return text + " " * (total - size) + return text[:total] + + if total <= 0: + return "" + cell_size = cell_len(text) + if cell_size == total: + return text + if cell_size < total: + return text + " " * (total - cell_size) + + start = 0 + end = len(text) + + # Binary search until we find the right size + while True: + pos = (start + end) // 2 + before = text[: pos + 1] + before_len = cell_len(before) + if before_len == total + 1 and cell_len(before[-1]) == 2: + return before[:-1] + " " + if before_len == total: + return before + if before_len > total: + end = pos + else: + start = pos + + +def chop_cells( + text: str, + width: int, +) -> list[str]: + """Split text into lines such that each line fits within the available (cell) width. + + Args: + text: The text to fold such that it fits in the given width. + width: The width available (number of cells). + + Returns: + A list of strings such that each string in the list has cell width + less than or equal to the available width. + """ + _get_character_cell_size = get_character_cell_size + lines: list[list[str]] = [[]] + + append_new_line = lines.append + append_to_last_line = lines[-1].append + + total_width = 0 + + for character in text: + cell_width = _get_character_cell_size(character) + char_doesnt_fit = total_width + cell_width > width + + if char_doesnt_fit: + append_new_line([character]) + append_to_last_line = lines[-1].append + total_width = cell_width + else: + append_to_last_line(character) + total_width += cell_width + + return ["".join(line) for line in lines] + + +if __name__ == "__main__": # pragma: no cover + print(get_character_cell_size("😽")) + for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): + print(line) + for n in range(80, 1, -1): + print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") + print("x" * n) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py new file mode 100644 index 0000000..4270a27 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/color.py @@ -0,0 +1,621 @@ +import platform +import re +from colorsys import rgb_to_hls +from enum import IntEnum +from functools import lru_cache +from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple + +from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE +from .color_triplet import ColorTriplet +from .repr import Result, rich_repr +from .terminal_theme import DEFAULT_TERMINAL_THEME + +if TYPE_CHECKING: # pragma: no cover + from .terminal_theme import TerminalTheme + from .text import Text + + +WINDOWS = platform.system() == "Windows" + + +class ColorSystem(IntEnum): + """One of the 3 color system supported by terminals.""" + + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorSystem.{self.name}" + + def __str__(self) -> str: + return repr(self) + + +class ColorType(IntEnum): + """Type of color stored in Color class.""" + + DEFAULT = 0 + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorType.{self.name}" + + +ANSI_COLOR_NAMES = { + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + "bright_black": 8, + "bright_red": 9, + "bright_green": 10, + "bright_yellow": 11, + "bright_blue": 12, + "bright_magenta": 13, + "bright_cyan": 14, + "bright_white": 15, + "grey0": 16, + "gray0": 16, + "navy_blue": 17, + "dark_blue": 18, + "blue3": 20, + "blue1": 21, + "dark_green": 22, + "deep_sky_blue4": 25, + "dodger_blue3": 26, + "dodger_blue2": 27, + "green4": 28, + "spring_green4": 29, + "turquoise4": 30, + "deep_sky_blue3": 32, + "dodger_blue1": 33, + "green3": 40, + "spring_green3": 41, + "dark_cyan": 36, + "light_sea_green": 37, + "deep_sky_blue2": 38, + "deep_sky_blue1": 39, + "spring_green2": 47, + "cyan3": 43, + "dark_turquoise": 44, + "turquoise2": 45, + "green1": 46, + "spring_green1": 48, + "medium_spring_green": 49, + "cyan2": 50, + "cyan1": 51, + "dark_red": 88, + "deep_pink4": 125, + "purple4": 55, + "purple3": 56, + "blue_violet": 57, + "orange4": 94, + "grey37": 59, + "gray37": 59, + "medium_purple4": 60, + "slate_blue3": 62, + "royal_blue1": 63, + "chartreuse4": 64, + "dark_sea_green4": 71, + "pale_turquoise4": 66, + "steel_blue": 67, + "steel_blue3": 68, + "cornflower_blue": 69, + "chartreuse3": 76, + "cadet_blue": 73, + "sky_blue3": 74, + "steel_blue1": 81, + "pale_green3": 114, + "sea_green3": 78, + "aquamarine3": 79, + "medium_turquoise": 80, + "chartreuse2": 112, + "sea_green2": 83, + "sea_green1": 85, + "aquamarine1": 122, + "dark_slate_gray2": 87, + "dark_magenta": 91, + "dark_violet": 128, + "purple": 129, + "light_pink4": 95, + "plum4": 96, + "medium_purple3": 98, + "slate_blue1": 99, + "yellow4": 106, + "wheat4": 101, + "grey53": 102, + "gray53": 102, + "light_slate_grey": 103, + "light_slate_gray": 103, + "medium_purple": 104, + "light_slate_blue": 105, + "dark_olive_green3": 149, + "dark_sea_green": 108, + "light_sky_blue3": 110, + "sky_blue2": 111, + "dark_sea_green3": 150, + "dark_slate_gray3": 116, + "sky_blue1": 117, + "chartreuse1": 118, + "light_green": 120, + "pale_green1": 156, + "dark_slate_gray1": 123, + "red3": 160, + "medium_violet_red": 126, + "magenta3": 164, + "dark_orange3": 166, + "indian_red": 167, + "hot_pink3": 168, + "medium_orchid3": 133, + "medium_orchid": 134, + "medium_purple2": 140, + "dark_goldenrod": 136, + "light_salmon3": 173, + "rosy_brown": 138, + "grey63": 139, + "gray63": 139, + "medium_purple1": 141, + "gold3": 178, + "dark_khaki": 143, + "navajo_white3": 144, + "grey69": 145, + "gray69": 145, + "light_steel_blue3": 146, + "light_steel_blue": 147, + "yellow3": 184, + "dark_sea_green2": 157, + "light_cyan3": 152, + "light_sky_blue1": 153, + "green_yellow": 154, + "dark_olive_green2": 155, + "dark_sea_green1": 193, + "pale_turquoise1": 159, + "deep_pink3": 162, + "magenta2": 200, + "hot_pink2": 169, + "orchid": 170, + "medium_orchid1": 207, + "orange3": 172, + "light_pink3": 174, + "pink3": 175, + "plum3": 176, + "violet": 177, + "light_goldenrod3": 179, + "tan": 180, + "misty_rose3": 181, + "thistle3": 182, + "plum2": 183, + "khaki3": 185, + "light_goldenrod2": 222, + "light_yellow3": 187, + "grey84": 188, + "gray84": 188, + "light_steel_blue1": 189, + "yellow2": 190, + "dark_olive_green1": 192, + "honeydew2": 194, + "light_cyan1": 195, + "red1": 196, + "deep_pink2": 197, + "deep_pink1": 199, + "magenta1": 201, + "orange_red1": 202, + "indian_red1": 204, + "hot_pink": 206, + "dark_orange": 208, + "salmon1": 209, + "light_coral": 210, + "pale_violet_red1": 211, + "orchid2": 212, + "orchid1": 213, + "orange1": 214, + "sandy_brown": 215, + "light_salmon1": 216, + "light_pink1": 217, + "pink1": 218, + "plum1": 219, + "gold1": 220, + "navajo_white1": 223, + "misty_rose1": 224, + "thistle1": 225, + "yellow1": 226, + "light_goldenrod1": 227, + "khaki1": 228, + "wheat1": 229, + "cornsilk1": 230, + "grey100": 231, + "gray100": 231, + "grey3": 232, + "gray3": 232, + "grey7": 233, + "gray7": 233, + "grey11": 234, + "gray11": 234, + "grey15": 235, + "gray15": 235, + "grey19": 236, + "gray19": 236, + "grey23": 237, + "gray23": 237, + "grey27": 238, + "gray27": 238, + "grey30": 239, + "gray30": 239, + "grey35": 240, + "gray35": 240, + "grey39": 241, + "gray39": 241, + "grey42": 242, + "gray42": 242, + "grey46": 243, + "gray46": 243, + "grey50": 244, + "gray50": 244, + "grey54": 245, + "gray54": 245, + "grey58": 246, + "gray58": 246, + "grey62": 247, + "gray62": 247, + "grey66": 248, + "gray66": 248, + "grey70": 249, + "gray70": 249, + "grey74": 250, + "gray74": 250, + "grey78": 251, + "gray78": 251, + "grey82": 252, + "gray82": 252, + "grey85": 253, + "gray85": 253, + "grey89": 254, + "gray89": 254, + "grey93": 255, + "gray93": 255, +} + + +class ColorParseError(Exception): + """The color could not be parsed.""" + + +RE_COLOR = re.compile( + r"""^ +\#([0-9a-f]{6})$| +color\(([0-9]{1,3})\)$| +rgb\(([\d\s,]+)\)$ +""", + re.VERBOSE, +) + + +@rich_repr +class Color(NamedTuple): + """Terminal color definition.""" + + name: str + """The name of the color (typically the input to Color.parse).""" + type: ColorType + """The type of the color.""" + number: Optional[int] = None + """The color number, if a standard color, or None.""" + triplet: Optional[ColorTriplet] = None + """A triplet of color components, if an RGB color.""" + + def __rich__(self) -> "Text": + """Displays the actual color if Rich printed.""" + from .style import Style + from .text import Text + + return Text.assemble( + f"", + ) + + def __rich_repr__(self) -> Result: + yield self.name + yield self.type + yield "number", self.number, None + yield "triplet", self.triplet, None + + @property + def system(self) -> ColorSystem: + """Get the native color system for this color.""" + if self.type == ColorType.DEFAULT: + return ColorSystem.STANDARD + return ColorSystem(int(self.type)) + + @property + def is_system_defined(self) -> bool: + """Check if the color is ultimately defined by the system.""" + return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) + + @property + def is_default(self) -> bool: + """Check if the color is a default color.""" + return self.type == ColorType.DEFAULT + + def get_truecolor( + self, theme: Optional["TerminalTheme"] = None, foreground: bool = True + ) -> ColorTriplet: + """Get an equivalent color triplet for this color. + + Args: + theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. + foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. + + Returns: + ColorTriplet: A color triplet containing RGB components. + """ + + if theme is None: + theme = DEFAULT_TERMINAL_THEME + if self.type == ColorType.TRUECOLOR: + assert self.triplet is not None + return self.triplet + elif self.type == ColorType.EIGHT_BIT: + assert self.number is not None + return EIGHT_BIT_PALETTE[self.number] + elif self.type == ColorType.STANDARD: + assert self.number is not None + return theme.ansi_colors[self.number] + elif self.type == ColorType.WINDOWS: + assert self.number is not None + return WINDOWS_PALETTE[self.number] + else: # self.type == ColorType.DEFAULT: + assert self.number is None + return theme.foreground_color if foreground else theme.background_color + + @classmethod + def from_ansi(cls, number: int) -> "Color": + """Create a Color number from it's 8-bit ansi number. + + Args: + number (int): A number between 0-255 inclusive. + + Returns: + Color: A new Color instance. + """ + return cls( + name=f"color({number})", + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + @classmethod + def from_triplet(cls, triplet: "ColorTriplet") -> "Color": + """Create a truecolor RGB color from a triplet of values. + + Args: + triplet (ColorTriplet): A color triplet containing red, green and blue components. + + Returns: + Color: A new color object. + """ + return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) + + @classmethod + def from_rgb(cls, red: float, green: float, blue: float) -> "Color": + """Create a truecolor from three color components in the range(0->255). + + Args: + red (float): Red component in range 0-255. + green (float): Green component in range 0-255. + blue (float): Blue component in range 0-255. + + Returns: + Color: A new color object. + """ + return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) + + @classmethod + def default(cls) -> "Color": + """Get a Color instance representing the default color. + + Returns: + Color: Default color. + """ + return cls(name="default", type=ColorType.DEFAULT) + + @classmethod + @lru_cache(maxsize=1024) + def parse(cls, color: str) -> "Color": + """Parse a color definition.""" + original_color = color + color = color.lower().strip() + + if color == "default": + return cls(color, type=ColorType.DEFAULT) + + color_number = ANSI_COLOR_NAMES.get(color) + if color_number is not None: + return cls( + color, + type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), + number=color_number, + ) + + color_match = RE_COLOR.match(color) + if color_match is None: + raise ColorParseError(f"{original_color!r} is not a valid color") + + color_24, color_8, color_rgb = color_match.groups() + if color_24: + triplet = ColorTriplet( + int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + elif color_8: + number = int(color_8) + if number > 255: + raise ColorParseError(f"color number must be <= 255 in {color!r}") + return cls( + color, + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + else: # color_rgb: + components = color_rgb.split(",") + if len(components) != 3: + raise ColorParseError( + f"expected three components in {original_color!r}" + ) + red, green, blue = components + triplet = ColorTriplet(int(red), int(green), int(blue)) + if not all(component <= 255 for component in triplet): + raise ColorParseError( + f"color components must be <= 255 in {original_color!r}" + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + @lru_cache(maxsize=1024) + def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: + """Get the ANSI escape codes for this color.""" + _type = self.type + if _type == ColorType.DEFAULT: + return ("39" if foreground else "49",) + + elif _type == ColorType.WINDOWS: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.STANDARD: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.EIGHT_BIT: + assert self.number is not None + return ("38" if foreground else "48", "5", str(self.number)) + + else: # self.standard == ColorStandard.TRUECOLOR: + assert self.triplet is not None + red, green, blue = self.triplet + return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) + + @lru_cache(maxsize=1024) + def downgrade(self, system: ColorSystem) -> "Color": + """Downgrade a color system to a system with fewer colors.""" + + if self.type in (ColorType.DEFAULT, system): + return self + # Convert to 8-bit color from truecolor color + if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + _h, l, s = rgb_to_hls(*self.triplet.normalized) + # If saturation is under 15% assume it is grayscale + if s < 0.15: + gray = round(l * 25.0) + if gray == 0: + color_number = 16 + elif gray == 25: + color_number = 231 + else: + color_number = 231 + gray + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + red, green, blue = self.triplet + six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 + six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 + six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 + + color_number = ( + 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) + ) + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + # Convert to standard from truecolor or 8-bit + elif system == ColorSystem.STANDARD: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = STANDARD_PALETTE.match(triplet) + return Color(self.name, ColorType.STANDARD, number=color_number) + + elif system == ColorSystem.WINDOWS: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + if self.number < 16: + return Color(self.name, ColorType.WINDOWS, number=self.number) + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = WINDOWS_PALETTE.match(triplet) + return Color(self.name, ColorType.WINDOWS, number=color_number) + + return self + + +def parse_rgb_hex(hex_color: str) -> ColorTriplet: + """Parse six hex characters in to RGB triplet.""" + assert len(hex_color) == 6, "must be 6 characters" + color = ColorTriplet( + int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) + ) + return color + + +def blend_rgb( + color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 +) -> ColorTriplet: + """Blend one RGB color in to another.""" + r1, g1, b1 = color1 + r2, g2, b2 = color2 + new_color = ColorTriplet( + int(r1 + (r2 - r1) * cross_fade), + int(g1 + (g2 - g1) * cross_fade), + int(b1 + (b2 - b1) * cross_fade), + ) + return new_color + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + from .table import Table + from .text import Text + + console = Console() + + table = Table(show_footer=False, show_edge=True) + table.add_column("Color", width=10, overflow="ellipsis") + table.add_column("Number", justify="right", style="yellow") + table.add_column("Name", style="green") + table.add_column("Hex", style="blue") + table.add_column("RGB", style="magenta") + + colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) + for color_number, name in colors: + if "grey" in name: + continue + color_cell = Text(" " * 10, style=f"on {name}") + if color_number < 16: + table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) + else: + color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] + table.add_row( + color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb + ) + + console.print(table) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py new file mode 100644 index 0000000..02cab32 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py @@ -0,0 +1,38 @@ +from typing import NamedTuple, Tuple + + +class ColorTriplet(NamedTuple): + """The red, green, and blue components of a color.""" + + red: int + """Red component in 0 to 255 range.""" + green: int + """Green component in 0 to 255 range.""" + blue: int + """Blue component in 0 to 255 range.""" + + @property + def hex(self) -> str: + """get the color triplet in CSS style.""" + red, green, blue = self + return f"#{red:02x}{green:02x}{blue:02x}" + + @property + def rgb(self) -> str: + """The color in RGB format. + + Returns: + str: An rgb color, e.g. ``"rgb(100,23,255)"``. + """ + red, green, blue = self + return f"rgb({red},{green},{blue})" + + @property + def normalized(self) -> Tuple[float, float, float]: + """Convert components into floats between 0 and 1. + + Returns: + Tuple[float, float, float]: A tuple of three normalized colour components. + """ + red, green, blue = self + return red / 255.0, green / 255.0, blue / 255.0 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/columns.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/columns.py new file mode 100644 index 0000000..669a3a7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/columns.py @@ -0,0 +1,187 @@ +from collections import defaultdict +from itertools import chain +from operator import itemgetter +from typing import Dict, Iterable, List, Optional, Tuple + +from .align import Align, AlignMethod +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .constrain import Constrain +from .measure import Measurement +from .padding import Padding, PaddingDimensions +from .table import Table +from .text import TextType +from .jupyter import JupyterMixin + + +class Columns(JupyterMixin): + """Display renderables in neat columns. + + Args: + renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). + width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. + padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). + expand (bool, optional): Expand columns to full width. Defaults to False. + equal (bool, optional): Arrange in to equal sized columns. Defaults to False. + column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. + right_to_left (bool, optional): Start column from right hand side. Defaults to False. + align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. + title (TextType, optional): Optional title for Columns. + """ + + def __init__( + self, + renderables: Optional[Iterable[RenderableType]] = None, + padding: PaddingDimensions = (0, 1), + *, + width: Optional[int] = None, + expand: bool = False, + equal: bool = False, + column_first: bool = False, + right_to_left: bool = False, + align: Optional[AlignMethod] = None, + title: Optional[TextType] = None, + ) -> None: + self.renderables = list(renderables or []) + self.width = width + self.padding = padding + self.expand = expand + self.equal = equal + self.column_first = column_first + self.right_to_left = right_to_left + self.align: Optional[AlignMethod] = align + self.title = title + + def add_renderable(self, renderable: RenderableType) -> None: + """Add a renderable to the columns. + + Args: + renderable (RenderableType): Any renderable object. + """ + self.renderables.append(renderable) + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + render_str = console.render_str + renderables = [ + render_str(renderable) if isinstance(renderable, str) else renderable + for renderable in self.renderables + ] + if not renderables: + return + _top, right, _bottom, left = Padding.unpack(self.padding) + width_padding = max(left, right) + max_width = options.max_width + widths: Dict[int, int] = defaultdict(int) + column_count = len(renderables) + + get_measurement = Measurement.get + renderable_widths = [ + get_measurement(console, options, renderable).maximum + for renderable in renderables + ] + if self.equal: + renderable_widths = [max(renderable_widths)] * len(renderable_widths) + + def iter_renderables( + column_count: int, + ) -> Iterable[Tuple[int, Optional[RenderableType]]]: + item_count = len(renderables) + if self.column_first: + width_renderables = list(zip(renderable_widths, renderables)) + + column_lengths: List[int] = [item_count // column_count] * column_count + for col_no in range(item_count % column_count): + column_lengths[col_no] += 1 + + row_count = (item_count + column_count - 1) // column_count + cells = [[-1] * column_count for _ in range(row_count)] + row = col = 0 + for index in range(item_count): + cells[row][col] = index + column_lengths[col] -= 1 + if column_lengths[col]: + row += 1 + else: + col += 1 + row = 0 + for index in chain.from_iterable(cells): + if index == -1: + break + yield width_renderables[index] + else: + yield from zip(renderable_widths, renderables) + # Pad odd elements with spaces + if item_count % column_count: + for _ in range(column_count - (item_count % column_count)): + yield 0, None + + table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) + table.expand = self.expand + table.title = self.title + + if self.width is not None: + column_count = (max_width) // (self.width + width_padding) + for _ in range(column_count): + table.add_column(width=self.width) + else: + while column_count > 1: + widths.clear() + column_no = 0 + for renderable_width, _ in iter_renderables(column_count): + widths[column_no] = max(widths[column_no], renderable_width) + total_width = sum(widths.values()) + width_padding * ( + len(widths) - 1 + ) + if total_width > max_width: + column_count = len(widths) - 1 + break + else: + column_no = (column_no + 1) % column_count + else: + break + + get_renderable = itemgetter(1) + _renderables = [ + get_renderable(_renderable) + for _renderable in iter_renderables(column_count) + ] + if self.equal: + _renderables = [ + None + if renderable is None + else Constrain(renderable, renderable_widths[0]) + for renderable in _renderables + ] + if self.align: + align = self.align + _Align = Align + _renderables = [ + None if renderable is None else _Align(renderable, align) + for renderable in _renderables + ] + + right_to_left = self.right_to_left + add_row = table.add_row + for start in range(0, len(_renderables), column_count): + row = _renderables[start : start + column_count] + if right_to_left: + row = row[::-1] + add_row(*row) + yield table + + +if __name__ == "__main__": # pragma: no cover + import os + + console = Console() + + files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] + columns = Columns(files, padding=(0, 1), expand=False, equal=False) + console.print(columns) + console.rule() + columns.column_first = True + console.print(columns) + columns.right_to_left = True + console.rule() + console.print(columns) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py new file mode 100644 index 0000000..a11c7c1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/console.py @@ -0,0 +1,2633 @@ +import inspect +import os +import platform +import sys +import threading +import zlib +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +from functools import wraps +from getpass import getpass +from html import escape +from inspect import isclass +from itertools import islice +from math import ceil +from time import monotonic +from types import FrameType, ModuleType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + NamedTuple, + Optional, + TextIO, + Tuple, + Type, + Union, + cast, +) + +from pip._vendor.rich._null_file import NULL_FILE + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, runtime_checkable +else: + from pip._vendor.typing_extensions import ( + Literal, + Protocol, + runtime_checkable, + ) # pragma: no cover + +from . import errors, themes +from ._emoji_replace import _emoji_replace +from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._fileno import get_fileno +from ._log_render import FormatTimeCallable, LogRender +from .align import Align, AlignMethod +from .color import ColorSystem, blend_rgb +from .control import Control +from .emoji import EmojiVariant +from .highlighter import NullHighlighter, ReprHighlighter +from .markup import render as render_markup +from .measure import Measurement, measure_renderables +from .pager import Pager, SystemPager +from .pretty import Pretty, is_expandable +from .protocol import rich_cast +from .region import Region +from .scope import render_scope +from .screen import Screen +from .segment import Segment +from .style import Style, StyleType +from .styled import Styled +from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme +from .text import Text, TextType +from .theme import Theme, ThemeStack + +if TYPE_CHECKING: + from ._windows import WindowsConsoleFeatures + from .live import Live + from .status import Status + +JUPYTER_DEFAULT_COLUMNS = 115 +JUPYTER_DEFAULT_LINES = 100 +WINDOWS = platform.system() == "Windows" + +HighlighterType = Callable[[Union[str, "Text"]], "Text"] +JustifyMethod = Literal["default", "left", "center", "right", "full"] +OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] + + +class NoChange: + pass + + +NO_CHANGE = NoChange() + +try: + _STDIN_FILENO = sys.__stdin__.fileno() +except Exception: + _STDIN_FILENO = 0 +try: + _STDOUT_FILENO = sys.__stdout__.fileno() +except Exception: + _STDOUT_FILENO = 1 +try: + _STDERR_FILENO = sys.__stderr__.fileno() +except Exception: + _STDERR_FILENO = 2 + +_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) +_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) + + +_TERM_COLORS = { + "kitty": ColorSystem.EIGHT_BIT, + "256color": ColorSystem.EIGHT_BIT, + "16color": ColorSystem.STANDARD, +} + + +class ConsoleDimensions(NamedTuple): + """Size of the terminal.""" + + width: int + """The width of the console in 'cells'.""" + height: int + """The height of the console in lines.""" + + +@dataclass +class ConsoleOptions: + """Options for __rich_console__ method.""" + + size: ConsoleDimensions + """Size of console.""" + legacy_windows: bool + """legacy_windows: flag for legacy windows.""" + min_width: int + """Minimum width of renderable.""" + max_width: int + """Maximum width of renderable.""" + is_terminal: bool + """True if the target is a terminal, otherwise False.""" + encoding: str + """Encoding of terminal.""" + max_height: int + """Height of container (starts as terminal)""" + justify: Optional[JustifyMethod] = None + """Justify value override for renderable.""" + overflow: Optional[OverflowMethod] = None + """Overflow value override for renderable.""" + no_wrap: Optional[bool] = False + """Disable wrapping for text.""" + highlight: Optional[bool] = None + """Highlight override for render_str.""" + markup: Optional[bool] = None + """Enable markup when rendering strings.""" + height: Optional[int] = None + + @property + def ascii_only(self) -> bool: + """Check if renderables should use ascii only.""" + return not self.encoding.startswith("utf") + + def copy(self) -> "ConsoleOptions": + """Return a copy of the options. + + Returns: + ConsoleOptions: a copy of self. + """ + options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) + options.__dict__ = self.__dict__.copy() + return options + + def update( + self, + *, + width: Union[int, NoChange] = NO_CHANGE, + min_width: Union[int, NoChange] = NO_CHANGE, + max_width: Union[int, NoChange] = NO_CHANGE, + justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, + overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, + no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, + highlight: Union[Optional[bool], NoChange] = NO_CHANGE, + markup: Union[Optional[bool], NoChange] = NO_CHANGE, + height: Union[Optional[int], NoChange] = NO_CHANGE, + ) -> "ConsoleOptions": + """Update values, return a copy.""" + options = self.copy() + if not isinstance(width, NoChange): + options.min_width = options.max_width = max(0, width) + if not isinstance(min_width, NoChange): + options.min_width = min_width + if not isinstance(max_width, NoChange): + options.max_width = max_width + if not isinstance(justify, NoChange): + options.justify = justify + if not isinstance(overflow, NoChange): + options.overflow = overflow + if not isinstance(no_wrap, NoChange): + options.no_wrap = no_wrap + if not isinstance(highlight, NoChange): + options.highlight = highlight + if not isinstance(markup, NoChange): + options.markup = markup + if not isinstance(height, NoChange): + if height is not None: + options.max_height = height + options.height = None if height is None else max(0, height) + return options + + def update_width(self, width: int) -> "ConsoleOptions": + """Update just the width, return a copy. + + Args: + width (int): New width (sets both min_width and max_width) + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + return options + + def update_height(self, height: int) -> "ConsoleOptions": + """Update the height, and return a copy. + + Args: + height (int): New height + + Returns: + ~ConsoleOptions: New Console options instance. + """ + options = self.copy() + options.max_height = options.height = height + return options + + def reset_height(self) -> "ConsoleOptions": + """Return a copy of the options with height set to ``None``. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.height = None + return options + + def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": + """Update the width and height, and return a copy. + + Args: + width (int): New width (sets both min_width and max_width). + height (int): New height. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + options.height = options.max_height = height + return options + + +@runtime_checkable +class RichCast(Protocol): + """An object that may be 'cast' to a console renderable.""" + + def __rich__( + self, + ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover + ... + + +@runtime_checkable +class ConsoleRenderable(Protocol): + """An object that supports the console protocol.""" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": # pragma: no cover + ... + + +# A type that may be rendered by Console. +RenderableType = Union[ConsoleRenderable, RichCast, str] +"""A string or any object that may be rendered by Rich.""" + +# The result of calling a __rich_console__ method. +RenderResult = Iterable[Union[RenderableType, Segment]] + +_null_highlighter = NullHighlighter() + + +class CaptureError(Exception): + """An error in the Capture context manager.""" + + +class NewLine: + """A renderable to generate new line(s)""" + + def __init__(self, count: int = 1) -> None: + self.count = count + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + yield Segment("\n" * self.count) + + +class ScreenUpdate: + """Render a list of lines at a given offset.""" + + def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: + self._lines = lines + self.x = x + self.y = y + + def __rich_console__( + self, console: "Console", options: ConsoleOptions + ) -> RenderResult: + x = self.x + move_to = Control.move_to + for offset, line in enumerate(self._lines, self.y): + yield move_to(x, offset) + yield from line + + +class Capture: + """Context manager to capture the result of printing to the console. + See :meth:`~rich.console.Console.capture` for how to use. + + Args: + console (Console): A console instance to capture output. + """ + + def __init__(self, console: "Console") -> None: + self._console = console + self._result: Optional[str] = None + + def __enter__(self) -> "Capture": + self._console.begin_capture() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self._result = self._console.end_capture() + + def get(self) -> str: + """Get the result of the capture.""" + if self._result is None: + raise CaptureError( + "Capture result is not available until context manager exits." + ) + return self._result + + +class ThemeContext: + """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" + + def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: + self.console = console + self.theme = theme + self.inherit = inherit + + def __enter__(self) -> "ThemeContext": + self.console.push_theme(self.theme) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.console.pop_theme() + + +class PagerContext: + """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" + + def __init__( + self, + console: "Console", + pager: Optional[Pager] = None, + styles: bool = False, + links: bool = False, + ) -> None: + self._console = console + self.pager = SystemPager() if pager is None else pager + self.styles = styles + self.links = links + + def __enter__(self) -> "PagerContext": + self._console._enter_buffer() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if exc_type is None: + with self._console._lock: + buffer: List[Segment] = self._console._buffer[:] + del self._console._buffer[:] + segments: Iterable[Segment] = buffer + if not self.styles: + segments = Segment.strip_styles(segments) + elif not self.links: + segments = Segment.strip_links(segments) + content = self._console._render_buffer(segments) + self.pager.show(content) + self._console._exit_buffer() + + +class ScreenContext: + """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" + + def __init__( + self, console: "Console", hide_cursor: bool, style: StyleType = "" + ) -> None: + self.console = console + self.hide_cursor = hide_cursor + self.screen = Screen(style=style) + self._changed = False + + def update( + self, *renderables: RenderableType, style: Optional[StyleType] = None + ) -> None: + """Update the screen. + + Args: + renderable (RenderableType, optional): Optional renderable to replace current renderable, + or None for no change. Defaults to None. + style: (Style, optional): Replacement style, or None for no change. Defaults to None. + """ + if renderables: + self.screen.renderable = ( + Group(*renderables) if len(renderables) > 1 else renderables[0] + ) + if style is not None: + self.screen.style = style + self.console.print(self.screen, end="") + + def __enter__(self) -> "ScreenContext": + self._changed = self.console.set_alt_screen(True) + if self._changed and self.hide_cursor: + self.console.show_cursor(False) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if self._changed: + self.console.set_alt_screen(False) + if self.hide_cursor: + self.console.show_cursor(True) + + +class Group: + """Takes a group of renderables and returns a renderable object that renders the group. + + Args: + renderables (Iterable[RenderableType]): An iterable of renderable objects. + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: + self._renderables = renderables + self.fit = fit + self._render: Optional[List[RenderableType]] = None + + @property + def renderables(self) -> List["RenderableType"]: + if self._render is None: + self._render = list(self._renderables) + return self._render + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.fit: + return measure_renderables(console, options, self.renderables) + else: + return Measurement(options.max_width, options.max_width) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> RenderResult: + yield from self.renderables + + +def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: + """A decorator that turns an iterable of renderables in to a group. + + Args: + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def decorator( + method: Callable[..., Iterable[RenderableType]] + ) -> Callable[..., Group]: + """Convert a method that returns an iterable of renderables in to a Group.""" + + @wraps(method) + def _replace(*args: Any, **kwargs: Any) -> Group: + renderables = method(*args, **kwargs) + return Group(*renderables, fit=fit) + + return _replace + + return decorator + + +def _is_jupyter() -> bool: # pragma: no cover + """Check if we're running in a Jupyter notebook.""" + try: + get_ipython # type: ignore[name-defined] + except NameError: + return False + ipython = get_ipython() # type: ignore[name-defined] + shell = ipython.__class__.__name__ + if ( + "google.colab" in str(ipython.__class__) + or os.getenv("DATABRICKS_RUNTIME_VERSION") + or shell == "ZMQInteractiveShell" + ): + return True # Jupyter notebook or qtconsole + elif shell == "TerminalInteractiveShell": + return False # Terminal running IPython + else: + return False # Other type (?) + + +COLOR_SYSTEMS = { + "standard": ColorSystem.STANDARD, + "256": ColorSystem.EIGHT_BIT, + "truecolor": ColorSystem.TRUECOLOR, + "windows": ColorSystem.WINDOWS, +} + +_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} + + +@dataclass +class ConsoleThreadLocals(threading.local): + """Thread local values for Console context.""" + + theme_stack: ThemeStack + buffer: List[Segment] = field(default_factory=list) + buffer_index: int = 0 + + +class RenderHook(ABC): + """Provides hooks in to the render process.""" + + @abstractmethod + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Called with a list of objects to render. + + This method can return a new list of renderables, or modify and return the same list. + + Args: + renderables (List[ConsoleRenderable]): A number of renderable objects. + + Returns: + List[ConsoleRenderable]: A replacement list of renderables. + """ + + +_windows_console_features: Optional["WindowsConsoleFeatures"] = None + + +def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover + global _windows_console_features + if _windows_console_features is not None: + return _windows_console_features + from ._windows import get_windows_console_features + + _windows_console_features = get_windows_console_features() + return _windows_console_features + + +def detect_legacy_windows() -> bool: + """Detect legacy Windows.""" + return WINDOWS and not get_windows_console_features().vt + + +class Console: + """A high level console interface. + + Args: + color_system (str, optional): The color system supported by your terminal, + either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. + force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. + force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. + force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. + soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. + theme (Theme, optional): An optional style theme object, or ``None`` for default theme. + stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. + file (IO, optional): A file object where the console should write to. Defaults to stdout. + quiet (bool, Optional): Boolean to suppress all output. Defaults to False. + width (int, optional): The width of the terminal. Leave as default to auto-detect width. + height (int, optional): The height of the terminal. Leave as default to auto-detect height. + style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. + no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. + tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. + record (bool, optional): Boolean to enable recording of terminal output, + required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. + markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. + emoji (bool, optional): Enable emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + highlight (bool, optional): Enable automatic highlighting. Defaults to True. + log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. + log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". + highlighter (HighlighterType, optional): Default highlighter. + legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. + safe_box (bool, optional): Restrict box options that don't render on legacy Windows. + get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), + or None for datetime.now. + get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. + """ + + _environ: Mapping[str, str] = os.environ + + def __init__( + self, + *, + color_system: Optional[ + Literal["auto", "standard", "256", "truecolor", "windows"] + ] = "auto", + force_terminal: Optional[bool] = None, + force_jupyter: Optional[bool] = None, + force_interactive: Optional[bool] = None, + soft_wrap: bool = False, + theme: Optional[Theme] = None, + stderr: bool = False, + file: Optional[IO[str]] = None, + quiet: bool = False, + width: Optional[int] = None, + height: Optional[int] = None, + style: Optional[StyleType] = None, + no_color: Optional[bool] = None, + tab_size: int = 8, + record: bool = False, + markup: bool = True, + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, + highlight: bool = True, + log_time: bool = True, + log_path: bool = True, + log_time_format: Union[str, FormatTimeCallable] = "[%X]", + highlighter: Optional["HighlighterType"] = ReprHighlighter(), + legacy_windows: Optional[bool] = None, + safe_box: bool = True, + get_datetime: Optional[Callable[[], datetime]] = None, + get_time: Optional[Callable[[], float]] = None, + _environ: Optional[Mapping[str, str]] = None, + ): + # Copy of os.environ allows us to replace it for testing + if _environ is not None: + self._environ = _environ + + self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter + if self.is_jupyter: + if width is None: + jupyter_columns = self._environ.get("JUPYTER_COLUMNS") + if jupyter_columns is not None and jupyter_columns.isdigit(): + width = int(jupyter_columns) + else: + width = JUPYTER_DEFAULT_COLUMNS + if height is None: + jupyter_lines = self._environ.get("JUPYTER_LINES") + if jupyter_lines is not None and jupyter_lines.isdigit(): + height = int(jupyter_lines) + else: + height = JUPYTER_DEFAULT_LINES + + self.tab_size = tab_size + self.record = record + self._markup = markup + self._emoji = emoji + self._emoji_variant: Optional[EmojiVariant] = emoji_variant + self._highlight = highlight + self.legacy_windows: bool = ( + (detect_legacy_windows() and not self.is_jupyter) + if legacy_windows is None + else legacy_windows + ) + + if width is None: + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) - self.legacy_windows + if height is None: + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + self.soft_wrap = soft_wrap + self._width = width + self._height = height + + self._color_system: Optional[ColorSystem] + + self._force_terminal = None + if force_terminal is not None: + self._force_terminal = force_terminal + + self._file = file + self.quiet = quiet + self.stderr = stderr + + if color_system is None: + self._color_system = None + elif color_system == "auto": + self._color_system = self._detect_color_system() + else: + self._color_system = COLOR_SYSTEMS[color_system] + + self._lock = threading.RLock() + self._log_render = LogRender( + show_time=log_time, + show_path=log_path, + time_format=log_time_format, + ) + self.highlighter: HighlighterType = highlighter or _null_highlighter + self.safe_box = safe_box + self.get_datetime = get_datetime or datetime.now + self.get_time = get_time or monotonic + self.style = style + self.no_color = ( + no_color if no_color is not None else "NO_COLOR" in self._environ + ) + self.is_interactive = ( + (self.is_terminal and not self.is_dumb_terminal) + if force_interactive is None + else force_interactive + ) + + self._record_buffer_lock = threading.RLock() + self._thread_locals = ConsoleThreadLocals( + theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) + ) + self._record_buffer: List[Segment] = [] + self._render_hooks: List[RenderHook] = [] + self._live: Optional["Live"] = None + self._is_alt_screen = False + + def __repr__(self) -> str: + return f"" + + @property + def file(self) -> IO[str]: + """Get the file object to write to.""" + file = self._file or (sys.stderr if self.stderr else sys.stdout) + file = getattr(file, "rich_proxied_file", file) + if file is None: + file = NULL_FILE + return file + + @file.setter + def file(self, new_file: IO[str]) -> None: + """Set a new file object.""" + self._file = new_file + + @property + def _buffer(self) -> List[Segment]: + """Get a thread local buffer.""" + return self._thread_locals.buffer + + @property + def _buffer_index(self) -> int: + """Get a thread local buffer.""" + return self._thread_locals.buffer_index + + @_buffer_index.setter + def _buffer_index(self, value: int) -> None: + self._thread_locals.buffer_index = value + + @property + def _theme_stack(self) -> ThemeStack: + """Get the thread local theme stack.""" + return self._thread_locals.theme_stack + + def _detect_color_system(self) -> Optional[ColorSystem]: + """Detect color system from env vars.""" + if self.is_jupyter: + return ColorSystem.TRUECOLOR + if not self.is_terminal or self.is_dumb_terminal: + return None + if WINDOWS: # pragma: no cover + if self.legacy_windows: # pragma: no cover + return ColorSystem.WINDOWS + windows_console_features = get_windows_console_features() + return ( + ColorSystem.TRUECOLOR + if windows_console_features.truecolor + else ColorSystem.EIGHT_BIT + ) + else: + color_term = self._environ.get("COLORTERM", "").strip().lower() + if color_term in ("truecolor", "24bit"): + return ColorSystem.TRUECOLOR + term = self._environ.get("TERM", "").strip().lower() + _term_name, _hyphen, colors = term.rpartition("-") + color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) + return color_system + + def _enter_buffer(self) -> None: + """Enter in to a buffer context, and buffer all output.""" + self._buffer_index += 1 + + def _exit_buffer(self) -> None: + """Leave buffer context, and render content if required.""" + self._buffer_index -= 1 + self._check_buffer() + + def set_live(self, live: "Live") -> None: + """Set Live instance. Used by Live context manager. + + Args: + live (Live): Live instance using this Console. + + Raises: + errors.LiveError: If this Console has a Live context currently active. + """ + with self._lock: + if self._live is not None: + raise errors.LiveError("Only one live display may be active at once") + self._live = live + + def clear_live(self) -> None: + """Clear the Live instance.""" + with self._lock: + self._live = None + + def push_render_hook(self, hook: RenderHook) -> None: + """Add a new render hook to the stack. + + Args: + hook (RenderHook): Render hook instance. + """ + with self._lock: + self._render_hooks.append(hook) + + def pop_render_hook(self) -> None: + """Pop the last renderhook from the stack.""" + with self._lock: + self._render_hooks.pop() + + def __enter__(self) -> "Console": + """Own context manager to enter buffer context.""" + self._enter_buffer() + return self + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + """Exit buffer context.""" + self._exit_buffer() + + def begin_capture(self) -> None: + """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" + self._enter_buffer() + + def end_capture(self) -> str: + """End capture mode and return captured string. + + Returns: + str: Console output. + """ + render_result = self._render_buffer(self._buffer) + del self._buffer[:] + self._exit_buffer() + return render_result + + def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: + """Push a new theme on to the top of the stack, replacing the styles from the previous theme. + Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather + than calling this method directly. + + Args: + theme (Theme): A theme instance. + inherit (bool, optional): Inherit existing styles. Defaults to True. + """ + self._theme_stack.push_theme(theme, inherit=inherit) + + def pop_theme(self) -> None: + """Remove theme from top of stack, restoring previous theme.""" + self._theme_stack.pop_theme() + + def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: + """Use a different theme for the duration of the context manager. + + Args: + theme (Theme): Theme instance to user. + inherit (bool, optional): Inherit existing console styles. Defaults to True. + + Returns: + ThemeContext: [description] + """ + return ThemeContext(self, theme, inherit) + + @property + def color_system(self) -> Optional[str]: + """Get color system string. + + Returns: + Optional[str]: "standard", "256" or "truecolor". + """ + + if self._color_system is not None: + return _COLOR_SYSTEMS_NAMES[self._color_system] + else: + return None + + @property + def encoding(self) -> str: + """Get the encoding of the console file, e.g. ``"utf-8"``. + + Returns: + str: A standard encoding string. + """ + return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() + + @property + def is_terminal(self) -> bool: + """Check if the console is writing to a terminal. + + Returns: + bool: True if the console writing to a device capable of + understanding terminal codes, otherwise False. + """ + if self._force_terminal is not None: + return self._force_terminal + + if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( + "idlelib" + ): + # Return False for Idle which claims to be a tty but can't handle ansi codes + return False + + if self.is_jupyter: + # return False for Jupyter, which may have FORCE_COLOR set + return False + + # If FORCE_COLOR env var has any value at all, we assume a terminal. + force_color = self._environ.get("FORCE_COLOR") + if force_color is not None: + self._force_terminal = True + return True + + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) + try: + return False if isatty is None else isatty() + except ValueError: + # in some situation (at the end of a pytest run for example) isatty() can raise + # ValueError: I/O operation on closed file + # return False because we aren't in a terminal anymore + return False + + @property + def is_dumb_terminal(self) -> bool: + """Detect dumb terminal. + + Returns: + bool: True if writing to a dumb terminal, otherwise False. + + """ + _term = self._environ.get("TERM", "") + is_dumb = _term.lower() in ("dumb", "unknown") + return self.is_terminal and is_dumb + + @property + def options(self) -> ConsoleOptions: + """Get default console options.""" + return ConsoleOptions( + max_height=self.size.height, + size=self.size, + legacy_windows=self.legacy_windows, + min_width=1, + max_width=self.width, + encoding=self.encoding, + is_terminal=self.is_terminal, + ) + + @property + def size(self) -> ConsoleDimensions: + """Get the size of the console. + + Returns: + ConsoleDimensions: A named tuple containing the dimensions. + """ + + if self._width is not None and self._height is not None: + return ConsoleDimensions(self._width - self.legacy_windows, self._height) + + if self.is_dumb_terminal: + return ConsoleDimensions(80, 25) + + width: Optional[int] = None + height: Optional[int] = None + + if WINDOWS: # pragma: no cover + try: + width, height = os.get_terminal_size() + except (AttributeError, ValueError, OSError): # Probably not a terminal + pass + else: + for file_descriptor in _STD_STREAMS: + try: + width, height = os.get_terminal_size(file_descriptor) + except (AttributeError, ValueError, OSError): + pass + else: + break + + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + # get_terminal_size can report 0, 0 if run from pseudo-terminal + width = width or 80 + height = height or 25 + return ConsoleDimensions( + width - self.legacy_windows if self._width is None else self._width, + height if self._height is None else self._height, + ) + + @size.setter + def size(self, new_size: Tuple[int, int]) -> None: + """Set a new size for the terminal. + + Args: + new_size (Tuple[int, int]): New width and height. + """ + width, height = new_size + self._width = width + self._height = height + + @property + def width(self) -> int: + """Get the width of the console. + + Returns: + int: The width (in characters) of the console. + """ + return self.size.width + + @width.setter + def width(self, width: int) -> None: + """Set width. + + Args: + width (int): New width. + """ + self._width = width + + @property + def height(self) -> int: + """Get the height of the console. + + Returns: + int: The height (in lines) of the console. + """ + return self.size.height + + @height.setter + def height(self, height: int) -> None: + """Set height. + + Args: + height (int): new height. + """ + self._height = height + + def bell(self) -> None: + """Play a 'bell' sound (if supported by the terminal).""" + self.control(Control.bell()) + + def capture(self) -> Capture: + """A context manager to *capture* the result of print() or log() in a string, + rather than writing it to the console. + + Example: + >>> from rich.console import Console + >>> console = Console() + >>> with console.capture() as capture: + ... console.print("[bold magenta]Hello World[/]") + >>> print(capture.get()) + + Returns: + Capture: Context manager with disables writing to the terminal. + """ + capture = Capture(self) + return capture + + def pager( + self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False + ) -> PagerContext: + """A context manager to display anything printed within a "pager". The pager application + is defined by the system and will typically support at least pressing a key to scroll. + + Args: + pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. + styles (bool, optional): Show styles in pager. Defaults to False. + links (bool, optional): Show links in pager. Defaults to False. + + Example: + >>> from rich.console import Console + >>> from rich.__main__ import make_test_card + >>> console = Console() + >>> with console.pager(): + console.print(make_test_card()) + + Returns: + PagerContext: A context manager. + """ + return PagerContext(self, pager=pager, styles=styles, links=links) + + def line(self, count: int = 1) -> None: + """Write new line(s). + + Args: + count (int, optional): Number of new lines. Defaults to 1. + """ + + assert count >= 0, "count must be >= 0" + self.print(NewLine(count)) + + def clear(self, home: bool = True) -> None: + """Clear the screen. + + Args: + home (bool, optional): Also move the cursor to 'home' position. Defaults to True. + """ + if home: + self.control(Control.clear(), Control.home()) + else: + self.control(Control.clear()) + + def status( + self, + status: RenderableType, + *, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ) -> "Status": + """Display a status and spinner. + + Args: + status (RenderableType): A status renderable (str or Text typically). + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + + Returns: + Status: A Status object that may be used as a context manager. + """ + from .status import Status + + status_renderable = Status( + status, + console=self, + spinner=spinner, + spinner_style=spinner_style, + speed=speed, + refresh_per_second=refresh_per_second, + ) + return status_renderable + + def show_cursor(self, show: bool = True) -> bool: + """Show or hide the cursor. + + Args: + show (bool, optional): Set visibility of the cursor. + """ + if self.is_terminal: + self.control(Control.show_cursor(show)) + return True + return False + + def set_alt_screen(self, enable: bool = True) -> bool: + """Enables alternative screen mode. + + Note, if you enable this mode, you should ensure that is disabled before + the application exits. See :meth:`~rich.Console.screen` for a context manager + that handles this for you. + + Args: + enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. + + Returns: + bool: True if the control codes were written. + + """ + changed = False + if self.is_terminal and not self.legacy_windows: + self.control(Control.alt_screen(enable)) + changed = True + self._is_alt_screen = enable + return changed + + @property + def is_alt_screen(self) -> bool: + """Check if the alt screen was enabled. + + Returns: + bool: True if the alt screen was enabled, otherwise False. + """ + return self._is_alt_screen + + def set_window_title(self, title: str) -> bool: + """Set the title of the console terminal window. + + Warning: There is no means within Rich of "resetting" the window title to its + previous value, meaning the title you set will persist even after your application + exits. + + ``fish`` shell resets the window title before and after each command by default, + negating this issue. Windows Terminal and command prompt will also reset the title for you. + Most other shells and terminals, however, do not do this. + + Some terminals may require configuration changes before you can set the title. + Some terminals may not support setting the title at all. + + Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) + may also set the terminal window title. This could result in whatever value you write + using this method being overwritten. + + Args: + title (str): The new title of the terminal window. + + Returns: + bool: True if the control code to change the terminal title was + written, otherwise False. Note that a return value of True + does not guarantee that the window title has actually changed, + since the feature may be unsupported/disabled in some terminals. + """ + if self.is_terminal: + self.control(Control.title(title)) + return True + return False + + def screen( + self, hide_cursor: bool = True, style: Optional[StyleType] = None + ) -> "ScreenContext": + """Context manager to enable and disable 'alternative screen' mode. + + Args: + hide_cursor (bool, optional): Also hide the cursor. Defaults to False. + style (Style, optional): Optional style for screen. Defaults to None. + + Returns: + ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. + """ + return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") + + def measure( + self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None + ) -> Measurement: + """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains + information regarding the number of characters required to print the renderable. + + Args: + renderable (RenderableType): Any renderable or string. + options (Optional[ConsoleOptions], optional): Options to use when measuring, or None + to use default options. Defaults to None. + + Returns: + Measurement: A measurement of the renderable. + """ + measurement = Measurement.get(self, options or self.options, renderable) + return measurement + + def render( + self, renderable: RenderableType, options: Optional[ConsoleOptions] = None + ) -> Iterable[Segment]: + """Render an object in to an iterable of `Segment` instances. + + This method contains the logic for rendering objects with the console protocol. + You are unlikely to need to use it directly, unless you are extending the library. + + Args: + renderable (RenderableType): An object supporting the console protocol, or + an object that may be converted to a string. + options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. + + Returns: + Iterable[Segment]: An iterable of segments that may be rendered. + """ + + _options = options or self.options + if _options.max_width < 1: + # No space to render anything. This prevents potential recursion errors. + return + render_iterable: RenderResult + + renderable = rich_cast(renderable) + if hasattr(renderable, "__rich_console__") and not isclass(renderable): + render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] + elif isinstance(renderable, str): + text_renderable = self.render_str( + renderable, highlight=_options.highlight, markup=_options.markup + ) + render_iterable = text_renderable.__rich_console__(self, _options) + else: + raise errors.NotRenderableError( + f"Unable to render {renderable!r}; " + "A str, Segment or object with __rich_console__ method is required" + ) + + try: + iter_render = iter(render_iterable) + except TypeError: + raise errors.NotRenderableError( + f"object {render_iterable!r} is not renderable" + ) + _Segment = Segment + _options = _options.reset_height() + for render_output in iter_render: + if isinstance(render_output, _Segment): + yield render_output + else: + yield from self.render(render_output, _options) + + def render_lines( + self, + renderable: RenderableType, + options: Optional[ConsoleOptions] = None, + *, + style: Optional[Style] = None, + pad: bool = True, + new_lines: bool = False, + ) -> List[List[Segment]]: + """Render objects in to a list of lines. + + The output of render_lines is useful when further formatting of rendered console text + is required, such as the Panel class which draws a border around any renderable object. + + Args: + renderable (RenderableType): Any object renderable in the console. + options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. + style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. + pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. + new_lines (bool, optional): Include "\n" characters at end of lines. + + Returns: + List[List[Segment]]: A list of lines, where a line is a list of Segment objects. + """ + with self._lock: + render_options = options or self.options + _rendered = self.render(renderable, render_options) + if style: + _rendered = Segment.apply_style(_rendered, style) + + render_height = render_options.height + if render_height is not None: + render_height = max(0, render_height) + + lines = list( + islice( + Segment.split_and_crop_lines( + _rendered, + render_options.max_width, + include_new_lines=new_lines, + pad=pad, + style=style, + ), + None, + render_height, + ) + ) + if render_options.height is not None: + extra_lines = render_options.height - len(lines) + if extra_lines > 0: + pad_line = [ + [Segment(" " * render_options.max_width, style), Segment("\n")] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ] + lines.extend(pad_line * extra_lines) + + return lines + + def render_str( + self, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + highlighter: Optional[HighlighterType] = None, + ) -> "Text": + """Convert a string to a Text instance. This is called automatically if + you print or log a string. + + Args: + text (str): Text to render. + style (Union[str, Style], optional): Style to apply to rendered text. + justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. + highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. + highlighter (HighlighterType, optional): Optional highlighter to apply. + Returns: + ConsoleRenderable: Renderable object. + + """ + emoji_enabled = emoji or (emoji is None and self._emoji) + markup_enabled = markup or (markup is None and self._markup) + highlight_enabled = highlight or (highlight is None and self._highlight) + + if markup_enabled: + rich_text = render_markup( + text, + style=style, + emoji=emoji_enabled, + emoji_variant=self._emoji_variant, + ) + rich_text.justify = justify + rich_text.overflow = overflow + else: + rich_text = Text( + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text, + justify=justify, + overflow=overflow, + style=style, + ) + + _highlighter = (highlighter or self.highlighter) if highlight_enabled else None + if _highlighter is not None: + highlight_text = _highlighter(str(rich_text)) + highlight_text.copy_styles(rich_text) + return highlight_text + + return rich_text + + def get_style( + self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None + ) -> Style: + """Get a Style instance by its theme name or parse a definition. + + Args: + name (str): The name of a style or a style definition. + + Returns: + Style: A Style object. + + Raises: + MissingStyle: If no style could be parsed from name. + + """ + if isinstance(name, Style): + return name + + try: + style = self._theme_stack.get(name) + if style is None: + style = Style.parse(name) + return style.copy() if style.link else style + except errors.StyleSyntaxError as error: + if default is not None: + return self.get_style(default) + raise errors.MissingStyle( + f"Failed to get style {name!r}; {error}" + ) from None + + def _collect_renderables( + self, + objects: Iterable[Any], + sep: str, + end: str, + *, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + ) -> List[ConsoleRenderable]: + """Combine a number of renderables and text into one renderable. + + Args: + objects (Iterable[Any]): Anything that Rich can render. + sep (str): String to write between print data. + end (str): String to write at end of print data. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. + + Returns: + List[ConsoleRenderable]: A list of things to render. + """ + renderables: List[ConsoleRenderable] = [] + _append = renderables.append + text: List[Text] = [] + append_text = text.append + + append = _append + if justify in ("left", "center", "right"): + + def align_append(renderable: RenderableType) -> None: + _append(Align(renderable, cast(AlignMethod, justify))) + + append = align_append + + _highlighter: HighlighterType = _null_highlighter + if highlight or (highlight is None and self._highlight): + _highlighter = self.highlighter + + def check_text() -> None: + if text: + sep_text = Text(sep, justify=justify, end=end) + append(sep_text.join(text)) + text.clear() + + for renderable in objects: + renderable = rich_cast(renderable) + if isinstance(renderable, str): + append_text( + self.render_str( + renderable, emoji=emoji, markup=markup, highlighter=_highlighter + ) + ) + elif isinstance(renderable, Text): + append_text(renderable) + elif isinstance(renderable, ConsoleRenderable): + check_text() + append(renderable) + elif is_expandable(renderable): + check_text() + append(Pretty(renderable, highlighter=_highlighter)) + else: + append_text(_highlighter(str(renderable))) + + check_text() + + if self.style is not None: + style = self.get_style(self.style) + renderables = [Styled(renderable, style) for renderable in renderables] + + return renderables + + def rule( + self, + title: TextType = "", + *, + characters: str = "─", + style: Union[str, Style] = "rule.line", + align: AlignMethod = "center", + ) -> None: + """Draw a line with optional centered title. + + Args: + title (str, optional): Text to render over the rule. Defaults to "". + characters (str, optional): Character(s) to form the line. Defaults to "─". + style (str, optional): Style of line. Defaults to "rule.line". + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". + """ + from .rule import Rule + + rule = Rule(title=title, characters=characters, style=style, align=align) + self.print(rule) + + def control(self, *control: Control) -> None: + """Insert non-printing control codes. + + Args: + control_codes (str): Control codes, such as those that may move the cursor. + """ + if not self.is_dumb_terminal: + with self: + self._buffer.extend(_control.segment for _control in control) + + def out( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + highlight: Optional[bool] = None, + ) -> None: + """Output to the terminal. This is a low-level way of writing to the terminal which unlike + :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will + optionally apply highlighting and a basic style. + + Args: + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use + console default. Defaults to ``None``. + """ + raw_output: str = sep.join(str(_object) for _object in objects) + self.print( + raw_output, + style=style, + highlight=highlight, + emoji=False, + markup=False, + no_wrap=True, + overflow="ignore", + crop=False, + end=end, + ) + + def print( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + no_wrap: Optional[bool] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + width: Optional[int] = None, + height: Optional[int] = None, + crop: bool = True, + soft_wrap: Optional[bool] = None, + new_line_start: bool = False, + ) -> None: + """Print to the console. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. + no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. + width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. + crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. + soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for + Console default. Defaults to ``None``. + new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. + """ + if not objects: + objects = (NewLine(),) + + if soft_wrap is None: + soft_wrap = self.soft_wrap + if soft_wrap: + if no_wrap is None: + no_wrap = True + if overflow is None: + overflow = "ignore" + crop = False + render_hooks = self._render_hooks[:] + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + render_options = self.options.update( + justify=justify, + overflow=overflow, + width=min(width, self.width) if width is not None else NO_CHANGE, + height=height, + no_wrap=no_wrap, + markup=markup, + highlight=highlight, + ) + + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + if style is None: + for renderable in renderables: + extend(render(renderable, render_options)) + else: + for renderable in renderables: + extend( + Segment.apply_style( + render(renderable, render_options), self.get_style(style) + ) + ) + if new_line_start: + if ( + len("".join(segment.text for segment in new_segments).splitlines()) + > 1 + ): + new_segments.insert(0, Segment.line()) + if crop: + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + else: + self._buffer.extend(new_segments) + + def print_json( + self, + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (Optional[str]): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + from pip._vendor.rich.json import JSON + + if json is None: + json_renderable = JSON.from_data( + data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + else: + if not isinstance(json, str): + raise TypeError( + f"json must be str. Did you mean print_json(data={json!r}) ?" + ) + json_renderable = JSON( + json, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + self.print(json_renderable, soft_wrap=True) + + def update_screen( + self, + renderable: RenderableType, + *, + region: Optional[Region] = None, + options: Optional[ConsoleOptions] = None, + ) -> None: + """Update the screen at a given offset. + + Args: + renderable (RenderableType): A Rich renderable. + region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. + x (int, optional): x offset. Defaults to 0. + y (int, optional): y offset. Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + render_options = options or self.options + if region is None: + x = y = 0 + render_options = render_options.update_dimensions( + render_options.max_width, render_options.height or self.height + ) + else: + x, y, width, height = region + render_options = render_options.update_dimensions(width, height) + + lines = self.render_lines(renderable, options=render_options) + self.update_screen_lines(lines, x, y) + + def update_screen_lines( + self, lines: List[List[Segment]], x: int = 0, y: int = 0 + ) -> None: + """Update lines of the screen at a given offset. + + Args: + lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). + x (int, optional): x offset (column no). Defaults to 0. + y (int, optional): y offset (column no). Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + screen_update = ScreenUpdate(lines, x, y) + segments = self.render(screen_update) + self._buffer.extend(segments) + self._check_buffer() + + def print_exception( + self, + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ) -> None: + """Prints a rich render of the last exception and traceback. + + Args: + width (Optional[int], optional): Number of characters used to render code. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + from .traceback import Traceback + + traceback = Traceback( + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + suppress=suppress, + max_frames=max_frames, + ) + self.print(traceback) + + @staticmethod + def _caller_frame_info( + offset: int, + currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, + ) -> Tuple[str, int, Dict[str, Any]]: + """Get caller frame information. + + Args: + offset (int): the caller offset within the current frame stack. + currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to + retrieve the current frame. Defaults to ``inspect.currentframe``. + + Returns: + Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and + the dictionary of local variables associated with the caller frame. + + Raises: + RuntimeError: If the stack offset is invalid. + """ + # Ignore the frame of this local helper + offset += 1 + + frame = currentframe() + if frame is not None: + # Use the faster currentframe where implemented + while offset and frame is not None: + frame = frame.f_back + offset -= 1 + assert frame is not None + return frame.f_code.co_filename, frame.f_lineno, frame.f_locals + else: + # Fallback to the slower stack + frame_info = inspect.stack()[offset] + return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals + + def log( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + log_locals: bool = False, + _stack_offset: int = 1, + ) -> None: + """Log rich content to the terminal. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. + log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` + was called. Defaults to False. + _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. + """ + if not objects: + objects = (NewLine(),) + + render_hooks = self._render_hooks[:] + + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + if style is not None: + renderables = [Styled(renderable, style) for renderable in renderables] + + filename, line_no, locals = self._caller_frame_info(_stack_offset) + link_path = None if filename.startswith("<") else os.path.abspath(filename) + path = filename.rpartition(os.sep)[-1] + if log_locals: + locals_map = { + key: value + for key, value in locals.items() + if not key.startswith("__") + } + renderables.append(render_scope(locals_map, title="[i]locals")) + + renderables = [ + self._log_render( + self, + renderables, + log_time=self.get_datetime(), + path=path, + line_no=line_no, + link_path=link_path, + ) + ] + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + render_options = self.options + for renderable in renderables: + extend(render(renderable, render_options)) + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + + def _check_buffer(self) -> None: + """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) + Rendering is supported on Windows, Unix and Jupyter environments. For + legacy Windows consoles, the win32 API is called directly. + This method will also record what it renders if recording is enabled via Console.record. + """ + if self.quiet: + del self._buffer[:] + return + with self._lock: + if self.record: + with self._record_buffer_lock: + self._record_buffer.extend(self._buffer[:]) + + if self._buffer_index == 0: + if self.is_jupyter: # pragma: no cover + from .jupyter import display + + display(self._buffer, self._render_buffer(self._buffer[:])) + del self._buffer[:] + else: + if WINDOWS: + use_legacy_windows_render = False + if self.legacy_windows: + fileno = get_fileno(self.file) + if fileno is not None: + use_legacy_windows_render = ( + fileno in _STD_STREAMS_OUTPUT + ) + + if use_legacy_windows_render: + from pip._vendor.rich._win32_console import LegacyWindowsTerm + from pip._vendor.rich._windows_renderer import legacy_windows_render + + buffer = self._buffer[:] + if self.no_color and self._color_system: + buffer = list(Segment.remove_color(buffer)) + + legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) + else: + # Either a non-std stream on legacy Windows, or modern Windows. + text = self._render_buffer(self._buffer[:]) + # https://bugs.python.org/issue37871 + # https://github.com/python/cpython/issues/82052 + # We need to avoid writing more than 32Kb in a single write, due to the above bug + write = self.file.write + # Worse case scenario, every character is 4 bytes of utf-8 + MAX_WRITE = 32 * 1024 // 4 + try: + if len(text) <= MAX_WRITE: + write(text) + else: + batch: List[str] = [] + batch_append = batch.append + size = 0 + for line in text.splitlines(True): + if size + len(line) > MAX_WRITE and batch: + write("".join(batch)) + batch.clear() + size = 0 + batch_append(line) + size += len(line) + if batch: + write("".join(batch)) + batch.clear() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + else: + text = self._render_buffer(self._buffer[:]) + try: + self.file.write(text) + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + + self.file.flush() + del self._buffer[:] + + def _render_buffer(self, buffer: Iterable[Segment]) -> str: + """Render buffered output, and clear buffer.""" + output: List[str] = [] + append = output.append + color_system = self._color_system + legacy_windows = self.legacy_windows + not_terminal = not self.is_terminal + if self.no_color and color_system: + buffer = Segment.remove_color(buffer) + for text, style, control in buffer: + if style: + append( + style.render( + text, + color_system=color_system, + legacy_windows=legacy_windows, + ) + ) + elif not (not_terminal and control): + append(text) + + rendered = "".join(output) + return rendered + + def input( + self, + prompt: TextType = "", + *, + markup: bool = True, + emoji: bool = True, + password: bool = False, + stream: Optional[TextIO] = None, + ) -> str: + """Displays a prompt and waits for input from the user. The prompt may contain color / style. + + It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. + + Args: + prompt (Union[str, Text]): Text to render in the prompt. + markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. + emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. + password: (bool, optional): Hide typed text. Defaults to False. + stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. + + Returns: + str: Text read from stdin. + """ + if prompt: + self.print(prompt, markup=markup, emoji=emoji, end="") + if password: + result = getpass("", stream=stream) + else: + if stream: + result = stream.readline() + else: + result = input() + return result + + def export_text(self, *, clear: bool = True, styles: bool = False) -> str: + """Generate text from console contents (requires record=True argument in constructor). + + Args: + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. + Defaults to ``False``. + + Returns: + str: String containing console contents. + + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + + with self._record_buffer_lock: + if styles: + text = "".join( + (style.render(text) if style else text) + for text, style, _ in self._record_buffer + ) + else: + text = "".join( + segment.text + for segment in self._record_buffer + if not segment.control + ) + if clear: + del self._record_buffer[:] + return text + + def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: + """Generate text from console and save to a given location (requires record=True argument in constructor). + + Args: + path (str): Path to write text files. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. + Defaults to ``False``. + + """ + text = self.export_text(clear=clear, styles=styles) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(text) + + def export_html( + self, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: Optional[str] = None, + inline_styles: bool = False, + ) -> str: + """Generate HTML from console contents (requires record=True argument in constructor). + + Args: + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + Returns: + str: String containing console contents as HTML. + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + fragments: List[str] = [] + append = fragments.append + _theme = theme or DEFAULT_TERMINAL_THEME + stylesheet = "" + + render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format + + with self._record_buffer_lock: + if inline_styles: + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + if style.link: + text = f'
    {text}' + text = f'{text}' if rule else text + append(text) + else: + styles: Dict[str, int] = {} + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + style_number = styles.setdefault(rule, len(styles) + 1) + if style.link: + text = f'{text}' + else: + text = f'{text}' + append(text) + stylesheet_rules: List[str] = [] + stylesheet_append = stylesheet_rules.append + for style_rule, style_number in styles.items(): + if style_rule: + stylesheet_append(f".r{style_number} {{{style_rule}}}") + stylesheet = "\n".join(stylesheet_rules) + + rendered_code = render_code_format.format( + code="".join(fragments), + stylesheet=stylesheet, + foreground=_theme.foreground_color.hex, + background=_theme.background_color.hex, + ) + if clear: + del self._record_buffer[:] + return rendered_code + + def save_html( + self, + path: str, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_HTML_FORMAT, + inline_styles: bool = False, + ) -> None: + """Generate HTML from console contents and write to a file (requires record=True argument in constructor). + + Args: + path (str): Path to write html file. + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + """ + html = self.export_html( + theme=theme, + clear=clear, + code_format=code_format, + inline_styles=inline_styles, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(html) + + def export_svg( + self, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> str: + """ + Generate an SVG from the console contents (requires record=True in Console constructor). + + Args: + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + + from pip._vendor.rich.cells import cell_len + + style_cache: Dict[Style, str] = {} + + def get_svg_style(style: Style) -> str: + """Convert a Style to CSS rules for SVG.""" + if style in style_cache: + return style_cache[style] + css_rules = [] + color = ( + _theme.foreground_color + if (style.color is None or style.color.is_default) + else style.color.get_truecolor(_theme) + ) + bgcolor = ( + _theme.background_color + if (style.bgcolor is None or style.bgcolor.is_default) + else style.bgcolor.get_truecolor(_theme) + ) + if style.reverse: + color, bgcolor = bgcolor, color + if style.dim: + color = blend_rgb(color, bgcolor, 0.4) + css_rules.append(f"fill: {color.hex}") + if style.bold: + css_rules.append("font-weight: bold") + if style.italic: + css_rules.append("font-style: italic;") + if style.underline: + css_rules.append("text-decoration: underline;") + if style.strike: + css_rules.append("text-decoration: line-through;") + + css = ";".join(css_rules) + style_cache[style] = css + return css + + _theme = theme or SVG_EXPORT_THEME + + width = self.width + char_height = 20 + char_width = char_height * font_aspect_ratio + line_height = char_height * 1.22 + + margin_top = 1 + margin_right = 1 + margin_bottom = 1 + margin_left = 1 + + padding_top = 40 + padding_right = 8 + padding_bottom = 8 + padding_left = 8 + + padding_width = padding_left + padding_right + padding_height = padding_top + padding_bottom + margin_width = margin_left + margin_right + margin_height = margin_top + margin_bottom + + text_backgrounds: List[str] = [] + text_group: List[str] = [] + classes: Dict[str, int] = {} + style_no = 1 + + def escape_text(text: str) -> str: + """HTML escape text and replace spaces with nbsp.""" + return escape(text).replace(" ", " ") + + def make_tag( + name: str, content: Optional[str] = None, **attribs: object + ) -> str: + """Make a tag from name, content, and attributes.""" + + def stringify(value: object) -> str: + if isinstance(value, (float)): + return format(value, "g") + return str(value) + + tag_attribs = " ".join( + f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' + for k, v in attribs.items() + ) + return ( + f"<{name} {tag_attribs}>{content}" + if content + else f"<{name} {tag_attribs}/>" + ) + + with self._record_buffer_lock: + segments = list(Segment.filter_control(self._record_buffer)) + if clear: + self._record_buffer.clear() + + if unique_id is None: + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(repr(segment) for segment in segments)).encode( + "utf-8", + "ignore", + ) + + title.encode("utf-8", "ignore") + ) + ) + y = 0 + for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): + x = 0 + for text, style, _control in line: + style = style or Style() + rules = get_svg_style(style) + if rules not in classes: + classes[rules] = style_no + style_no += 1 + class_name = f"r{classes[rules]}" + + if style.reverse: + has_background = True + background = ( + _theme.foreground_color.hex + if style.color is None + else style.color.get_truecolor(_theme).hex + ) + else: + bgcolor = style.bgcolor + has_background = bgcolor is not None and not bgcolor.is_default + background = ( + _theme.background_color.hex + if style.bgcolor is None + else style.bgcolor.get_truecolor(_theme).hex + ) + + text_length = cell_len(text) + if has_background: + text_backgrounds.append( + make_tag( + "rect", + fill=background, + x=x * char_width, + y=y * line_height + 1.5, + width=char_width * text_length, + height=line_height + 0.25, + shape_rendering="crispEdges", + ) + ) + + if text != " " * len(text): + text_group.append( + make_tag( + "text", + escape_text(text), + _class=f"{unique_id}-{class_name}", + x=x * char_width, + y=y * line_height + char_height, + textLength=char_width * len(text), + clip_path=f"url(#{unique_id}-line-{y})", + ) + ) + x += cell_len(text) + + line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] + lines = "\n".join( + f""" + {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} + """ + for line_no, offset in enumerate(line_offsets) + ) + + styles = "\n".join( + f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() + ) + backgrounds = "".join(text_backgrounds) + matrix = "".join(text_group) + + terminal_width = ceil(width * char_width + padding_width) + terminal_height = (y + 1) * line_height + padding_height + chrome = make_tag( + "rect", + fill=_theme.background_color.hex, + stroke="rgba(255,255,255,0.35)", + stroke_width="1", + x=margin_left, + y=margin_top, + width=terminal_width, + height=terminal_height, + rx=8, + ) + + title_color = _theme.foreground_color.hex + if title: + chrome += make_tag( + "text", + escape_text(title), + _class=f"{unique_id}-title", + fill=title_color, + text_anchor="middle", + x=terminal_width // 2, + y=margin_top + char_height + 6, + ) + chrome += f""" + + + + + + """ + + svg = code_format.format( + unique_id=unique_id, + char_width=char_width, + char_height=char_height, + line_height=line_height, + terminal_width=char_width * width - 1, + terminal_height=(y + 1) * line_height - 1, + width=terminal_width + margin_width, + height=terminal_height + margin_height, + terminal_x=margin_left + padding_left, + terminal_y=margin_top + padding_top, + styles=styles, + chrome=chrome, + backgrounds=backgrounds, + matrix=matrix, + lines=lines, + ) + return svg + + def save_svg( + self, + path: str, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> None: + """Generate an SVG file from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + svg = self.export_svg( + title=title, + theme=theme, + clear=clear, + code_format=code_format, + font_aspect_ratio=font_aspect_ratio, + unique_id=unique_id, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(svg) + + +def _svg_hash(svg_main_code: str) -> str: + """Returns a unique hash for the given SVG main code. + + Args: + svg_main_code (str): The content we're going to inject in the SVG envelope. + + Returns: + str: a hash of the given content + """ + return str(zlib.adler32(svg_main_code.encode())) + + +if __name__ == "__main__": # pragma: no cover + console = Console(record=True) + + console.log( + "JSONRPC [i]request[/i]", + 5, + 1.3, + True, + False, + None, + { + "jsonrpc": "2.0", + "method": "subtract", + "params": {"minuend": 42, "subtrahend": 23}, + "id": 3, + }, + ) + + console.log("Hello, World!", "{'a': 1}", repr(console)) + + console.print( + { + "name": None, + "empty": [], + "quiz": { + "sport": { + "answered": True, + "q1": { + "question": "Which one is correct team name in NBA?", + "options": [ + "New York Bulls", + "Los Angeles Kings", + "Golden State Warriors", + "Huston Rocket", + ], + "answer": "Huston Rocket", + }, + }, + "maths": { + "answered": False, + "q1": { + "question": "5 + 7 = ?", + "options": [10, 11, 12, 13], + "answer": 12, + }, + "q2": { + "question": "12 - 8 = ?", + "options": [1, 2, 3, 4], + "answer": 4, + }, + }, + }, + } + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py new file mode 100644 index 0000000..65fdf56 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py @@ -0,0 +1,37 @@ +from typing import Optional, TYPE_CHECKING + +from .jupyter import JupyterMixin +from .measure import Measurement + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + + +class Constrain(JupyterMixin): + """Constrain the width of a renderable to a given number of characters. + + Args: + renderable (RenderableType): A renderable object. + width (int, optional): The maximum width (in characters) to render. Defaults to 80. + """ + + def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: + self.renderable = renderable + self.width = width + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.width is None: + yield self.renderable + else: + child_options = options.update_width(min(self.width, options.max_width)) + yield from console.render(self.renderable, child_options) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.width is not None: + options = options.update_width(self.width) + measurement = Measurement.get(console, options, self.renderable) + return measurement diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py new file mode 100644 index 0000000..901ff8b --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/containers.py @@ -0,0 +1,167 @@ +from itertools import zip_longest +from typing import ( + TYPE_CHECKING, + Iterable, + Iterator, + List, + Optional, + TypeVar, + Union, + overload, +) + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + JustifyMethod, + OverflowMethod, + RenderResult, + RenderableType, + ) + from .text import Text + +from .cells import cell_len +from .measure import Measurement + +T = TypeVar("T") + + +class Renderables: + """A list subclass which renders its contents to the console.""" + + def __init__( + self, renderables: Optional[Iterable["RenderableType"]] = None + ) -> None: + self._renderables: List["RenderableType"] = ( + list(renderables) if renderables is not None else [] + ) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._renderables + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + dimensions = [ + Measurement.get(console, options, renderable) + for renderable in self._renderables + ] + if not dimensions: + return Measurement(1, 1) + _min = max(dimension.minimum for dimension in dimensions) + _max = max(dimension.maximum for dimension in dimensions) + return Measurement(_min, _max) + + def append(self, renderable: "RenderableType") -> None: + self._renderables.append(renderable) + + def __iter__(self) -> Iterable["RenderableType"]: + return iter(self._renderables) + + +class Lines: + """A list subclass which can render to the console.""" + + def __init__(self, lines: Iterable["Text"] = ()) -> None: + self._lines: List["Text"] = list(lines) + + def __repr__(self) -> str: + return f"Lines({self._lines!r})" + + def __iter__(self) -> Iterator["Text"]: + return iter(self._lines) + + @overload + def __getitem__(self, index: int) -> "Text": + ... + + @overload + def __getitem__(self, index: slice) -> List["Text"]: + ... + + def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: + return self._lines[index] + + def __setitem__(self, index: int, value: "Text") -> "Lines": + self._lines[index] = value + return self + + def __len__(self) -> int: + return self._lines.__len__() + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + """Console render method to insert line-breaks.""" + yield from self._lines + + def append(self, line: "Text") -> None: + self._lines.append(line) + + def extend(self, lines: Iterable["Text"]) -> None: + self._lines.extend(lines) + + def pop(self, index: int = -1) -> "Text": + return self._lines.pop(index) + + def justify( + self, + console: "Console", + width: int, + justify: "JustifyMethod" = "left", + overflow: "OverflowMethod" = "fold", + ) -> None: + """Justify and overflow text to a given width. + + Args: + console (Console): Console instance. + width (int): Number of cells available per line. + justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". + overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". + + """ + from .text import Text + + if justify == "left": + for line in self._lines: + line.truncate(width, overflow=overflow, pad=True) + elif justify == "center": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left((width - cell_len(line.plain)) // 2) + line.pad_right(width - cell_len(line.plain)) + elif justify == "right": + for line in self._lines: + line.rstrip() + line.truncate(width, overflow=overflow) + line.pad_left(width - cell_len(line.plain)) + elif justify == "full": + for line_index, line in enumerate(self._lines): + if line_index == len(self._lines) - 1: + break + words = line.split(" ") + words_size = sum(cell_len(word.plain) for word in words) + num_spaces = len(words) - 1 + spaces = [1 for _ in range(num_spaces)] + index = 0 + if spaces: + while words_size + num_spaces < width: + spaces[len(spaces) - index - 1] += 1 + num_spaces += 1 + index = (index + 1) % len(spaces) + tokens: List[Text] = [] + for index, (word, next_word) in enumerate( + zip_longest(words, words[1:]) + ): + tokens.append(word) + if index < len(spaces): + style = word.get_style_at_offset(console, -1) + next_style = next_word.get_style_at_offset(console, 0) + space_style = style if style == next_style else line.style + tokens.append(Text(" " * spaces[index], style=space_style)) + self[line_index] = Text("").join(tokens) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/control.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/control.py new file mode 100644 index 0000000..88fcb92 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/control.py @@ -0,0 +1,225 @@ +import sys +import time +from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union + +if sys.version_info >= (3, 8): + from typing import Final +else: + from pip._vendor.typing_extensions import Final # pragma: no cover + +from .segment import ControlCode, ControlType, Segment + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +STRIP_CONTROL_CODES: Final = [ + 7, # Bell + 8, # Backspace + 11, # Vertical tab + 12, # Form feed + 13, # Carriage return +] +_CONTROL_STRIP_TRANSLATE: Final = { + _codepoint: None for _codepoint in STRIP_CONTROL_CODES +} + +CONTROL_ESCAPE: Final = { + 7: "\\a", + 8: "\\b", + 11: "\\v", + 12: "\\f", + 13: "\\r", +} + +CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { + ControlType.BELL: lambda: "\x07", + ControlType.CARRIAGE_RETURN: lambda: "\r", + ControlType.HOME: lambda: "\x1b[H", + ControlType.CLEAR: lambda: "\x1b[2J", + ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", + ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", + ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", + ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", + ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", + ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", + ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", + ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", + ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", + ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", + ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", + ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", +} + + +class Control: + """A renderable that inserts a control code (non printable but may move cursor). + + Args: + *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a + tuple of ControlType and an integer parameter + """ + + __slots__ = ["segment"] + + def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: + control_codes: List[ControlCode] = [ + (code,) if isinstance(code, ControlType) else code for code in codes + ] + _format_map = CONTROL_CODES_FORMAT + rendered_codes = "".join( + _format_map[code](*parameters) for code, *parameters in control_codes + ) + self.segment = Segment(rendered_codes, None, control_codes) + + @classmethod + def bell(cls) -> "Control": + """Ring the 'bell'.""" + return cls(ControlType.BELL) + + @classmethod + def home(cls) -> "Control": + """Move cursor to 'home' position.""" + return cls(ControlType.HOME) + + @classmethod + def move(cls, x: int = 0, y: int = 0) -> "Control": + """Move cursor relative to current position. + + Args: + x (int): X offset. + y (int): Y offset. + + Returns: + ~Control: Control object. + + """ + + def get_codes() -> Iterable[ControlCode]: + control = ControlType + if x: + yield ( + control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, + abs(x), + ) + if y: + yield ( + control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, + abs(y), + ) + + control = cls(*get_codes()) + return control + + @classmethod + def move_to_column(cls, x: int, y: int = 0) -> "Control": + """Move to the given column, optionally add offset to row. + + Returns: + x (int): absolute x (column) + y (int): optional y offset (row) + + Returns: + ~Control: Control object. + """ + + return ( + cls( + (ControlType.CURSOR_MOVE_TO_COLUMN, x), + ( + ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, + abs(y), + ), + ) + if y + else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) + ) + + @classmethod + def move_to(cls, x: int, y: int) -> "Control": + """Move cursor to absolute position. + + Args: + x (int): x offset (column) + y (int): y offset (row) + + Returns: + ~Control: Control object. + """ + return cls((ControlType.CURSOR_MOVE_TO, x, y)) + + @classmethod + def clear(cls) -> "Control": + """Clear the screen.""" + return cls(ControlType.CLEAR) + + @classmethod + def show_cursor(cls, show: bool) -> "Control": + """Show or hide the cursor.""" + return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) + + @classmethod + def alt_screen(cls, enable: bool) -> "Control": + """Enable or disable alt screen.""" + if enable: + return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) + else: + return cls(ControlType.DISABLE_ALT_SCREEN) + + @classmethod + def title(cls, title: str) -> "Control": + """Set the terminal window title + + Args: + title (str): The new terminal window title + """ + return cls((ControlType.SET_WINDOW_TITLE, title)) + + def __str__(self) -> str: + return self.segment.text + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.segment.text: + yield self.segment + + +def strip_control_codes( + text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE +) -> str: + """Remove control codes from text. + + Args: + text (str): A string possibly contain control codes. + + Returns: + str: String with control codes removed. + """ + return text.translate(_translate_table) + + +def escape_control_codes( + text: str, + _translate_table: Dict[int, str] = CONTROL_ESCAPE, +) -> str: + """Replace control codes with their "escaped" equivalent in the given text. + (e.g. "\b" becomes "\\b") + + Args: + text (str): A string possibly containing control codes. + + Returns: + str: String with control codes replaced with their escaped version. + """ + return text.translate(_translate_table) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + console = Console() + console.print("Look at the title of your terminal window ^") + # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) + for i in range(10): + console.set_window_title("🚀 Loading" + "." * i) + time.sleep(0.5) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py new file mode 100644 index 0000000..dca3719 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py @@ -0,0 +1,190 @@ +from typing import Dict + +from .style import Style + +DEFAULT_STYLES: Dict[str, Style] = { + "none": Style.null(), + "reset": Style( + color="default", + bgcolor="default", + dim=False, + bold=False, + italic=False, + underline=False, + blink=False, + blink2=False, + reverse=False, + conceal=False, + strike=False, + ), + "dim": Style(dim=True), + "bright": Style(dim=False), + "bold": Style(bold=True), + "strong": Style(bold=True), + "code": Style(reverse=True, bold=True), + "italic": Style(italic=True), + "emphasize": Style(italic=True), + "underline": Style(underline=True), + "blink": Style(blink=True), + "blink2": Style(blink2=True), + "reverse": Style(reverse=True), + "strike": Style(strike=True), + "black": Style(color="black"), + "red": Style(color="red"), + "green": Style(color="green"), + "yellow": Style(color="yellow"), + "magenta": Style(color="magenta"), + "cyan": Style(color="cyan"), + "white": Style(color="white"), + "inspect.attr": Style(color="yellow", italic=True), + "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), + "inspect.callable": Style(bold=True, color="red"), + "inspect.async_def": Style(italic=True, color="bright_cyan"), + "inspect.def": Style(italic=True, color="bright_cyan"), + "inspect.class": Style(italic=True, color="bright_cyan"), + "inspect.error": Style(bold=True, color="red"), + "inspect.equals": Style(), + "inspect.help": Style(color="cyan"), + "inspect.doc": Style(dim=True), + "inspect.value.border": Style(color="green"), + "live.ellipsis": Style(bold=True, color="red"), + "layout.tree.row": Style(dim=False, color="red"), + "layout.tree.column": Style(dim=False, color="blue"), + "logging.keyword": Style(bold=True, color="yellow"), + "logging.level.notset": Style(dim=True), + "logging.level.debug": Style(color="green"), + "logging.level.info": Style(color="blue"), + "logging.level.warning": Style(color="red"), + "logging.level.error": Style(color="red", bold=True), + "logging.level.critical": Style(color="red", bold=True, reverse=True), + "log.level": Style.null(), + "log.time": Style(color="cyan", dim=True), + "log.message": Style.null(), + "log.path": Style(dim=True), + "repr.ellipsis": Style(color="yellow"), + "repr.indent": Style(color="green", dim=True), + "repr.error": Style(color="red", bold=True), + "repr.str": Style(color="green", italic=False, bold=False), + "repr.brace": Style(bold=True), + "repr.comma": Style(bold=True), + "repr.ipv4": Style(bold=True, color="bright_green"), + "repr.ipv6": Style(bold=True, color="bright_green"), + "repr.eui48": Style(bold=True, color="bright_green"), + "repr.eui64": Style(bold=True, color="bright_green"), + "repr.tag_start": Style(bold=True), + "repr.tag_name": Style(color="bright_magenta", bold=True), + "repr.tag_contents": Style(color="default"), + "repr.tag_end": Style(bold=True), + "repr.attrib_name": Style(color="yellow", italic=False), + "repr.attrib_equal": Style(bold=True), + "repr.attrib_value": Style(color="magenta", italic=False), + "repr.number": Style(color="cyan", bold=True, italic=False), + "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same + "repr.bool_true": Style(color="bright_green", italic=True), + "repr.bool_false": Style(color="bright_red", italic=True), + "repr.none": Style(color="magenta", italic=True), + "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), + "repr.uuid": Style(color="bright_yellow", bold=False), + "repr.call": Style(color="magenta", bold=True), + "repr.path": Style(color="magenta"), + "repr.filename": Style(color="bright_magenta"), + "rule.line": Style(color="bright_green"), + "rule.text": Style.null(), + "json.brace": Style(bold=True), + "json.bool_true": Style(color="bright_green", italic=True), + "json.bool_false": Style(color="bright_red", italic=True), + "json.null": Style(color="magenta", italic=True), + "json.number": Style(color="cyan", bold=True, italic=False), + "json.str": Style(color="green", italic=False, bold=False), + "json.key": Style(color="blue", bold=True), + "prompt": Style.null(), + "prompt.choices": Style(color="magenta", bold=True), + "prompt.default": Style(color="cyan", bold=True), + "prompt.invalid": Style(color="red"), + "prompt.invalid.choice": Style(color="red"), + "pretty": Style.null(), + "scope.border": Style(color="blue"), + "scope.key": Style(color="yellow", italic=True), + "scope.key.special": Style(color="yellow", italic=True, dim=True), + "scope.equals": Style(color="red"), + "table.header": Style(bold=True), + "table.footer": Style(bold=True), + "table.cell": Style.null(), + "table.title": Style(italic=True), + "table.caption": Style(italic=True, dim=True), + "traceback.error": Style(color="red", italic=True), + "traceback.border.syntax_error": Style(color="bright_red"), + "traceback.border": Style(color="red"), + "traceback.text": Style.null(), + "traceback.title": Style(color="red", bold=True), + "traceback.exc_type": Style(color="bright_red", bold=True), + "traceback.exc_value": Style.null(), + "traceback.offset": Style(color="bright_red", bold=True), + "bar.back": Style(color="grey23"), + "bar.complete": Style(color="rgb(249,38,114)"), + "bar.finished": Style(color="rgb(114,156,31)"), + "bar.pulse": Style(color="rgb(249,38,114)"), + "progress.description": Style.null(), + "progress.filesize": Style(color="green"), + "progress.filesize.total": Style(color="green"), + "progress.download": Style(color="green"), + "progress.elapsed": Style(color="yellow"), + "progress.percentage": Style(color="magenta"), + "progress.remaining": Style(color="cyan"), + "progress.data.speed": Style(color="red"), + "progress.spinner": Style(color="green"), + "status.spinner": Style(color="green"), + "tree": Style(), + "tree.line": Style(), + "markdown.paragraph": Style(), + "markdown.text": Style(), + "markdown.em": Style(italic=True), + "markdown.emph": Style(italic=True), # For commonmark backwards compatibility + "markdown.strong": Style(bold=True), + "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), + "markdown.code_block": Style(color="cyan", bgcolor="black"), + "markdown.block_quote": Style(color="magenta"), + "markdown.list": Style(color="cyan"), + "markdown.item": Style(), + "markdown.item.bullet": Style(color="yellow", bold=True), + "markdown.item.number": Style(color="yellow", bold=True), + "markdown.hr": Style(color="yellow"), + "markdown.h1.border": Style(), + "markdown.h1": Style(bold=True), + "markdown.h2": Style(bold=True, underline=True), + "markdown.h3": Style(bold=True), + "markdown.h4": Style(bold=True, dim=True), + "markdown.h5": Style(underline=True), + "markdown.h6": Style(italic=True), + "markdown.h7": Style(italic=True, dim=True), + "markdown.link": Style(color="bright_blue"), + "markdown.link_url": Style(color="blue", underline=True), + "markdown.s": Style(strike=True), + "iso8601.date": Style(color="blue"), + "iso8601.time": Style(color="magenta"), + "iso8601.timezone": Style(color="yellow"), +} + + +if __name__ == "__main__": # pragma: no cover + import argparse + import io + + from pip._vendor.rich.console import Console + from pip._vendor.rich.table import Table + from pip._vendor.rich.text import Text + + parser = argparse.ArgumentParser() + parser.add_argument("--html", action="store_true", help="Export as HTML table") + args = parser.parse_args() + html: bool = args.html + console = Console(record=True, width=70, file=io.StringIO()) if html else Console() + + table = Table("Name", "Styling") + + for style_name, style in DEFAULT_STYLES.items(): + table.add_row(Text(style_name, style=style), str(style)) + + console.print(table) + if html: + print(console.export_html(inline_styles=True)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py new file mode 100644 index 0000000..ad36183 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py @@ -0,0 +1,37 @@ +import os +import platform + +from pip._vendor.rich import inspect +from pip._vendor.rich.console import Console, get_windows_console_features +from pip._vendor.rich.panel import Panel +from pip._vendor.rich.pretty import Pretty + + +def report() -> None: # pragma: no cover + """Print a report to the terminal with debugging information""" + console = Console() + inspect(console) + features = get_windows_console_features() + inspect(features) + + env_names = ( + "TERM", + "COLORTERM", + "CLICOLOR", + "NO_COLOR", + "TERM_PROGRAM", + "COLUMNS", + "LINES", + "JUPYTER_COLUMNS", + "JUPYTER_LINES", + "JPY_PARENT_PID", + "VSCODE_VERBOSE_LOGGING", + ) + env = {name: os.getenv(name) for name in env_names} + console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) + + console.print(f'platform="{platform.system()}"') + + +if __name__ == "__main__": # pragma: no cover + report() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py new file mode 100644 index 0000000..791f046 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py @@ -0,0 +1,96 @@ +import sys +from typing import TYPE_CHECKING, Optional, Union + +from .jupyter import JupyterMixin +from .segment import Segment +from .style import Style +from ._emoji_codes import EMOJI +from ._emoji_replace import _emoji_replace + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + + +EmojiVariant = Literal["emoji", "text"] + + +class NoEmoji(Exception): + """No emoji by that name.""" + + +class Emoji(JupyterMixin): + __slots__ = ["name", "style", "_char", "variant"] + + VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} + + def __init__( + self, + name: str, + style: Union[str, Style] = "none", + variant: Optional[EmojiVariant] = None, + ) -> None: + """A single emoji character. + + Args: + name (str): Name of emoji. + style (Union[str, Style], optional): Optional style. Defaults to None. + + Raises: + NoEmoji: If the emoji doesn't exist. + """ + self.name = name + self.style = style + self.variant = variant + try: + self._char = EMOJI[name] + except KeyError: + raise NoEmoji(f"No emoji called {name!r}") + if variant is not None: + self._char += self.VARIANTS.get(variant, "") + + @classmethod + def replace(cls, text: str) -> str: + """Replace emoji markup with corresponding unicode characters. + + Args: + text (str): A string with emojis codes, e.g. "Hello :smiley:!" + + Returns: + str: A string with emoji codes replaces with actual emoji. + """ + return _emoji_replace(text) + + def __repr__(self) -> str: + return f"" + + def __str__(self) -> str: + return self._char + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + yield Segment(self._char, console.get_style(self.style)) + + +if __name__ == "__main__": # pragma: no cover + import sys + + from pip._vendor.rich.columns import Columns + from pip._vendor.rich.console import Console + + console = Console(record=True) + + columns = Columns( + (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), + column_first=True, + ) + + console.print(columns) + if len(sys.argv) > 1: + console.save_html(sys.argv[1]) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/errors.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/errors.py new file mode 100644 index 0000000..0bcbe53 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/errors.py @@ -0,0 +1,34 @@ +class ConsoleError(Exception): + """An error in console operation.""" + + +class StyleError(Exception): + """An error in styles.""" + + +class StyleSyntaxError(ConsoleError): + """Style was badly formatted.""" + + +class MissingStyle(StyleError): + """No such style.""" + + +class StyleStackError(ConsoleError): + """Style stack is invalid.""" + + +class NotRenderableError(ConsoleError): + """Object is not renderable.""" + + +class MarkupError(ConsoleError): + """Markup was badly formatted.""" + + +class LiveError(ConsoleError): + """Error related to Live display.""" + + +class NoAltScreen(ConsoleError): + """Alt screen mode was required.""" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py new file mode 100644 index 0000000..4b0b0da --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py @@ -0,0 +1,57 @@ +import io +from typing import IO, TYPE_CHECKING, Any, List + +from .ansi import AnsiDecoder +from .text import Text + +if TYPE_CHECKING: + from .console import Console + + +class FileProxy(io.TextIOBase): + """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" + + def __init__(self, console: "Console", file: IO[str]) -> None: + self.__console = console + self.__file = file + self.__buffer: List[str] = [] + self.__ansi_decoder = AnsiDecoder() + + @property + def rich_proxied_file(self) -> IO[str]: + """Get proxied file.""" + return self.__file + + def __getattr__(self, name: str) -> Any: + return getattr(self.__file, name) + + def write(self, text: str) -> int: + if not isinstance(text, str): + raise TypeError(f"write() argument must be str, not {type(text).__name__}") + buffer = self.__buffer + lines: List[str] = [] + while text: + line, new_line, text = text.partition("\n") + if new_line: + lines.append("".join(buffer) + line) + buffer.clear() + else: + buffer.append(line) + break + if lines: + console = self.__console + with console: + output = Text("\n").join( + self.__ansi_decoder.decode_line(line) for line in lines + ) + console.print(output) + return len(text) + + def flush(self) -> None: + output = "".join(self.__buffer) + if output: + self.__console.print(output) + del self.__buffer[:] + + def fileno(self) -> int: + return self.__file.fileno() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py new file mode 100644 index 0000000..99f118e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py @@ -0,0 +1,89 @@ +# coding: utf-8 +"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 + +The functions declared in this module should cover the different +use cases needed to generate a string representation of a file size +using several different units. Since there are many standards regarding +file size units, three different functions have been implemented. + +See Also: + * `Wikipedia: Binary prefix `_ + +""" + +__all__ = ["decimal"] + +from typing import Iterable, List, Optional, Tuple + + +def _to_str( + size: int, + suffixes: Iterable[str], + base: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + if size == 1: + return "1 byte" + elif size < base: + return "{:,} bytes".format(size) + + for i, suffix in enumerate(suffixes, 2): # noqa: B007 + unit = base**i + if size < unit: + break + return "{:,.{precision}f}{separator}{}".format( + (base * size / unit), + suffix, + precision=precision, + separator=separator, + ) + + +def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: + """Pick a suffix and base for the given size.""" + for i, suffix in enumerate(suffixes): + unit = base**i + if size < unit * base: + break + return unit, suffix + + +def decimal( + size: int, + *, + precision: Optional[int] = 1, + separator: Optional[str] = " ", +) -> str: + """Convert a filesize in to a string (powers of 1000, SI prefixes). + + In this convention, ``1000 B = 1 kB``. + + This is typically the format used to advertise the storage + capacity of USB flash drives and the like (*256 MB* meaning + actually a storage capacity of more than *256 000 000 B*), + or used by **Mac OS X** since v10.6 to report file sizes. + + Arguments: + int (size): A file size. + int (precision): The number of decimal places to include (default = 1). + str (separator): The string to separate the value from the units (default = " "). + + Returns: + `str`: A string containing a abbreviated file size and units. + + Example: + >>> filesize.decimal(30000) + '30.0 kB' + >>> filesize.decimal(30000, precision=2, separator="") + '30.00kB' + + """ + return _to_str( + size, + ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), + 1000, + precision=precision, + separator=separator, + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py new file mode 100644 index 0000000..27714b2 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py @@ -0,0 +1,232 @@ +import re +from abc import ABC, abstractmethod +from typing import List, Union + +from .text import Span, Text + + +def _combine_regex(*regexes: str) -> str: + """Combine a number of regexes in to a single regex. + + Returns: + str: New regex with all regexes ORed together. + """ + return "|".join(regexes) + + +class Highlighter(ABC): + """Abstract base class for highlighters.""" + + def __call__(self, text: Union[str, Text]) -> Text: + """Highlight a str or Text instance. + + Args: + text (Union[str, ~Text]): Text to highlight. + + Raises: + TypeError: If not called with text or str. + + Returns: + Text: A test instance with highlighting applied. + """ + if isinstance(text, str): + highlight_text = Text(text) + elif isinstance(text, Text): + highlight_text = text.copy() + else: + raise TypeError(f"str or Text instance required, not {text!r}") + self.highlight(highlight_text) + return highlight_text + + @abstractmethod + def highlight(self, text: Text) -> None: + """Apply highlighting in place to text. + + Args: + text (~Text): A text object highlight. + """ + + +class NullHighlighter(Highlighter): + """A highlighter object that doesn't highlight. + + May be used to disable highlighting entirely. + + """ + + def highlight(self, text: Text) -> None: + """Nothing to do""" + + +class RegexHighlighter(Highlighter): + """Applies highlighting from a list of regular expressions.""" + + highlights: List[str] = [] + base_style: str = "" + + def highlight(self, text: Text) -> None: + """Highlight :class:`rich.text.Text` using regular expressions. + + Args: + text (~Text): Text to highlighted. + + """ + + highlight_regex = text.highlight_regex + for re_highlight in self.highlights: + highlight_regex(re_highlight, style_prefix=self.base_style) + + +class ReprHighlighter(RegexHighlighter): + """Highlights the text typically produced from ``__repr__`` methods.""" + + base_style = "repr." + highlights = [ + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", + r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', + r"(?P[][{}()])", + _combine_regex( + r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", + r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", + r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", + r"(?P[\w.]*?)\(", + r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", + r"(?P\.\.\.)", + r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", + r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~]*)", + ), + ] + + +class JSONHighlighter(RegexHighlighter): + """Highlights JSON""" + + # Captures the start and end of JSON strings, handling escaped quotes + JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", + r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", + r"(?P(? None: + super().highlight(text) + + # Additional work to handle highlighting JSON keys + plain = text.plain + append = text.spans.append + whitespace = self.JSON_WHITESPACE + for match in re.finditer(self.JSON_STR, plain): + start, end = match.span() + cursor = end + while cursor < len(plain): + char = plain[cursor] + cursor += 1 + if char == ":": + append(Span(start, end, "json.key")) + elif char in whitespace: + continue + break + + +class ISO8601Highlighter(RegexHighlighter): + """Highlights the ISO8601 date time strings. + Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html + """ + + base_style = "iso8601." + highlights = [ + # + # Dates + # + # Calendar month (e.g. 2008-08). The hyphen is required + r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", + # Calendar date w/o hyphens (e.g. 20080830) + r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", + # Ordinal date (e.g. 2008-243). The hyphen is optional + r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", + # + # Weeks + # + # Week of the year (e.g., 2008-W35). The hyphen is optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", + # Week date (e.g., 2008-W35-6). The hyphens are optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", + # + # Times + # + # Hours and minutes (e.g., 17:21). The colon is optional + r"^(?P
    {text}' + append_fragment(text) + + code = "".join(fragments) + html = JUPYTER_HTML_FORMAT.format(code=code) + + return html + + +def display(segments: Iterable[Segment], text: str) -> None: + """Render segments to Jupyter.""" + html = _render_segments(segments) + jupyter_renderable = JupyterRenderable(html, text) + try: + from IPython.display import display as ipython_display + + ipython_display(jupyter_renderable) + except ModuleNotFoundError: + # Handle the case where the Console has force_jupyter=True, + # but IPython is not installed. + pass + + +def print(*args: Any, **kwargs: Any) -> None: + """Proxy for Console print.""" + console = get_console() + return console.print(*args, **kwargs) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py new file mode 100644 index 0000000..a6f1a31 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/layout.py @@ -0,0 +1,442 @@ +from abc import ABC, abstractmethod +from itertools import islice +from operator import itemgetter +from threading import RLock +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) + +from ._ratio import ratio_resolve +from .align import Align +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .highlighter import ReprHighlighter +from .panel import Panel +from .pretty import Pretty +from .region import Region +from .repr import Result, rich_repr +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from pip._vendor.rich.tree import Tree + + +class LayoutRender(NamedTuple): + """An individual layout render.""" + + region: Region + render: List[List[Segment]] + + +RegionMap = Dict["Layout", Region] +RenderMap = Dict["Layout", LayoutRender] + + +class LayoutError(Exception): + """Layout related error.""" + + +class NoSplitter(LayoutError): + """Requested splitter does not exist.""" + + +class _Placeholder: + """An internal renderable used as a Layout placeholder.""" + + highlighter = ReprHighlighter() + + def __init__(self, layout: "Layout", style: StyleType = "") -> None: + self.layout = layout + self.style = style + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + width = options.max_width + height = options.height or options.size.height + layout = self.layout + title = ( + f"{layout.name!r} ({width} x {height})" + if layout.name + else f"({width} x {height})" + ) + yield Panel( + Align.center(Pretty(layout), vertical="middle"), + style=self.style, + title=self.highlighter(title), + border_style="blue", + height=height, + ) + + +class Splitter(ABC): + """Base class for a splitter.""" + + name: str = "" + + @abstractmethod + def get_tree_icon(self) -> str: + """Get the icon (emoji) used in layout.tree""" + + @abstractmethod + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + """Divide a region amongst several child layouts. + + Args: + children (Sequence(Layout)): A number of child layouts. + region (Region): A rectangular region to divide. + """ + + +class RowSplitter(Splitter): + """Split a layout region in to rows.""" + + name = "row" + + def get_tree_icon(self) -> str: + return "[layout.tree.row]⬌" + + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + x, y, width, height = region + render_widths = ratio_resolve(width, children) + offset = 0 + _Region = Region + for child, child_width in zip(children, render_widths): + yield child, _Region(x + offset, y, child_width, height) + offset += child_width + + +class ColumnSplitter(Splitter): + """Split a layout region in to columns.""" + + name = "column" + + def get_tree_icon(self) -> str: + return "[layout.tree.column]⬍" + + def divide( + self, children: Sequence["Layout"], region: Region + ) -> Iterable[Tuple["Layout", Region]]: + x, y, width, height = region + render_heights = ratio_resolve(height, children) + offset = 0 + _Region = Region + for child, child_height in zip(children, render_heights): + yield child, _Region(x, y + offset, width, child_height) + offset += child_height + + +@rich_repr +class Layout: + """A renderable to divide a fixed height in to rows or columns. + + Args: + renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None. + name (str, optional): Optional identifier for Layout. Defaults to None. + size (int, optional): Optional fixed size of layout. Defaults to None. + minimum_size (int, optional): Minimum size of layout. Defaults to 1. + ratio (int, optional): Optional ratio for flexible layout. Defaults to 1. + visible (bool, optional): Visibility of layout. Defaults to True. + """ + + splitters = {"row": RowSplitter, "column": ColumnSplitter} + + def __init__( + self, + renderable: Optional[RenderableType] = None, + *, + name: Optional[str] = None, + size: Optional[int] = None, + minimum_size: int = 1, + ratio: int = 1, + visible: bool = True, + ) -> None: + self._renderable = renderable or _Placeholder(self) + self.size = size + self.minimum_size = minimum_size + self.ratio = ratio + self.name = name + self.visible = visible + self.splitter: Splitter = self.splitters["column"]() + self._children: List[Layout] = [] + self._render_map: RenderMap = {} + self._lock = RLock() + + def __rich_repr__(self) -> Result: + yield "name", self.name, None + yield "size", self.size, None + yield "minimum_size", self.minimum_size, 1 + yield "ratio", self.ratio, 1 + + @property + def renderable(self) -> RenderableType: + """Layout renderable.""" + return self if self._children else self._renderable + + @property + def children(self) -> List["Layout"]: + """Gets (visible) layout children.""" + return [child for child in self._children if child.visible] + + @property + def map(self) -> RenderMap: + """Get a map of the last render.""" + return self._render_map + + def get(self, name: str) -> Optional["Layout"]: + """Get a named layout, or None if it doesn't exist. + + Args: + name (str): Name of layout. + + Returns: + Optional[Layout]: Layout instance or None if no layout was found. + """ + if self.name == name: + return self + else: + for child in self._children: + named_layout = child.get(name) + if named_layout is not None: + return named_layout + return None + + def __getitem__(self, name: str) -> "Layout": + layout = self.get(name) + if layout is None: + raise KeyError(f"No layout with name {name!r}") + return layout + + @property + def tree(self) -> "Tree": + """Get a tree renderable to show layout structure.""" + from pip._vendor.rich.styled import Styled + from pip._vendor.rich.table import Table + from pip._vendor.rich.tree import Tree + + def summary(layout: "Layout") -> Table: + icon = layout.splitter.get_tree_icon() + + table = Table.grid(padding=(0, 1, 0, 0)) + + text: RenderableType = ( + Pretty(layout) if layout.visible else Styled(Pretty(layout), "dim") + ) + table.add_row(icon, text) + _summary = table + return _summary + + layout = self + tree = Tree( + summary(layout), + guide_style=f"layout.tree.{layout.splitter.name}", + highlight=True, + ) + + def recurse(tree: "Tree", layout: "Layout") -> None: + for child in layout._children: + recurse( + tree.add( + summary(child), + guide_style=f"layout.tree.{child.splitter.name}", + ), + child, + ) + + recurse(tree, self) + return tree + + def split( + self, + *layouts: Union["Layout", RenderableType], + splitter: Union[Splitter, str] = "column", + ) -> None: + """Split the layout in to multiple sub-layouts. + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + splitter (Union[Splitter, str]): Splitter instance or name of splitter. + """ + _layouts = [ + layout if isinstance(layout, Layout) else Layout(layout) + for layout in layouts + ] + try: + self.splitter = ( + splitter + if isinstance(splitter, Splitter) + else self.splitters[splitter]() + ) + except KeyError: + raise NoSplitter(f"No splitter called {splitter!r}") + self._children[:] = _layouts + + def add_split(self, *layouts: Union["Layout", RenderableType]) -> None: + """Add a new layout(s) to existing split. + + Args: + *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances. + + """ + _layouts = ( + layout if isinstance(layout, Layout) else Layout(layout) + for layout in layouts + ) + self._children.extend(_layouts) + + def split_row(self, *layouts: Union["Layout", RenderableType]) -> None: + """Split the layout in to a row (layouts side by side). + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + """ + self.split(*layouts, splitter="row") + + def split_column(self, *layouts: Union["Layout", RenderableType]) -> None: + """Split the layout in to a column (layouts stacked on top of each other). + + Args: + *layouts (Layout): Positional arguments should be (sub) Layout instances. + """ + self.split(*layouts, splitter="column") + + def unsplit(self) -> None: + """Reset splits to initial state.""" + del self._children[:] + + def update(self, renderable: RenderableType) -> None: + """Update renderable. + + Args: + renderable (RenderableType): New renderable object. + """ + with self._lock: + self._renderable = renderable + + def refresh_screen(self, console: "Console", layout_name: str) -> None: + """Refresh a sub-layout. + + Args: + console (Console): Console instance where Layout is to be rendered. + layout_name (str): Name of layout. + """ + with self._lock: + layout = self[layout_name] + region, _lines = self._render_map[layout] + (x, y, width, height) = region + lines = console.render_lines( + layout, console.options.update_dimensions(width, height) + ) + self._render_map[layout] = LayoutRender(region, lines) + console.update_screen_lines(lines, x, y) + + def _make_region_map(self, width: int, height: int) -> RegionMap: + """Create a dict that maps layout on to Region.""" + stack: List[Tuple[Layout, Region]] = [(self, Region(0, 0, width, height))] + push = stack.append + pop = stack.pop + layout_regions: List[Tuple[Layout, Region]] = [] + append_layout_region = layout_regions.append + while stack: + append_layout_region(pop()) + layout, region = layout_regions[-1] + children = layout.children + if children: + for child_and_region in layout.splitter.divide(children, region): + push(child_and_region) + + region_map = { + layout: region + for layout, region in sorted(layout_regions, key=itemgetter(1)) + } + return region_map + + def render(self, console: Console, options: ConsoleOptions) -> RenderMap: + """Render the sub_layouts. + + Args: + console (Console): Console instance. + options (ConsoleOptions): Console options. + + Returns: + RenderMap: A dict that maps Layout on to a tuple of Region, lines + """ + render_width = options.max_width + render_height = options.height or console.height + region_map = self._make_region_map(render_width, render_height) + layout_regions = [ + (layout, region) + for layout, region in region_map.items() + if not layout.children + ] + render_map: Dict["Layout", "LayoutRender"] = {} + render_lines = console.render_lines + update_dimensions = options.update_dimensions + + for layout, region in layout_regions: + lines = render_lines( + layout.renderable, update_dimensions(region.width, region.height) + ) + render_map[layout] = LayoutRender(region, lines) + return render_map + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + with self._lock: + width = options.max_width or console.width + height = options.height or console.height + render_map = self.render(console, options.update_dimensions(width, height)) + self._render_map = render_map + layout_lines: List[List[Segment]] = [[] for _ in range(height)] + _islice = islice + for region, lines in render_map.values(): + _x, y, _layout_width, layout_height = region + for row, line in zip( + _islice(layout_lines, y, y + layout_height), lines + ): + row.extend(line) + + new_line = Segment.line() + for layout_row in layout_lines: + yield from layout_row + yield new_line + + +if __name__ == "__main__": + from pip._vendor.rich.console import Console + + console = Console() + layout = Layout() + + layout.split_column( + Layout(name="header", size=3), + Layout(ratio=1, name="main"), + Layout(size=10, name="footer"), + ) + + layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2)) + + layout["body"].split_row(Layout(name="content", ratio=2), Layout(name="s2")) + + layout["s2"].split_column( + Layout(name="top"), Layout(name="middle"), Layout(name="bottom") + ) + + layout["side"].split_column(Layout(layout.tree, name="left1"), Layout(name="left2")) + + layout["content"].update("foo") + + console.print(layout) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py new file mode 100644 index 0000000..f0529a7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/live.py @@ -0,0 +1,375 @@ +import sys +from threading import Event, RLock, Thread +from types import TracebackType +from typing import IO, Any, Callable, List, Optional, TextIO, Type, cast + +from . import get_console +from .console import Console, ConsoleRenderable, RenderableType, RenderHook +from .control import Control +from .file_proxy import FileProxy +from .jupyter import JupyterMixin +from .live_render import LiveRender, VerticalOverflowMethod +from .screen import Screen +from .text import Text + + +class _RefreshThread(Thread): + """A thread that calls refresh() at regular intervals.""" + + def __init__(self, live: "Live", refresh_per_second: float) -> None: + self.live = live + self.refresh_per_second = refresh_per_second + self.done = Event() + super().__init__(daemon=True) + + def stop(self) -> None: + self.done.set() + + def run(self) -> None: + while not self.done.wait(1 / self.refresh_per_second): + with self.live._lock: + if not self.done.is_set(): + self.live.refresh() + + +class Live(JupyterMixin, RenderHook): + """Renders an auto-updating live display of any given renderable. + + Args: + renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing. + console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. + screen (bool, optional): Enable alternate screen mode. Defaults to False. + auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True + refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4. + transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False. + redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. + redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True. + vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis". + get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None. + """ + + def __init__( + self, + renderable: Optional[RenderableType] = None, + *, + console: Optional[Console] = None, + screen: bool = False, + auto_refresh: bool = True, + refresh_per_second: float = 4, + transient: bool = False, + redirect_stdout: bool = True, + redirect_stderr: bool = True, + vertical_overflow: VerticalOverflowMethod = "ellipsis", + get_renderable: Optional[Callable[[], RenderableType]] = None, + ) -> None: + assert refresh_per_second > 0, "refresh_per_second must be > 0" + self._renderable = renderable + self.console = console if console is not None else get_console() + self._screen = screen + self._alt_screen = False + + self._redirect_stdout = redirect_stdout + self._redirect_stderr = redirect_stderr + self._restore_stdout: Optional[IO[str]] = None + self._restore_stderr: Optional[IO[str]] = None + + self._lock = RLock() + self.ipy_widget: Optional[Any] = None + self.auto_refresh = auto_refresh + self._started: bool = False + self.transient = True if screen else transient + + self._refresh_thread: Optional[_RefreshThread] = None + self.refresh_per_second = refresh_per_second + + self.vertical_overflow = vertical_overflow + self._get_renderable = get_renderable + self._live_render = LiveRender( + self.get_renderable(), vertical_overflow=vertical_overflow + ) + + @property + def is_started(self) -> bool: + """Check if live display has been started.""" + return self._started + + def get_renderable(self) -> RenderableType: + renderable = ( + self._get_renderable() + if self._get_renderable is not None + else self._renderable + ) + return renderable or "" + + def start(self, refresh: bool = False) -> None: + """Start live rendering display. + + Args: + refresh (bool, optional): Also refresh. Defaults to False. + """ + with self._lock: + if self._started: + return + self.console.set_live(self) + self._started = True + if self._screen: + self._alt_screen = self.console.set_alt_screen(True) + self.console.show_cursor(False) + self._enable_redirect_io() + self.console.push_render_hook(self) + if refresh: + try: + self.refresh() + except Exception: + # If refresh fails, we want to stop the redirection of sys.stderr, + # so the error stacktrace is properly displayed in the terminal. + # (or, if the code that calls Rich captures the exception and wants to display something, + # let this be displayed in the terminal). + self.stop() + raise + if self.auto_refresh: + self._refresh_thread = _RefreshThread(self, self.refresh_per_second) + self._refresh_thread.start() + + def stop(self) -> None: + """Stop live rendering display.""" + with self._lock: + if not self._started: + return + self.console.clear_live() + self._started = False + + if self.auto_refresh and self._refresh_thread is not None: + self._refresh_thread.stop() + self._refresh_thread = None + # allow it to fully render on the last even if overflow + self.vertical_overflow = "visible" + with self.console: + try: + if not self._alt_screen and not self.console.is_jupyter: + self.refresh() + finally: + self._disable_redirect_io() + self.console.pop_render_hook() + if not self._alt_screen and self.console.is_terminal: + self.console.line() + self.console.show_cursor(True) + if self._alt_screen: + self.console.set_alt_screen(False) + + if self.transient and not self._alt_screen: + self.console.control(self._live_render.restore_cursor()) + if self.ipy_widget is not None and self.transient: + self.ipy_widget.close() # pragma: no cover + + def __enter__(self) -> "Live": + self.start(refresh=self._renderable is not None) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.stop() + + def _enable_redirect_io(self) -> None: + """Enable redirecting of stdout / stderr.""" + if self.console.is_terminal or self.console.is_jupyter: + if self._redirect_stdout and not isinstance(sys.stdout, FileProxy): + self._restore_stdout = sys.stdout + sys.stdout = cast("TextIO", FileProxy(self.console, sys.stdout)) + if self._redirect_stderr and not isinstance(sys.stderr, FileProxy): + self._restore_stderr = sys.stderr + sys.stderr = cast("TextIO", FileProxy(self.console, sys.stderr)) + + def _disable_redirect_io(self) -> None: + """Disable redirecting of stdout / stderr.""" + if self._restore_stdout: + sys.stdout = cast("TextIO", self._restore_stdout) + self._restore_stdout = None + if self._restore_stderr: + sys.stderr = cast("TextIO", self._restore_stderr) + self._restore_stderr = None + + @property + def renderable(self) -> RenderableType: + """Get the renderable that is being displayed + + Returns: + RenderableType: Displayed renderable. + """ + renderable = self.get_renderable() + return Screen(renderable) if self._alt_screen else renderable + + def update(self, renderable: RenderableType, *, refresh: bool = False) -> None: + """Update the renderable that is being displayed + + Args: + renderable (RenderableType): New renderable to use. + refresh (bool, optional): Refresh the display. Defaults to False. + """ + if isinstance(renderable, str): + renderable = self.console.render_str(renderable) + with self._lock: + self._renderable = renderable + if refresh: + self.refresh() + + def refresh(self) -> None: + """Update the display of the Live Render.""" + with self._lock: + self._live_render.set_renderable(self.renderable) + if self.console.is_jupyter: # pragma: no cover + try: + from IPython.display import display + from ipywidgets import Output + except ImportError: + import warnings + + warnings.warn('install "ipywidgets" for Jupyter support') + else: + if self.ipy_widget is None: + self.ipy_widget = Output() + display(self.ipy_widget) + + with self.ipy_widget: + self.ipy_widget.clear_output(wait=True) + self.console.print(self._live_render.renderable) + elif self.console.is_terminal and not self.console.is_dumb_terminal: + with self.console: + self.console.print(Control()) + elif ( + not self._started and not self.transient + ): # if it is finished allow files or dumb-terminals to see final result + with self.console: + self.console.print(Control()) + + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Process renderables to restore cursor and display progress.""" + self._live_render.vertical_overflow = self.vertical_overflow + if self.console.is_interactive: + # lock needs acquiring as user can modify live_render renderable at any time unlike in Progress. + with self._lock: + reset = ( + Control.home() + if self._alt_screen + else self._live_render.position_cursor() + ) + renderables = [reset, *renderables, self._live_render] + elif ( + not self._started and not self.transient + ): # if it is finished render the final output for files or dumb_terminals + renderables = [*renderables, self._live_render] + + return renderables + + +if __name__ == "__main__": # pragma: no cover + import random + import time + from itertools import cycle + from typing import Dict, List, Tuple + + from .align import Align + from .console import Console + from .live import Live as Live + from .panel import Panel + from .rule import Rule + from .syntax import Syntax + from .table import Table + + console = Console() + + syntax = Syntax( + '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value''', + "python", + line_numbers=True, + ) + + table = Table("foo", "bar", "baz") + table.add_row("1", "2", "3") + + progress_renderables = [ + "You can make the terminal shorter and taller to see the live table hide" + "Text may be printed while the progress bars are rendering.", + Panel("In fact, [i]any[/i] renderable will work"), + "Such as [magenta]tables[/]...", + table, + "Pretty printed structures...", + {"type": "example", "text": "Pretty printed"}, + "Syntax...", + syntax, + Rule("Give it a try!"), + ] + + examples = cycle(progress_renderables) + + exchanges = [ + "SGD", + "MYR", + "EUR", + "USD", + "AUD", + "JPY", + "CNH", + "HKD", + "CAD", + "INR", + "DKK", + "GBP", + "RUB", + "NZD", + "MXN", + "IDR", + "TWD", + "THB", + "VND", + ] + with Live(console=console) as live_table: + exchange_rate_dict: Dict[Tuple[str, str], float] = {} + + for index in range(100): + select_exchange = exchanges[index % len(exchanges)] + + for exchange in exchanges: + if exchange == select_exchange: + continue + time.sleep(0.4) + if random.randint(0, 10) < 1: + console.log(next(examples)) + exchange_rate_dict[(select_exchange, exchange)] = 200 / ( + (random.random() * 320) + 1 + ) + if len(exchange_rate_dict) > len(exchanges) - 1: + exchange_rate_dict.pop(list(exchange_rate_dict.keys())[0]) + table = Table(title="Exchange Rates") + + table.add_column("Source Currency") + table.add_column("Destination Currency") + table.add_column("Exchange Rate") + + for (source, dest), exchange_rate in exchange_rate_dict.items(): + table.add_row( + source, + dest, + Text( + f"{exchange_rate:.4f}", + style="red" if exchange_rate < 1.0 else "green", + ), + ) + + live_table.update(Align.center(table)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py new file mode 100644 index 0000000..e20745d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py @@ -0,0 +1,112 @@ +import sys +from typing import Optional, Tuple + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + + +from ._loop import loop_last +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .control import Control +from .segment import ControlType, Segment +from .style import StyleType +from .text import Text + +VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"] + + +class LiveRender: + """Creates a renderable that may be updated. + + Args: + renderable (RenderableType): Any renderable object. + style (StyleType, optional): An optional style to apply to the renderable. Defaults to "". + """ + + def __init__( + self, + renderable: RenderableType, + style: StyleType = "", + vertical_overflow: VerticalOverflowMethod = "ellipsis", + ) -> None: + self.renderable = renderable + self.style = style + self.vertical_overflow = vertical_overflow + self._shape: Optional[Tuple[int, int]] = None + + def set_renderable(self, renderable: RenderableType) -> None: + """Set a new renderable. + + Args: + renderable (RenderableType): Any renderable object, including str. + """ + self.renderable = renderable + + def position_cursor(self) -> Control: + """Get control codes to move cursor to beginning of live render. + + Returns: + Control: A control instance that may be printed. + """ + if self._shape is not None: + _, height = self._shape + return Control( + ControlType.CARRIAGE_RETURN, + (ControlType.ERASE_IN_LINE, 2), + *( + ( + (ControlType.CURSOR_UP, 1), + (ControlType.ERASE_IN_LINE, 2), + ) + * (height - 1) + ) + ) + return Control() + + def restore_cursor(self) -> Control: + """Get control codes to clear the render and restore the cursor to its previous position. + + Returns: + Control: A Control instance that may be printed. + """ + if self._shape is not None: + _, height = self._shape + return Control( + ControlType.CARRIAGE_RETURN, + *((ControlType.CURSOR_UP, 1), (ControlType.ERASE_IN_LINE, 2)) * height + ) + return Control() + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + renderable = self.renderable + style = console.get_style(self.style) + lines = console.render_lines(renderable, options, style=style, pad=False) + shape = Segment.get_shape(lines) + + _, height = shape + if height > options.size.height: + if self.vertical_overflow == "crop": + lines = lines[: options.size.height] + shape = Segment.get_shape(lines) + elif self.vertical_overflow == "ellipsis": + lines = lines[: (options.size.height - 1)] + overflow_text = Text( + "...", + overflow="crop", + justify="center", + end="", + style="live.ellipsis", + ) + lines.append(list(console.render(overflow_text))) + shape = Segment.get_shape(lines) + self._shape = shape + + new_line = Segment.line() + for last, line in loop_last(lines): + yield from line + if not last: + yield new_line diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/logging.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/logging.py new file mode 100644 index 0000000..91368dd --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/logging.py @@ -0,0 +1,289 @@ +import logging +from datetime import datetime +from logging import Handler, LogRecord +from pathlib import Path +from types import ModuleType +from typing import ClassVar, Iterable, List, Optional, Type, Union + +from pip._vendor.rich._null_file import NullFile + +from . import get_console +from ._log_render import FormatTimeCallable, LogRender +from .console import Console, ConsoleRenderable +from .highlighter import Highlighter, ReprHighlighter +from .text import Text +from .traceback import Traceback + + +class RichHandler(Handler): + """A logging handler that renders output with Rich. The time / level / message and file are displayed in columns. + The level is color coded, and the message is syntax highlighted. + + Note: + Be careful when enabling console markup in log messages if you have configured logging for libraries not + under your control. If a dependency writes messages containing square brackets, it may not produce the intended output. + + Args: + level (Union[int, str], optional): Log level. Defaults to logging.NOTSET. + console (:class:`~rich.console.Console`, optional): Optional console instance to write logs. + Default will use a global console instance writing to stdout. + show_time (bool, optional): Show a column for the time. Defaults to True. + omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True. + show_level (bool, optional): Show a column for the level. Defaults to True. + show_path (bool, optional): Show the path to the original log call. Defaults to True. + enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True. + highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None. + markup (bool, optional): Enable console markup in log messages. Defaults to False. + rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False. + tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None. + tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None. + tracebacks_theme (str, optional): Override pygments theme used in traceback. + tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True. + tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False. + tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ". + keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``. + """ + + KEYWORDS: ClassVar[Optional[List[str]]] = [ + "GET", + "POST", + "HEAD", + "PUT", + "DELETE", + "OPTIONS", + "TRACE", + "PATCH", + ] + HIGHLIGHTER_CLASS: ClassVar[Type[Highlighter]] = ReprHighlighter + + def __init__( + self, + level: Union[int, str] = logging.NOTSET, + console: Optional[Console] = None, + *, + show_time: bool = True, + omit_repeated_times: bool = True, + show_level: bool = True, + show_path: bool = True, + enable_link_path: bool = True, + highlighter: Optional[Highlighter] = None, + markup: bool = False, + rich_tracebacks: bool = False, + tracebacks_width: Optional[int] = None, + tracebacks_extra_lines: int = 3, + tracebacks_theme: Optional[str] = None, + tracebacks_word_wrap: bool = True, + tracebacks_show_locals: bool = False, + tracebacks_suppress: Iterable[Union[str, ModuleType]] = (), + locals_max_length: int = 10, + locals_max_string: int = 80, + log_time_format: Union[str, FormatTimeCallable] = "[%x %X]", + keywords: Optional[List[str]] = None, + ) -> None: + super().__init__(level=level) + self.console = console or get_console() + self.highlighter = highlighter or self.HIGHLIGHTER_CLASS() + self._log_render = LogRender( + show_time=show_time, + show_level=show_level, + show_path=show_path, + time_format=log_time_format, + omit_repeated_times=omit_repeated_times, + level_width=None, + ) + self.enable_link_path = enable_link_path + self.markup = markup + self.rich_tracebacks = rich_tracebacks + self.tracebacks_width = tracebacks_width + self.tracebacks_extra_lines = tracebacks_extra_lines + self.tracebacks_theme = tracebacks_theme + self.tracebacks_word_wrap = tracebacks_word_wrap + self.tracebacks_show_locals = tracebacks_show_locals + self.tracebacks_suppress = tracebacks_suppress + self.locals_max_length = locals_max_length + self.locals_max_string = locals_max_string + self.keywords = keywords + + def get_level_text(self, record: LogRecord) -> Text: + """Get the level name from the record. + + Args: + record (LogRecord): LogRecord instance. + + Returns: + Text: A tuple of the style and level name. + """ + level_name = record.levelname + level_text = Text.styled( + level_name.ljust(8), f"logging.level.{level_name.lower()}" + ) + return level_text + + def emit(self, record: LogRecord) -> None: + """Invoked by logging.""" + message = self.format(record) + traceback = None + if ( + self.rich_tracebacks + and record.exc_info + and record.exc_info != (None, None, None) + ): + exc_type, exc_value, exc_traceback = record.exc_info + assert exc_type is not None + assert exc_value is not None + traceback = Traceback.from_exception( + exc_type, + exc_value, + exc_traceback, + width=self.tracebacks_width, + extra_lines=self.tracebacks_extra_lines, + theme=self.tracebacks_theme, + word_wrap=self.tracebacks_word_wrap, + show_locals=self.tracebacks_show_locals, + locals_max_length=self.locals_max_length, + locals_max_string=self.locals_max_string, + suppress=self.tracebacks_suppress, + ) + message = record.getMessage() + if self.formatter: + record.message = record.getMessage() + formatter = self.formatter + if hasattr(formatter, "usesTime") and formatter.usesTime(): + record.asctime = formatter.formatTime(record, formatter.datefmt) + message = formatter.formatMessage(record) + + message_renderable = self.render_message(record, message) + log_renderable = self.render( + record=record, traceback=traceback, message_renderable=message_renderable + ) + if isinstance(self.console.file, NullFile): + # Handles pythonw, where stdout/stderr are null, and we return NullFile + # instance from Console.file. In this case, we still want to make a log record + # even though we won't be writing anything to a file. + self.handleError(record) + else: + try: + self.console.print(log_renderable) + except Exception: + self.handleError(record) + + def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable": + """Render message text in to Text. + + Args: + record (LogRecord): logging Record. + message (str): String containing log message. + + Returns: + ConsoleRenderable: Renderable to display log message. + """ + use_markup = getattr(record, "markup", self.markup) + message_text = Text.from_markup(message) if use_markup else Text(message) + + highlighter = getattr(record, "highlighter", self.highlighter) + if highlighter: + message_text = highlighter(message_text) + + if self.keywords is None: + self.keywords = self.KEYWORDS + + if self.keywords: + message_text.highlight_words(self.keywords, "logging.keyword") + + return message_text + + def render( + self, + *, + record: LogRecord, + traceback: Optional[Traceback], + message_renderable: "ConsoleRenderable", + ) -> "ConsoleRenderable": + """Render log for display. + + Args: + record (LogRecord): logging Record. + traceback (Optional[Traceback]): Traceback instance or None for no Traceback. + message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents. + + Returns: + ConsoleRenderable: Renderable to display log. + """ + path = Path(record.pathname).name + level = self.get_level_text(record) + time_format = None if self.formatter is None else self.formatter.datefmt + log_time = datetime.fromtimestamp(record.created) + + log_renderable = self._log_render( + self.console, + [message_renderable] if not traceback else [message_renderable, traceback], + log_time=log_time, + time_format=time_format, + level=level, + path=path, + line_no=record.lineno, + link_path=record.pathname if self.enable_link_path else None, + ) + return log_renderable + + +if __name__ == "__main__": # pragma: no cover + from time import sleep + + FORMAT = "%(message)s" + # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s" + logging.basicConfig( + level="NOTSET", + format=FORMAT, + datefmt="[%X]", + handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)], + ) + log = logging.getLogger("rich") + + log.info("Server starting...") + log.info("Listening on http://127.0.0.1:8080") + sleep(1) + + log.info("GET /index.html 200 1298") + log.info("GET /imgs/backgrounds/back1.jpg 200 54386") + log.info("GET /css/styles.css 200 54386") + log.warning("GET /favicon.ico 404 242") + sleep(1) + + log.debug( + "JSONRPC request\n--> %r\n<-- %r", + { + "version": "1.1", + "method": "confirmFruitPurchase", + "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], + "id": "194521489", + }, + {"version": "1.1", "result": True, "error": None, "id": "194521489"}, + ) + log.debug( + "Loading configuration file /adasd/asdasd/qeqwe/qwrqwrqwr/sdgsdgsdg/werwerwer/dfgerert/ertertert/ertetert/werwerwer" + ) + log.error("Unable to find 'pomelo' in database!") + log.info("POST /jsonrpc/ 200 65532") + log.info("POST /admin/ 401 42234") + log.warning("password was rejected for admin site.") + + def divide() -> None: + number = 1 + divisor = 0 + foos = ["foo"] * 100 + log.debug("in divide") + try: + number / divisor + except: + log.exception("An error of some kind occurred!") + + divide() + sleep(1) + log.critical("Out of memory!") + log.info("Server exited with code=-1") + log.info("[bold]EXITING...[/bold]", extra=dict(markup=True)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py new file mode 100644 index 0000000..f617187 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/markup.py @@ -0,0 +1,251 @@ +import re +from ast import literal_eval +from operator import attrgetter +from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union + +from ._emoji_replace import _emoji_replace +from .emoji import EmojiVariant +from .errors import MarkupError +from .style import Style +from .text import Span, Text + +RE_TAGS = re.compile( + r"""((\\*)\[([a-z#/@][^[]*?)])""", + re.VERBOSE, +) + +RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$") + + +class Tag(NamedTuple): + """A tag in console markup.""" + + name: str + """The tag name. e.g. 'bold'.""" + parameters: Optional[str] + """Any additional parameters after the name.""" + + def __str__(self) -> str: + return ( + self.name if self.parameters is None else f"{self.name} {self.parameters}" + ) + + @property + def markup(self) -> str: + """Get the string representation of this tag.""" + return ( + f"[{self.name}]" + if self.parameters is None + else f"[{self.name}={self.parameters}]" + ) + + +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EscapeSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def escape( + markup: str, + _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub, +) -> str: + """Escapes text so that it won't be interpreted as markup. + + Args: + markup (str): Content to be inserted in to markup. + + Returns: + str: Markup with square brackets escaped. + """ + + def escape_backslashes(match: Match[str]) -> str: + """Called by re.sub replace matches.""" + backslashes, text = match.groups() + return f"{backslashes}{backslashes}\\{text}" + + markup = _escape(escape_backslashes, markup) + if markup.endswith("\\") and not markup.endswith("\\\\"): + return markup + "\\" + + return markup + + +def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]: + """Parse markup in to an iterable of tuples of (position, text, tag). + + Args: + markup (str): A string containing console markup + + """ + position = 0 + _divmod = divmod + _Tag = Tag + for match in RE_TAGS.finditer(markup): + full_text, escapes, tag_text = match.groups() + start, end = match.span() + if start > position: + yield start, markup[position:start], None + if escapes: + backslashes, escaped = _divmod(len(escapes), 2) + if backslashes: + # Literal backslashes + yield start, "\\" * backslashes, None + start += backslashes * 2 + if escaped: + # Escape of tag + yield start, full_text[len(escapes) :], None + position = end + continue + text, equals, parameters = tag_text.partition("=") + yield start, None, _Tag(text, parameters if equals else None) + position = end + if position < len(markup): + yield position, markup[position:], None + + +def render( + markup: str, + style: Union[str, Style] = "", + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, +) -> Text: + """Render console markup in to a Text instance. + + Args: + markup (str): A string containing console markup. + style: (Union[str, Style]): The style to use. + emoji (bool, optional): Also render emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + + + Raises: + MarkupError: If there is a syntax error in the markup. + + Returns: + Text: A test instance. + """ + emoji_replace = _emoji_replace + if "[" not in markup: + return Text( + emoji_replace(markup, default_variant=emoji_variant) if emoji else markup, + style=style, + ) + text = Text(style=style) + append = text.append + normalize = Style.normalize + + style_stack: List[Tuple[int, Tag]] = [] + pop = style_stack.pop + + spans: List[Span] = [] + append_span = spans.append + + _Span = Span + _Tag = Tag + + def pop_style(style_name: str) -> Tuple[int, Tag]: + """Pop tag matching given style name.""" + for index, (_, tag) in enumerate(reversed(style_stack), 1): + if tag.name == style_name: + return pop(-index) + raise KeyError(style_name) + + for position, plain_text, tag in _parse(markup): + if plain_text is not None: + # Handle open brace escapes, where the brace is not part of a tag. + plain_text = plain_text.replace("\\[", "[") + append(emoji_replace(plain_text) if emoji else plain_text) + elif tag is not None: + if tag.name.startswith("/"): # Closing tag + style_name = tag.name[1:].strip() + + if style_name: # explicit close + style_name = normalize(style_name) + try: + start, open_tag = pop_style(style_name) + except KeyError: + raise MarkupError( + f"closing tag '{tag.markup}' at position {position} doesn't match any open tag" + ) from None + else: # implicit close + try: + start, open_tag = pop() + except IndexError: + raise MarkupError( + f"closing tag '[/]' at position {position} has nothing to close" + ) from None + + if open_tag.name.startswith("@"): + if open_tag.parameters: + handler_name = "" + parameters = open_tag.parameters.strip() + handler_match = RE_HANDLER.match(parameters) + if handler_match is not None: + handler_name, match_parameters = handler_match.groups() + parameters = ( + "()" if match_parameters is None else match_parameters + ) + + try: + meta_params = literal_eval(parameters) + except SyntaxError as error: + raise MarkupError( + f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}" + ) + except Exception as error: + raise MarkupError( + f"error parsing {open_tag.parameters!r}; {error}" + ) from None + + if handler_name: + meta_params = ( + handler_name, + meta_params + if isinstance(meta_params, tuple) + else (meta_params,), + ) + + else: + meta_params = () + + append_span( + _Span( + start, len(text), Style(meta={open_tag.name: meta_params}) + ) + ) + else: + append_span(_Span(start, len(text), str(open_tag))) + + else: # Opening tag + normalized_tag = _Tag(normalize(tag.name), tag.parameters) + style_stack.append((len(text), normalized_tag)) + + text_length = len(text) + while style_stack: + start, tag = style_stack.pop() + style = str(tag) + if style: + append_span(_Span(start, text_length, style)) + + text.spans = sorted(spans[::-1], key=attrgetter("start")) + return text + + +if __name__ == "__main__": # pragma: no cover + MARKUP = [ + "[red]Hello World[/red]", + "[magenta]Hello [b]World[/b]", + "[bold]Bold[italic] bold and italic [/bold]italic[/italic]", + "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog", + ":warning-emoji: [bold red blink] DANGER![/]", + ] + + from pip._vendor.rich import print + from pip._vendor.rich.table import Table + + grid = Table("Markup", "Result", padding=(0, 1)) + + for markup in MARKUP: + grid.add_row(Text(markup), markup) + + print(grid) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/measure.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/measure.py new file mode 100644 index 0000000..a508ffa --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/measure.py @@ -0,0 +1,151 @@ +from operator import itemgetter +from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Sequence + +from . import errors +from .protocol import is_renderable, rich_cast + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType + + +class Measurement(NamedTuple): + """Stores the minimum and maximum widths (in characters) required to render an object.""" + + minimum: int + """Minimum number of cells required to render.""" + maximum: int + """Maximum number of cells required to render.""" + + @property + def span(self) -> int: + """Get difference between maximum and minimum.""" + return self.maximum - self.minimum + + def normalize(self) -> "Measurement": + """Get measurement that ensures that minimum <= maximum and minimum >= 0 + + Returns: + Measurement: A normalized measurement. + """ + minimum, maximum = self + minimum = min(max(0, minimum), maximum) + return Measurement(max(0, minimum), max(0, max(minimum, maximum))) + + def with_maximum(self, width: int) -> "Measurement": + """Get a RenderableWith where the widths are <= width. + + Args: + width (int): Maximum desired width. + + Returns: + Measurement: New Measurement object. + """ + minimum, maximum = self + return Measurement(min(minimum, width), min(maximum, width)) + + def with_minimum(self, width: int) -> "Measurement": + """Get a RenderableWith where the widths are >= width. + + Args: + width (int): Minimum desired width. + + Returns: + Measurement: New Measurement object. + """ + minimum, maximum = self + width = max(0, width) + return Measurement(max(minimum, width), max(maximum, width)) + + def clamp( + self, min_width: Optional[int] = None, max_width: Optional[int] = None + ) -> "Measurement": + """Clamp a measurement within the specified range. + + Args: + min_width (int): Minimum desired width, or ``None`` for no minimum. Defaults to None. + max_width (int): Maximum desired width, or ``None`` for no maximum. Defaults to None. + + Returns: + Measurement: New Measurement object. + """ + measurement = self + if min_width is not None: + measurement = measurement.with_minimum(min_width) + if max_width is not None: + measurement = measurement.with_maximum(max_width) + return measurement + + @classmethod + def get( + cls, console: "Console", options: "ConsoleOptions", renderable: "RenderableType" + ) -> "Measurement": + """Get a measurement for a renderable. + + Args: + console (~rich.console.Console): Console instance. + options (~rich.console.ConsoleOptions): Console options. + renderable (RenderableType): An object that may be rendered with Rich. + + Raises: + errors.NotRenderableError: If the object is not renderable. + + Returns: + Measurement: Measurement object containing range of character widths required to render the object. + """ + _max_width = options.max_width + if _max_width < 1: + return Measurement(0, 0) + if isinstance(renderable, str): + renderable = console.render_str( + renderable, markup=options.markup, highlight=False + ) + renderable = rich_cast(renderable) + if is_renderable(renderable): + get_console_width: Optional[ + Callable[["Console", "ConsoleOptions"], "Measurement"] + ] = getattr(renderable, "__rich_measure__", None) + if get_console_width is not None: + render_width = ( + get_console_width(console, options) + .normalize() + .with_maximum(_max_width) + ) + if render_width.maximum < 1: + return Measurement(0, 0) + return render_width.normalize() + else: + return Measurement(0, _max_width) + else: + raise errors.NotRenderableError( + f"Unable to get render width for {renderable!r}; " + "a str, Segment, or object with __rich_console__ method is required" + ) + + +def measure_renderables( + console: "Console", + options: "ConsoleOptions", + renderables: Sequence["RenderableType"], +) -> "Measurement": + """Get a measurement that would fit a number of renderables. + + Args: + console (~rich.console.Console): Console instance. + options (~rich.console.ConsoleOptions): Console options. + renderables (Iterable[RenderableType]): One or more renderable objects. + + Returns: + Measurement: Measurement object containing range of character widths required to + contain all given renderables. + """ + if not renderables: + return Measurement(0, 0) + get_measurement = Measurement.get + measurements = [ + get_measurement(console, options, renderable) for renderable in renderables + ] + measured_width = Measurement( + max(measurements, key=itemgetter(0)).minimum, + max(measurements, key=itemgetter(1)).maximum, + ) + return measured_width diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/padding.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/padding.py new file mode 100644 index 0000000..1b2204f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/padding.py @@ -0,0 +1,141 @@ +from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + RenderableType, + RenderResult, + ) +from .jupyter import JupyterMixin +from .measure import Measurement +from .style import Style +from .segment import Segment + + +PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]] + + +class Padding(JupyterMixin): + """Draw space around content. + + Example: + >>> print(Padding("Hello", (2, 4), style="on blue")) + + Args: + renderable (RenderableType): String or other renderable. + pad (Union[int, Tuple[int]]): Padding for top, right, bottom, and left borders. + May be specified with 1, 2, or 4 integers (CSS style). + style (Union[str, Style], optional): Style for padding characters. Defaults to "none". + expand (bool, optional): Expand padding to fit available width. Defaults to True. + """ + + def __init__( + self, + renderable: "RenderableType", + pad: "PaddingDimensions" = (0, 0, 0, 0), + *, + style: Union[str, Style] = "none", + expand: bool = True, + ): + self.renderable = renderable + self.top, self.right, self.bottom, self.left = self.unpack(pad) + self.style = style + self.expand = expand + + @classmethod + def indent(cls, renderable: "RenderableType", level: int) -> "Padding": + """Make padding instance to render an indent. + + Args: + renderable (RenderableType): String or other renderable. + level (int): Number of characters to indent. + + Returns: + Padding: A Padding instance. + """ + + return Padding(renderable, pad=(0, 0, 0, level), expand=False) + + @staticmethod + def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]: + """Unpack padding specified in CSS style.""" + if isinstance(pad, int): + return (pad, pad, pad, pad) + if len(pad) == 1: + _pad = pad[0] + return (_pad, _pad, _pad, _pad) + if len(pad) == 2: + pad_top, pad_right = cast(Tuple[int, int], pad) + return (pad_top, pad_right, pad_top, pad_right) + if len(pad) == 4: + top, right, bottom, left = cast(Tuple[int, int, int, int], pad) + return (top, right, bottom, left) + raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given") + + def __repr__(self) -> str: + return f"Padding({self.renderable!r}, ({self.top},{self.right},{self.bottom},{self.left}))" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) + if self.expand: + width = options.max_width + else: + width = min( + Measurement.get(console, options, self.renderable).maximum + + self.left + + self.right, + options.max_width, + ) + render_options = options.update_width(width - self.left - self.right) + if render_options.height is not None: + render_options = render_options.update_height( + height=render_options.height - self.top - self.bottom + ) + lines = console.render_lines( + self.renderable, render_options, style=style, pad=True + ) + _Segment = Segment + + left = _Segment(" " * self.left, style) if self.left else None + right = ( + [_Segment(f'{" " * self.right}', style), _Segment.line()] + if self.right + else [_Segment.line()] + ) + blank_line: Optional[List[Segment]] = None + if self.top: + blank_line = [_Segment(f'{" " * width}\n', style)] + yield from blank_line * self.top + if left: + for line in lines: + yield left + yield from line + yield from right + else: + for line in lines: + yield from line + yield from right + if self.bottom: + blank_line = blank_line or [_Segment(f'{" " * width}\n', style)] + yield from blank_line * self.bottom + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + max_width = options.max_width + extra_width = self.left + self.right + if max_width - extra_width < 1: + return Measurement(max_width, max_width) + measure_min, measure_max = Measurement.get(console, options, self.renderable) + measurement = Measurement(measure_min + extra_width, measure_max + extra_width) + measurement = measurement.with_maximum(max_width) + return measurement + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich import print + + print(Padding("Hello, World", (2, 4), style="on blue")) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/pager.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/pager.py new file mode 100644 index 0000000..a3f7aa6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/pager.py @@ -0,0 +1,34 @@ +from abc import ABC, abstractmethod +from typing import Any + + +class Pager(ABC): + """Base class for a pager.""" + + @abstractmethod + def show(self, content: str) -> None: + """Show content in pager. + + Args: + content (str): Content to be displayed. + """ + + +class SystemPager(Pager): + """Uses the pager installed on the system.""" + + def _pager(self, content: str) -> Any: #  pragma: no cover + return __import__("pydoc").pager(content) + + def show(self, content: str) -> None: + """Use the same pager used by pydoc.""" + self._pager(content) + + +if __name__ == "__main__": # pragma: no cover + from .__main__ import make_test_card + from .console import Console + + console = Console() + with console.pager(styles=True): + console.print(make_test_card()) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/palette.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/palette.py new file mode 100644 index 0000000..fa0c4dd --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/palette.py @@ -0,0 +1,100 @@ +from math import sqrt +from functools import lru_cache +from typing import Sequence, Tuple, TYPE_CHECKING + +from .color_triplet import ColorTriplet + +if TYPE_CHECKING: + from pip._vendor.rich.table import Table + + +class Palette: + """A palette of available colors.""" + + def __init__(self, colors: Sequence[Tuple[int, int, int]]): + self._colors = colors + + def __getitem__(self, number: int) -> ColorTriplet: + return ColorTriplet(*self._colors[number]) + + def __rich__(self) -> "Table": + from pip._vendor.rich.color import Color + from pip._vendor.rich.style import Style + from pip._vendor.rich.text import Text + from pip._vendor.rich.table import Table + + table = Table( + "index", + "RGB", + "Color", + title="Palette", + caption=f"{len(self._colors)} colors", + highlight=True, + caption_justify="right", + ) + for index, color in enumerate(self._colors): + table.add_row( + str(index), + repr(color), + Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))), + ) + return table + + # This is somewhat inefficient and needs caching + @lru_cache(maxsize=1024) + def match(self, color: Tuple[int, int, int]) -> int: + """Find a color from a palette that most closely matches a given color. + + Args: + color (Tuple[int, int, int]): RGB components in range 0 > 255. + + Returns: + int: Index of closes matching color. + """ + red1, green1, blue1 = color + _sqrt = sqrt + get_color = self._colors.__getitem__ + + def get_color_distance(index: int) -> float: + """Get the distance to a color.""" + red2, green2, blue2 = get_color(index) + red_mean = (red1 + red2) // 2 + red = red1 - red2 + green = green1 - green2 + blue = blue1 - blue2 + return _sqrt( + (((512 + red_mean) * red * red) >> 8) + + 4 * green * green + + (((767 - red_mean) * blue * blue) >> 8) + ) + + min_index = min(range(len(self._colors)), key=get_color_distance) + return min_index + + +if __name__ == "__main__": # pragma: no cover + import colorsys + from typing import Iterable + from pip._vendor.rich.color import Color + from pip._vendor.rich.console import Console, ConsoleOptions + from pip._vendor.rich.segment import Segment + from pip._vendor.rich.style import Style + + class ColorBox: + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> Iterable[Segment]: + height = console.size.height - 3 + for y in range(0, height): + for x in range(options.max_width): + h = x / options.max_width + l = y / (height + 1) + r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) + r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0) + bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) + color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) + yield Segment("▄", Style(color=color, bgcolor=bgcolor)) + yield Segment.line() + + console = Console() + console.print(ColorBox()) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py new file mode 100644 index 0000000..95f4c84 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/panel.py @@ -0,0 +1,312 @@ +from typing import TYPE_CHECKING, Optional + +from .align import AlignMethod +from .box import ROUNDED, Box +from .cells import cell_len +from .jupyter import JupyterMixin +from .measure import Measurement, measure_renderables +from .padding import Padding, PaddingDimensions +from .segment import Segment +from .style import Style, StyleType +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + + +class Panel(JupyterMixin): + """A console renderable that draws a border around its contents. + + Example: + >>> console.print(Panel("Hello, World!")) + + Args: + renderable (RenderableType): A console renderable object. + box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`. + Defaults to box.ROUNDED. + safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. + expand (bool, optional): If True the panel will stretch to fill the console + width, otherwise it will be sized to fit the contents. Defaults to True. + style (str, optional): The style of the panel (border and contents). Defaults to "none". + border_style (str, optional): The style of the border. Defaults to "none". + width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. + height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect. + padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. + highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False. + """ + + def __init__( + self, + renderable: "RenderableType", + box: Box = ROUNDED, + *, + title: Optional[TextType] = None, + title_align: AlignMethod = "center", + subtitle: Optional[TextType] = None, + subtitle_align: AlignMethod = "center", + safe_box: Optional[bool] = None, + expand: bool = True, + style: StyleType = "none", + border_style: StyleType = "none", + width: Optional[int] = None, + height: Optional[int] = None, + padding: PaddingDimensions = (0, 1), + highlight: bool = False, + ) -> None: + self.renderable = renderable + self.box = box + self.title = title + self.title_align: AlignMethod = title_align + self.subtitle = subtitle + self.subtitle_align = subtitle_align + self.safe_box = safe_box + self.expand = expand + self.style = style + self.border_style = border_style + self.width = width + self.height = height + self.padding = padding + self.highlight = highlight + + @classmethod + def fit( + cls, + renderable: "RenderableType", + box: Box = ROUNDED, + *, + title: Optional[TextType] = None, + title_align: AlignMethod = "center", + subtitle: Optional[TextType] = None, + subtitle_align: AlignMethod = "center", + safe_box: Optional[bool] = None, + style: StyleType = "none", + border_style: StyleType = "none", + width: Optional[int] = None, + height: Optional[int] = None, + padding: PaddingDimensions = (0, 1), + highlight: bool = False, + ) -> "Panel": + """An alternative constructor that sets expand=False.""" + return cls( + renderable, + box, + title=title, + title_align=title_align, + subtitle=subtitle, + subtitle_align=subtitle_align, + safe_box=safe_box, + style=style, + border_style=border_style, + width=width, + height=height, + padding=padding, + highlight=highlight, + expand=False, + ) + + @property + def _title(self) -> Optional[Text]: + if self.title: + title_text = ( + Text.from_markup(self.title) + if isinstance(self.title, str) + else self.title.copy() + ) + title_text.end = "" + title_text.plain = title_text.plain.replace("\n", " ") + title_text.no_wrap = True + title_text.expand_tabs() + title_text.pad(1) + return title_text + return None + + @property + def _subtitle(self) -> Optional[Text]: + if self.subtitle: + subtitle_text = ( + Text.from_markup(self.subtitle) + if isinstance(self.subtitle, str) + else self.subtitle.copy() + ) + subtitle_text.end = "" + subtitle_text.plain = subtitle_text.plain.replace("\n", " ") + subtitle_text.no_wrap = True + subtitle_text.expand_tabs() + subtitle_text.pad(1) + return subtitle_text + return None + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + _padding = Padding.unpack(self.padding) + renderable = ( + Padding(self.renderable, _padding) if any(_padding) else self.renderable + ) + style = console.get_style(self.style) + border_style = style + console.get_style(self.border_style) + width = ( + options.max_width + if self.width is None + else min(options.max_width, self.width) + ) + + safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box + box = self.box.substitute(options, safe=safe_box) + + def align_text( + text: Text, width: int, align: str, character: str, style: Style + ) -> Text: + """Gets new aligned text. + + Args: + text (Text): Title or subtitle text. + width (int): Desired width. + align (str): Alignment. + character (str): Character for alignment. + style (Style): Border style + + Returns: + Text: New text instance + """ + text = text.copy() + text.truncate(width) + excess_space = width - cell_len(text.plain) + if excess_space: + if align == "left": + return Text.assemble( + text, + (character * excess_space, style), + no_wrap=True, + end="", + ) + elif align == "center": + left = excess_space // 2 + return Text.assemble( + (character * left, style), + text, + (character * (excess_space - left), style), + no_wrap=True, + end="", + ) + else: + return Text.assemble( + (character * excess_space, style), + text, + no_wrap=True, + end="", + ) + return text + + title_text = self._title + if title_text is not None: + title_text.stylize_before(border_style) + + child_width = ( + width - 2 + if self.expand + else console.measure( + renderable, options=options.update_width(width - 2) + ).maximum + ) + child_height = self.height or options.height or None + if child_height: + child_height -= 2 + if title_text is not None: + child_width = min( + options.max_width - 2, max(child_width, title_text.cell_len + 2) + ) + + width = child_width + 2 + child_options = options.update( + width=child_width, height=child_height, highlight=self.highlight + ) + lines = console.render_lines(renderable, child_options, style=style) + + line_start = Segment(box.mid_left, border_style) + line_end = Segment(f"{box.mid_right}", border_style) + new_line = Segment.line() + if title_text is None or width <= 4: + yield Segment(box.get_top([width - 2]), border_style) + else: + title_text = align_text( + title_text, + width - 4, + self.title_align, + box.top, + border_style, + ) + yield Segment(box.top_left + box.top, border_style) + yield from console.render(title_text, child_options.update_width(width - 4)) + yield Segment(box.top + box.top_right, border_style) + + yield new_line + for line in lines: + yield line_start + yield from line + yield line_end + yield new_line + + subtitle_text = self._subtitle + if subtitle_text is not None: + subtitle_text.stylize_before(border_style) + + if subtitle_text is None or width <= 4: + yield Segment(box.get_bottom([width - 2]), border_style) + else: + subtitle_text = align_text( + subtitle_text, + width - 4, + self.subtitle_align, + box.bottom, + border_style, + ) + yield Segment(box.bottom_left + box.bottom, border_style) + yield from console.render( + subtitle_text, child_options.update_width(width - 4) + ) + yield Segment(box.bottom + box.bottom_right, border_style) + + yield new_line + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + _title = self._title + _, right, _, left = Padding.unpack(self.padding) + padding = left + right + renderables = [self.renderable, _title] if _title else [self.renderable] + + if self.width is None: + width = ( + measure_renderables( + console, + options.update_width(options.max_width - padding - 2), + renderables, + ).maximum + + padding + + 2 + ) + else: + width = self.width + return Measurement(width, width) + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + c = Console() + + from .box import DOUBLE, ROUNDED + from .padding import Padding + + p = Panel( + "Hello, World!", + title="rich.Panel", + style="white on blue", + box=DOUBLE, + padding=1, + ) + + c.print() + c.print(p) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py new file mode 100644 index 0000000..9b9e3ba --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py @@ -0,0 +1,995 @@ +import builtins +import collections +import dataclasses +import inspect +import os +import sys +from array import array +from collections import Counter, UserDict, UserList, defaultdict, deque +from dataclasses import dataclass, fields, is_dataclass +from inspect import isclass +from itertools import islice +from types import MappingProxyType +from typing import ( + TYPE_CHECKING, + Any, + Callable, + DefaultDict, + Dict, + Iterable, + List, + Optional, + Sequence, + Set, + Tuple, + Union, +) + +from pip._vendor.rich.repr import RichReprResult + +try: + import attr as _attr_module + + _has_attrs = hasattr(_attr_module, "ib") +except ImportError: # pragma: no cover + _has_attrs = False + +from . import get_console +from ._loop import loop_last +from ._pick import pick_bool +from .abc import RichRenderable +from .cells import cell_len +from .highlighter import ReprHighlighter +from .jupyter import JupyterMixin, JupyterRenderable +from .measure import Measurement +from .text import Text + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + HighlighterType, + JustifyMethod, + OverflowMethod, + RenderResult, + ) + + +def _is_attr_object(obj: Any) -> bool: + """Check if an object was created with attrs module.""" + return _has_attrs and _attr_module.has(type(obj)) + + +def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]: + """Get fields for an attrs object.""" + return _attr_module.fields(type(obj)) if _has_attrs else [] + + +def _is_dataclass_repr(obj: object) -> bool: + """Check if an instance of a dataclass contains the default repr. + + Args: + obj (object): A dataclass instance. + + Returns: + bool: True if the default repr is used, False if there is a custom repr. + """ + # Digging in to a lot of internals here + # Catching all exceptions in case something is missing on a non CPython implementation + try: + return obj.__repr__.__code__.co_filename == dataclasses.__file__ + except Exception: # pragma: no coverage + return False + + +_dummy_namedtuple = collections.namedtuple("_dummy_namedtuple", []) + + +def _has_default_namedtuple_repr(obj: object) -> bool: + """Check if an instance of namedtuple contains the default repr + + Args: + obj (object): A namedtuple + + Returns: + bool: True if the default repr is used, False if there's a custom repr. + """ + obj_file = None + try: + obj_file = inspect.getfile(obj.__repr__) + except (OSError, TypeError): + # OSError handles case where object is defined in __main__ scope, e.g. REPL - no filename available. + # TypeError trapped defensively, in case of object without filename slips through. + pass + default_repr_file = inspect.getfile(_dummy_namedtuple.__repr__) + return obj_file == default_repr_file + + +def _ipy_display_hook( + value: Any, + console: Optional["Console"] = None, + overflow: "OverflowMethod" = "ignore", + crop: bool = False, + indent_guides: bool = False, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, + expand_all: bool = False, +) -> Union[str, None]: + # needed here to prevent circular import: + from .console import ConsoleRenderable + + # always skip rich generated jupyter renderables or None values + if _safe_isinstance(value, JupyterRenderable) or value is None: + return None + + console = console or get_console() + + with console.capture() as capture: + # certain renderables should start on a new line + if _safe_isinstance(value, ConsoleRenderable): + console.line() + console.print( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + margin=12, + ), + crop=crop, + new_line_start=True, + end="", + ) + # strip trailing newline, not usually part of a text repr + # I'm not sure if this should be prevented at a lower level + return capture.get().rstrip("\n") + + +def _safe_isinstance( + obj: object, class_or_tuple: Union[type, Tuple[type, ...]] +) -> bool: + """isinstance can fail in rare cases, for example types with no __class__""" + try: + return isinstance(obj, class_or_tuple) + except Exception: + return False + + +def install( + console: Optional["Console"] = None, + overflow: "OverflowMethod" = "ignore", + crop: bool = False, + indent_guides: bool = False, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, + expand_all: bool = False, +) -> None: + """Install automatic pretty printing in the Python REPL. + + Args: + console (Console, optional): Console instance or ``None`` to use global console. Defaults to None. + overflow (Optional[OverflowMethod], optional): Overflow method. Defaults to "ignore". + crop (Optional[bool], optional): Enable cropping of long lines. Defaults to False. + indent_guides (bool, optional): Enable indentation guides. Defaults to False. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. + expand_all (bool, optional): Expand all containers. Defaults to False. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + from pip._vendor.rich import get_console + + console = console or get_console() + assert console is not None + + def display_hook(value: Any) -> None: + """Replacement sys.displayhook which prettifies objects with Rich.""" + if value is not None: + assert console is not None + builtins._ = None # type: ignore[attr-defined] + console.print( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + ), + crop=crop, + ) + builtins._ = value # type: ignore[attr-defined] + + try: + ip = get_ipython() # type: ignore[name-defined] + except NameError: + sys.displayhook = display_hook + else: + from IPython.core.formatters import BaseFormatter + + class RichFormatter(BaseFormatter): # type: ignore[misc] + pprint: bool = True + + def __call__(self, value: Any) -> Any: + if self.pprint: + return _ipy_display_hook( + value, + console=get_console(), + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + ) + else: + return repr(value) + + # replace plain text formatter with rich formatter + rich_formatter = RichFormatter() + ip.display_formatter.formatters["text/plain"] = rich_formatter + + +class Pretty(JupyterMixin): + """A rich renderable that pretty prints an object. + + Args: + _object (Any): An object to pretty print. + highlighter (HighlighterType, optional): Highlighter object to apply to result, or None for ReprHighlighter. Defaults to None. + indent_size (int, optional): Number of spaces in indent. Defaults to 4. + justify (JustifyMethod, optional): Justify method, or None for default. Defaults to None. + overflow (OverflowMethod, optional): Overflow method, or None for default. Defaults to None. + no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to False. + indent_guides (bool, optional): Enable indentation guides. Defaults to False. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. + expand_all (bool, optional): Expand all containers. Defaults to False. + margin (int, optional): Subtrace a margin from width to force containers to expand earlier. Defaults to 0. + insert_line (bool, optional): Insert a new line if the output has multiple new lines. Defaults to False. + """ + + def __init__( + self, + _object: Any, + highlighter: Optional["HighlighterType"] = None, + *, + indent_size: int = 4, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = False, + indent_guides: bool = False, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, + expand_all: bool = False, + margin: int = 0, + insert_line: bool = False, + ) -> None: + self._object = _object + self.highlighter = highlighter or ReprHighlighter() + self.indent_size = indent_size + self.justify: Optional["JustifyMethod"] = justify + self.overflow: Optional["OverflowMethod"] = overflow + self.no_wrap = no_wrap + self.indent_guides = indent_guides + self.max_length = max_length + self.max_string = max_string + self.max_depth = max_depth + self.expand_all = expand_all + self.margin = margin + self.insert_line = insert_line + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + pretty_str = pretty_repr( + self._object, + max_width=options.max_width - self.margin, + indent_size=self.indent_size, + max_length=self.max_length, + max_string=self.max_string, + max_depth=self.max_depth, + expand_all=self.expand_all, + ) + pretty_text = Text.from_ansi( + pretty_str, + justify=self.justify or options.justify, + overflow=self.overflow or options.overflow, + no_wrap=pick_bool(self.no_wrap, options.no_wrap), + style="pretty", + ) + pretty_text = ( + self.highlighter(pretty_text) + if pretty_text + else Text( + f"{type(self._object)}.__repr__ returned empty string", + style="dim italic", + ) + ) + if self.indent_guides and not options.ascii_only: + pretty_text = pretty_text.with_indent_guides( + self.indent_size, style="repr.indent" + ) + if self.insert_line and "\n" in pretty_text: + yield "" + yield pretty_text + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + pretty_str = pretty_repr( + self._object, + max_width=options.max_width, + indent_size=self.indent_size, + max_length=self.max_length, + max_string=self.max_string, + max_depth=self.max_depth, + expand_all=self.expand_all, + ) + text_width = ( + max(cell_len(line) for line in pretty_str.splitlines()) if pretty_str else 0 + ) + return Measurement(text_width, text_width) + + +def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, str, str]: + return ( + f"defaultdict({_object.default_factory!r}, {{", + "})", + f"defaultdict({_object.default_factory!r}, {{}})", + ) + + +def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: + return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})") + + +_BRACES: Dict[type, Callable[[Any], Tuple[str, str, str]]] = { + os._Environ: lambda _object: ("environ({", "})", "environ({})"), + array: _get_braces_for_array, + defaultdict: _get_braces_for_defaultdict, + Counter: lambda _object: ("Counter({", "})", "Counter()"), + deque: lambda _object: ("deque([", "])", "deque()"), + dict: lambda _object: ("{", "}", "{}"), + UserDict: lambda _object: ("{", "}", "{}"), + frozenset: lambda _object: ("frozenset({", "})", "frozenset()"), + list: lambda _object: ("[", "]", "[]"), + UserList: lambda _object: ("[", "]", "[]"), + set: lambda _object: ("{", "}", "set()"), + tuple: lambda _object: ("(", ")", "()"), + MappingProxyType: lambda _object: ("mappingproxy({", "})", "mappingproxy({})"), +} +_CONTAINERS = tuple(_BRACES.keys()) +_MAPPING_CONTAINERS = (dict, os._Environ, MappingProxyType, UserDict) + + +def is_expandable(obj: Any) -> bool: + """Check if an object may be expanded by pretty print.""" + return ( + _safe_isinstance(obj, _CONTAINERS) + or (is_dataclass(obj)) + or (hasattr(obj, "__rich_repr__")) + or _is_attr_object(obj) + ) and not isclass(obj) + + +@dataclass +class Node: + """A node in a repr tree. May be atomic or a container.""" + + key_repr: str = "" + value_repr: str = "" + open_brace: str = "" + close_brace: str = "" + empty: str = "" + last: bool = False + is_tuple: bool = False + is_namedtuple: bool = False + children: Optional[List["Node"]] = None + key_separator: str = ": " + separator: str = ", " + + def iter_tokens(self) -> Iterable[str]: + """Generate tokens for this node.""" + if self.key_repr: + yield self.key_repr + yield self.key_separator + if self.value_repr: + yield self.value_repr + elif self.children is not None: + if self.children: + yield self.open_brace + if self.is_tuple and not self.is_namedtuple and len(self.children) == 1: + yield from self.children[0].iter_tokens() + yield "," + else: + for child in self.children: + yield from child.iter_tokens() + if not child.last: + yield self.separator + yield self.close_brace + else: + yield self.empty + + def check_length(self, start_length: int, max_length: int) -> bool: + """Check the length fits within a limit. + + Args: + start_length (int): Starting length of the line (indent, prefix, suffix). + max_length (int): Maximum length. + + Returns: + bool: True if the node can be rendered within max length, otherwise False. + """ + total_length = start_length + for token in self.iter_tokens(): + total_length += cell_len(token) + if total_length > max_length: + return False + return True + + def __str__(self) -> str: + repr_text = "".join(self.iter_tokens()) + return repr_text + + def render( + self, max_width: int = 80, indent_size: int = 4, expand_all: bool = False + ) -> str: + """Render the node to a pretty repr. + + Args: + max_width (int, optional): Maximum width of the repr. Defaults to 80. + indent_size (int, optional): Size of indents. Defaults to 4. + expand_all (bool, optional): Expand all levels. Defaults to False. + + Returns: + str: A repr string of the original object. + """ + lines = [_Line(node=self, is_root=True)] + line_no = 0 + while line_no < len(lines): + line = lines[line_no] + if line.expandable and not line.expanded: + if expand_all or not line.check_length(max_width): + lines[line_no : line_no + 1] = line.expand(indent_size) + line_no += 1 + + repr_str = "\n".join(str(line) for line in lines) + return repr_str + + +@dataclass +class _Line: + """A line in repr output.""" + + parent: Optional["_Line"] = None + is_root: bool = False + node: Optional[Node] = None + text: str = "" + suffix: str = "" + whitespace: str = "" + expanded: bool = False + last: bool = False + + @property + def expandable(self) -> bool: + """Check if the line may be expanded.""" + return bool(self.node is not None and self.node.children) + + def check_length(self, max_length: int) -> bool: + """Check this line fits within a given number of cells.""" + start_length = ( + len(self.whitespace) + cell_len(self.text) + cell_len(self.suffix) + ) + assert self.node is not None + return self.node.check_length(start_length, max_length) + + def expand(self, indent_size: int) -> Iterable["_Line"]: + """Expand this line by adding children on their own line.""" + node = self.node + assert node is not None + whitespace = self.whitespace + assert node.children + if node.key_repr: + new_line = yield _Line( + text=f"{node.key_repr}{node.key_separator}{node.open_brace}", + whitespace=whitespace, + ) + else: + new_line = yield _Line(text=node.open_brace, whitespace=whitespace) + child_whitespace = self.whitespace + " " * indent_size + tuple_of_one = node.is_tuple and len(node.children) == 1 + for last, child in loop_last(node.children): + separator = "," if tuple_of_one else node.separator + line = _Line( + parent=new_line, + node=child, + whitespace=child_whitespace, + suffix=separator, + last=last and not tuple_of_one, + ) + yield line + + yield _Line( + text=node.close_brace, + whitespace=whitespace, + suffix=self.suffix, + last=self.last, + ) + + def __str__(self) -> str: + if self.last: + return f"{self.whitespace}{self.text}{self.node or ''}" + else: + return ( + f"{self.whitespace}{self.text}{self.node or ''}{self.suffix.rstrip()}" + ) + + +def _is_namedtuple(obj: Any) -> bool: + """Checks if an object is most likely a namedtuple. It is possible + to craft an object that passes this check and isn't a namedtuple, but + there is only a minuscule chance of this happening unintentionally. + + Args: + obj (Any): The object to test + + Returns: + bool: True if the object is a namedtuple. False otherwise. + """ + try: + fields = getattr(obj, "_fields", None) + except Exception: + # Being very defensive - if we cannot get the attr then its not a namedtuple + return False + return isinstance(obj, tuple) and isinstance(fields, tuple) + + +def traverse( + _object: Any, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, +) -> Node: + """Traverse object and generate a tree. + + Args: + _object (Any): Object to be traversed. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. + Defaults to None. + max_depth (int, optional): Maximum depth of data structures, or None for no maximum. + Defaults to None. + + Returns: + Node: The root of a tree structure which can be used to render a pretty repr. + """ + + def to_repr(obj: Any) -> str: + """Get repr string for an object, but catch errors.""" + if ( + max_string is not None + and _safe_isinstance(obj, (bytes, str)) + and len(obj) > max_string + ): + truncated = len(obj) - max_string + obj_repr = f"{obj[:max_string]!r}+{truncated}" + else: + try: + obj_repr = repr(obj) + except Exception as error: + obj_repr = f"" + return obj_repr + + visited_ids: Set[int] = set() + push_visited = visited_ids.add + pop_visited = visited_ids.remove + + def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node: + """Walk the object depth first.""" + + obj_id = id(obj) + if obj_id in visited_ids: + # Recursion detected + return Node(value_repr="...") + + obj_type = type(obj) + children: List[Node] + reached_max_depth = max_depth is not None and depth >= max_depth + + def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]: + for arg in rich_args: + if _safe_isinstance(arg, tuple): + if len(arg) == 3: + key, child, default = arg + if default == child: + continue + yield key, child + elif len(arg) == 2: + key, child = arg + yield key, child + elif len(arg) == 1: + yield arg[0] + else: + yield arg + + try: + fake_attributes = hasattr( + obj, "awehoi234_wdfjwljet234_234wdfoijsdfmmnxpi492" + ) + except Exception: + fake_attributes = False + + rich_repr_result: Optional[RichReprResult] = None + if not fake_attributes: + try: + if hasattr(obj, "__rich_repr__") and not isclass(obj): + rich_repr_result = obj.__rich_repr__() + except Exception: + pass + + if rich_repr_result is not None: + push_visited(obj_id) + angular = getattr(obj.__rich_repr__, "angular", False) + args = list(iter_rich_args(rich_repr_result)) + class_name = obj.__class__.__name__ + + if args: + children = [] + append = children.append + + if reached_max_depth: + if angular: + node = Node(value_repr=f"<{class_name}...>") + else: + node = Node(value_repr=f"{class_name}(...)") + else: + if angular: + node = Node( + open_brace=f"<{class_name} ", + close_brace=">", + children=children, + last=root, + separator=" ", + ) + else: + node = Node( + open_brace=f"{class_name}(", + close_brace=")", + children=children, + last=root, + ) + for last, arg in loop_last(args): + if _safe_isinstance(arg, tuple): + key, child = arg + child_node = _traverse(child, depth=depth + 1) + child_node.last = last + child_node.key_repr = key + child_node.key_separator = "=" + append(child_node) + else: + child_node = _traverse(arg, depth=depth + 1) + child_node.last = last + append(child_node) + else: + node = Node( + value_repr=f"<{class_name}>" if angular else f"{class_name}()", + children=[], + last=root, + ) + pop_visited(obj_id) + elif _is_attr_object(obj) and not fake_attributes: + push_visited(obj_id) + children = [] + append = children.append + + attr_fields = _get_attr_fields(obj) + if attr_fields: + if reached_max_depth: + node = Node(value_repr=f"{obj.__class__.__name__}(...)") + else: + node = Node( + open_brace=f"{obj.__class__.__name__}(", + close_brace=")", + children=children, + last=root, + ) + + def iter_attrs() -> ( + Iterable[Tuple[str, Any, Optional[Callable[[Any], str]]]] + ): + """Iterate over attr fields and values.""" + for attr in attr_fields: + if attr.repr: + try: + value = getattr(obj, attr.name) + except Exception as error: + # Can happen, albeit rarely + yield (attr.name, error, None) + else: + yield ( + attr.name, + value, + attr.repr if callable(attr.repr) else None, + ) + + for last, (name, value, repr_callable) in loop_last(iter_attrs()): + if repr_callable: + child_node = Node(value_repr=str(repr_callable(value))) + else: + child_node = _traverse(value, depth=depth + 1) + child_node.last = last + child_node.key_repr = name + child_node.key_separator = "=" + append(child_node) + else: + node = Node( + value_repr=f"{obj.__class__.__name__}()", children=[], last=root + ) + pop_visited(obj_id) + elif ( + is_dataclass(obj) + and not _safe_isinstance(obj, type) + and not fake_attributes + and _is_dataclass_repr(obj) + ): + push_visited(obj_id) + children = [] + append = children.append + if reached_max_depth: + node = Node(value_repr=f"{obj.__class__.__name__}(...)") + else: + node = Node( + open_brace=f"{obj.__class__.__name__}(", + close_brace=")", + children=children, + last=root, + empty=f"{obj.__class__.__name__}()", + ) + + for last, field in loop_last( + field for field in fields(obj) if field.repr + ): + child_node = _traverse(getattr(obj, field.name), depth=depth + 1) + child_node.key_repr = field.name + child_node.last = last + child_node.key_separator = "=" + append(child_node) + + pop_visited(obj_id) + elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj): + push_visited(obj_id) + class_name = obj.__class__.__name__ + if reached_max_depth: + # If we've reached the max depth, we still show the class name, but not its contents + node = Node( + value_repr=f"{class_name}(...)", + ) + else: + children = [] + append = children.append + node = Node( + open_brace=f"{class_name}(", + close_brace=")", + children=children, + empty=f"{class_name}()", + ) + for last, (key, value) in loop_last(obj._asdict().items()): + child_node = _traverse(value, depth=depth + 1) + child_node.key_repr = key + child_node.last = last + child_node.key_separator = "=" + append(child_node) + pop_visited(obj_id) + elif _safe_isinstance(obj, _CONTAINERS): + for container_type in _CONTAINERS: + if _safe_isinstance(obj, container_type): + obj_type = container_type + break + + push_visited(obj_id) + + open_brace, close_brace, empty = _BRACES[obj_type](obj) + + if reached_max_depth: + node = Node(value_repr=f"{open_brace}...{close_brace}") + elif obj_type.__repr__ != type(obj).__repr__: + node = Node(value_repr=to_repr(obj), last=root) + elif obj: + children = [] + node = Node( + open_brace=open_brace, + close_brace=close_brace, + children=children, + last=root, + ) + append = children.append + num_items = len(obj) + last_item_index = num_items - 1 + + if _safe_isinstance(obj, _MAPPING_CONTAINERS): + iter_items = iter(obj.items()) + if max_length is not None: + iter_items = islice(iter_items, max_length) + for index, (key, child) in enumerate(iter_items): + child_node = _traverse(child, depth=depth + 1) + child_node.key_repr = to_repr(key) + child_node.last = index == last_item_index + append(child_node) + else: + iter_values = iter(obj) + if max_length is not None: + iter_values = islice(iter_values, max_length) + for index, child in enumerate(iter_values): + child_node = _traverse(child, depth=depth + 1) + child_node.last = index == last_item_index + append(child_node) + if max_length is not None and num_items > max_length: + append(Node(value_repr=f"... +{num_items - max_length}", last=True)) + else: + node = Node(empty=empty, children=[], last=root) + + pop_visited(obj_id) + else: + node = Node(value_repr=to_repr(obj), last=root) + node.is_tuple = _safe_isinstance(obj, tuple) + node.is_namedtuple = _is_namedtuple(obj) + return node + + node = _traverse(_object, root=True) + return node + + +def pretty_repr( + _object: Any, + *, + max_width: int = 80, + indent_size: int = 4, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, + expand_all: bool = False, +) -> str: + """Prettify repr string by expanding on to new lines to fit within a given width. + + Args: + _object (Any): Object to repr. + max_width (int, optional): Desired maximum width of repr string. Defaults to 80. + indent_size (int, optional): Number of spaces to indent. Defaults to 4. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. + Defaults to None. + max_depth (int, optional): Maximum depth of nested data structure, or None for no depth. + Defaults to None. + expand_all (bool, optional): Expand all containers regardless of available width. Defaults to False. + + Returns: + str: A possibly multi-line representation of the object. + """ + + if _safe_isinstance(_object, Node): + node = _object + else: + node = traverse( + _object, max_length=max_length, max_string=max_string, max_depth=max_depth + ) + repr_str: str = node.render( + max_width=max_width, indent_size=indent_size, expand_all=expand_all + ) + return repr_str + + +def pprint( + _object: Any, + *, + console: Optional["Console"] = None, + indent_guides: bool = True, + max_length: Optional[int] = None, + max_string: Optional[int] = None, + max_depth: Optional[int] = None, + expand_all: bool = False, +) -> None: + """A convenience function for pretty printing. + + Args: + _object (Any): Object to pretty print. + console (Console, optional): Console instance, or None to use default. Defaults to None. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of strings before truncating, or None to disable. Defaults to None. + max_depth (int, optional): Maximum depth for nested data structures, or None for unlimited depth. Defaults to None. + indent_guides (bool, optional): Enable indentation guides. Defaults to True. + expand_all (bool, optional): Expand all containers. Defaults to False. + """ + _console = get_console() if console is None else console + _console.print( + Pretty( + _object, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + indent_guides=indent_guides, + expand_all=expand_all, + overflow="ignore", + ), + soft_wrap=True, + ) + + +if __name__ == "__main__": # pragma: no cover + + class BrokenRepr: + def __repr__(self) -> str: + 1 / 0 + return "this will fail" + + from typing import NamedTuple + + class StockKeepingUnit(NamedTuple): + name: str + description: str + price: float + category: str + reviews: List[str] + + d = defaultdict(int) + d["foo"] = 5 + data = { + "foo": [ + 1, + "Hello World!", + 100.123, + 323.232, + 432324.0, + {5, 6, 7, (1, 2, 3, 4), 8}, + ], + "bar": frozenset({1, 2, 3}), + "defaultdict": defaultdict( + list, {"crumble": ["apple", "rhubarb", "butter", "sugar", "flour"]} + ), + "counter": Counter( + [ + "apple", + "orange", + "pear", + "kumquat", + "kumquat", + "durian" * 100, + ] + ), + "atomic": (False, True, None), + "namedtuple": StockKeepingUnit( + "Sparkling British Spring Water", + "Carbonated spring water", + 0.9, + "water", + ["its amazing!", "its terrible!"], + ), + "Broken": BrokenRepr(), + } + data["foo"].append(data) # type: ignore[attr-defined] + + from pip._vendor.rich import print + + print(Pretty(data, indent_guides=True, max_string=20)) + + class Thing: + def __repr__(self) -> str: + return "Hello\x1b[38;5;239m World!" + + print(Pretty(Thing())) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py new file mode 100644 index 0000000..2420c24 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress.py @@ -0,0 +1,1699 @@ +import io +import sys +import typing +import warnings +from abc import ABC, abstractmethod +from collections import deque +from dataclasses import dataclass, field +from datetime import timedelta +from io import RawIOBase, UnsupportedOperation +from math import ceil +from mmap import mmap +from operator import length_hint +from os import PathLike, stat +from threading import Event, RLock, Thread +from types import TracebackType +from typing import ( + Any, + BinaryIO, + Callable, + ContextManager, + Deque, + Dict, + Generic, + Iterable, + List, + NamedTuple, + NewType, + Optional, + Sequence, + TextIO, + Tuple, + Type, + TypeVar, + Union, +) + +if sys.version_info >= (3, 8): + from typing import Literal +else: + from pip._vendor.typing_extensions import Literal # pragma: no cover + +from . import filesize, get_console +from .console import Console, Group, JustifyMethod, RenderableType +from .highlighter import Highlighter +from .jupyter import JupyterMixin +from .live import Live +from .progress_bar import ProgressBar +from .spinner import Spinner +from .style import StyleType +from .table import Column, Table +from .text import Text, TextType + +TaskID = NewType("TaskID", int) + +ProgressType = TypeVar("ProgressType") + +GetTimeCallable = Callable[[], float] + + +_I = typing.TypeVar("_I", TextIO, BinaryIO) + + +class _TrackThread(Thread): + """A thread to periodically update progress.""" + + def __init__(self, progress: "Progress", task_id: "TaskID", update_period: float): + self.progress = progress + self.task_id = task_id + self.update_period = update_period + self.done = Event() + + self.completed = 0 + super().__init__() + + def run(self) -> None: + task_id = self.task_id + advance = self.progress.advance + update_period = self.update_period + last_completed = 0 + wait = self.done.wait + while not wait(update_period): + completed = self.completed + if last_completed != completed: + advance(task_id, completed - last_completed) + last_completed = completed + + self.progress.update(self.task_id, completed=self.completed, refresh=True) + + def __enter__(self) -> "_TrackThread": + self.start() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.done.set() + self.join() + + +def track( + sequence: Union[Sequence[ProgressType], Iterable[ProgressType]], + description: str = "Working...", + total: Optional[float] = None, + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + update_period: float = 0.1, + disable: bool = False, + show_speed: bool = True, +) -> Iterable[ProgressType]: + """Track progress by iterating over a sequence. + + Args: + sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over. + description (str, optional): Description of task show next to progress bar. Defaults to "Working". + total: (float, optional): Total number of steps. Default is len(sequence). + auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + console (Console, optional): Console to write to. Default creates internal Console instance. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. + disable (bool, optional): Disable display of progress. + show_speed (bool, optional): Show speed if total isn't known. Defaults to True. + Returns: + Iterable[ProgressType]: An iterable of the values in the sequence. + + """ + + columns: List["ProgressColumn"] = ( + [TextColumn("[progress.description]{task.description}")] if description else [] + ) + columns.extend( + ( + BarColumn( + style=style, + complete_style=complete_style, + finished_style=finished_style, + pulse_style=pulse_style, + ), + TaskProgressColumn(show_speed=show_speed), + TimeRemainingColumn(elapsed_when_finished=True), + ) + ) + progress = Progress( + *columns, + auto_refresh=auto_refresh, + console=console, + transient=transient, + get_time=get_time, + refresh_per_second=refresh_per_second or 10, + disable=disable, + ) + + with progress: + yield from progress.track( + sequence, total=total, description=description, update_period=update_period + ) + + +class _Reader(RawIOBase, BinaryIO): + """A reader that tracks progress while it's being read from.""" + + def __init__( + self, + handle: BinaryIO, + progress: "Progress", + task: TaskID, + close_handle: bool = True, + ) -> None: + self.handle = handle + self.progress = progress + self.task = task + self.close_handle = close_handle + self._closed = False + + def __enter__(self) -> "_Reader": + self.handle.__enter__() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.close() + + def __iter__(self) -> BinaryIO: + return self + + def __next__(self) -> bytes: + line = next(self.handle) + self.progress.advance(self.task, advance=len(line)) + return line + + @property + def closed(self) -> bool: + return self._closed + + def fileno(self) -> int: + return self.handle.fileno() + + def isatty(self) -> bool: + return self.handle.isatty() + + @property + def mode(self) -> str: + return self.handle.mode + + @property + def name(self) -> str: + return self.handle.name + + def readable(self) -> bool: + return self.handle.readable() + + def seekable(self) -> bool: + return self.handle.seekable() + + def writable(self) -> bool: + return False + + def read(self, size: int = -1) -> bytes: + block = self.handle.read(size) + self.progress.advance(self.task, advance=len(block)) + return block + + def readinto(self, b: Union[bytearray, memoryview, mmap]): # type: ignore[no-untyped-def, override] + n = self.handle.readinto(b) # type: ignore[attr-defined] + self.progress.advance(self.task, advance=n) + return n + + def readline(self, size: int = -1) -> bytes: # type: ignore[override] + line = self.handle.readline(size) + self.progress.advance(self.task, advance=len(line)) + return line + + def readlines(self, hint: int = -1) -> List[bytes]: + lines = self.handle.readlines(hint) + self.progress.advance(self.task, advance=sum(map(len, lines))) + return lines + + def close(self) -> None: + if self.close_handle: + self.handle.close() + self._closed = True + + def seek(self, offset: int, whence: int = 0) -> int: + pos = self.handle.seek(offset, whence) + self.progress.update(self.task, completed=pos) + return pos + + def tell(self) -> int: + return self.handle.tell() + + def write(self, s: Any) -> int: + raise UnsupportedOperation("write") + + +class _ReadContext(ContextManager[_I], Generic[_I]): + """A utility class to handle a context for both a reader and a progress.""" + + def __init__(self, progress: "Progress", reader: _I) -> None: + self.progress = progress + self.reader: _I = reader + + def __enter__(self) -> _I: + self.progress.start() + return self.reader.__enter__() + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.progress.stop() + self.reader.__exit__(exc_type, exc_val, exc_tb) + + +def wrap_file( + file: BinaryIO, + total: int, + *, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[BinaryIO]: + """Read bytes from a file while tracking progress. + + Args: + file (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. + total (int): Total number of bytes to read. + description (str, optional): Description of task show next to progress bar. Defaults to "Reading". + auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + console (Console, optional): Console to write to. Default creates internal Console instance. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + disable (bool, optional): Disable display of progress. + Returns: + ContextManager[BinaryIO]: A context manager yielding a progress reader. + + """ + + columns: List["ProgressColumn"] = ( + [TextColumn("[progress.description]{task.description}")] if description else [] + ) + columns.extend( + ( + BarColumn( + style=style, + complete_style=complete_style, + finished_style=finished_style, + pulse_style=pulse_style, + ), + DownloadColumn(), + TimeRemainingColumn(), + ) + ) + progress = Progress( + *columns, + auto_refresh=auto_refresh, + console=console, + transient=transient, + get_time=get_time, + refresh_per_second=refresh_per_second or 10, + disable=disable, + ) + + reader = progress.wrap_file(file, total=total, description=description) + return _ReadContext(progress, reader) + + +@typing.overload +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rt"], Literal["r"]], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[TextIO]: + pass + + +@typing.overload +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Literal["rb"], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> ContextManager[BinaryIO]: + pass + + +def open( + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + description: str = "Reading...", + auto_refresh: bool = True, + console: Optional[Console] = None, + transient: bool = False, + get_time: Optional[Callable[[], float]] = None, + refresh_per_second: float = 10, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + disable: bool = False, +) -> Union[ContextManager[BinaryIO], ContextManager[TextIO]]: + """Read bytes from a file while tracking progress. + + Args: + path (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. + mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". + buffering (int): The buffering strategy to use, see :func:`io.open`. + encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. + errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. + newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open` + total: (int, optional): Total number of bytes to read. Must be provided if reading from a file handle. Default for a path is os.stat(file).st_size. + description (str, optional): Description of task show next to progress bar. Defaults to "Reading". + auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + console (Console, optional): Console to write to. Default creates internal Console instance. + refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + disable (bool, optional): Disable display of progress. + encoding (str, optional): The encoding to use when reading in text mode. + + Returns: + ContextManager[BinaryIO]: A context manager yielding a progress reader. + + """ + + columns: List["ProgressColumn"] = ( + [TextColumn("[progress.description]{task.description}")] if description else [] + ) + columns.extend( + ( + BarColumn( + style=style, + complete_style=complete_style, + finished_style=finished_style, + pulse_style=pulse_style, + ), + DownloadColumn(), + TimeRemainingColumn(), + ) + ) + progress = Progress( + *columns, + auto_refresh=auto_refresh, + console=console, + transient=transient, + get_time=get_time, + refresh_per_second=refresh_per_second or 10, + disable=disable, + ) + + reader = progress.open( + file, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, + total=total, + description=description, + ) + return _ReadContext(progress, reader) # type: ignore[return-value, type-var] + + +class ProgressColumn(ABC): + """Base class for a widget to use in progress display.""" + + max_refresh: Optional[float] = None + + def __init__(self, table_column: Optional[Column] = None) -> None: + self._table_column = table_column + self._renderable_cache: Dict[TaskID, Tuple[float, RenderableType]] = {} + self._update_time: Optional[float] = None + + def get_table_column(self) -> Column: + """Get a table column, used to build tasks table.""" + return self._table_column or Column() + + def __call__(self, task: "Task") -> RenderableType: + """Called by the Progress object to return a renderable for the given task. + + Args: + task (Task): An object containing information regarding the task. + + Returns: + RenderableType: Anything renderable (including str). + """ + current_time = task.get_time() + if self.max_refresh is not None and not task.completed: + try: + timestamp, renderable = self._renderable_cache[task.id] + except KeyError: + pass + else: + if timestamp + self.max_refresh > current_time: + return renderable + + renderable = self.render(task) + self._renderable_cache[task.id] = (current_time, renderable) + return renderable + + @abstractmethod + def render(self, task: "Task") -> RenderableType: + """Should return a renderable object.""" + + +class RenderableColumn(ProgressColumn): + """A column to insert an arbitrary column. + + Args: + renderable (RenderableType, optional): Any renderable. Defaults to empty string. + """ + + def __init__( + self, renderable: RenderableType = "", *, table_column: Optional[Column] = None + ): + self.renderable = renderable + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> RenderableType: + return self.renderable + + +class SpinnerColumn(ProgressColumn): + """A column with a 'spinner' animation. + + Args: + spinner_name (str, optional): Name of spinner animation. Defaults to "dots". + style (StyleType, optional): Style of spinner. Defaults to "progress.spinner". + speed (float, optional): Speed factor of spinner. Defaults to 1.0. + finished_text (TextType, optional): Text used when task is finished. Defaults to " ". + """ + + def __init__( + self, + spinner_name: str = "dots", + style: Optional[StyleType] = "progress.spinner", + speed: float = 1.0, + finished_text: TextType = " ", + table_column: Optional[Column] = None, + ): + self.spinner = Spinner(spinner_name, style=style, speed=speed) + self.finished_text = ( + Text.from_markup(finished_text) + if isinstance(finished_text, str) + else finished_text + ) + super().__init__(table_column=table_column) + + def set_spinner( + self, + spinner_name: str, + spinner_style: Optional[StyleType] = "progress.spinner", + speed: float = 1.0, + ) -> None: + """Set a new spinner. + + Args: + spinner_name (str): Spinner name, see python -m rich.spinner. + spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner". + speed (float, optional): Speed factor of spinner. Defaults to 1.0. + """ + self.spinner = Spinner(spinner_name, style=spinner_style, speed=speed) + + def render(self, task: "Task") -> RenderableType: + text = ( + self.finished_text + if task.finished + else self.spinner.render(task.get_time()) + ) + return text + + +class TextColumn(ProgressColumn): + """A column containing text.""" + + def __init__( + self, + text_format: str, + style: StyleType = "none", + justify: JustifyMethod = "left", + markup: bool = True, + highlighter: Optional[Highlighter] = None, + table_column: Optional[Column] = None, + ) -> None: + self.text_format = text_format + self.justify: JustifyMethod = justify + self.style = style + self.markup = markup + self.highlighter = highlighter + super().__init__(table_column=table_column or Column(no_wrap=True)) + + def render(self, task: "Task") -> Text: + _text = self.text_format.format(task=task) + if self.markup: + text = Text.from_markup(_text, style=self.style, justify=self.justify) + else: + text = Text(_text, style=self.style, justify=self.justify) + if self.highlighter: + self.highlighter.highlight(text) + return text + + +class BarColumn(ProgressColumn): + """Renders a visual progress bar. + + Args: + bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + """ + + def __init__( + self, + bar_width: Optional[int] = 40, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + table_column: Optional[Column] = None, + ) -> None: + self.bar_width = bar_width + self.style = style + self.complete_style = complete_style + self.finished_style = finished_style + self.pulse_style = pulse_style + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> ProgressBar: + """Gets a progress bar widget for a task.""" + return ProgressBar( + total=max(0, task.total) if task.total is not None else None, + completed=max(0, task.completed), + width=None if self.bar_width is None else max(1, self.bar_width), + pulse=not task.started, + animation_time=task.get_time(), + style=self.style, + complete_style=self.complete_style, + finished_style=self.finished_style, + pulse_style=self.pulse_style, + ) + + +class TimeElapsedColumn(ProgressColumn): + """Renders time elapsed.""" + + def render(self, task: "Task") -> Text: + """Show time elapsed.""" + elapsed = task.finished_time if task.finished else task.elapsed + if elapsed is None: + return Text("-:--:--", style="progress.elapsed") + delta = timedelta(seconds=max(0, int(elapsed))) + return Text(str(delta), style="progress.elapsed") + + +class TaskProgressColumn(TextColumn): + """Show task progress as a percentage. + + Args: + text_format (str, optional): Format for percentage display. Defaults to "[progress.percentage]{task.percentage:>3.0f}%". + text_format_no_percentage (str, optional): Format if percentage is unknown. Defaults to "". + style (StyleType, optional): Style of output. Defaults to "none". + justify (JustifyMethod, optional): Text justification. Defaults to "left". + markup (bool, optional): Enable markup. Defaults to True. + highlighter (Optional[Highlighter], optional): Highlighter to apply to output. Defaults to None. + table_column (Optional[Column], optional): Table Column to use. Defaults to None. + show_speed (bool, optional): Show speed if total is unknown. Defaults to False. + """ + + def __init__( + self, + text_format: str = "[progress.percentage]{task.percentage:>3.0f}%", + text_format_no_percentage: str = "", + style: StyleType = "none", + justify: JustifyMethod = "left", + markup: bool = True, + highlighter: Optional[Highlighter] = None, + table_column: Optional[Column] = None, + show_speed: bool = False, + ) -> None: + self.text_format_no_percentage = text_format_no_percentage + self.show_speed = show_speed + super().__init__( + text_format=text_format, + style=style, + justify=justify, + markup=markup, + highlighter=highlighter, + table_column=table_column, + ) + + @classmethod + def render_speed(cls, speed: Optional[float]) -> Text: + """Render the speed in iterations per second. + + Args: + task (Task): A Task object. + + Returns: + Text: Text object containing the task speed. + """ + if speed is None: + return Text("", style="progress.percentage") + unit, suffix = filesize.pick_unit_and_suffix( + int(speed), + ["", "×10³", "×10⁶", "×10⁹", "×10¹²"], + 1000, + ) + data_speed = speed / unit + return Text(f"{data_speed:.1f}{suffix} it/s", style="progress.percentage") + + def render(self, task: "Task") -> Text: + if task.total is None and self.show_speed: + return self.render_speed(task.finished_speed or task.speed) + text_format = ( + self.text_format_no_percentage if task.total is None else self.text_format + ) + _text = text_format.format(task=task) + if self.markup: + text = Text.from_markup(_text, style=self.style, justify=self.justify) + else: + text = Text(_text, style=self.style, justify=self.justify) + if self.highlighter: + self.highlighter.highlight(text) + return text + + +class TimeRemainingColumn(ProgressColumn): + """Renders estimated time remaining. + + Args: + compact (bool, optional): Render MM:SS when time remaining is less than an hour. Defaults to False. + elapsed_when_finished (bool, optional): Render time elapsed when the task is finished. Defaults to False. + """ + + # Only refresh twice a second to prevent jitter + max_refresh = 0.5 + + def __init__( + self, + compact: bool = False, + elapsed_when_finished: bool = False, + table_column: Optional[Column] = None, + ): + self.compact = compact + self.elapsed_when_finished = elapsed_when_finished + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> Text: + """Show time remaining.""" + if self.elapsed_when_finished and task.finished: + task_time = task.finished_time + style = "progress.elapsed" + else: + task_time = task.time_remaining + style = "progress.remaining" + + if task.total is None: + return Text("", style=style) + + if task_time is None: + return Text("--:--" if self.compact else "-:--:--", style=style) + + # Based on https://github.com/tqdm/tqdm/blob/master/tqdm/std.py + minutes, seconds = divmod(int(task_time), 60) + hours, minutes = divmod(minutes, 60) + + if self.compact and not hours: + formatted = f"{minutes:02d}:{seconds:02d}" + else: + formatted = f"{hours:d}:{minutes:02d}:{seconds:02d}" + + return Text(formatted, style=style) + + +class FileSizeColumn(ProgressColumn): + """Renders completed filesize.""" + + def render(self, task: "Task") -> Text: + """Show data completed.""" + data_size = filesize.decimal(int(task.completed)) + return Text(data_size, style="progress.filesize") + + +class TotalFileSizeColumn(ProgressColumn): + """Renders total filesize.""" + + def render(self, task: "Task") -> Text: + """Show data completed.""" + data_size = filesize.decimal(int(task.total)) if task.total is not None else "" + return Text(data_size, style="progress.filesize.total") + + +class MofNCompleteColumn(ProgressColumn): + """Renders completed count/total, e.g. ' 10/1000'. + + Best for bounded tasks with int quantities. + + Space pads the completed count so that progress length does not change as task progresses + past powers of 10. + + Args: + separator (str, optional): Text to separate completed and total values. Defaults to "/". + """ + + def __init__(self, separator: str = "/", table_column: Optional[Column] = None): + self.separator = separator + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> Text: + """Show completed/total.""" + completed = int(task.completed) + total = int(task.total) if task.total is not None else "?" + total_width = len(str(total)) + return Text( + f"{completed:{total_width}d}{self.separator}{total}", + style="progress.download", + ) + + +class DownloadColumn(ProgressColumn): + """Renders file size downloaded and total, e.g. '0.5/2.3 GB'. + + Args: + binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False. + """ + + def __init__( + self, binary_units: bool = False, table_column: Optional[Column] = None + ) -> None: + self.binary_units = binary_units + super().__init__(table_column=table_column) + + def render(self, task: "Task") -> Text: + """Calculate common unit for completed and total.""" + completed = int(task.completed) + + unit_and_suffix_calculation_base = ( + int(task.total) if task.total is not None else completed + ) + if self.binary_units: + unit, suffix = filesize.pick_unit_and_suffix( + unit_and_suffix_calculation_base, + ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], + 1024, + ) + else: + unit, suffix = filesize.pick_unit_and_suffix( + unit_and_suffix_calculation_base, + ["bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], + 1000, + ) + precision = 0 if unit == 1 else 1 + + completed_ratio = completed / unit + completed_str = f"{completed_ratio:,.{precision}f}" + + if task.total is not None: + total = int(task.total) + total_ratio = total / unit + total_str = f"{total_ratio:,.{precision}f}" + else: + total_str = "?" + + download_status = f"{completed_str}/{total_str} {suffix}" + download_text = Text(download_status, style="progress.download") + return download_text + + +class TransferSpeedColumn(ProgressColumn): + """Renders human readable transfer speed.""" + + def render(self, task: "Task") -> Text: + """Show data transfer speed.""" + speed = task.finished_speed or task.speed + if speed is None: + return Text("?", style="progress.data.speed") + data_speed = filesize.decimal(int(speed)) + return Text(f"{data_speed}/s", style="progress.data.speed") + + +class ProgressSample(NamedTuple): + """Sample of progress for a given time.""" + + timestamp: float + """Timestamp of sample.""" + completed: float + """Number of steps completed.""" + + +@dataclass +class Task: + """Information regarding a progress task. + + This object should be considered read-only outside of the :class:`~Progress` class. + + """ + + id: TaskID + """Task ID associated with this task (used in Progress methods).""" + + description: str + """str: Description of the task.""" + + total: Optional[float] + """Optional[float]: Total number of steps in this task.""" + + completed: float + """float: Number of steps completed""" + + _get_time: GetTimeCallable + """Callable to get the current time.""" + + finished_time: Optional[float] = None + """float: Time task was finished.""" + + visible: bool = True + """bool: Indicates if this task is visible in the progress display.""" + + fields: Dict[str, Any] = field(default_factory=dict) + """dict: Arbitrary fields passed in via Progress.update.""" + + start_time: Optional[float] = field(default=None, init=False, repr=False) + """Optional[float]: Time this task was started, or None if not started.""" + + stop_time: Optional[float] = field(default=None, init=False, repr=False) + """Optional[float]: Time this task was stopped, or None if not stopped.""" + + finished_speed: Optional[float] = None + """Optional[float]: The last speed for a finished task.""" + + _progress: Deque[ProgressSample] = field( + default_factory=lambda: deque(maxlen=1000), init=False, repr=False + ) + + _lock: RLock = field(repr=False, default_factory=RLock) + """Thread lock.""" + + def get_time(self) -> float: + """float: Get the current time, in seconds.""" + return self._get_time() + + @property + def started(self) -> bool: + """bool: Check if the task as started.""" + return self.start_time is not None + + @property + def remaining(self) -> Optional[float]: + """Optional[float]: Get the number of steps remaining, if a non-None total was set.""" + if self.total is None: + return None + return self.total - self.completed + + @property + def elapsed(self) -> Optional[float]: + """Optional[float]: Time elapsed since task was started, or ``None`` if the task hasn't started.""" + if self.start_time is None: + return None + if self.stop_time is not None: + return self.stop_time - self.start_time + return self.get_time() - self.start_time + + @property + def finished(self) -> bool: + """Check if the task has finished.""" + return self.finished_time is not None + + @property + def percentage(self) -> float: + """float: Get progress of task as a percentage. If a None total was set, returns 0""" + if not self.total: + return 0.0 + completed = (self.completed / self.total) * 100.0 + completed = min(100.0, max(0.0, completed)) + return completed + + @property + def speed(self) -> Optional[float]: + """Optional[float]: Get the estimated speed in steps per second.""" + if self.start_time is None: + return None + with self._lock: + progress = self._progress + if not progress: + return None + total_time = progress[-1].timestamp - progress[0].timestamp + if total_time == 0: + return None + iter_progress = iter(progress) + next(iter_progress) + total_completed = sum(sample.completed for sample in iter_progress) + speed = total_completed / total_time + return speed + + @property + def time_remaining(self) -> Optional[float]: + """Optional[float]: Get estimated time to completion, or ``None`` if no data.""" + if self.finished: + return 0.0 + speed = self.speed + if not speed: + return None + remaining = self.remaining + if remaining is None: + return None + estimate = ceil(remaining / speed) + return estimate + + def _reset(self) -> None: + """Reset progress.""" + self._progress.clear() + self.finished_time = None + self.finished_speed = None + + +class Progress(JupyterMixin): + """Renders an auto-updating progress bar(s). + + Args: + console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. + auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. + refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. + speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. + transient: (bool, optional): Clear the progress on exit. Defaults to False. + redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. + redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True. + get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None. + disable (bool, optional): Disable progress display. Defaults to False + expand (bool, optional): Expand tasks table to fit width. Defaults to False. + """ + + def __init__( + self, + *columns: Union[str, ProgressColumn], + console: Optional[Console] = None, + auto_refresh: bool = True, + refresh_per_second: float = 10, + speed_estimate_period: float = 30.0, + transient: bool = False, + redirect_stdout: bool = True, + redirect_stderr: bool = True, + get_time: Optional[GetTimeCallable] = None, + disable: bool = False, + expand: bool = False, + ) -> None: + assert refresh_per_second > 0, "refresh_per_second must be > 0" + self._lock = RLock() + self.columns = columns or self.get_default_columns() + self.speed_estimate_period = speed_estimate_period + + self.disable = disable + self.expand = expand + self._tasks: Dict[TaskID, Task] = {} + self._task_index: TaskID = TaskID(0) + self.live = Live( + console=console or get_console(), + auto_refresh=auto_refresh, + refresh_per_second=refresh_per_second, + transient=transient, + redirect_stdout=redirect_stdout, + redirect_stderr=redirect_stderr, + get_renderable=self.get_renderable, + ) + self.get_time = get_time or self.console.get_time + self.print = self.console.print + self.log = self.console.log + + @classmethod + def get_default_columns(cls) -> Tuple[ProgressColumn, ...]: + """Get the default columns used for a new Progress instance: + - a text column for the description (TextColumn) + - the bar itself (BarColumn) + - a text column showing completion percentage (TextColumn) + - an estimated-time-remaining column (TimeRemainingColumn) + If the Progress instance is created without passing a columns argument, + the default columns defined here will be used. + + You can also create a Progress instance using custom columns before + and/or after the defaults, as in this example: + + progress = Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + "Elapsed:", + TimeElapsedColumn(), + ) + + This code shows the creation of a Progress display, containing + a spinner to the left, the default columns, and a labeled elapsed + time column. + """ + return ( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + TaskProgressColumn(), + TimeRemainingColumn(), + ) + + @property + def console(self) -> Console: + return self.live.console + + @property + def tasks(self) -> List[Task]: + """Get a list of Task instances.""" + with self._lock: + return list(self._tasks.values()) + + @property + def task_ids(self) -> List[TaskID]: + """A list of task IDs.""" + with self._lock: + return list(self._tasks.keys()) + + @property + def finished(self) -> bool: + """Check if all tasks have been completed.""" + with self._lock: + if not self._tasks: + return True + return all(task.finished for task in self._tasks.values()) + + def start(self) -> None: + """Start the progress display.""" + if not self.disable: + self.live.start(refresh=True) + + def stop(self) -> None: + """Stop the progress display.""" + self.live.stop() + if not self.console.is_interactive: + self.console.print() + + def __enter__(self) -> "Progress": + self.start() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.stop() + + def track( + self, + sequence: Union[Iterable[ProgressType], Sequence[ProgressType]], + total: Optional[float] = None, + task_id: Optional[TaskID] = None, + description: str = "Working...", + update_period: float = 0.1, + ) -> Iterable[ProgressType]: + """Track progress by iterating over a sequence. + + Args: + sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress. + total: (float, optional): Total number of steps. Default is len(sequence). + task_id: (TaskID): Task to track. Default is new task. + description: (str, optional): Description of task, if new task is created. + update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. + + Returns: + Iterable[ProgressType]: An iterable of values taken from the provided sequence. + """ + if total is None: + total = float(length_hint(sequence)) or None + + if task_id is None: + task_id = self.add_task(description, total=total) + else: + self.update(task_id, total=total) + + if self.live.auto_refresh: + with _TrackThread(self, task_id, update_period) as track_thread: + for value in sequence: + yield value + track_thread.completed += 1 + else: + advance = self.advance + refresh = self.refresh + for value in sequence: + yield value + advance(task_id, 1) + refresh() + + def wrap_file( + self, + file: BinaryIO, + total: Optional[int] = None, + *, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> BinaryIO: + """Track progress file reading from a binary file. + + Args: + file (BinaryIO): A file-like object opened in binary mode. + total (int, optional): Total number of bytes to read. This must be provided unless a task with a total is also given. + task_id (TaskID): Task to track. Default is new task. + description (str, optional): Description of task, if new task is created. + + Returns: + BinaryIO: A readable file-like object in binary mode. + + Raises: + ValueError: When no total value can be extracted from the arguments or the task. + """ + # attempt to recover the total from the task + total_bytes: Optional[float] = None + if total is not None: + total_bytes = total + elif task_id is not None: + with self._lock: + total_bytes = self._tasks[task_id].total + if total_bytes is None: + raise ValueError( + f"unable to get the total number of bytes, please specify 'total'" + ) + + # update total of task or create new task + if task_id is None: + task_id = self.add_task(description, total=total_bytes) + else: + self.update(task_id, total=total_bytes) + + return _Reader(file, self, task_id, close_handle=False) + + @typing.overload + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Literal["rb"], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> BinaryIO: + pass + + @typing.overload + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["r"], Literal["rt"]], + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> TextIO: + pass + + def open( + self, + file: Union[str, "PathLike[str]", bytes], + mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + *, + total: Optional[int] = None, + task_id: Optional[TaskID] = None, + description: str = "Reading...", + ) -> Union[BinaryIO, TextIO]: + """Track progress while reading from a binary file. + + Args: + path (Union[str, PathLike[str]]): The path to the file to read. + mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". + buffering (int): The buffering strategy to use, see :func:`io.open`. + encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. + errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. + newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`. + total (int, optional): Total number of bytes to read. If none given, os.stat(path).st_size is used. + task_id (TaskID): Task to track. Default is new task. + description (str, optional): Description of task, if new task is created. + + Returns: + BinaryIO: A readable file-like object in binary mode. + + Raises: + ValueError: When an invalid mode is given. + """ + # normalize the mode (always rb, rt) + _mode = "".join(sorted(mode, reverse=False)) + if _mode not in ("br", "rt", "r"): + raise ValueError("invalid mode {!r}".format(mode)) + + # patch buffering to provide the same behaviour as the builtin `open` + line_buffering = buffering == 1 + if _mode == "br" and buffering == 1: + warnings.warn( + "line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used", + RuntimeWarning, + ) + buffering = -1 + elif _mode in ("rt", "r"): + if buffering == 0: + raise ValueError("can't have unbuffered text I/O") + elif buffering == 1: + buffering = -1 + + # attempt to get the total with `os.stat` + if total is None: + total = stat(file).st_size + + # update total of task or create new task + if task_id is None: + task_id = self.add_task(description, total=total) + else: + self.update(task_id, total=total) + + # open the file in binary mode, + handle = io.open(file, "rb", buffering=buffering) + reader = _Reader(handle, self, task_id, close_handle=True) + + # wrap the reader in a `TextIOWrapper` if text mode + if mode in ("r", "rt"): + return io.TextIOWrapper( + reader, + encoding=encoding, + errors=errors, + newline=newline, + line_buffering=line_buffering, + ) + + return reader + + def start_task(self, task_id: TaskID) -> None: + """Start a task. + + Starts a task (used when calculating elapsed time). You may need to call this manually, + if you called ``add_task`` with ``start=False``. + + Args: + task_id (TaskID): ID of task. + """ + with self._lock: + task = self._tasks[task_id] + if task.start_time is None: + task.start_time = self.get_time() + + def stop_task(self, task_id: TaskID) -> None: + """Stop a task. + + This will freeze the elapsed time on the task. + + Args: + task_id (TaskID): ID of task. + """ + with self._lock: + task = self._tasks[task_id] + current_time = self.get_time() + if task.start_time is None: + task.start_time = current_time + task.stop_time = current_time + + def update( + self, + task_id: TaskID, + *, + total: Optional[float] = None, + completed: Optional[float] = None, + advance: Optional[float] = None, + description: Optional[str] = None, + visible: Optional[bool] = None, + refresh: bool = False, + **fields: Any, + ) -> None: + """Update information associated with a task. + + Args: + task_id (TaskID): Task id (returned by add_task). + total (float, optional): Updates task.total if not None. + completed (float, optional): Updates task.completed if not None. + advance (float, optional): Add a value to task.completed if not None. + description (str, optional): Change task description if not None. + visible (bool, optional): Set visible flag if not None. + refresh (bool): Force a refresh of progress information. Default is False. + **fields (Any): Additional data fields required for rendering. + """ + with self._lock: + task = self._tasks[task_id] + completed_start = task.completed + + if total is not None and total != task.total: + task.total = total + task._reset() + if advance is not None: + task.completed += advance + if completed is not None: + task.completed = completed + if description is not None: + task.description = description + if visible is not None: + task.visible = visible + task.fields.update(fields) + update_completed = task.completed - completed_start + + current_time = self.get_time() + old_sample_time = current_time - self.speed_estimate_period + _progress = task._progress + + popleft = _progress.popleft + while _progress and _progress[0].timestamp < old_sample_time: + popleft() + if update_completed > 0: + _progress.append(ProgressSample(current_time, update_completed)) + if ( + task.total is not None + and task.completed >= task.total + and task.finished_time is None + ): + task.finished_time = task.elapsed + + if refresh: + self.refresh() + + def reset( + self, + task_id: TaskID, + *, + start: bool = True, + total: Optional[float] = None, + completed: int = 0, + visible: Optional[bool] = None, + description: Optional[str] = None, + **fields: Any, + ) -> None: + """Reset a task so completed is 0 and the clock is reset. + + Args: + task_id (TaskID): ID of task. + start (bool, optional): Start the task after reset. Defaults to True. + total (float, optional): New total steps in task, or None to use current total. Defaults to None. + completed (int, optional): Number of steps completed. Defaults to 0. + visible (bool, optional): Enable display of the task. Defaults to True. + description (str, optional): Change task description if not None. Defaults to None. + **fields (str): Additional data fields required for rendering. + """ + current_time = self.get_time() + with self._lock: + task = self._tasks[task_id] + task._reset() + task.start_time = current_time if start else None + if total is not None: + task.total = total + task.completed = completed + if visible is not None: + task.visible = visible + if fields: + task.fields = fields + if description is not None: + task.description = description + task.finished_time = None + self.refresh() + + def advance(self, task_id: TaskID, advance: float = 1) -> None: + """Advance task by a number of steps. + + Args: + task_id (TaskID): ID of task. + advance (float): Number of steps to advance. Default is 1. + """ + current_time = self.get_time() + with self._lock: + task = self._tasks[task_id] + completed_start = task.completed + task.completed += advance + update_completed = task.completed - completed_start + old_sample_time = current_time - self.speed_estimate_period + _progress = task._progress + + popleft = _progress.popleft + while _progress and _progress[0].timestamp < old_sample_time: + popleft() + while len(_progress) > 1000: + popleft() + _progress.append(ProgressSample(current_time, update_completed)) + if ( + task.total is not None + and task.completed >= task.total + and task.finished_time is None + ): + task.finished_time = task.elapsed + task.finished_speed = task.speed + + def refresh(self) -> None: + """Refresh (render) the progress information.""" + if not self.disable and self.live.is_started: + self.live.refresh() + + def get_renderable(self) -> RenderableType: + """Get a renderable for the progress display.""" + renderable = Group(*self.get_renderables()) + return renderable + + def get_renderables(self) -> Iterable[RenderableType]: + """Get a number of renderables for the progress display.""" + table = self.make_tasks_table(self.tasks) + yield table + + def make_tasks_table(self, tasks: Iterable[Task]) -> Table: + """Get a table to render the Progress display. + + Args: + tasks (Iterable[Task]): An iterable of Task instances, one per row of the table. + + Returns: + Table: A table instance. + """ + table_columns = ( + ( + Column(no_wrap=True) + if isinstance(_column, str) + else _column.get_table_column().copy() + ) + for _column in self.columns + ) + table = Table.grid(*table_columns, padding=(0, 1), expand=self.expand) + + for task in tasks: + if task.visible: + table.add_row( + *( + ( + column.format(task=task) + if isinstance(column, str) + else column(task) + ) + for column in self.columns + ) + ) + return table + + def __rich__(self) -> RenderableType: + """Makes the Progress class itself renderable.""" + with self._lock: + return self.get_renderable() + + def add_task( + self, + description: str, + start: bool = True, + total: Optional[float] = 100.0, + completed: int = 0, + visible: bool = True, + **fields: Any, + ) -> TaskID: + """Add a new 'task' to the Progress display. + + Args: + description (str): A description of the task. + start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False, + you will need to call `start` manually. Defaults to True. + total (float, optional): Number of total steps in the progress if known. + Set to None to render a pulsing animation. Defaults to 100. + completed (int, optional): Number of steps completed so far. Defaults to 0. + visible (bool, optional): Enable display of the task. Defaults to True. + **fields (str): Additional data fields required for rendering. + + Returns: + TaskID: An ID you can use when calling `update`. + """ + with self._lock: + task = Task( + self._task_index, + description, + total, + completed, + visible=visible, + fields=fields, + _get_time=self.get_time, + _lock=self._lock, + ) + self._tasks[self._task_index] = task + if start: + self.start_task(self._task_index) + new_task_index = self._task_index + self._task_index = TaskID(int(self._task_index) + 1) + self.refresh() + return new_task_index + + def remove_task(self, task_id: TaskID) -> None: + """Delete a task if it exists. + + Args: + task_id (TaskID): A task ID. + + """ + with self._lock: + del self._tasks[task_id] + + +if __name__ == "__main__": # pragma: no coverage + import random + import time + + from .panel import Panel + from .rule import Rule + from .syntax import Syntax + from .table import Table + + syntax = Syntax( + '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: + """Iterate and generate a tuple with a flag for last value.""" + iter_values = iter(values) + try: + previous_value = next(iter_values) + except StopIteration: + return + for value in iter_values: + yield False, previous_value + previous_value = value + yield True, previous_value''', + "python", + line_numbers=True, + ) + + table = Table("foo", "bar", "baz") + table.add_row("1", "2", "3") + + progress_renderables = [ + "Text may be printed while the progress bars are rendering.", + Panel("In fact, [i]any[/i] renderable will work"), + "Such as [magenta]tables[/]...", + table, + "Pretty printed structures...", + {"type": "example", "text": "Pretty printed"}, + "Syntax...", + syntax, + Rule("Give it a try!"), + ] + + from itertools import cycle + + examples = cycle(progress_renderables) + + console = Console(record=True) + + with Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + TimeElapsedColumn(), + console=console, + transient=False, + ) as progress: + task1 = progress.add_task("[red]Downloading", total=1000) + task2 = progress.add_task("[green]Processing", total=1000) + task3 = progress.add_task("[yellow]Thinking", total=None) + + while not progress.finished: + progress.update(task1, advance=0.5) + progress.update(task2, advance=0.3) + time.sleep(0.01) + if random.randint(0, 100) < 1: + progress.log(next(examples)) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py new file mode 100644 index 0000000..a2bf326 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py @@ -0,0 +1,223 @@ +import math +from functools import lru_cache +from time import monotonic +from typing import Iterable, List, Optional + +from .color import Color, blend_rgb +from .color_triplet import ColorTriplet +from .console import Console, ConsoleOptions, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style, StyleType + +# Number of characters before 'pulse' animation repeats +PULSE_SIZE = 20 + + +class ProgressBar(JupyterMixin): + """Renders a (progress) bar. Used by rich.progress. + + Args: + total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation. + completed (float, optional): Number of steps completed. Defaults to 0. + width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. + pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed. + style (StyleType, optional): Style for the bar background. Defaults to "bar.back". + complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". + finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". + pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". + animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time. + """ + + def __init__( + self, + total: Optional[float] = 100.0, + completed: float = 0, + width: Optional[int] = None, + pulse: bool = False, + style: StyleType = "bar.back", + complete_style: StyleType = "bar.complete", + finished_style: StyleType = "bar.finished", + pulse_style: StyleType = "bar.pulse", + animation_time: Optional[float] = None, + ): + self.total = total + self.completed = completed + self.width = width + self.pulse = pulse + self.style = style + self.complete_style = complete_style + self.finished_style = finished_style + self.pulse_style = pulse_style + self.animation_time = animation_time + + self._pulse_segments: Optional[List[Segment]] = None + + def __repr__(self) -> str: + return f"" + + @property + def percentage_completed(self) -> Optional[float]: + """Calculate percentage complete.""" + if self.total is None: + return None + completed = (self.completed / self.total) * 100.0 + completed = min(100, max(0.0, completed)) + return completed + + @lru_cache(maxsize=16) + def _get_pulse_segments( + self, + fore_style: Style, + back_style: Style, + color_system: str, + no_color: bool, + ascii: bool = False, + ) -> List[Segment]: + """Get a list of segments to render a pulse animation. + + Returns: + List[Segment]: A list of segments, one segment per character. + """ + bar = "-" if ascii else "━" + segments: List[Segment] = [] + if color_system not in ("standard", "eight_bit", "truecolor") or no_color: + segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2) + segments += [Segment(" " if no_color else bar, back_style)] * ( + PULSE_SIZE - (PULSE_SIZE // 2) + ) + return segments + + append = segments.append + fore_color = ( + fore_style.color.get_truecolor() + if fore_style.color + else ColorTriplet(255, 0, 255) + ) + back_color = ( + back_style.color.get_truecolor() + if back_style.color + else ColorTriplet(0, 0, 0) + ) + cos = math.cos + pi = math.pi + _Segment = Segment + _Style = Style + from_triplet = Color.from_triplet + + for index in range(PULSE_SIZE): + position = index / PULSE_SIZE + fade = 0.5 + cos((position * pi * 2)) / 2.0 + color = blend_rgb(fore_color, back_color, cross_fade=fade) + append(_Segment(bar, _Style(color=from_triplet(color)))) + return segments + + def update(self, completed: float, total: Optional[float] = None) -> None: + """Update progress with new values. + + Args: + completed (float): Number of steps completed. + total (float, optional): Total number of steps, or ``None`` to not change. Defaults to None. + """ + self.completed = completed + self.total = total if total is not None else self.total + + def _render_pulse( + self, console: Console, width: int, ascii: bool = False + ) -> Iterable[Segment]: + """Renders the pulse animation. + + Args: + console (Console): Console instance. + width (int): Width in characters of pulse animation. + + Returns: + RenderResult: [description] + + Yields: + Iterator[Segment]: Segments to render pulse + """ + fore_style = console.get_style(self.pulse_style, default="white") + back_style = console.get_style(self.style, default="black") + + pulse_segments = self._get_pulse_segments( + fore_style, back_style, console.color_system, console.no_color, ascii=ascii + ) + segment_count = len(pulse_segments) + current_time = ( + monotonic() if self.animation_time is None else self.animation_time + ) + segments = pulse_segments * (int(width / segment_count) + 2) + offset = int(-current_time * 15) % segment_count + segments = segments[offset : offset + width] + yield from segments + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + width = min(self.width or options.max_width, options.max_width) + ascii = options.legacy_windows or options.ascii_only + should_pulse = self.pulse or self.total is None + if should_pulse: + yield from self._render_pulse(console, width, ascii=ascii) + return + + completed: Optional[float] = ( + min(self.total, max(0, self.completed)) if self.total is not None else None + ) + + bar = "-" if ascii else "━" + half_bar_right = " " if ascii else "╸" + half_bar_left = " " if ascii else "╺" + complete_halves = ( + int(width * 2 * completed / self.total) + if self.total and completed is not None + else width * 2 + ) + bar_count = complete_halves // 2 + half_bar_count = complete_halves % 2 + style = console.get_style(self.style) + is_finished = self.total is None or self.completed >= self.total + complete_style = console.get_style( + self.finished_style if is_finished else self.complete_style + ) + _Segment = Segment + if bar_count: + yield _Segment(bar * bar_count, complete_style) + if half_bar_count: + yield _Segment(half_bar_right * half_bar_count, complete_style) + + if not console.no_color: + remaining_bars = width - bar_count - half_bar_count + if remaining_bars and console.color_system is not None: + if not half_bar_count and bar_count: + yield _Segment(half_bar_left, style) + remaining_bars -= 1 + if remaining_bars: + yield _Segment(bar * remaining_bars, style) + + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: + return ( + Measurement(self.width, self.width) + if self.width is not None + else Measurement(4, options.max_width) + ) + + +if __name__ == "__main__": # pragma: no cover + console = Console() + bar = ProgressBar(width=50, total=100) + + import time + + console.show_cursor(False) + for n in range(0, 101, 1): + bar.update(n) + console.print(bar) + console.file.write("\r") + time.sleep(0.05) + console.show_cursor(True) + console.print() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py new file mode 100644 index 0000000..75ff048 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py @@ -0,0 +1,375 @@ +from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload + +from . import get_console +from .console import Console +from .text import Text, TextType + +PromptType = TypeVar("PromptType") +DefaultType = TypeVar("DefaultType") + + +class PromptError(Exception): + """Exception base class for prompt related errors.""" + + +class InvalidResponse(PromptError): + """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error + and provide an error message. + + Args: + message (Union[str, Text]): Error message. + """ + + def __init__(self, message: TextType) -> None: + self.message = message + + def __rich__(self) -> TextType: + return self.message + + +class PromptBase(Generic[PromptType]): + """Ask the user for input until a valid response is received. This is the base class, see one of + the concrete classes for examples. + + Args: + prompt (TextType, optional): Prompt text. Defaults to "". + console (Console, optional): A Console instance or None to use global console. Defaults to None. + password (bool, optional): Enable password input. Defaults to False. + choices (List[str], optional): A list of valid choices. Defaults to None. + show_default (bool, optional): Show default in prompt. Defaults to True. + show_choices (bool, optional): Show choices in prompt. Defaults to True. + """ + + response_type: type = str + + validate_error_message = "[prompt.invalid]Please enter a valid value" + illegal_choice_message = ( + "[prompt.invalid.choice]Please select one of the available options" + ) + prompt_suffix = ": " + + choices: Optional[List[str]] = None + + def __init__( + self, + prompt: TextType = "", + *, + console: Optional[Console] = None, + password: bool = False, + choices: Optional[List[str]] = None, + show_default: bool = True, + show_choices: bool = True, + ) -> None: + self.console = console or get_console() + self.prompt = ( + Text.from_markup(prompt, style="prompt") + if isinstance(prompt, str) + else prompt + ) + self.password = password + if choices is not None: + self.choices = choices + self.show_default = show_default + self.show_choices = show_choices + + @classmethod + @overload + def ask( + cls, + prompt: TextType = "", + *, + console: Optional[Console] = None, + password: bool = False, + choices: Optional[List[str]] = None, + show_default: bool = True, + show_choices: bool = True, + default: DefaultType, + stream: Optional[TextIO] = None, + ) -> Union[DefaultType, PromptType]: + ... + + @classmethod + @overload + def ask( + cls, + prompt: TextType = "", + *, + console: Optional[Console] = None, + password: bool = False, + choices: Optional[List[str]] = None, + show_default: bool = True, + show_choices: bool = True, + stream: Optional[TextIO] = None, + ) -> PromptType: + ... + + @classmethod + def ask( + cls, + prompt: TextType = "", + *, + console: Optional[Console] = None, + password: bool = False, + choices: Optional[List[str]] = None, + show_default: bool = True, + show_choices: bool = True, + default: Any = ..., + stream: Optional[TextIO] = None, + ) -> Any: + """Shortcut to construct and run a prompt loop and return the result. + + Example: + >>> filename = Prompt.ask("Enter a filename") + + Args: + prompt (TextType, optional): Prompt text. Defaults to "". + console (Console, optional): A Console instance or None to use global console. Defaults to None. + password (bool, optional): Enable password input. Defaults to False. + choices (List[str], optional): A list of valid choices. Defaults to None. + show_default (bool, optional): Show default in prompt. Defaults to True. + show_choices (bool, optional): Show choices in prompt. Defaults to True. + stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None. + """ + _prompt = cls( + prompt, + console=console, + password=password, + choices=choices, + show_default=show_default, + show_choices=show_choices, + ) + return _prompt(default=default, stream=stream) + + def render_default(self, default: DefaultType) -> Text: + """Turn the supplied default in to a Text instance. + + Args: + default (DefaultType): Default value. + + Returns: + Text: Text containing rendering of default value. + """ + return Text(f"({default})", "prompt.default") + + def make_prompt(self, default: DefaultType) -> Text: + """Make prompt text. + + Args: + default (DefaultType): Default value. + + Returns: + Text: Text to display in prompt. + """ + prompt = self.prompt.copy() + prompt.end = "" + + if self.show_choices and self.choices: + _choices = "/".join(self.choices) + choices = f"[{_choices}]" + prompt.append(" ") + prompt.append(choices, "prompt.choices") + + if ( + default != ... + and self.show_default + and isinstance(default, (str, self.response_type)) + ): + prompt.append(" ") + _default = self.render_default(default) + prompt.append(_default) + + prompt.append(self.prompt_suffix) + + return prompt + + @classmethod + def get_input( + cls, + console: Console, + prompt: TextType, + password: bool, + stream: Optional[TextIO] = None, + ) -> str: + """Get input from user. + + Args: + console (Console): Console instance. + prompt (TextType): Prompt text. + password (bool): Enable password entry. + + Returns: + str: String from user. + """ + return console.input(prompt, password=password, stream=stream) + + def check_choice(self, value: str) -> bool: + """Check value is in the list of valid choices. + + Args: + value (str): Value entered by user. + + Returns: + bool: True if choice was valid, otherwise False. + """ + assert self.choices is not None + return value.strip() in self.choices + + def process_response(self, value: str) -> PromptType: + """Process response from user, convert to prompt type. + + Args: + value (str): String typed by user. + + Raises: + InvalidResponse: If ``value`` is invalid. + + Returns: + PromptType: The value to be returned from ask method. + """ + value = value.strip() + try: + return_value: PromptType = self.response_type(value) + except ValueError: + raise InvalidResponse(self.validate_error_message) + + if self.choices is not None and not self.check_choice(value): + raise InvalidResponse(self.illegal_choice_message) + + return return_value + + def on_validate_error(self, value: str, error: InvalidResponse) -> None: + """Called to handle validation error. + + Args: + value (str): String entered by user. + error (InvalidResponse): Exception instance the initiated the error. + """ + self.console.print(error) + + def pre_prompt(self) -> None: + """Hook to display something before the prompt.""" + + @overload + def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType: + ... + + @overload + def __call__( + self, *, default: DefaultType, stream: Optional[TextIO] = None + ) -> Union[PromptType, DefaultType]: + ... + + def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any: + """Run the prompt loop. + + Args: + default (Any, optional): Optional default value. + + Returns: + PromptType: Processed value. + """ + while True: + self.pre_prompt() + prompt = self.make_prompt(default) + value = self.get_input(self.console, prompt, self.password, stream=stream) + if value == "" and default != ...: + return default + try: + return_value = self.process_response(value) + except InvalidResponse as error: + self.on_validate_error(value, error) + continue + else: + return return_value + + +class Prompt(PromptBase[str]): + """A prompt that returns a str. + + Example: + >>> name = Prompt.ask("Enter your name") + + + """ + + response_type = str + + +class IntPrompt(PromptBase[int]): + """A prompt that returns an integer. + + Example: + >>> burrito_count = IntPrompt.ask("How many burritos do you want to order") + + """ + + response_type = int + validate_error_message = "[prompt.invalid]Please enter a valid integer number" + + +class FloatPrompt(PromptBase[float]): + """A prompt that returns a float. + + Example: + >>> temperature = FloatPrompt.ask("Enter desired temperature") + + """ + + response_type = float + validate_error_message = "[prompt.invalid]Please enter a number" + + +class Confirm(PromptBase[bool]): + """A yes / no confirmation prompt. + + Example: + >>> if Confirm.ask("Continue"): + run_job() + + """ + + response_type = bool + validate_error_message = "[prompt.invalid]Please enter Y or N" + choices: List[str] = ["y", "n"] + + def render_default(self, default: DefaultType) -> Text: + """Render the default as (y) or (n) rather than True/False.""" + yes, no = self.choices + return Text(f"({yes})" if default else f"({no})", style="prompt.default") + + def process_response(self, value: str) -> bool: + """Convert choices to a bool.""" + value = value.strip().lower() + if value not in self.choices: + raise InvalidResponse(self.validate_error_message) + return value == self.choices[0] + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich import print + + if Confirm.ask("Run [i]prompt[/i] tests?", default=True): + while True: + result = IntPrompt.ask( + ":rocket: Enter a number between [b]1[/b] and [b]10[/b]", default=5 + ) + if result >= 1 and result <= 10: + break + print(":pile_of_poo: [prompt.invalid]Number must be between 1 and 10") + print(f"number={result}") + + while True: + password = Prompt.ask( + "Please enter a password [cyan](must be at least 5 characters)", + password=True, + ) + if len(password) >= 5: + break + print("[prompt.invalid]password too short") + print(f"password={password!r}") + + fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"]) + print(f"fruit={fruit!r}") + + else: + print("[b]OK :loudly_crying_face:") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py new file mode 100644 index 0000000..12ab237 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py @@ -0,0 +1,42 @@ +from typing import Any, cast, Set, TYPE_CHECKING +from inspect import isclass + +if TYPE_CHECKING: + from pip._vendor.rich.console import RenderableType + +_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf""" + + +def is_renderable(check_object: Any) -> bool: + """Check if an object may be rendered by Rich.""" + return ( + isinstance(check_object, str) + or hasattr(check_object, "__rich__") + or hasattr(check_object, "__rich_console__") + ) + + +def rich_cast(renderable: object) -> "RenderableType": + """Cast an object to a renderable by calling __rich__ if present. + + Args: + renderable (object): A potentially renderable object + + Returns: + object: The result of recursively calling __rich__. + """ + from pip._vendor.rich.console import RenderableType + + rich_visited_set: Set[type] = set() # Prevent potential infinite loop + while hasattr(renderable, "__rich__") and not isclass(renderable): + # Detect object which claim to have all the attributes + if hasattr(renderable, _GIBBERISH): + return repr(renderable) + cast_method = getattr(renderable, "__rich__") + renderable = cast_method() + renderable_type = type(renderable) + if renderable_type in rich_visited_set: + break + rich_visited_set.add(renderable_type) + + return cast(RenderableType, renderable) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/rich/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/region.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/region.py new file mode 100644 index 0000000..75b3631 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/region.py @@ -0,0 +1,10 @@ +from typing import NamedTuple + + +class Region(NamedTuple): + """Defines a rectangular region of the screen.""" + + x: int + y: int + width: int + height: int diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py new file mode 100644 index 0000000..10efc42 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/repr.py @@ -0,0 +1,149 @@ +import inspect +from functools import partial +from typing import ( + Any, + Callable, + Iterable, + List, + Optional, + Tuple, + Type, + TypeVar, + Union, + overload, +) + +T = TypeVar("T") + + +Result = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] +RichReprResult = Result + + +class ReprError(Exception): + """An error occurred when attempting to build a repr.""" + + +@overload +def auto(cls: Optional[Type[T]]) -> Type[T]: + ... + + +@overload +def auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: + ... + + +def auto( + cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None +) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: + """Class decorator to create __repr__ from __rich_repr__""" + + def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]: + def auto_repr(self: T) -> str: + """Create repr string from __rich_repr__""" + repr_str: List[str] = [] + append = repr_str.append + + angular: bool = getattr(self.__rich_repr__, "angular", False) # type: ignore[attr-defined] + for arg in self.__rich_repr__(): # type: ignore[attr-defined] + if isinstance(arg, tuple): + if len(arg) == 1: + append(repr(arg[0])) + else: + key, value, *default = arg + if key is None: + append(repr(value)) + else: + if default and default[0] == value: + continue + append(f"{key}={value!r}") + else: + append(repr(arg)) + if angular: + return f"<{self.__class__.__name__} {' '.join(repr_str)}>" + else: + return f"{self.__class__.__name__}({', '.join(repr_str)})" + + def auto_rich_repr(self: Type[T]) -> Result: + """Auto generate __rich_rep__ from signature of __init__""" + try: + signature = inspect.signature(self.__init__) + for name, param in signature.parameters.items(): + if param.kind == param.POSITIONAL_ONLY: + yield getattr(self, name) + elif param.kind in ( + param.POSITIONAL_OR_KEYWORD, + param.KEYWORD_ONLY, + ): + if param.default is param.empty: + yield getattr(self, param.name) + else: + yield param.name, getattr(self, param.name), param.default + except Exception as error: + raise ReprError( + f"Failed to auto generate __rich_repr__; {error}" + ) from None + + if not hasattr(cls, "__rich_repr__"): + auto_rich_repr.__doc__ = "Build a rich repr" + cls.__rich_repr__ = auto_rich_repr # type: ignore[attr-defined] + + auto_repr.__doc__ = "Return repr(self)" + cls.__repr__ = auto_repr # type: ignore[assignment] + if angular is not None: + cls.__rich_repr__.angular = angular # type: ignore[attr-defined] + return cls + + if cls is None: + return partial(do_replace, angular=angular) + else: + return do_replace(cls, angular=angular) + + +@overload +def rich_repr(cls: Optional[Type[T]]) -> Type[T]: + ... + + +@overload +def rich_repr(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: + ... + + +def rich_repr( + cls: Optional[Type[T]] = None, *, angular: bool = False +) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: + if cls is None: + return auto(angular=angular) + else: + return auto(cls) + + +if __name__ == "__main__": + + @auto + class Foo: + def __rich_repr__(self) -> Result: + yield "foo" + yield "bar", {"shopping": ["eggs", "ham", "pineapple"]} + yield "buy", "hand sanitizer" + + foo = Foo() + from pip._vendor.rich.console import Console + + console = Console() + + console.rule("Standard repr") + console.print(foo) + + console.print(foo, width=60) + console.print(foo, width=30) + + console.rule("Angular repr") + Foo.__rich_repr__.angular = True # type: ignore[attr-defined] + + console.print(foo) + + console.print(foo, width=60) + console.print(foo, width=30) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/rule.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/rule.py new file mode 100644 index 0000000..fd00ce6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/rule.py @@ -0,0 +1,130 @@ +from typing import Union + +from .align import AlignMethod +from .cells import cell_len, set_cell_size +from .console import Console, ConsoleOptions, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .style import Style +from .text import Text + + +class Rule(JupyterMixin): + """A console renderable to draw a horizontal rule (line). + + Args: + title (Union[str, Text], optional): Text to render in the rule. Defaults to "". + characters (str, optional): Character(s) used to draw the line. Defaults to "─". + style (StyleType, optional): Style of Rule. Defaults to "rule.line". + end (str, optional): Character at end of Rule. defaults to "\\\\n" + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". + """ + + def __init__( + self, + title: Union[str, Text] = "", + *, + characters: str = "─", + style: Union[str, Style] = "rule.line", + end: str = "\n", + align: AlignMethod = "center", + ) -> None: + if cell_len(characters) < 1: + raise ValueError( + "'characters' argument must have a cell width of at least 1" + ) + if align not in ("left", "center", "right"): + raise ValueError( + f'invalid value for align, expected "left", "center", "right" (not {align!r})' + ) + self.title = title + self.characters = characters + self.style = style + self.end = end + self.align = align + + def __repr__(self) -> str: + return f"Rule({self.title!r}, {self.characters!r})" + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + width = options.max_width + + characters = ( + "-" + if (options.ascii_only and not self.characters.isascii()) + else self.characters + ) + + chars_len = cell_len(characters) + if not self.title: + yield self._rule_line(chars_len, width) + return + + if isinstance(self.title, Text): + title_text = self.title + else: + title_text = console.render_str(self.title, style="rule.text") + + title_text.plain = title_text.plain.replace("\n", " ") + title_text.expand_tabs() + + required_space = 4 if self.align == "center" else 2 + truncate_width = max(0, width - required_space) + if not truncate_width: + yield self._rule_line(chars_len, width) + return + + rule_text = Text(end=self.end) + if self.align == "center": + title_text.truncate(truncate_width, overflow="ellipsis") + side_width = (width - cell_len(title_text.plain)) // 2 + left = Text(characters * (side_width // chars_len + 1)) + left.truncate(side_width - 1) + right_length = width - cell_len(left.plain) - cell_len(title_text.plain) + right = Text(characters * (side_width // chars_len + 1)) + right.truncate(right_length) + rule_text.append(left.plain + " ", self.style) + rule_text.append(title_text) + rule_text.append(" " + right.plain, self.style) + elif self.align == "left": + title_text.truncate(truncate_width, overflow="ellipsis") + rule_text.append(title_text) + rule_text.append(" ") + rule_text.append(characters * (width - rule_text.cell_len), self.style) + elif self.align == "right": + title_text.truncate(truncate_width, overflow="ellipsis") + rule_text.append(characters * (width - title_text.cell_len - 1), self.style) + rule_text.append(" ") + rule_text.append(title_text) + + rule_text.plain = set_cell_size(rule_text.plain, width) + yield rule_text + + def _rule_line(self, chars_len: int, width: int) -> Text: + rule_text = Text(self.characters * ((width // chars_len) + 1), self.style) + rule_text.truncate(width) + rule_text.plain = set_cell_size(rule_text.plain, width) + return rule_text + + def __rich_measure__( + self, console: Console, options: ConsoleOptions + ) -> Measurement: + return Measurement(1, 1) + + +if __name__ == "__main__": # pragma: no cover + import sys + + from pip._vendor.rich.console import Console + + try: + text = sys.argv[1] + except IndexError: + text = "Hello, World" + console = Console() + console.print(Rule(title=text)) + + console = Console() + console.print(Rule("foo"), width=4) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/scope.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/scope.py new file mode 100644 index 0000000..c9d134c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/scope.py @@ -0,0 +1,86 @@ +from collections.abc import Mapping +from typing import TYPE_CHECKING, Any, Optional, Tuple + +from .highlighter import ReprHighlighter +from .panel import Panel +from .pretty import Pretty +from .table import Table +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import ConsoleRenderable + + +def render_scope( + scope: "Mapping[str, Any]", + *, + title: Optional[TextType] = None, + sort_keys: bool = True, + indent_guides: bool = False, + max_length: Optional[int] = None, + max_string: Optional[int] = None, +) -> "ConsoleRenderable": + """Render python variables in a given scope. + + Args: + scope (Mapping): A mapping containing variable names and values. + title (str, optional): Optional title. Defaults to None. + sort_keys (bool, optional): Enable sorting of items. Defaults to True. + indent_guides (bool, optional): Enable indentation guides. Defaults to False. + max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to None. + max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. + + Returns: + ConsoleRenderable: A renderable object. + """ + highlighter = ReprHighlighter() + items_table = Table.grid(padding=(0, 1), expand=False) + items_table.add_column(justify="right") + + def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: + """Sort special variables first, then alphabetically.""" + key, _ = item + return (not key.startswith("__"), key.lower()) + + items = sorted(scope.items(), key=sort_items) if sort_keys else scope.items() + for key, value in items: + key_text = Text.assemble( + (key, "scope.key.special" if key.startswith("__") else "scope.key"), + (" =", "scope.equals"), + ) + items_table.add_row( + key_text, + Pretty( + value, + highlighter=highlighter, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + ), + ) + return Panel.fit( + items_table, + title=title, + border_style="scope.border", + padding=(0, 1), + ) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich import print + + print() + + def test(foo: float, bar: float) -> None: + list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"] + dict_of_things = { + "version": "1.1", + "method": "confirmFruitPurchase", + "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], + "id": "194521489", + } + print(render_scope(locals(), title="[i]locals", sort_keys=False)) + + test(20.3423, 3.1427) + print() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/screen.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/screen.py new file mode 100644 index 0000000..7f416e1 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/screen.py @@ -0,0 +1,54 @@ +from typing import Optional, TYPE_CHECKING + +from .segment import Segment +from .style import StyleType +from ._loop import loop_last + + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + RenderResult, + RenderableType, + Group, + ) + + +class Screen: + """A renderable that fills the terminal screen and crops excess. + + Args: + renderable (RenderableType): Child renderable. + style (StyleType, optional): Optional background style. Defaults to None. + """ + + renderable: "RenderableType" + + def __init__( + self, + *renderables: "RenderableType", + style: Optional[StyleType] = None, + application_mode: bool = False, + ) -> None: + from pip._vendor.rich.console import Group + + self.renderable = Group(*renderables) + self.style = style + self.application_mode = application_mode + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + width, height = options.size + style = console.get_style(self.style) if self.style else None + render_options = options.update(width=width, height=height) + lines = console.render_lines( + self.renderable or "", render_options, style=style, pad=True + ) + lines = Segment.set_shape(lines, width, height, style=style) + new_line = Segment("\n\r") if self.application_mode else Segment.line() + for last, line in loop_last(lines): + yield from line + if not last: + yield new_line diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py new file mode 100644 index 0000000..93edbbd --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/segment.py @@ -0,0 +1,738 @@ +from enum import IntEnum +from functools import lru_cache +from itertools import filterfalse +from logging import getLogger +from operator import attrgetter +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from .cells import ( + _is_single_cell_widths, + cached_cell_len, + cell_len, + get_character_cell_size, + set_cell_size, +) +from .repr import Result, rich_repr +from .style import Style + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +log = getLogger("rich") + + +class ControlType(IntEnum): + """Non-printable control codes which typically translate to ANSI codes.""" + + BELL = 1 + CARRIAGE_RETURN = 2 + HOME = 3 + CLEAR = 4 + SHOW_CURSOR = 5 + HIDE_CURSOR = 6 + ENABLE_ALT_SCREEN = 7 + DISABLE_ALT_SCREEN = 8 + CURSOR_UP = 9 + CURSOR_DOWN = 10 + CURSOR_FORWARD = 11 + CURSOR_BACKWARD = 12 + CURSOR_MOVE_TO_COLUMN = 13 + CURSOR_MOVE_TO = 14 + ERASE_IN_LINE = 15 + SET_WINDOW_TITLE = 16 + + +ControlCode = Union[ + Tuple[ControlType], + Tuple[ControlType, Union[int, str]], + Tuple[ControlType, int, int], +] + + +@rich_repr() +class Segment(NamedTuple): + """A piece of text with associated style. Segments are produced by the Console render process and + are ultimately converted in to strings to be written to the terminal. + + Args: + text (str): A piece of text. + style (:class:`~rich.style.Style`, optional): An optional style to apply to the text. + control (Tuple[ControlCode], optional): Optional sequence of control codes. + + Attributes: + cell_length (int): The cell length of this Segment. + """ + + text: str + style: Optional[Style] = None + control: Optional[Sequence[ControlCode]] = None + + @property + def cell_length(self) -> int: + """The number of terminal cells required to display self.text. + + Returns: + int: A number of cells. + """ + text, _style, control = self + return 0 if control else cell_len(text) + + def __rich_repr__(self) -> Result: + yield self.text + if self.control is None: + if self.style is not None: + yield self.style + else: + yield self.style + yield self.control + + def __bool__(self) -> bool: + """Check if the segment contains text.""" + return bool(self.text) + + @property + def is_control(self) -> bool: + """Check if the segment contains control codes.""" + return self.control is not None + + @classmethod + @lru_cache(1024 * 16) + def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: + text, style, control = segment + _Segment = Segment + + cell_length = segment.cell_length + if cut >= cell_length: + return segment, _Segment("", style, control) + + cell_size = get_character_cell_size + + pos = int((cut / cell_length) * (len(text) - 1)) + + before = text[:pos] + cell_pos = cell_len(before) + if cell_pos == cut: + return ( + _Segment(before, style, control), + _Segment(text[pos:], style, control), + ) + while pos < len(text): + char = text[pos] + pos += 1 + cell_pos += cell_size(char) + before = text[:pos] + if cell_pos == cut: + return ( + _Segment(before, style, control), + _Segment(text[pos:], style, control), + ) + if cell_pos > cut: + return ( + _Segment(before[: pos - 1] + " ", style, control), + _Segment(" " + text[pos:], style, control), + ) + + raise AssertionError("Will never reach here") + + def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: + """Split segment in to two segments at the specified column. + + If the cut point falls in the middle of a 2-cell wide character then it is replaced + by two spaces, to preserve the display width of the parent segment. + + Returns: + Tuple[Segment, Segment]: Two segments. + """ + text, style, control = self + + if _is_single_cell_widths(text): + # Fast path with all 1 cell characters + if cut >= len(text): + return self, Segment("", style, control) + return ( + Segment(text[:cut], style, control), + Segment(text[cut:], style, control), + ) + + return self._split_cells(self, cut) + + @classmethod + def line(cls) -> "Segment": + """Make a new line segment.""" + return cls("\n") + + @classmethod + def apply_style( + cls, + segments: Iterable["Segment"], + style: Optional[Style] = None, + post_style: Optional[Style] = None, + ) -> Iterable["Segment"]: + """Apply style(s) to an iterable of segments. + + Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``. + + Args: + segments (Iterable[Segment]): Segments to process. + style (Style, optional): Base style. Defaults to None. + post_style (Style, optional): Style to apply on top of segment style. Defaults to None. + + Returns: + Iterable[Segments]: A new iterable of segments (possibly the same iterable). + """ + result_segments = segments + if style: + apply = style.__add__ + result_segments = ( + cls(text, None if control else apply(_style), control) + for text, _style, control in result_segments + ) + if post_style: + result_segments = ( + cls( + text, + ( + None + if control + else (_style + post_style if _style else post_style) + ), + control, + ) + for text, _style, control in result_segments + ) + return result_segments + + @classmethod + def filter_control( + cls, segments: Iterable["Segment"], is_control: bool = False + ) -> Iterable["Segment"]: + """Filter segments by ``is_control`` attribute. + + Args: + segments (Iterable[Segment]): An iterable of Segment instances. + is_control (bool, optional): is_control flag to match in search. + + Returns: + Iterable[Segment]: And iterable of Segment instances. + + """ + if is_control: + return filter(attrgetter("control"), segments) + else: + return filterfalse(attrgetter("control"), segments) + + @classmethod + def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]: + """Split a sequence of segments in to a list of lines. + + Args: + segments (Iterable[Segment]): Segments potentially containing line feeds. + + Yields: + Iterable[List[Segment]]: Iterable of segment lists, one per line. + """ + line: List[Segment] = [] + append = line.append + + for segment in segments: + if "\n" in segment.text and not segment.control: + text, style, _ = segment + while text: + _text, new_line, text = text.partition("\n") + if _text: + append(cls(_text, style)) + if new_line: + yield line + line = [] + append = line.append + else: + append(segment) + if line: + yield line + + @classmethod + def split_and_crop_lines( + cls, + segments: Iterable["Segment"], + length: int, + style: Optional[Style] = None, + pad: bool = True, + include_new_lines: bool = True, + ) -> Iterable[List["Segment"]]: + """Split segments in to lines, and crop lines greater than a given length. + + Args: + segments (Iterable[Segment]): An iterable of segments, probably + generated from console.render. + length (int): Desired line length. + style (Style, optional): Style to use for any padding. + pad (bool): Enable padding of lines that are less than `length`. + + Returns: + Iterable[List[Segment]]: An iterable of lines of segments. + """ + line: List[Segment] = [] + append = line.append + + adjust_line_length = cls.adjust_line_length + new_line_segment = cls("\n") + + for segment in segments: + if "\n" in segment.text and not segment.control: + text, segment_style, _ = segment + while text: + _text, new_line, text = text.partition("\n") + if _text: + append(cls(_text, segment_style)) + if new_line: + cropped_line = adjust_line_length( + line, length, style=style, pad=pad + ) + if include_new_lines: + cropped_line.append(new_line_segment) + yield cropped_line + line.clear() + else: + append(segment) + if line: + yield adjust_line_length(line, length, style=style, pad=pad) + + @classmethod + def adjust_line_length( + cls, + line: List["Segment"], + length: int, + style: Optional[Style] = None, + pad: bool = True, + ) -> List["Segment"]: + """Adjust a line to a given width (cropping or padding as required). + + Args: + segments (Iterable[Segment]): A list of segments in a single line. + length (int): The desired width of the line. + style (Style, optional): The style of padding if used (space on the end). Defaults to None. + pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True. + + Returns: + List[Segment]: A line of segments with the desired length. + """ + line_length = sum(segment.cell_length for segment in line) + new_line: List[Segment] + + if line_length < length: + if pad: + new_line = line + [cls(" " * (length - line_length), style)] + else: + new_line = line[:] + elif line_length > length: + new_line = [] + append = new_line.append + line_length = 0 + for segment in line: + segment_length = segment.cell_length + if line_length + segment_length < length or segment.control: + append(segment) + line_length += segment_length + else: + text, segment_style, _ = segment + text = set_cell_size(text, length - line_length) + append(cls(text, segment_style)) + break + else: + new_line = line[:] + return new_line + + @classmethod + def get_line_length(cls, line: List["Segment"]) -> int: + """Get the length of list of segments. + + Args: + line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters), + + Returns: + int: The length of the line. + """ + _cell_len = cell_len + return sum(_cell_len(text) for text, style, control in line if not control) + + @classmethod + def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]: + """Get the shape (enclosing rectangle) of a list of lines. + + Args: + lines (List[List[Segment]]): A list of lines (no '\\\\n' characters). + + Returns: + Tuple[int, int]: Width and height in characters. + """ + get_line_length = cls.get_line_length + max_width = max(get_line_length(line) for line in lines) if lines else 0 + return (max_width, len(lines)) + + @classmethod + def set_shape( + cls, + lines: List[List["Segment"]], + width: int, + height: Optional[int] = None, + style: Optional[Style] = None, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Set the shape of a list of lines (enclosing rectangle). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style, optional): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + _height = height or len(lines) + + blank = ( + [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)] + ) + + adjust_line_length = cls.adjust_line_length + shaped_lines = lines[:_height] + shaped_lines[:] = [ + adjust_line_length(line, width, style=style) for line in lines + ] + if len(shaped_lines) < _height: + shaped_lines.extend([blank] * (_height - len(shaped_lines))) + return shaped_lines + + @classmethod + def align_top( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns lines to top (adds extra lines to bottom as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + lines = lines + [[blank]] * extra_lines + return lines + + @classmethod + def align_bottom( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns render to bottom (adds extra lines above as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. Defaults to None. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + lines = [[blank]] * extra_lines + lines + return lines + + @classmethod + def align_middle( + cls: Type["Segment"], + lines: List[List["Segment"]], + width: int, + height: int, + style: Style, + new_lines: bool = False, + ) -> List[List["Segment"]]: + """Aligns lines to middle (adds extra lines to above and below as required). + + Args: + lines (List[List[Segment]]): A list of lines. + width (int): Desired width. + height (int, optional): Desired height or None for no change. + style (Style): Style of any padding added. + new_lines (bool, optional): Padded lines should include "\n". Defaults to False. + + Returns: + List[List[Segment]]: New list of lines. + """ + extra_lines = height - len(lines) + if not extra_lines: + return lines[:] + lines = lines[:height] + blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) + top_lines = extra_lines // 2 + bottom_lines = extra_lines - top_lines + lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines + return lines + + @classmethod + def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: + """Simplify an iterable of segments by combining contiguous segments with the same style. + + Args: + segments (Iterable[Segment]): An iterable of segments. + + Returns: + Iterable[Segment]: A possibly smaller iterable of segments that will render the same way. + """ + iter_segments = iter(segments) + try: + last_segment = next(iter_segments) + except StopIteration: + return + + _Segment = Segment + for segment in iter_segments: + if last_segment.style == segment.style and not segment.control: + last_segment = _Segment( + last_segment.text + segment.text, last_segment.style + ) + else: + yield last_segment + last_segment = segment + yield last_segment + + @classmethod + def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: + """Remove all links from an iterable of styles. + + Args: + segments (Iterable[Segment]): An iterable segments. + + Yields: + Segment: Segments with link removed. + """ + for segment in segments: + if segment.control or segment.style is None: + yield segment + else: + text, style, _control = segment + yield cls(text, style.update_link(None) if style else None) + + @classmethod + def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: + """Remove all styles from an iterable of segments. + + Args: + segments (Iterable[Segment]): An iterable segments. + + Yields: + Segment: Segments with styles replace with None + """ + for text, _style, control in segments: + yield cls(text, None, control) + + @classmethod + def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: + """Remove all color from an iterable of segments. + + Args: + segments (Iterable[Segment]): An iterable segments. + + Yields: + Segment: Segments with colorless style. + """ + + cache: Dict[Style, Style] = {} + for text, style, control in segments: + if style: + colorless_style = cache.get(style) + if colorless_style is None: + colorless_style = style.without_color + cache[style] = colorless_style + yield cls(text, colorless_style, control) + else: + yield cls(text, None, control) + + @classmethod + def divide( + cls, segments: Iterable["Segment"], cuts: Iterable[int] + ) -> Iterable[List["Segment"]]: + """Divides an iterable of segments in to portions. + + Args: + cuts (Iterable[int]): Cell positions where to divide. + + Yields: + [Iterable[List[Segment]]]: An iterable of Segments in List. + """ + split_segments: List["Segment"] = [] + add_segment = split_segments.append + + iter_cuts = iter(cuts) + + while True: + cut = next(iter_cuts, -1) + if cut == -1: + return [] + if cut != 0: + break + yield [] + pos = 0 + + segments_clear = split_segments.clear + segments_copy = split_segments.copy + + _cell_len = cached_cell_len + for segment in segments: + text, _style, control = segment + while text: + end_pos = pos if control else pos + _cell_len(text) + if end_pos < cut: + add_segment(segment) + pos = end_pos + break + + if end_pos == cut: + add_segment(segment) + yield segments_copy() + segments_clear() + pos = end_pos + + cut = next(iter_cuts, -1) + if cut == -1: + if split_segments: + yield segments_copy() + return + + break + + else: + before, segment = segment.split_cells(cut - pos) + text, _style, control = segment + add_segment(before) + yield segments_copy() + segments_clear() + pos = cut + + cut = next(iter_cuts, -1) + if cut == -1: + if split_segments: + yield segments_copy() + return + + yield segments_copy() + + +class Segments: + """A simple renderable to render an iterable of segments. This class may be useful if + you want to print segments outside of a __rich_console__ method. + + Args: + segments (Iterable[Segment]): An iterable of segments. + new_lines (bool, optional): Add new lines between segments. Defaults to False. + """ + + def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None: + self.segments = list(segments) + self.new_lines = new_lines + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.new_lines: + line = Segment.line() + for segment in self.segments: + yield segment + yield line + else: + yield from self.segments + + +class SegmentLines: + def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None: + """A simple renderable containing a number of lines of segments. May be used as an intermediate + in rendering process. + + Args: + lines (Iterable[List[Segment]]): Lists of segments forming lines. + new_lines (bool, optional): Insert new lines after each line. Defaults to False. + """ + self.lines = list(lines) + self.new_lines = new_lines + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.new_lines: + new_line = Segment.line() + for line in self.lines: + yield from line + yield new_line + else: + for line in self.lines: + yield from line + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + from pip._vendor.rich.syntax import Syntax + from pip._vendor.rich.text import Text + + code = """from rich.console import Console +console = Console() +text = Text.from_markup("Hello, [bold magenta]World[/]!") +console.print(text)""" + + text = Text.from_markup("Hello, [bold magenta]World[/]!") + + console = Console() + + console.rule("rich.Segment") + console.print( + "A Segment is the last step in the Rich render process before generating text with ANSI codes." + ) + console.print("\nConsider the following code:\n") + console.print(Syntax(code, "python", line_numbers=True)) + console.print() + console.print( + "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n" + ) + fragments = list(console.render(text)) + console.print(fragments) + console.print() + console.print("The Segments are then processed to produce the following output:\n") + console.print(text) + console.print( + "\nYou will only need to know this if you are implementing your own Rich renderables." + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py new file mode 100644 index 0000000..91ea630 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py @@ -0,0 +1,137 @@ +from typing import cast, List, Optional, TYPE_CHECKING, Union + +from ._spinners import SPINNERS +from .measure import Measurement +from .table import Table +from .text import Text + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult, RenderableType + from .style import StyleType + + +class Spinner: + """A spinner animation. + + Args: + name (str): Name of spinner (run python -m rich.spinner). + text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". + style (StyleType, optional): Style for spinner animation. Defaults to None. + speed (float, optional): Speed factor for animation. Defaults to 1.0. + + Raises: + KeyError: If name isn't one of the supported spinner animations. + """ + + def __init__( + self, + name: str, + text: "RenderableType" = "", + *, + style: Optional["StyleType"] = None, + speed: float = 1.0, + ) -> None: + try: + spinner = SPINNERS[name] + except KeyError: + raise KeyError(f"no spinner called {name!r}") + self.text: "Union[RenderableType, Text]" = ( + Text.from_markup(text) if isinstance(text, str) else text + ) + self.frames = cast(List[str], spinner["frames"])[:] + self.interval = cast(float, spinner["interval"]) + self.start_time: Optional[float] = None + self.style = style + self.speed = speed + self.frame_no_offset: float = 0.0 + self._update_speed = 0.0 + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + yield self.render(console.get_time()) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + text = self.render(0) + return Measurement.get(console, options, text) + + def render(self, time: float) -> "RenderableType": + """Render the spinner for a given time. + + Args: + time (float): Time in seconds. + + Returns: + RenderableType: A renderable containing animation frame. + """ + if self.start_time is None: + self.start_time = time + + frame_no = ((time - self.start_time) * self.speed) / ( + self.interval / 1000.0 + ) + self.frame_no_offset + frame = Text( + self.frames[int(frame_no) % len(self.frames)], style=self.style or "" + ) + + if self._update_speed: + self.frame_no_offset = frame_no + self.start_time = time + self.speed = self._update_speed + self._update_speed = 0.0 + + if not self.text: + return frame + elif isinstance(self.text, (str, Text)): + return Text.assemble(frame, " ", self.text) + else: + table = Table.grid(padding=1) + table.add_row(frame, self.text) + return table + + def update( + self, + *, + text: "RenderableType" = "", + style: Optional["StyleType"] = None, + speed: Optional[float] = None, + ) -> None: + """Updates attributes of a spinner after it has been started. + + Args: + text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". + style (StyleType, optional): Style for spinner animation. Defaults to None. + speed (float, optional): Speed factor for animation. Defaults to None. + """ + if text: + self.text = Text.from_markup(text) if isinstance(text, str) else text + if style: + self.style = style + if speed: + self._update_speed = speed + + +if __name__ == "__main__": # pragma: no cover + from time import sleep + + from .columns import Columns + from .panel import Panel + from .live import Live + + all_spinners = Columns( + [ + Spinner(spinner_name, text=Text(repr(spinner_name), style="green")) + for spinner_name in sorted(SPINNERS.keys()) + ], + column_first=True, + expand=True, + ) + + with Live( + Panel(all_spinners, title="Spinners", border_style="blue"), + refresh_per_second=20, + ) as live: + while True: + sleep(0.1) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py new file mode 100644 index 0000000..6574483 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/status.py @@ -0,0 +1,131 @@ +from types import TracebackType +from typing import Optional, Type + +from .console import Console, RenderableType +from .jupyter import JupyterMixin +from .live import Live +from .spinner import Spinner +from .style import StyleType + + +class Status(JupyterMixin): + """Displays a status indicator with a 'spinner' animation. + + Args: + status (RenderableType): A status renderable (str or Text typically). + console (Console, optional): Console instance to use, or None for global console. Defaults to None. + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + """ + + def __init__( + self, + status: RenderableType, + *, + console: Optional[Console] = None, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ): + self.status = status + self.spinner_style = spinner_style + self.speed = speed + self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed) + self._live = Live( + self.renderable, + console=console, + refresh_per_second=refresh_per_second, + transient=True, + ) + + @property + def renderable(self) -> Spinner: + return self._spinner + + @property + def console(self) -> "Console": + """Get the Console used by the Status objects.""" + return self._live.console + + def update( + self, + status: Optional[RenderableType] = None, + *, + spinner: Optional[str] = None, + spinner_style: Optional[StyleType] = None, + speed: Optional[float] = None, + ) -> None: + """Update status. + + Args: + status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None. + spinner (Optional[str], optional): New spinner or None for no change. Defaults to None. + spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None. + speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None. + """ + if status is not None: + self.status = status + if spinner_style is not None: + self.spinner_style = spinner_style + if speed is not None: + self.speed = speed + if spinner is not None: + self._spinner = Spinner( + spinner, text=self.status, style=self.spinner_style, speed=self.speed + ) + self._live.update(self.renderable, refresh=True) + else: + self._spinner.update( + text=self.status, style=self.spinner_style, speed=self.speed + ) + + def start(self) -> None: + """Start the status animation.""" + self._live.start() + + def stop(self) -> None: + """Stop the spinner animation.""" + self._live.stop() + + def __rich__(self) -> RenderableType: + return self.renderable + + def __enter__(self) -> "Status": + self.start() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.stop() + + +if __name__ == "__main__": # pragma: no cover + from time import sleep + + from .console import Console + + console = Console() + with console.status("[magenta]Covid detector booting up") as status: + sleep(3) + console.log("Importing advanced AI") + sleep(3) + console.log("Advanced Covid AI Ready") + sleep(3) + status.update(status="[bold blue] Scanning for Covid", spinner="earth") + sleep(3) + console.log("Found 10,000,000,000 copies of Covid32.exe") + sleep(3) + status.update( + status="[bold red]Moving Covid32.exe to Trash", + spinner="bouncingBall", + spinner_style="yellow", + ) + sleep(5) + console.print("[bold green]Covid deleted successfully") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/style.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/style.py new file mode 100644 index 0000000..313c889 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/style.py @@ -0,0 +1,796 @@ +import sys +from functools import lru_cache +from marshal import dumps, loads +from random import randint +from typing import Any, Dict, Iterable, List, Optional, Type, Union, cast + +from . import errors +from .color import Color, ColorParseError, ColorSystem, blend_rgb +from .repr import Result, rich_repr +from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme + +# Style instances and style definitions are often interchangeable +StyleType = Union[str, "Style"] + + +class _Bit: + """A descriptor to get/set a style attribute bit.""" + + __slots__ = ["bit"] + + def __init__(self, bit_no: int) -> None: + self.bit = 1 << bit_no + + def __get__(self, obj: "Style", objtype: Type["Style"]) -> Optional[bool]: + if obj._set_attributes & self.bit: + return obj._attributes & self.bit != 0 + return None + + +@rich_repr +class Style: + """A terminal style. + + A terminal style consists of a color (`color`), a background color (`bgcolor`), and a number of attributes, such + as bold, italic etc. The attributes have 3 states: they can either be on + (``True``), off (``False``), or not set (``None``). + + Args: + color (Union[Color, str], optional): Color of terminal text. Defaults to None. + bgcolor (Union[Color, str], optional): Color of terminal background. Defaults to None. + bold (bool, optional): Enable bold text. Defaults to None. + dim (bool, optional): Enable dim text. Defaults to None. + italic (bool, optional): Enable italic text. Defaults to None. + underline (bool, optional): Enable underlined text. Defaults to None. + blink (bool, optional): Enabled blinking text. Defaults to None. + blink2 (bool, optional): Enable fast blinking text. Defaults to None. + reverse (bool, optional): Enabled reverse text. Defaults to None. + conceal (bool, optional): Enable concealed text. Defaults to None. + strike (bool, optional): Enable strikethrough text. Defaults to None. + underline2 (bool, optional): Enable doubly underlined text. Defaults to None. + frame (bool, optional): Enable framed text. Defaults to None. + encircle (bool, optional): Enable encircled text. Defaults to None. + overline (bool, optional): Enable overlined text. Defaults to None. + link (str, link): Link URL. Defaults to None. + + """ + + _color: Optional[Color] + _bgcolor: Optional[Color] + _attributes: int + _set_attributes: int + _hash: Optional[int] + _null: bool + _meta: Optional[bytes] + + __slots__ = [ + "_color", + "_bgcolor", + "_attributes", + "_set_attributes", + "_link", + "_link_id", + "_ansi", + "_style_definition", + "_hash", + "_null", + "_meta", + ] + + # maps bits on to SGR parameter + _style_map = { + 0: "1", + 1: "2", + 2: "3", + 3: "4", + 4: "5", + 5: "6", + 6: "7", + 7: "8", + 8: "9", + 9: "21", + 10: "51", + 11: "52", + 12: "53", + } + + STYLE_ATTRIBUTES = { + "dim": "dim", + "d": "dim", + "bold": "bold", + "b": "bold", + "italic": "italic", + "i": "italic", + "underline": "underline", + "u": "underline", + "blink": "blink", + "blink2": "blink2", + "reverse": "reverse", + "r": "reverse", + "conceal": "conceal", + "c": "conceal", + "strike": "strike", + "s": "strike", + "underline2": "underline2", + "uu": "underline2", + "frame": "frame", + "encircle": "encircle", + "overline": "overline", + "o": "overline", + } + + def __init__( + self, + *, + color: Optional[Union[Color, str]] = None, + bgcolor: Optional[Union[Color, str]] = None, + bold: Optional[bool] = None, + dim: Optional[bool] = None, + italic: Optional[bool] = None, + underline: Optional[bool] = None, + blink: Optional[bool] = None, + blink2: Optional[bool] = None, + reverse: Optional[bool] = None, + conceal: Optional[bool] = None, + strike: Optional[bool] = None, + underline2: Optional[bool] = None, + frame: Optional[bool] = None, + encircle: Optional[bool] = None, + overline: Optional[bool] = None, + link: Optional[str] = None, + meta: Optional[Dict[str, Any]] = None, + ): + self._ansi: Optional[str] = None + self._style_definition: Optional[str] = None + + def _make_color(color: Union[Color, str]) -> Color: + return color if isinstance(color, Color) else Color.parse(color) + + self._color = None if color is None else _make_color(color) + self._bgcolor = None if bgcolor is None else _make_color(bgcolor) + self._set_attributes = sum( + ( + bold is not None, + dim is not None and 2, + italic is not None and 4, + underline is not None and 8, + blink is not None and 16, + blink2 is not None and 32, + reverse is not None and 64, + conceal is not None and 128, + strike is not None and 256, + underline2 is not None and 512, + frame is not None and 1024, + encircle is not None and 2048, + overline is not None and 4096, + ) + ) + self._attributes = ( + sum( + ( + bold and 1 or 0, + dim and 2 or 0, + italic and 4 or 0, + underline and 8 or 0, + blink and 16 or 0, + blink2 and 32 or 0, + reverse and 64 or 0, + conceal and 128 or 0, + strike and 256 or 0, + underline2 and 512 or 0, + frame and 1024 or 0, + encircle and 2048 or 0, + overline and 4096 or 0, + ) + ) + if self._set_attributes + else 0 + ) + + self._link = link + self._meta = None if meta is None else dumps(meta) + self._link_id = ( + f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else "" + ) + self._hash: Optional[int] = None + self._null = not (self._set_attributes or color or bgcolor or link or meta) + + @classmethod + def null(cls) -> "Style": + """Create an 'null' style, equivalent to Style(), but more performant.""" + return NULL_STYLE + + @classmethod + def from_color( + cls, color: Optional[Color] = None, bgcolor: Optional[Color] = None + ) -> "Style": + """Create a new style with colors and no attributes. + + Returns: + color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None. + bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None. + """ + style: Style = cls.__new__(Style) + style._ansi = None + style._style_definition = None + style._color = color + style._bgcolor = bgcolor + style._set_attributes = 0 + style._attributes = 0 + style._link = None + style._link_id = "" + style._meta = None + style._null = not (color or bgcolor) + style._hash = None + return style + + @classmethod + def from_meta(cls, meta: Optional[Dict[str, Any]]) -> "Style": + """Create a new style with meta data. + + Returns: + meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None. + """ + style: Style = cls.__new__(Style) + style._ansi = None + style._style_definition = None + style._color = None + style._bgcolor = None + style._set_attributes = 0 + style._attributes = 0 + style._link = None + style._meta = dumps(meta) + style._link_id = f"{randint(0, 999999)}{hash(style._meta)}" + style._hash = None + style._null = not (meta) + return style + + @classmethod + def on(cls, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Style": + """Create a blank style with meta information. + + Example: + style = Style.on(click=self.on_click) + + Args: + meta (Optional[Dict[str, Any]], optional): An optional dict of meta information. + **handlers (Any): Keyword arguments are translated in to handlers. + + Returns: + Style: A Style with meta information attached. + """ + meta = {} if meta is None else meta + meta.update({f"@{key}": value for key, value in handlers.items()}) + return cls.from_meta(meta) + + bold = _Bit(0) + dim = _Bit(1) + italic = _Bit(2) + underline = _Bit(3) + blink = _Bit(4) + blink2 = _Bit(5) + reverse = _Bit(6) + conceal = _Bit(7) + strike = _Bit(8) + underline2 = _Bit(9) + frame = _Bit(10) + encircle = _Bit(11) + overline = _Bit(12) + + @property + def link_id(self) -> str: + """Get a link id, used in ansi code for links.""" + return self._link_id + + def __str__(self) -> str: + """Re-generate style definition from attributes.""" + if self._style_definition is None: + attributes: List[str] = [] + append = attributes.append + bits = self._set_attributes + if bits & 0b0000000001111: + if bits & 1: + append("bold" if self.bold else "not bold") + if bits & (1 << 1): + append("dim" if self.dim else "not dim") + if bits & (1 << 2): + append("italic" if self.italic else "not italic") + if bits & (1 << 3): + append("underline" if self.underline else "not underline") + if bits & 0b0000111110000: + if bits & (1 << 4): + append("blink" if self.blink else "not blink") + if bits & (1 << 5): + append("blink2" if self.blink2 else "not blink2") + if bits & (1 << 6): + append("reverse" if self.reverse else "not reverse") + if bits & (1 << 7): + append("conceal" if self.conceal else "not conceal") + if bits & (1 << 8): + append("strike" if self.strike else "not strike") + if bits & 0b1111000000000: + if bits & (1 << 9): + append("underline2" if self.underline2 else "not underline2") + if bits & (1 << 10): + append("frame" if self.frame else "not frame") + if bits & (1 << 11): + append("encircle" if self.encircle else "not encircle") + if bits & (1 << 12): + append("overline" if self.overline else "not overline") + if self._color is not None: + append(self._color.name) + if self._bgcolor is not None: + append("on") + append(self._bgcolor.name) + if self._link: + append("link") + append(self._link) + self._style_definition = " ".join(attributes) or "none" + return self._style_definition + + def __bool__(self) -> bool: + """A Style is false if it has no attributes, colors, or links.""" + return not self._null + + def _make_ansi_codes(self, color_system: ColorSystem) -> str: + """Generate ANSI codes for this style. + + Args: + color_system (ColorSystem): Color system. + + Returns: + str: String containing codes. + """ + + if self._ansi is None: + sgr: List[str] = [] + append = sgr.append + _style_map = self._style_map + attributes = self._attributes & self._set_attributes + if attributes: + if attributes & 1: + append(_style_map[0]) + if attributes & 2: + append(_style_map[1]) + if attributes & 4: + append(_style_map[2]) + if attributes & 8: + append(_style_map[3]) + if attributes & 0b0000111110000: + for bit in range(4, 9): + if attributes & (1 << bit): + append(_style_map[bit]) + if attributes & 0b1111000000000: + for bit in range(9, 13): + if attributes & (1 << bit): + append(_style_map[bit]) + if self._color is not None: + sgr.extend(self._color.downgrade(color_system).get_ansi_codes()) + if self._bgcolor is not None: + sgr.extend( + self._bgcolor.downgrade(color_system).get_ansi_codes( + foreground=False + ) + ) + self._ansi = ";".join(sgr) + return self._ansi + + @classmethod + @lru_cache(maxsize=1024) + def normalize(cls, style: str) -> str: + """Normalize a style definition so that styles with the same effect have the same string + representation. + + Args: + style (str): A style definition. + + Returns: + str: Normal form of style definition. + """ + try: + return str(cls.parse(style)) + except errors.StyleSyntaxError: + return style.strip().lower() + + @classmethod + def pick_first(cls, *values: Optional[StyleType]) -> StyleType: + """Pick first non-None style.""" + for value in values: + if value is not None: + return value + raise ValueError("expected at least one non-None style") + + def __rich_repr__(self) -> Result: + yield "color", self.color, None + yield "bgcolor", self.bgcolor, None + yield "bold", self.bold, None, + yield "dim", self.dim, None, + yield "italic", self.italic, None + yield "underline", self.underline, None, + yield "blink", self.blink, None + yield "blink2", self.blink2, None + yield "reverse", self.reverse, None + yield "conceal", self.conceal, None + yield "strike", self.strike, None + yield "underline2", self.underline2, None + yield "frame", self.frame, None + yield "encircle", self.encircle, None + yield "link", self.link, None + if self._meta: + yield "meta", self.meta + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Style): + return NotImplemented + return self.__hash__() == other.__hash__() + + def __ne__(self, other: Any) -> bool: + if not isinstance(other, Style): + return NotImplemented + return self.__hash__() != other.__hash__() + + def __hash__(self) -> int: + if self._hash is not None: + return self._hash + self._hash = hash( + ( + self._color, + self._bgcolor, + self._attributes, + self._set_attributes, + self._link, + self._meta, + ) + ) + return self._hash + + @property + def color(self) -> Optional[Color]: + """The foreground color or None if it is not set.""" + return self._color + + @property + def bgcolor(self) -> Optional[Color]: + """The background color or None if it is not set.""" + return self._bgcolor + + @property + def link(self) -> Optional[str]: + """Link text, if set.""" + return self._link + + @property + def transparent_background(self) -> bool: + """Check if the style specified a transparent background.""" + return self.bgcolor is None or self.bgcolor.is_default + + @property + def background_style(self) -> "Style": + """A Style with background only.""" + return Style(bgcolor=self.bgcolor) + + @property + def meta(self) -> Dict[str, Any]: + """Get meta information (can not be changed after construction).""" + return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta)) + + @property + def without_color(self) -> "Style": + """Get a copy of the style with color removed.""" + if self._null: + return NULL_STYLE + style: Style = self.__new__(Style) + style._ansi = None + style._style_definition = None + style._color = None + style._bgcolor = None + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = self._link + style._link_id = f"{randint(0, 999999)}" if self._link else "" + style._null = False + style._meta = None + style._hash = None + return style + + @classmethod + @lru_cache(maxsize=4096) + def parse(cls, style_definition: str) -> "Style": + """Parse a style definition. + + Args: + style_definition (str): A string containing a style. + + Raises: + errors.StyleSyntaxError: If the style definition syntax is invalid. + + Returns: + `Style`: A Style instance. + """ + if style_definition.strip() == "none" or not style_definition: + return cls.null() + + STYLE_ATTRIBUTES = cls.STYLE_ATTRIBUTES + color: Optional[str] = None + bgcolor: Optional[str] = None + attributes: Dict[str, Optional[Any]] = {} + link: Optional[str] = None + + words = iter(style_definition.split()) + for original_word in words: + word = original_word.lower() + if word == "on": + word = next(words, "") + if not word: + raise errors.StyleSyntaxError("color expected after 'on'") + try: + Color.parse(word) is None + except ColorParseError as error: + raise errors.StyleSyntaxError( + f"unable to parse {word!r} as background color; {error}" + ) from None + bgcolor = word + + elif word == "not": + word = next(words, "") + attribute = STYLE_ATTRIBUTES.get(word) + if attribute is None: + raise errors.StyleSyntaxError( + f"expected style attribute after 'not', found {word!r}" + ) + attributes[attribute] = False + + elif word == "link": + word = next(words, "") + if not word: + raise errors.StyleSyntaxError("URL expected after 'link'") + link = word + + elif word in STYLE_ATTRIBUTES: + attributes[STYLE_ATTRIBUTES[word]] = True + + else: + try: + Color.parse(word) + except ColorParseError as error: + raise errors.StyleSyntaxError( + f"unable to parse {word!r} as color; {error}" + ) from None + color = word + style = Style(color=color, bgcolor=bgcolor, link=link, **attributes) + return style + + @lru_cache(maxsize=1024) + def get_html_style(self, theme: Optional[TerminalTheme] = None) -> str: + """Get a CSS style rule.""" + theme = theme or DEFAULT_TERMINAL_THEME + css: List[str] = [] + append = css.append + + color = self.color + bgcolor = self.bgcolor + if self.reverse: + color, bgcolor = bgcolor, color + if self.dim: + foreground_color = ( + theme.foreground_color if color is None else color.get_truecolor(theme) + ) + color = Color.from_triplet( + blend_rgb(foreground_color, theme.background_color, 0.5) + ) + if color is not None: + theme_color = color.get_truecolor(theme) + append(f"color: {theme_color.hex}") + append(f"text-decoration-color: {theme_color.hex}") + if bgcolor is not None: + theme_color = bgcolor.get_truecolor(theme, foreground=False) + append(f"background-color: {theme_color.hex}") + if self.bold: + append("font-weight: bold") + if self.italic: + append("font-style: italic") + if self.underline: + append("text-decoration: underline") + if self.strike: + append("text-decoration: line-through") + if self.overline: + append("text-decoration: overline") + return "; ".join(css) + + @classmethod + def combine(cls, styles: Iterable["Style"]) -> "Style": + """Combine styles and get result. + + Args: + styles (Iterable[Style]): Styles to combine. + + Returns: + Style: A new style instance. + """ + iter_styles = iter(styles) + return sum(iter_styles, next(iter_styles)) + + @classmethod + def chain(cls, *styles: "Style") -> "Style": + """Combine styles from positional argument in to a single style. + + Args: + *styles (Iterable[Style]): Styles to combine. + + Returns: + Style: A new style instance. + """ + iter_styles = iter(styles) + return sum(iter_styles, next(iter_styles)) + + def copy(self) -> "Style": + """Get a copy of this style. + + Returns: + Style: A new Style instance with identical attributes. + """ + if self._null: + return NULL_STYLE + style: Style = self.__new__(Style) + style._ansi = self._ansi + style._style_definition = self._style_definition + style._color = self._color + style._bgcolor = self._bgcolor + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = self._link + style._link_id = f"{randint(0, 999999)}" if self._link else "" + style._hash = self._hash + style._null = False + style._meta = self._meta + return style + + @lru_cache(maxsize=128) + def clear_meta_and_links(self) -> "Style": + """Get a copy of this style with link and meta information removed. + + Returns: + Style: New style object. + """ + if self._null: + return NULL_STYLE + style: Style = self.__new__(Style) + style._ansi = self._ansi + style._style_definition = self._style_definition + style._color = self._color + style._bgcolor = self._bgcolor + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = None + style._link_id = "" + style._hash = self._hash + style._null = False + style._meta = None + return style + + def update_link(self, link: Optional[str] = None) -> "Style": + """Get a copy with a different value for link. + + Args: + link (str, optional): New value for link. Defaults to None. + + Returns: + Style: A new Style instance. + """ + style: Style = self.__new__(Style) + style._ansi = self._ansi + style._style_definition = self._style_definition + style._color = self._color + style._bgcolor = self._bgcolor + style._attributes = self._attributes + style._set_attributes = self._set_attributes + style._link = link + style._link_id = f"{randint(0, 999999)}" if link else "" + style._hash = None + style._null = False + style._meta = self._meta + return style + + def render( + self, + text: str = "", + *, + color_system: Optional[ColorSystem] = ColorSystem.TRUECOLOR, + legacy_windows: bool = False, + ) -> str: + """Render the ANSI codes for the style. + + Args: + text (str, optional): A string to style. Defaults to "". + color_system (Optional[ColorSystem], optional): Color system to render to. Defaults to ColorSystem.TRUECOLOR. + + Returns: + str: A string containing ANSI style codes. + """ + if not text or color_system is None: + return text + attrs = self._ansi or self._make_ansi_codes(color_system) + rendered = f"\x1b[{attrs}m{text}\x1b[0m" if attrs else text + if self._link and not legacy_windows: + rendered = ( + f"\x1b]8;id={self._link_id};{self._link}\x1b\\{rendered}\x1b]8;;\x1b\\" + ) + return rendered + + def test(self, text: Optional[str] = None) -> None: + """Write text with style directly to terminal. + + This method is for testing purposes only. + + Args: + text (Optional[str], optional): Text to style or None for style name. + + """ + text = text or str(self) + sys.stdout.write(f"{self.render(text)}\n") + + @lru_cache(maxsize=1024) + def _add(self, style: Optional["Style"]) -> "Style": + if style is None or style._null: + return self + if self._null: + return style + new_style: Style = self.__new__(Style) + new_style._ansi = None + new_style._style_definition = None + new_style._color = style._color or self._color + new_style._bgcolor = style._bgcolor or self._bgcolor + new_style._attributes = (self._attributes & ~style._set_attributes) | ( + style._attributes & style._set_attributes + ) + new_style._set_attributes = self._set_attributes | style._set_attributes + new_style._link = style._link or self._link + new_style._link_id = style._link_id or self._link_id + new_style._null = style._null + if self._meta and style._meta: + new_style._meta = dumps({**self.meta, **style.meta}) + else: + new_style._meta = self._meta or style._meta + new_style._hash = None + return new_style + + def __add__(self, style: Optional["Style"]) -> "Style": + combined_style = self._add(style) + return combined_style.copy() if combined_style.link else combined_style + + +NULL_STYLE = Style() + + +class StyleStack: + """A stack of styles.""" + + __slots__ = ["_stack"] + + def __init__(self, default_style: "Style") -> None: + self._stack: List[Style] = [default_style] + + def __repr__(self) -> str: + return f"" + + @property + def current(self) -> Style: + """Get the Style at the top of the stack.""" + return self._stack[-1] + + def push(self, style: Style) -> None: + """Push a new style on to the stack. + + Args: + style (Style): New style to combine with current style. + """ + self._stack.append(self._stack[-1] + style) + + def pop(self) -> Style: + """Pop last style and discard. + + Returns: + Style: New current style (also available as stack.current) + """ + self._stack.pop() + return self._stack[-1] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/styled.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/styled.py new file mode 100644 index 0000000..91cd0db --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/styled.py @@ -0,0 +1,42 @@ +from typing import TYPE_CHECKING + +from .measure import Measurement +from .segment import Segment +from .style import StyleType + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult, RenderableType + + +class Styled: + """Apply a style to a renderable. + + Args: + renderable (RenderableType): Any renderable. + style (StyleType): A style to apply across the entire renderable. + """ + + def __init__(self, renderable: "RenderableType", style: "StyleType") -> None: + self.renderable = renderable + self.style = style + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + style = console.get_style(self.style) + rendered_segments = console.render(self.renderable, options) + segments = Segment.apply_style(rendered_segments, style) + return segments + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + return Measurement.get(console, options, self.renderable) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich import print + from pip._vendor.rich.panel import Panel + + panel = Styled(Panel("hello"), "on blue") + print(panel) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py new file mode 100644 index 0000000..c26fd87 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py @@ -0,0 +1,958 @@ +import os.path +import platform +import re +import sys +import textwrap +from abc import ABC, abstractmethod +from pathlib import Path +from typing import ( + Any, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Set, + Tuple, + Type, + Union, +) + +from pip._vendor.pygments.lexer import Lexer +from pip._vendor.pygments.lexers import get_lexer_by_name, guess_lexer_for_filename +from pip._vendor.pygments.style import Style as PygmentsStyle +from pip._vendor.pygments.styles import get_style_by_name +from pip._vendor.pygments.token import ( + Comment, + Error, + Generic, + Keyword, + Name, + Number, + Operator, + String, + Token, + Whitespace, +) +from pip._vendor.pygments.util import ClassNotFound + +from pip._vendor.rich.containers import Lines +from pip._vendor.rich.padding import Padding, PaddingDimensions + +from ._loop import loop_first +from .cells import cell_len +from .color import Color, blend_rgb +from .console import Console, ConsoleOptions, JustifyMethod, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment, Segments +from .style import Style, StyleType +from .text import Text + +TokenType = Tuple[str, ...] + +WINDOWS = platform.system() == "Windows" +DEFAULT_THEME = "monokai" + +# The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py +# A few modifications were made + +ANSI_LIGHT: Dict[TokenType, Style] = { + Token: Style(), + Whitespace: Style(color="white"), + Comment: Style(dim=True), + Comment.Preproc: Style(color="cyan"), + Keyword: Style(color="blue"), + Keyword.Type: Style(color="cyan"), + Operator.Word: Style(color="magenta"), + Name.Builtin: Style(color="cyan"), + Name.Function: Style(color="green"), + Name.Namespace: Style(color="cyan", underline=True), + Name.Class: Style(color="green", underline=True), + Name.Exception: Style(color="cyan"), + Name.Decorator: Style(color="magenta", bold=True), + Name.Variable: Style(color="red"), + Name.Constant: Style(color="red"), + Name.Attribute: Style(color="cyan"), + Name.Tag: Style(color="bright_blue"), + String: Style(color="yellow"), + Number: Style(color="blue"), + Generic.Deleted: Style(color="bright_red"), + Generic.Inserted: Style(color="green"), + Generic.Heading: Style(bold=True), + Generic.Subheading: Style(color="magenta", bold=True), + Generic.Prompt: Style(bold=True), + Generic.Error: Style(color="bright_red"), + Error: Style(color="red", underline=True), +} + +ANSI_DARK: Dict[TokenType, Style] = { + Token: Style(), + Whitespace: Style(color="bright_black"), + Comment: Style(dim=True), + Comment.Preproc: Style(color="bright_cyan"), + Keyword: Style(color="bright_blue"), + Keyword.Type: Style(color="bright_cyan"), + Operator.Word: Style(color="bright_magenta"), + Name.Builtin: Style(color="bright_cyan"), + Name.Function: Style(color="bright_green"), + Name.Namespace: Style(color="bright_cyan", underline=True), + Name.Class: Style(color="bright_green", underline=True), + Name.Exception: Style(color="bright_cyan"), + Name.Decorator: Style(color="bright_magenta", bold=True), + Name.Variable: Style(color="bright_red"), + Name.Constant: Style(color="bright_red"), + Name.Attribute: Style(color="bright_cyan"), + Name.Tag: Style(color="bright_blue"), + String: Style(color="yellow"), + Number: Style(color="bright_blue"), + Generic.Deleted: Style(color="bright_red"), + Generic.Inserted: Style(color="bright_green"), + Generic.Heading: Style(bold=True), + Generic.Subheading: Style(color="bright_magenta", bold=True), + Generic.Prompt: Style(bold=True), + Generic.Error: Style(color="bright_red"), + Error: Style(color="red", underline=True), +} + +RICH_SYNTAX_THEMES = {"ansi_light": ANSI_LIGHT, "ansi_dark": ANSI_DARK} +NUMBERS_COLUMN_DEFAULT_PADDING = 2 + + +class SyntaxTheme(ABC): + """Base class for a syntax theme.""" + + @abstractmethod + def get_style_for_token(self, token_type: TokenType) -> Style: + """Get a style for a given Pygments token.""" + raise NotImplementedError # pragma: no cover + + @abstractmethod + def get_background_style(self) -> Style: + """Get the background color.""" + raise NotImplementedError # pragma: no cover + + +class PygmentsSyntaxTheme(SyntaxTheme): + """Syntax theme that delegates to Pygments theme.""" + + def __init__(self, theme: Union[str, Type[PygmentsStyle]]) -> None: + self._style_cache: Dict[TokenType, Style] = {} + if isinstance(theme, str): + try: + self._pygments_style_class = get_style_by_name(theme) + except ClassNotFound: + self._pygments_style_class = get_style_by_name("default") + else: + self._pygments_style_class = theme + + self._background_color = self._pygments_style_class.background_color + self._background_style = Style(bgcolor=self._background_color) + + def get_style_for_token(self, token_type: TokenType) -> Style: + """Get a style from a Pygments class.""" + try: + return self._style_cache[token_type] + except KeyError: + try: + pygments_style = self._pygments_style_class.style_for_token(token_type) + except KeyError: + style = Style.null() + else: + color = pygments_style["color"] + bgcolor = pygments_style["bgcolor"] + style = Style( + color="#" + color if color else "#000000", + bgcolor="#" + bgcolor if bgcolor else self._background_color, + bold=pygments_style["bold"], + italic=pygments_style["italic"], + underline=pygments_style["underline"], + ) + self._style_cache[token_type] = style + return style + + def get_background_style(self) -> Style: + return self._background_style + + +class ANSISyntaxTheme(SyntaxTheme): + """Syntax theme to use standard colors.""" + + def __init__(self, style_map: Dict[TokenType, Style]) -> None: + self.style_map = style_map + self._missing_style = Style.null() + self._background_style = Style.null() + self._style_cache: Dict[TokenType, Style] = {} + + def get_style_for_token(self, token_type: TokenType) -> Style: + """Look up style in the style map.""" + try: + return self._style_cache[token_type] + except KeyError: + # Styles form a hierarchy + # We need to go from most to least specific + # e.g. ("foo", "bar", "baz") to ("foo", "bar") to ("foo",) + get_style = self.style_map.get + token = tuple(token_type) + style = self._missing_style + while token: + _style = get_style(token) + if _style is not None: + style = _style + break + token = token[:-1] + self._style_cache[token_type] = style + return style + + def get_background_style(self) -> Style: + return self._background_style + + +SyntaxPosition = Tuple[int, int] + + +class _SyntaxHighlightRange(NamedTuple): + """ + A range to highlight in a Syntax object. + `start` and `end` are 2-integers tuples, where the first integer is the line number + (starting from 1) and the second integer is the column index (starting from 0). + """ + + style: StyleType + start: SyntaxPosition + end: SyntaxPosition + + +class Syntax(JupyterMixin): + """Construct a Syntax object to render syntax highlighted code. + + Args: + code (str): Code to highlight. + lexer (Lexer | str): Lexer to use (see https://pygments.org/docs/lexers/) + theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "monokai". + dedent (bool, optional): Enable stripping of initial whitespace. Defaults to False. + line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. + start_line (int, optional): Starting number for line numbers. Defaults to 1. + line_range (Tuple[int | None, int | None], optional): If given should be a tuple of the start and end line to render. + A value of None in the tuple indicates the range is open in that direction. + highlight_lines (Set[int]): A set of line numbers to highlight. + code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. + tab_size (int, optional): Size of tabs. Defaults to 4. + word_wrap (bool, optional): Enable word wrapping. + background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. + indent_guides (bool, optional): Show indent guides. Defaults to False. + padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). + """ + + _pygments_style_class: Type[PygmentsStyle] + _theme: SyntaxTheme + + @classmethod + def get_theme(cls, name: Union[str, SyntaxTheme]) -> SyntaxTheme: + """Get a syntax theme instance.""" + if isinstance(name, SyntaxTheme): + return name + theme: SyntaxTheme + if name in RICH_SYNTAX_THEMES: + theme = ANSISyntaxTheme(RICH_SYNTAX_THEMES[name]) + else: + theme = PygmentsSyntaxTheme(name) + return theme + + def __init__( + self, + code: str, + lexer: Union[Lexer, str], + *, + theme: Union[str, SyntaxTheme] = DEFAULT_THEME, + dedent: bool = False, + line_numbers: bool = False, + start_line: int = 1, + line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, + highlight_lines: Optional[Set[int]] = None, + code_width: Optional[int] = None, + tab_size: int = 4, + word_wrap: bool = False, + background_color: Optional[str] = None, + indent_guides: bool = False, + padding: PaddingDimensions = 0, + ) -> None: + self.code = code + self._lexer = lexer + self.dedent = dedent + self.line_numbers = line_numbers + self.start_line = start_line + self.line_range = line_range + self.highlight_lines = highlight_lines or set() + self.code_width = code_width + self.tab_size = tab_size + self.word_wrap = word_wrap + self.background_color = background_color + self.background_style = ( + Style(bgcolor=background_color) if background_color else Style() + ) + self.indent_guides = indent_guides + self.padding = padding + + self._theme = self.get_theme(theme) + self._stylized_ranges: List[_SyntaxHighlightRange] = [] + + @classmethod + def from_path( + cls, + path: str, + encoding: str = "utf-8", + lexer: Optional[Union[Lexer, str]] = None, + theme: Union[str, SyntaxTheme] = DEFAULT_THEME, + dedent: bool = False, + line_numbers: bool = False, + line_range: Optional[Tuple[int, int]] = None, + start_line: int = 1, + highlight_lines: Optional[Set[int]] = None, + code_width: Optional[int] = None, + tab_size: int = 4, + word_wrap: bool = False, + background_color: Optional[str] = None, + indent_guides: bool = False, + padding: PaddingDimensions = 0, + ) -> "Syntax": + """Construct a Syntax object from a file. + + Args: + path (str): Path to file to highlight. + encoding (str): Encoding of file. + lexer (str | Lexer, optional): Lexer to use. If None, lexer will be auto-detected from path/file content. + theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "emacs". + dedent (bool, optional): Enable stripping of initial whitespace. Defaults to True. + line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. + start_line (int, optional): Starting number for line numbers. Defaults to 1. + line_range (Tuple[int, int], optional): If given should be a tuple of the start and end line to render. + highlight_lines (Set[int]): A set of line numbers to highlight. + code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. + tab_size (int, optional): Size of tabs. Defaults to 4. + word_wrap (bool, optional): Enable word wrapping of code. + background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. + indent_guides (bool, optional): Show indent guides. Defaults to False. + padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). + + Returns: + [Syntax]: A Syntax object that may be printed to the console + """ + code = Path(path).read_text(encoding=encoding) + + if not lexer: + lexer = cls.guess_lexer(path, code=code) + + return cls( + code, + lexer, + theme=theme, + dedent=dedent, + line_numbers=line_numbers, + line_range=line_range, + start_line=start_line, + highlight_lines=highlight_lines, + code_width=code_width, + tab_size=tab_size, + word_wrap=word_wrap, + background_color=background_color, + indent_guides=indent_guides, + padding=padding, + ) + + @classmethod + def guess_lexer(cls, path: str, code: Optional[str] = None) -> str: + """Guess the alias of the Pygments lexer to use based on a path and an optional string of code. + If code is supplied, it will use a combination of the code and the filename to determine the + best lexer to use. For example, if the file is ``index.html`` and the file contains Django + templating syntax, then "html+django" will be returned. If the file is ``index.html``, and no + templating language is used, the "html" lexer will be used. If no string of code + is supplied, the lexer will be chosen based on the file extension.. + + Args: + path (AnyStr): The path to the file containing the code you wish to know the lexer for. + code (str, optional): Optional string of code that will be used as a fallback if no lexer + is found for the supplied path. + + Returns: + str: The name of the Pygments lexer that best matches the supplied path/code. + """ + lexer: Optional[Lexer] = None + lexer_name = "default" + if code: + try: + lexer = guess_lexer_for_filename(path, code) + except ClassNotFound: + pass + + if not lexer: + try: + _, ext = os.path.splitext(path) + if ext: + extension = ext.lstrip(".").lower() + lexer = get_lexer_by_name(extension) + except ClassNotFound: + pass + + if lexer: + if lexer.aliases: + lexer_name = lexer.aliases[0] + else: + lexer_name = lexer.name + + return lexer_name + + def _get_base_style(self) -> Style: + """Get the base style.""" + default_style = self._theme.get_background_style() + self.background_style + return default_style + + def _get_token_color(self, token_type: TokenType) -> Optional[Color]: + """Get a color (if any) for the given token. + + Args: + token_type (TokenType): A token type tuple from Pygments. + + Returns: + Optional[Color]: Color from theme, or None for no color. + """ + style = self._theme.get_style_for_token(token_type) + return style.color + + @property + def lexer(self) -> Optional[Lexer]: + """The lexer for this syntax, or None if no lexer was found. + + Tries to find the lexer by name if a string was passed to the constructor. + """ + + if isinstance(self._lexer, Lexer): + return self._lexer + try: + return get_lexer_by_name( + self._lexer, + stripnl=False, + ensurenl=True, + tabsize=self.tab_size, + ) + except ClassNotFound: + return None + + @property + def default_lexer(self) -> Lexer: + """A Pygments Lexer to use if one is not specified or invalid.""" + return get_lexer_by_name( + "text", + stripnl=False, + ensurenl=True, + tabsize=self.tab_size, + ) + + def highlight( + self, + code: str, + line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, + ) -> Text: + """Highlight code and return a Text instance. + + Args: + code (str): Code to highlight. + line_range(Tuple[int, int], optional): Optional line range to highlight. + + Returns: + Text: A text instance containing highlighted syntax. + """ + + base_style = self._get_base_style() + justify: JustifyMethod = ( + "default" if base_style.transparent_background else "left" + ) + + text = Text( + justify=justify, + style=base_style, + tab_size=self.tab_size, + no_wrap=not self.word_wrap, + ) + _get_theme_style = self._theme.get_style_for_token + + lexer = self.lexer or self.default_lexer + + if lexer is None: + text.append(code) + else: + if line_range: + # More complicated path to only stylize a portion of the code + # This speeds up further operations as there are less spans to process + line_start, line_end = line_range + + def line_tokenize() -> Iterable[Tuple[Any, str]]: + """Split tokens to one per line.""" + assert lexer # required to make MyPy happy - we know lexer is not None at this point + + for token_type, token in lexer.get_tokens(code): + while token: + line_token, new_line, token = token.partition("\n") + yield token_type, line_token + new_line + + def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]: + """Convert tokens to spans.""" + tokens = iter(line_tokenize()) + line_no = 0 + _line_start = line_start - 1 if line_start else 0 + + # Skip over tokens until line start + while line_no < _line_start: + try: + _token_type, token = next(tokens) + except StopIteration: + break + yield (token, None) + if token.endswith("\n"): + line_no += 1 + # Generate spans until line end + for token_type, token in tokens: + yield (token, _get_theme_style(token_type)) + if token.endswith("\n"): + line_no += 1 + if line_end and line_no >= line_end: + break + + text.append_tokens(tokens_to_spans()) + + else: + text.append_tokens( + (token, _get_theme_style(token_type)) + for token_type, token in lexer.get_tokens(code) + ) + if self.background_color is not None: + text.stylize(f"on {self.background_color}") + + if self._stylized_ranges: + self._apply_stylized_ranges(text) + + return text + + def stylize_range( + self, style: StyleType, start: SyntaxPosition, end: SyntaxPosition + ) -> None: + """ + Adds a custom style on a part of the code, that will be applied to the syntax display when it's rendered. + Line numbers are 1-based, while column indexes are 0-based. + + Args: + style (StyleType): The style to apply. + start (Tuple[int, int]): The start of the range, in the form `[line number, column index]`. + end (Tuple[int, int]): The end of the range, in the form `[line number, column index]`. + """ + self._stylized_ranges.append(_SyntaxHighlightRange(style, start, end)) + + def _get_line_numbers_color(self, blend: float = 0.3) -> Color: + background_style = self._theme.get_background_style() + self.background_style + background_color = background_style.bgcolor + if background_color is None or background_color.is_system_defined: + return Color.default() + foreground_color = self._get_token_color(Token.Text) + if foreground_color is None or foreground_color.is_system_defined: + return foreground_color or Color.default() + new_color = blend_rgb( + background_color.get_truecolor(), + foreground_color.get_truecolor(), + cross_fade=blend, + ) + return Color.from_triplet(new_color) + + @property + def _numbers_column_width(self) -> int: + """Get the number of characters used to render the numbers column.""" + column_width = 0 + if self.line_numbers: + column_width = ( + len(str(self.start_line + self.code.count("\n"))) + + NUMBERS_COLUMN_DEFAULT_PADDING + ) + return column_width + + def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]: + """Get background, number, and highlight styles for line numbers.""" + background_style = self._get_base_style() + if background_style.transparent_background: + return Style.null(), Style(dim=True), Style.null() + if console.color_system in ("256", "truecolor"): + number_style = Style.chain( + background_style, + self._theme.get_style_for_token(Token.Text), + Style(color=self._get_line_numbers_color()), + self.background_style, + ) + highlight_number_style = Style.chain( + background_style, + self._theme.get_style_for_token(Token.Text), + Style(bold=True, color=self._get_line_numbers_color(0.9)), + self.background_style, + ) + else: + number_style = background_style + Style(dim=True) + highlight_number_style = background_style + Style(dim=False) + return background_style, number_style, highlight_number_style + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + _, right, _, left = Padding.unpack(self.padding) + padding = left + right + if self.code_width is not None: + width = self.code_width + self._numbers_column_width + padding + 1 + return Measurement(self._numbers_column_width, width) + lines = self.code.splitlines() + width = ( + self._numbers_column_width + + padding + + (max(cell_len(line) for line in lines) if lines else 0) + ) + if self.line_numbers: + width += 1 + return Measurement(self._numbers_column_width, width) + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + segments = Segments(self._get_syntax(console, options)) + if self.padding: + yield Padding( + segments, style=self._theme.get_background_style(), pad=self.padding + ) + else: + yield segments + + def _get_syntax( + self, + console: Console, + options: ConsoleOptions, + ) -> Iterable[Segment]: + """ + Get the Segments for the Syntax object, excluding any vertical/horizontal padding + """ + transparent_background = self._get_base_style().transparent_background + code_width = ( + ( + (options.max_width - self._numbers_column_width - 1) + if self.line_numbers + else options.max_width + ) + if self.code_width is None + else self.code_width + ) + + ends_on_nl, processed_code = self._process_code(self.code) + text = self.highlight(processed_code, self.line_range) + + if not self.line_numbers and not self.word_wrap and not self.line_range: + if not ends_on_nl: + text.remove_suffix("\n") + # Simple case of just rendering text + style = ( + self._get_base_style() + + self._theme.get_style_for_token(Comment) + + Style(dim=True) + + self.background_style + ) + if self.indent_guides and not options.ascii_only: + text = text.with_indent_guides(self.tab_size, style=style) + text.overflow = "crop" + if style.transparent_background: + yield from console.render( + text, options=options.update(width=code_width) + ) + else: + syntax_lines = console.render_lines( + text, + options.update(width=code_width, height=None, justify="left"), + style=self.background_style, + pad=True, + new_lines=True, + ) + for syntax_line in syntax_lines: + yield from syntax_line + return + + start_line, end_line = self.line_range or (None, None) + line_offset = 0 + if start_line: + line_offset = max(0, start_line - 1) + lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl) + if self.line_range: + if line_offset > len(lines): + return + lines = lines[line_offset:end_line] + + if self.indent_guides and not options.ascii_only: + style = ( + self._get_base_style() + + self._theme.get_style_for_token(Comment) + + Style(dim=True) + + self.background_style + ) + lines = ( + Text("\n") + .join(lines) + .with_indent_guides(self.tab_size, style=style + Style(italic=False)) + .split("\n", allow_blank=True) + ) + + numbers_column_width = self._numbers_column_width + render_options = options.update(width=code_width) + + highlight_line = self.highlight_lines.__contains__ + _Segment = Segment + new_line = _Segment("\n") + + line_pointer = "> " if options.legacy_windows else "❱ " + + ( + background_style, + number_style, + highlight_number_style, + ) = self._get_number_styles(console) + + for line_no, line in enumerate(lines, self.start_line + line_offset): + if self.word_wrap: + wrapped_lines = console.render_lines( + line, + render_options.update(height=None, justify="left"), + style=background_style, + pad=not transparent_background, + ) + else: + segments = list(line.render(console, end="")) + if options.no_wrap: + wrapped_lines = [segments] + else: + wrapped_lines = [ + _Segment.adjust_line_length( + segments, + render_options.max_width, + style=background_style, + pad=not transparent_background, + ) + ] + + if self.line_numbers: + wrapped_line_left_pad = _Segment( + " " * numbers_column_width + " ", background_style + ) + for first, wrapped_line in loop_first(wrapped_lines): + if first: + line_column = str(line_no).rjust(numbers_column_width - 2) + " " + if highlight_line(line_no): + yield _Segment(line_pointer, Style(color="red")) + yield _Segment(line_column, highlight_number_style) + else: + yield _Segment(" ", highlight_number_style) + yield _Segment(line_column, number_style) + else: + yield wrapped_line_left_pad + yield from wrapped_line + yield new_line + else: + for wrapped_line in wrapped_lines: + yield from wrapped_line + yield new_line + + def _apply_stylized_ranges(self, text: Text) -> None: + """ + Apply stylized ranges to a text instance, + using the given code to determine the right portion to apply the style to. + + Args: + text (Text): Text instance to apply the style to. + """ + code = text.plain + newlines_offsets = [ + # Let's add outer boundaries at each side of the list: + 0, + # N.B. using "\n" here is much faster than using metacharacters such as "^" or "\Z": + *[ + match.start() + 1 + for match in re.finditer("\n", code, flags=re.MULTILINE) + ], + len(code) + 1, + ] + + for stylized_range in self._stylized_ranges: + start = _get_code_index_for_syntax_position( + newlines_offsets, stylized_range.start + ) + end = _get_code_index_for_syntax_position( + newlines_offsets, stylized_range.end + ) + if start is not None and end is not None: + text.stylize(stylized_range.style, start, end) + + def _process_code(self, code: str) -> Tuple[bool, str]: + """ + Applies various processing to a raw code string + (normalises it so it always ends with a line return, dedents it if necessary, etc.) + + Args: + code (str): The raw code string to process + + Returns: + Tuple[bool, str]: the boolean indicates whether the raw code ends with a line return, + while the string is the processed code. + """ + ends_on_nl = code.endswith("\n") + processed_code = code if ends_on_nl else code + "\n" + processed_code = ( + textwrap.dedent(processed_code) if self.dedent else processed_code + ) + processed_code = processed_code.expandtabs(self.tab_size) + return ends_on_nl, processed_code + + +def _get_code_index_for_syntax_position( + newlines_offsets: Sequence[int], position: SyntaxPosition +) -> Optional[int]: + """ + Returns the index of the code string for the given positions. + + Args: + newlines_offsets (Sequence[int]): The offset of each newline character found in the code snippet. + position (SyntaxPosition): The position to search for. + + Returns: + Optional[int]: The index of the code string for this position, or `None` + if the given position's line number is out of range (if it's the column that is out of range + we silently clamp its value so that it reaches the end of the line) + """ + lines_count = len(newlines_offsets) + + line_number, column_index = position + if line_number > lines_count or len(newlines_offsets) < (line_number + 1): + return None # `line_number` is out of range + line_index = line_number - 1 + line_length = newlines_offsets[line_index + 1] - newlines_offsets[line_index] - 1 + # If `column_index` is out of range: let's silently clamp it: + column_index = min(line_length, column_index) + return newlines_offsets[line_index] + column_index + + +if __name__ == "__main__": # pragma: no cover + import argparse + import sys + + parser = argparse.ArgumentParser( + description="Render syntax to the console with Rich" + ) + parser.add_argument( + "path", + metavar="PATH", + help="path to file, or - for stdin", + ) + parser.add_argument( + "-c", + "--force-color", + dest="force_color", + action="store_true", + default=None, + help="force color for non-terminals", + ) + parser.add_argument( + "-i", + "--indent-guides", + dest="indent_guides", + action="store_true", + default=False, + help="display indent guides", + ) + parser.add_argument( + "-l", + "--line-numbers", + dest="line_numbers", + action="store_true", + help="render line numbers", + ) + parser.add_argument( + "-w", + "--width", + type=int, + dest="width", + default=None, + help="width of output (default will auto-detect)", + ) + parser.add_argument( + "-r", + "--wrap", + dest="word_wrap", + action="store_true", + default=False, + help="word wrap long lines", + ) + parser.add_argument( + "-s", + "--soft-wrap", + action="store_true", + dest="soft_wrap", + default=False, + help="enable soft wrapping mode", + ) + parser.add_argument( + "-t", "--theme", dest="theme", default="monokai", help="pygments theme" + ) + parser.add_argument( + "-b", + "--background-color", + dest="background_color", + default=None, + help="Override background color", + ) + parser.add_argument( + "-x", + "--lexer", + default=None, + dest="lexer_name", + help="Lexer name", + ) + parser.add_argument( + "-p", "--padding", type=int, default=0, dest="padding", help="Padding" + ) + parser.add_argument( + "--highlight-line", + type=int, + default=None, + dest="highlight_line", + help="The line number (not index!) to highlight", + ) + args = parser.parse_args() + + from pip._vendor.rich.console import Console + + console = Console(force_terminal=args.force_color, width=args.width) + + if args.path == "-": + code = sys.stdin.read() + syntax = Syntax( + code=code, + lexer=args.lexer_name, + line_numbers=args.line_numbers, + word_wrap=args.word_wrap, + theme=args.theme, + background_color=args.background_color, + indent_guides=args.indent_guides, + padding=args.padding, + highlight_lines={args.highlight_line}, + ) + else: + syntax = Syntax.from_path( + args.path, + lexer=args.lexer_name, + line_numbers=args.line_numbers, + word_wrap=args.word_wrap, + theme=args.theme, + background_color=args.background_color, + indent_guides=args.indent_guides, + padding=args.padding, + highlight_lines={args.highlight_line}, + ) + console.print(syntax, soft_wrap=args.soft_wrap) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py new file mode 100644 index 0000000..43c718e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/table.py @@ -0,0 +1,1000 @@ +from dataclasses import dataclass, field, replace +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) + +from . import box, errors +from ._loop import loop_first_last, loop_last +from ._pick import pick_bool +from ._ratio import ratio_distribute, ratio_reduce +from .align import VerticalAlignMethod +from .jupyter import JupyterMixin +from .measure import Measurement +from .padding import Padding, PaddingDimensions +from .protocol import is_renderable +from .segment import Segment +from .style import Style, StyleType +from .text import Text, TextType + +if TYPE_CHECKING: + from .console import ( + Console, + ConsoleOptions, + JustifyMethod, + OverflowMethod, + RenderableType, + RenderResult, + ) + + +@dataclass +class Column: + """Defines a column within a ~Table. + + Args: + title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. + caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. + width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. + min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. + box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. + safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. + padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). + collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. + pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. + expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. + show_header (bool, optional): Show a header row. Defaults to True. + show_footer (bool, optional): Show a footer row. Defaults to False. + show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. + show_lines (bool, optional): Draw lines between every row. Defaults to False. + leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. + style (Union[str, Style], optional): Default style for the table. Defaults to "none". + row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. + header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". + footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". + border_style (Union[str, Style], optional): Style of the border. Defaults to None. + title_style (Union[str, Style], optional): Style of the title. Defaults to None. + caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. + title_justify (str, optional): Justify method for title. Defaults to "center". + caption_justify (str, optional): Justify method for caption. Defaults to "center". + highlight (bool, optional): Highlight cell contents (if str). Defaults to False. + """ + + header: "RenderableType" = "" + """RenderableType: Renderable for the header (typically a string)""" + + footer: "RenderableType" = "" + """RenderableType: Renderable for the footer (typically a string)""" + + header_style: StyleType = "" + """StyleType: The style of the header.""" + + footer_style: StyleType = "" + """StyleType: The style of the footer.""" + + style: StyleType = "" + """StyleType: The style of the column.""" + + justify: "JustifyMethod" = "left" + """str: How to justify text within the column ("left", "center", "right", or "full")""" + + vertical: "VerticalAlignMethod" = "top" + """str: How to vertically align content ("top", "middle", or "bottom")""" + + overflow: "OverflowMethod" = "ellipsis" + """str: Overflow method.""" + + width: Optional[int] = None + """Optional[int]: Width of the column, or ``None`` (default) to auto calculate width.""" + + min_width: Optional[int] = None + """Optional[int]: Minimum width of column, or ``None`` for no minimum. Defaults to None.""" + + max_width: Optional[int] = None + """Optional[int]: Maximum width of column, or ``None`` for no maximum. Defaults to None.""" + + ratio: Optional[int] = None + """Optional[int]: Ratio to use when calculating column width, or ``None`` (default) to adapt to column contents.""" + + no_wrap: bool = False + """bool: Prevent wrapping of text within the column. Defaults to ``False``.""" + + _index: int = 0 + """Index of column.""" + + _cells: List["RenderableType"] = field(default_factory=list) + + def copy(self) -> "Column": + """Return a copy of this Column.""" + return replace(self, _cells=[]) + + @property + def cells(self) -> Iterable["RenderableType"]: + """Get all cells in the column, not including header.""" + yield from self._cells + + @property + def flexible(self) -> bool: + """Check if this column is flexible.""" + return self.ratio is not None + + +@dataclass +class Row: + """Information regarding a row.""" + + style: Optional[StyleType] = None + """Style to apply to row.""" + + end_section: bool = False + """Indicated end of section, which will force a line beneath the row.""" + + +class _Cell(NamedTuple): + """A single cell in a table.""" + + style: StyleType + """Style to apply to cell.""" + renderable: "RenderableType" + """Cell renderable.""" + vertical: VerticalAlignMethod + """Cell vertical alignment.""" + + +class Table(JupyterMixin): + """A console renderable to draw a table. + + Args: + *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. + title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. + caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. + width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. + min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. + box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. + safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. + padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). + collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. + pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. + expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. + show_header (bool, optional): Show a header row. Defaults to True. + show_footer (bool, optional): Show a footer row. Defaults to False. + show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. + show_lines (bool, optional): Draw lines between every row. Defaults to False. + leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. + style (Union[str, Style], optional): Default style for the table. Defaults to "none". + row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. + header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". + footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". + border_style (Union[str, Style], optional): Style of the border. Defaults to None. + title_style (Union[str, Style], optional): Style of the title. Defaults to None. + caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. + title_justify (str, optional): Justify method for title. Defaults to "center". + caption_justify (str, optional): Justify method for caption. Defaults to "center". + highlight (bool, optional): Highlight cell contents (if str). Defaults to False. + """ + + columns: List[Column] + rows: List[Row] + + def __init__( + self, + *headers: Union[Column, str], + title: Optional[TextType] = None, + caption: Optional[TextType] = None, + width: Optional[int] = None, + min_width: Optional[int] = None, + box: Optional[box.Box] = box.HEAVY_HEAD, + safe_box: Optional[bool] = None, + padding: PaddingDimensions = (0, 1), + collapse_padding: bool = False, + pad_edge: bool = True, + expand: bool = False, + show_header: bool = True, + show_footer: bool = False, + show_edge: bool = True, + show_lines: bool = False, + leading: int = 0, + style: StyleType = "none", + row_styles: Optional[Iterable[StyleType]] = None, + header_style: Optional[StyleType] = "table.header", + footer_style: Optional[StyleType] = "table.footer", + border_style: Optional[StyleType] = None, + title_style: Optional[StyleType] = None, + caption_style: Optional[StyleType] = None, + title_justify: "JustifyMethod" = "center", + caption_justify: "JustifyMethod" = "center", + highlight: bool = False, + ) -> None: + self.columns: List[Column] = [] + self.rows: List[Row] = [] + self.title = title + self.caption = caption + self.width = width + self.min_width = min_width + self.box = box + self.safe_box = safe_box + self._padding = Padding.unpack(padding) + self.pad_edge = pad_edge + self._expand = expand + self.show_header = show_header + self.show_footer = show_footer + self.show_edge = show_edge + self.show_lines = show_lines + self.leading = leading + self.collapse_padding = collapse_padding + self.style = style + self.header_style = header_style or "" + self.footer_style = footer_style or "" + self.border_style = border_style + self.title_style = title_style + self.caption_style = caption_style + self.title_justify: "JustifyMethod" = title_justify + self.caption_justify: "JustifyMethod" = caption_justify + self.highlight = highlight + self.row_styles: Sequence[StyleType] = list(row_styles or []) + append_column = self.columns.append + for header in headers: + if isinstance(header, str): + self.add_column(header=header) + else: + header._index = len(self.columns) + append_column(header) + + @classmethod + def grid( + cls, + *headers: Union[Column, str], + padding: PaddingDimensions = 0, + collapse_padding: bool = True, + pad_edge: bool = False, + expand: bool = False, + ) -> "Table": + """Get a table with no lines, headers, or footer. + + Args: + *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. + padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0. + collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True. + pad_edge (bool, optional): Enable padding around edges of table. Defaults to False. + expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. + + Returns: + Table: A table instance. + """ + return cls( + *headers, + box=None, + padding=padding, + collapse_padding=collapse_padding, + show_header=False, + show_footer=False, + show_edge=False, + pad_edge=pad_edge, + expand=expand, + ) + + @property + def expand(self) -> bool: + """Setting a non-None self.width implies expand.""" + return self._expand or self.width is not None + + @expand.setter + def expand(self, expand: bool) -> None: + """Set expand.""" + self._expand = expand + + @property + def _extra_width(self) -> int: + """Get extra width to add to cell content.""" + width = 0 + if self.box and self.show_edge: + width += 2 + if self.box: + width += len(self.columns) - 1 + return width + + @property + def row_count(self) -> int: + """Get the current number of rows.""" + return len(self.rows) + + def get_row_style(self, console: "Console", index: int) -> StyleType: + """Get the current row style.""" + style = Style.null() + if self.row_styles: + style += console.get_style(self.row_styles[index % len(self.row_styles)]) + row_style = self.rows[index].style + if row_style is not None: + style += console.get_style(row_style) + return style + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + max_width = options.max_width + if self.width is not None: + max_width = self.width + if max_width < 0: + return Measurement(0, 0) + + extra_width = self._extra_width + max_width = sum( + self._calculate_column_widths( + console, options.update_width(max_width - extra_width) + ) + ) + _measure_column = self._measure_column + + measurements = [ + _measure_column(console, options.update_width(max_width), column) + for column in self.columns + ] + minimum_width = ( + sum(measurement.minimum for measurement in measurements) + extra_width + ) + maximum_width = ( + sum(measurement.maximum for measurement in measurements) + extra_width + if (self.width is None) + else self.width + ) + measurement = Measurement(minimum_width, maximum_width) + measurement = measurement.clamp(self.min_width) + return measurement + + @property + def padding(self) -> Tuple[int, int, int, int]: + """Get cell padding.""" + return self._padding + + @padding.setter + def padding(self, padding: PaddingDimensions) -> "Table": + """Set cell padding.""" + self._padding = Padding.unpack(padding) + return self + + def add_column( + self, + header: "RenderableType" = "", + footer: "RenderableType" = "", + *, + header_style: Optional[StyleType] = None, + footer_style: Optional[StyleType] = None, + style: Optional[StyleType] = None, + justify: "JustifyMethod" = "left", + vertical: "VerticalAlignMethod" = "top", + overflow: "OverflowMethod" = "ellipsis", + width: Optional[int] = None, + min_width: Optional[int] = None, + max_width: Optional[int] = None, + ratio: Optional[int] = None, + no_wrap: bool = False, + ) -> None: + """Add a column to the table. + + Args: + header (RenderableType, optional): Text or renderable for the header. + Defaults to "". + footer (RenderableType, optional): Text or renderable for the footer. + Defaults to "". + header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None. + footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None. + style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None. + justify (JustifyMethod, optional): Alignment for cells. Defaults to "left". + vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top". + overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis". + width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None. + min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None. + max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None. + ratio (int, optional): Flexible ratio for the column (requires ``Table.expand`` or ``Table.width``). Defaults to None. + no_wrap (bool, optional): Set to ``True`` to disable wrapping of this column. + """ + + column = Column( + _index=len(self.columns), + header=header, + footer=footer, + header_style=header_style or "", + footer_style=footer_style or "", + style=style or "", + justify=justify, + vertical=vertical, + overflow=overflow, + width=width, + min_width=min_width, + max_width=max_width, + ratio=ratio, + no_wrap=no_wrap, + ) + self.columns.append(column) + + def add_row( + self, + *renderables: Optional["RenderableType"], + style: Optional[StyleType] = None, + end_section: bool = False, + ) -> None: + """Add a row of renderables. + + Args: + *renderables (None or renderable): Each cell in a row must be a renderable object (including str), + or ``None`` for a blank cell. + style (StyleType, optional): An optional style to apply to the entire row. Defaults to None. + end_section (bool, optional): End a section and draw a line. Defaults to False. + + Raises: + errors.NotRenderableError: If you add something that can't be rendered. + """ + + def add_cell(column: Column, renderable: "RenderableType") -> None: + column._cells.append(renderable) + + cell_renderables: List[Optional["RenderableType"]] = list(renderables) + + columns = self.columns + if len(cell_renderables) < len(columns): + cell_renderables = [ + *cell_renderables, + *[None] * (len(columns) - len(cell_renderables)), + ] + for index, renderable in enumerate(cell_renderables): + if index == len(columns): + column = Column(_index=index) + for _ in self.rows: + add_cell(column, Text("")) + self.columns.append(column) + else: + column = columns[index] + if renderable is None: + add_cell(column, "") + elif is_renderable(renderable): + add_cell(column, renderable) + else: + raise errors.NotRenderableError( + f"unable to render {type(renderable).__name__}; a string or other renderable object is required" + ) + self.rows.append(Row(style=style, end_section=end_section)) + + def add_section(self) -> None: + """Add a new section (draw a line after current row).""" + + if self.rows: + self.rows[-1].end_section = True + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if not self.columns: + yield Segment("\n") + return + + max_width = options.max_width + if self.width is not None: + max_width = self.width + + extra_width = self._extra_width + widths = self._calculate_column_widths( + console, options.update_width(max_width - extra_width) + ) + table_width = sum(widths) + extra_width + + render_options = options.update( + width=table_width, highlight=self.highlight, height=None + ) + + def render_annotation( + text: TextType, style: StyleType, justify: "JustifyMethod" = "center" + ) -> "RenderResult": + render_text = ( + console.render_str(text, style=style, highlight=False) + if isinstance(text, str) + else text + ) + return console.render( + render_text, options=render_options.update(justify=justify) + ) + + if self.title: + yield from render_annotation( + self.title, + style=Style.pick_first(self.title_style, "table.title"), + justify=self.title_justify, + ) + yield from self._render(console, render_options, widths) + if self.caption: + yield from render_annotation( + self.caption, + style=Style.pick_first(self.caption_style, "table.caption"), + justify=self.caption_justify, + ) + + def _calculate_column_widths( + self, console: "Console", options: "ConsoleOptions" + ) -> List[int]: + """Calculate the widths of each column, including padding, not including borders.""" + max_width = options.max_width + columns = self.columns + width_ranges = [ + self._measure_column(console, options, column) for column in columns + ] + widths = [_range.maximum or 1 for _range in width_ranges] + get_padding_width = self._get_padding_width + extra_width = self._extra_width + if self.expand: + ratios = [col.ratio or 0 for col in columns if col.flexible] + if any(ratios): + fixed_widths = [ + 0 if column.flexible else _range.maximum + for _range, column in zip(width_ranges, columns) + ] + flex_minimum = [ + (column.width or 1) + get_padding_width(column._index) + for column in columns + if column.flexible + ] + flexible_width = max_width - sum(fixed_widths) + flex_widths = ratio_distribute(flexible_width, ratios, flex_minimum) + iter_flex_widths = iter(flex_widths) + for index, column in enumerate(columns): + if column.flexible: + widths[index] = fixed_widths[index] + next(iter_flex_widths) + table_width = sum(widths) + + if table_width > max_width: + widths = self._collapse_widths( + widths, + [(column.width is None and not column.no_wrap) for column in columns], + max_width, + ) + table_width = sum(widths) + # last resort, reduce columns evenly + if table_width > max_width: + excess_width = table_width - max_width + widths = ratio_reduce(excess_width, [1] * len(widths), widths, widths) + table_width = sum(widths) + + width_ranges = [ + self._measure_column(console, options.update_width(width), column) + for width, column in zip(widths, columns) + ] + widths = [_range.maximum or 0 for _range in width_ranges] + + if (table_width < max_width and self.expand) or ( + self.min_width is not None and table_width < (self.min_width - extra_width) + ): + _max_width = ( + max_width + if self.min_width is None + else min(self.min_width - extra_width, max_width) + ) + pad_widths = ratio_distribute(_max_width - table_width, widths) + widths = [_width + pad for _width, pad in zip(widths, pad_widths)] + + return widths + + @classmethod + def _collapse_widths( + cls, widths: List[int], wrapable: List[bool], max_width: int + ) -> List[int]: + """Reduce widths so that the total is under max_width. + + Args: + widths (List[int]): List of widths. + wrapable (List[bool]): List of booleans that indicate if a column may shrink. + max_width (int): Maximum width to reduce to. + + Returns: + List[int]: A new list of widths. + """ + total_width = sum(widths) + excess_width = total_width - max_width + if any(wrapable): + while total_width and excess_width > 0: + max_column = max( + width for width, allow_wrap in zip(widths, wrapable) if allow_wrap + ) + second_max_column = max( + width if allow_wrap and width != max_column else 0 + for width, allow_wrap in zip(widths, wrapable) + ) + column_difference = max_column - second_max_column + ratios = [ + (1 if (width == max_column and allow_wrap) else 0) + for width, allow_wrap in zip(widths, wrapable) + ] + if not any(ratios) or not column_difference: + break + max_reduce = [min(excess_width, column_difference)] * len(widths) + widths = ratio_reduce(excess_width, ratios, max_reduce, widths) + + total_width = sum(widths) + excess_width = total_width - max_width + return widths + + def _get_cells( + self, console: "Console", column_index: int, column: Column + ) -> Iterable[_Cell]: + """Get all the cells with padding and optional header.""" + + collapse_padding = self.collapse_padding + pad_edge = self.pad_edge + padding = self.padding + any_padding = any(padding) + + first_column = column_index == 0 + last_column = column_index == len(self.columns) - 1 + + _padding_cache: Dict[Tuple[bool, bool], Tuple[int, int, int, int]] = {} + + def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: + cached = _padding_cache.get((first_row, last_row)) + if cached: + return cached + top, right, bottom, left = padding + + if collapse_padding: + if not first_column: + left = max(0, left - right) + if not last_row: + bottom = max(0, top - bottom) + + if not pad_edge: + if first_column: + left = 0 + if last_column: + right = 0 + if first_row: + top = 0 + if last_row: + bottom = 0 + _padding = (top, right, bottom, left) + _padding_cache[(first_row, last_row)] = _padding + return _padding + + raw_cells: List[Tuple[StyleType, "RenderableType"]] = [] + _append = raw_cells.append + get_style = console.get_style + if self.show_header: + header_style = get_style(self.header_style or "") + get_style( + column.header_style + ) + _append((header_style, column.header)) + cell_style = get_style(column.style or "") + for cell in column.cells: + _append((cell_style, cell)) + if self.show_footer: + footer_style = get_style(self.footer_style or "") + get_style( + column.footer_style + ) + _append((footer_style, column.footer)) + + if any_padding: + _Padding = Padding + for first, last, (style, renderable) in loop_first_last(raw_cells): + yield _Cell( + style, + _Padding(renderable, get_padding(first, last)), + getattr(renderable, "vertical", None) or column.vertical, + ) + else: + for style, renderable in raw_cells: + yield _Cell( + style, + renderable, + getattr(renderable, "vertical", None) or column.vertical, + ) + + def _get_padding_width(self, column_index: int) -> int: + """Get extra width from padding.""" + _, pad_right, _, pad_left = self.padding + if self.collapse_padding: + if column_index > 0: + pad_left = max(0, pad_left - pad_right) + return pad_left + pad_right + + def _measure_column( + self, + console: "Console", + options: "ConsoleOptions", + column: Column, + ) -> Measurement: + """Get the minimum and maximum width of the column.""" + + max_width = options.max_width + if max_width < 1: + return Measurement(0, 0) + + padding_width = self._get_padding_width(column._index) + + if column.width is not None: + # Fixed width column + return Measurement( + column.width + padding_width, column.width + padding_width + ).with_maximum(max_width) + # Flexible column, we need to measure contents + min_widths: List[int] = [] + max_widths: List[int] = [] + append_min = min_widths.append + append_max = max_widths.append + get_render_width = Measurement.get + for cell in self._get_cells(console, column._index, column): + _min, _max = get_render_width(console, options, cell.renderable) + append_min(_min) + append_max(_max) + + measurement = Measurement( + max(min_widths) if min_widths else 1, + max(max_widths) if max_widths else max_width, + ).with_maximum(max_width) + measurement = measurement.clamp( + None if column.min_width is None else column.min_width + padding_width, + None if column.max_width is None else column.max_width + padding_width, + ) + return measurement + + def _render( + self, console: "Console", options: "ConsoleOptions", widths: List[int] + ) -> "RenderResult": + table_style = console.get_style(self.style or "") + + border_style = table_style + console.get_style(self.border_style or "") + _column_cells = ( + self._get_cells(console, column_index, column) + for column_index, column in enumerate(self.columns) + ) + row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells)) + _box = ( + self.box.substitute( + options, safe=pick_bool(self.safe_box, console.safe_box) + ) + if self.box + else None + ) + _box = _box.get_plain_headed_box() if _box and not self.show_header else _box + + new_line = Segment.line() + + columns = self.columns + show_header = self.show_header + show_footer = self.show_footer + show_edge = self.show_edge + show_lines = self.show_lines + leading = self.leading + + _Segment = Segment + if _box: + box_segments = [ + ( + _Segment(_box.head_left, border_style), + _Segment(_box.head_right, border_style), + _Segment(_box.head_vertical, border_style), + ), + ( + _Segment(_box.foot_left, border_style), + _Segment(_box.foot_right, border_style), + _Segment(_box.foot_vertical, border_style), + ), + ( + _Segment(_box.mid_left, border_style), + _Segment(_box.mid_right, border_style), + _Segment(_box.mid_vertical, border_style), + ), + ] + if show_edge: + yield _Segment(_box.get_top(widths), border_style) + yield new_line + else: + box_segments = [] + + get_row_style = self.get_row_style + get_style = console.get_style + + for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)): + header_row = first and show_header + footer_row = last and show_footer + row = ( + self.rows[index - show_header] + if (not header_row and not footer_row) + else None + ) + max_height = 1 + cells: List[List[List[Segment]]] = [] + if header_row or footer_row: + row_style = Style.null() + else: + row_style = get_style( + get_row_style(console, index - 1 if show_header else index) + ) + for width, cell, column in zip(widths, row_cell, columns): + render_options = options.update( + width=width, + justify=column.justify, + no_wrap=column.no_wrap, + overflow=column.overflow, + height=None, + ) + lines = console.render_lines( + cell.renderable, + render_options, + style=get_style(cell.style) + row_style, + ) + max_height = max(max_height, len(lines)) + cells.append(lines) + + row_height = max(len(cell) for cell in cells) + + def align_cell( + cell: List[List[Segment]], + vertical: "VerticalAlignMethod", + width: int, + style: Style, + ) -> List[List[Segment]]: + if header_row: + vertical = "bottom" + elif footer_row: + vertical = "top" + + if vertical == "top": + return _Segment.align_top(cell, width, row_height, style) + elif vertical == "middle": + return _Segment.align_middle(cell, width, row_height, style) + return _Segment.align_bottom(cell, width, row_height, style) + + cells[:] = [ + _Segment.set_shape( + align_cell( + cell, + _cell.vertical, + width, + get_style(_cell.style) + row_style, + ), + width, + max_height, + ) + for width, _cell, cell, column in zip(widths, row_cell, cells, columns) + ] + + if _box: + if last and show_footer: + yield _Segment( + _box.get_row(widths, "foot", edge=show_edge), border_style + ) + yield new_line + left, right, _divider = box_segments[0 if first else (2 if last else 1)] + + # If the column divider is whitespace also style it with the row background + divider = ( + _divider + if _divider.text.strip() + else _Segment( + _divider.text, row_style.background_style + _divider.style + ) + ) + for line_no in range(max_height): + if show_edge: + yield left + for last_cell, rendered_cell in loop_last(cells): + yield from rendered_cell[line_no] + if not last_cell: + yield divider + if show_edge: + yield right + yield new_line + else: + for line_no in range(max_height): + for rendered_cell in cells: + yield from rendered_cell[line_no] + yield new_line + if _box and first and show_header: + yield _Segment( + _box.get_row(widths, "head", edge=show_edge), border_style + ) + yield new_line + end_section = row and row.end_section + if _box and (show_lines or leading or end_section): + if ( + not last + and not (show_footer and index >= len(row_cells) - 2) + and not (show_header and header_row) + ): + if leading: + yield _Segment( + _box.get_row(widths, "mid", edge=show_edge) * leading, + border_style, + ) + else: + yield _Segment( + _box.get_row(widths, "row", edge=show_edge), border_style + ) + yield new_line + + if _box and show_edge: + yield _Segment(_box.get_bottom(widths), border_style) + yield new_line + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + from pip._vendor.rich.highlighter import ReprHighlighter + from pip._vendor.rich.table import Table as Table + + from ._timer import timer + + with timer("Table render"): + table = Table( + title="Star Wars Movies", + caption="Rich example table", + caption_justify="right", + ) + + table.add_column( + "Released", header_style="bright_cyan", style="cyan", no_wrap=True + ) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + + table.add_row( + "Dec 20, 2019", + "Star Wars: The Rise of Skywalker", + "$952,110,690", + ) + table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") + table.add_row( + "Dec 15, 2017", + "Star Wars Ep. V111: The Last Jedi", + "$1,332,539,889", + style="on black", + end_section=True, + ) + table.add_row( + "Dec 16, 2016", + "Rogue One: A Star Wars Story", + "$1,332,439,889", + ) + + def header(text: str) -> None: + console.print() + console.rule(highlight(text)) + console.print() + + console = Console() + highlight = ReprHighlighter() + header("Example Table") + console.print(table, justify="center") + + table.expand = True + header("expand=True") + console.print(table) + + table.width = 50 + header("width=50") + + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + header("row_styles=['dim', 'none']") + + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + table.leading = 1 + header("leading=1, row_styles=['dim', 'none']") + console.print(table, justify="center") + + table.width = None + table.expand = False + table.row_styles = ["dim", "none"] + table.show_lines = True + table.leading = 0 + header("show_lines=True, row_styles=['dim', 'none']") + console.print(table, justify="center") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py new file mode 100644 index 0000000..565e9d9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py @@ -0,0 +1,153 @@ +from typing import List, Optional, Tuple + +from .color_triplet import ColorTriplet +from .palette import Palette + +_ColorTuple = Tuple[int, int, int] + + +class TerminalTheme: + """A color theme used when exporting console content. + + Args: + background (Tuple[int, int, int]): The background color. + foreground (Tuple[int, int, int]): The foreground (text) color. + normal (List[Tuple[int, int, int]]): A list of 8 normal intensity colors. + bright (List[Tuple[int, int, int]], optional): A list of 8 bright colors, or None + to repeat normal intensity. Defaults to None. + """ + + def __init__( + self, + background: _ColorTuple, + foreground: _ColorTuple, + normal: List[_ColorTuple], + bright: Optional[List[_ColorTuple]] = None, + ) -> None: + self.background_color = ColorTriplet(*background) + self.foreground_color = ColorTriplet(*foreground) + self.ansi_colors = Palette(normal + (bright or normal)) + + +DEFAULT_TERMINAL_THEME = TerminalTheme( + (255, 255, 255), + (0, 0, 0), + [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + ], + [ + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + ], +) + +MONOKAI = TerminalTheme( + (12, 12, 12), + (217, 217, 217), + [ + (26, 26, 26), + (244, 0, 95), + (152, 224, 36), + (253, 151, 31), + (157, 101, 255), + (244, 0, 95), + (88, 209, 235), + (196, 197, 181), + (98, 94, 76), + ], + [ + (244, 0, 95), + (152, 224, 36), + (224, 213, 97), + (157, 101, 255), + (244, 0, 95), + (88, 209, 235), + (246, 246, 239), + ], +) +DIMMED_MONOKAI = TerminalTheme( + (25, 25, 25), + (185, 188, 186), + [ + (58, 61, 67), + (190, 63, 72), + (135, 154, 59), + (197, 166, 53), + (79, 118, 161), + (133, 92, 141), + (87, 143, 164), + (185, 188, 186), + (136, 137, 135), + ], + [ + (251, 0, 31), + (15, 114, 47), + (196, 112, 51), + (24, 109, 227), + (251, 0, 103), + (46, 112, 109), + (253, 255, 185), + ], +) +NIGHT_OWLISH = TerminalTheme( + (255, 255, 255), + (64, 63, 83), + [ + (1, 22, 39), + (211, 66, 62), + (42, 162, 152), + (218, 170, 1), + (72, 118, 214), + (64, 63, 83), + (8, 145, 106), + (122, 129, 129), + (122, 129, 129), + ], + [ + (247, 110, 110), + (73, 208, 197), + (218, 194, 107), + (92, 167, 228), + (105, 112, 152), + (0, 201, 144), + (152, 159, 177), + ], +) + +SVG_EXPORT_THEME = TerminalTheme( + (41, 41, 41), + (197, 200, 198), + [ + (75, 78, 85), + (204, 85, 90), + (152, 168, 75), + (208, 179, 68), + (96, 138, 177), + (152, 114, 159), + (104, 160, 179), + (197, 200, 198), + (154, 155, 153), + ], + [ + (255, 38, 39), + (0, 130, 61), + (208, 132, 66), + (25, 132, 233), + (255, 44, 122), + (57, 130, 128), + (253, 253, 197), + ], +) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py new file mode 100644 index 0000000..209aa94 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/text.py @@ -0,0 +1,1357 @@ +import re +from functools import partial, reduce +from math import gcd +from operator import itemgetter +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +from ._loop import loop_last +from ._pick import pick_bool +from ._wrap import divide_line +from .align import AlignMethod +from .cells import cell_len, set_cell_size +from .containers import Lines +from .control import strip_control_codes +from .emoji import EmojiVariant +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style, StyleType + +if TYPE_CHECKING: # pragma: no cover + from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod + +DEFAULT_JUSTIFY: "JustifyMethod" = "default" +DEFAULT_OVERFLOW: "OverflowMethod" = "fold" + + +_re_whitespace = re.compile(r"\s+$") + +TextType = Union[str, "Text"] +"""A plain string or a :class:`Text` instance.""" + +GetStyleCallable = Callable[[str], Optional[StyleType]] + + +class Span(NamedTuple): + """A marked up region in some text.""" + + start: int + """Span start index.""" + end: int + """Span end index.""" + style: Union[str, Style] + """Style associated with the span.""" + + def __repr__(self) -> str: + return f"Span({self.start}, {self.end}, {self.style!r})" + + def __bool__(self) -> bool: + return self.end > self.start + + def split(self, offset: int) -> Tuple["Span", Optional["Span"]]: + """Split a span in to 2 from a given offset.""" + + if offset < self.start: + return self, None + if offset >= self.end: + return self, None + + start, end, style = self + span1 = Span(start, min(end, offset), style) + span2 = Span(span1.end, end, style) + return span1, span2 + + def move(self, offset: int) -> "Span": + """Move start and end by a given offset. + + Args: + offset (int): Number of characters to add to start and end. + + Returns: + TextSpan: A new TextSpan with adjusted position. + """ + start, end, style = self + return Span(start + offset, end + offset, style) + + def right_crop(self, offset: int) -> "Span": + """Crop the span at the given offset. + + Args: + offset (int): A value between start and end. + + Returns: + Span: A new (possibly smaller) span. + """ + start, end, style = self + if offset >= end: + return self + return Span(start, min(offset, end), style) + + def extend(self, cells: int) -> "Span": + """Extend the span by the given number of cells. + + Args: + cells (int): Additional space to add to end of span. + + Returns: + Span: A span. + """ + if cells: + start, end, style = self + return Span(start, end + cells, style) + else: + return self + + +class Text(JupyterMixin): + """Text with color / style. + + Args: + text (str, optional): Default unstyled text. Defaults to "". + style (Union[str, Style], optional): Base style for text. Defaults to "". + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. + spans (List[Span], optional). A list of predefined style spans. Defaults to None. + """ + + __slots__ = [ + "_text", + "style", + "justify", + "overflow", + "no_wrap", + "end", + "tab_size", + "_spans", + "_length", + ] + + def __init__( + self, + text: str = "", + style: Union[str, Style] = "", + *, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, + end: str = "\n", + tab_size: Optional[int] = None, + spans: Optional[List[Span]] = None, + ) -> None: + sanitized_text = strip_control_codes(text) + self._text = [sanitized_text] + self.style = style + self.justify: Optional["JustifyMethod"] = justify + self.overflow: Optional["OverflowMethod"] = overflow + self.no_wrap = no_wrap + self.end = end + self.tab_size = tab_size + self._spans: List[Span] = spans or [] + self._length: int = len(sanitized_text) + + def __len__(self) -> int: + return self._length + + def __bool__(self) -> bool: + return bool(self._length) + + def __str__(self) -> str: + return self.plain + + def __repr__(self) -> str: + return f"" + + def __add__(self, other: Any) -> "Text": + if isinstance(other, (str, Text)): + result = self.copy() + result.append(other) + return result + return NotImplemented + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Text): + return NotImplemented + return self.plain == other.plain and self._spans == other._spans + + def __contains__(self, other: object) -> bool: + if isinstance(other, str): + return other in self.plain + elif isinstance(other, Text): + return other.plain in self.plain + return False + + def __getitem__(self, slice: Union[int, slice]) -> "Text": + def get_text_at(offset: int) -> "Text": + _Span = Span + text = Text( + self.plain[offset], + spans=[ + _Span(0, 1, style) + for start, end, style in self._spans + if end > offset >= start + ], + end="", + ) + return text + + if isinstance(slice, int): + return get_text_at(slice) + else: + start, stop, step = slice.indices(len(self.plain)) + if step == 1: + lines = self.divide([start, stop]) + return lines[1] + else: + # This would be a bit of work to implement efficiently + # For now, its not required + raise TypeError("slices with step!=1 are not supported") + + @property + def cell_len(self) -> int: + """Get the number of cells required to render this text.""" + return cell_len(self.plain) + + @property + def markup(self) -> str: + """Get console markup to render this Text. + + Returns: + str: A string potentially creating markup tags. + """ + from .markup import escape + + output: List[str] = [] + + plain = self.plain + markup_spans = [ + (0, False, self.style), + *((span.start, False, span.style) for span in self._spans), + *((span.end, True, span.style) for span in self._spans), + (len(plain), True, self.style), + ] + markup_spans.sort(key=itemgetter(0, 1)) + position = 0 + append = output.append + for offset, closing, style in markup_spans: + if offset > position: + append(escape(plain[position:offset])) + position = offset + if style: + append(f"[/{style}]" if closing else f"[{style}]") + markup = "".join(output) + return markup + + @classmethod + def from_markup( + cls, + text: str, + *, + style: Union[str, Style] = "", + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + end: str = "\n", + ) -> "Text": + """Create Text instance from markup. + + Args: + text (str): A string containing console markup. + style (Union[str, Style], optional): Base style for text. Defaults to "". + emoji (bool, optional): Also render emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". + + Returns: + Text: A Text instance with markup rendered. + """ + from .markup import render + + rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant) + rendered_text.justify = justify + rendered_text.overflow = overflow + rendered_text.end = end + return rendered_text + + @classmethod + def from_ansi( + cls, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, + end: str = "\n", + tab_size: Optional[int] = 8, + ) -> "Text": + """Create a Text object from a string containing ANSI escape codes. + + Args: + text (str): A string containing escape codes. + style (Union[str, Style], optional): Base style for text. Defaults to "". + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. + """ + from .ansi import AnsiDecoder + + joiner = Text( + "\n", + justify=justify, + overflow=overflow, + no_wrap=no_wrap, + end=end, + tab_size=tab_size, + style=style, + ) + decoder = AnsiDecoder() + result = joiner.join(line for line in decoder.decode(text)) + return result + + @classmethod + def styled( + cls, + text: str, + style: StyleType = "", + *, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + ) -> "Text": + """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used + to pad the text when it is justified. + + Args: + text (str): A string containing console markup. + style (Union[str, Style]): Style to apply to the text. Defaults to "". + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + + Returns: + Text: A text instance with a style applied to the entire string. + """ + styled_text = cls(text, justify=justify, overflow=overflow) + styled_text.stylize(style) + return styled_text + + @classmethod + def assemble( + cls, + *parts: Union[str, "Text", Tuple[str, StyleType]], + style: Union[str, Style] = "", + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + no_wrap: Optional[bool] = None, + end: str = "\n", + tab_size: int = 8, + meta: Optional[Dict[str, Any]] = None, + ) -> "Text": + """Construct a text instance by combining a sequence of strings with optional styles. + The positional arguments should be either strings, or a tuple of string + style. + + Args: + style (Union[str, Style], optional): Base style for text. Defaults to "". + justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. + overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. + no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. + end (str, optional): Character to end text with. Defaults to "\\\\n". + tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to None. + meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None + + Returns: + Text: A new text instance. + """ + text = cls( + style=style, + justify=justify, + overflow=overflow, + no_wrap=no_wrap, + end=end, + tab_size=tab_size, + ) + append = text.append + _Text = Text + for part in parts: + if isinstance(part, (_Text, str)): + append(part) + else: + append(*part) + if meta: + text.apply_meta(meta) + return text + + @property + def plain(self) -> str: + """Get the text as a single string.""" + if len(self._text) != 1: + self._text[:] = ["".join(self._text)] + return self._text[0] + + @plain.setter + def plain(self, new_text: str) -> None: + """Set the text to a new value.""" + if new_text != self.plain: + sanitized_text = strip_control_codes(new_text) + self._text[:] = [sanitized_text] + old_length = self._length + self._length = len(sanitized_text) + if old_length > self._length: + self._trim_spans() + + @property + def spans(self) -> List[Span]: + """Get a reference to the internal list of spans.""" + return self._spans + + @spans.setter + def spans(self, spans: List[Span]) -> None: + """Set spans.""" + self._spans = spans[:] + + def blank_copy(self, plain: str = "") -> "Text": + """Return a new Text instance with copied metadata (but not the string or spans).""" + copy_self = Text( + plain, + style=self.style, + justify=self.justify, + overflow=self.overflow, + no_wrap=self.no_wrap, + end=self.end, + tab_size=self.tab_size, + ) + return copy_self + + def copy(self) -> "Text": + """Return a copy of this instance.""" + copy_self = Text( + self.plain, + style=self.style, + justify=self.justify, + overflow=self.overflow, + no_wrap=self.no_wrap, + end=self.end, + tab_size=self.tab_size, + ) + copy_self._spans[:] = self._spans + return copy_self + + def stylize( + self, + style: Union[str, Style], + start: int = 0, + end: Optional[int] = None, + ) -> None: + """Apply a style to the text, or a portion of the text. + + Args: + style (Union[str, Style]): Style instance or style definition to apply. + start (int): Start offset (negative indexing is supported). Defaults to 0. + end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. + """ + if style: + length = len(self) + if start < 0: + start = length + start + if end is None: + end = length + if end < 0: + end = length + end + if start >= length or end <= start: + # Span not in text or not valid + return + self._spans.append(Span(start, min(length, end), style)) + + def stylize_before( + self, + style: Union[str, Style], + start: int = 0, + end: Optional[int] = None, + ) -> None: + """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present. + + Args: + style (Union[str, Style]): Style instance or style definition to apply. + start (int): Start offset (negative indexing is supported). Defaults to 0. + end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. + """ + if style: + length = len(self) + if start < 0: + start = length + start + if end is None: + end = length + if end < 0: + end = length + end + if start >= length or end <= start: + # Span not in text or not valid + return + self._spans.insert(0, Span(start, min(length, end), style)) + + def apply_meta( + self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None + ) -> None: + """Apply metadata to the text, or a portion of the text. + + Args: + meta (Dict[str, Any]): A dict of meta information. + start (int): Start offset (negative indexing is supported). Defaults to 0. + end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. + + """ + style = Style.from_meta(meta) + self.stylize(style, start=start, end=end) + + def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text": + """Apply event handlers (used by Textual project). + + Example: + >>> from rich.text import Text + >>> text = Text("hello world") + >>> text.on(click="view.toggle('world')") + + Args: + meta (Dict[str, Any]): Mapping of meta information. + **handlers: Keyword args are prefixed with "@" to defined handlers. + + Returns: + Text: Self is returned to method may be chained. + """ + meta = {} if meta is None else meta + meta.update({f"@{key}": value for key, value in handlers.items()}) + self.stylize(Style.from_meta(meta)) + return self + + def remove_suffix(self, suffix: str) -> None: + """Remove a suffix if it exists. + + Args: + suffix (str): Suffix to remove. + """ + if self.plain.endswith(suffix): + self.right_crop(len(suffix)) + + def get_style_at_offset(self, console: "Console", offset: int) -> Style: + """Get the style of a character at give offset. + + Args: + console (~Console): Console where text will be rendered. + offset (int): Offset in to text (negative indexing supported) + + Returns: + Style: A Style instance. + """ + # TODO: This is a little inefficient, it is only used by full justify + if offset < 0: + offset = len(self) + offset + get_style = console.get_style + style = get_style(self.style).copy() + for start, end, span_style in self._spans: + if end > offset >= start: + style += get_style(span_style, default="") + return style + + def extend_style(self, spaces: int) -> None: + """Extend the Text given number of spaces where the spaces have the same style as the last character. + + Args: + spaces (int): Number of spaces to add to the Text. + """ + if spaces <= 0: + return + spans = self.spans + new_spaces = " " * spaces + if spans: + end_offset = len(self) + self._spans[:] = [ + span.extend(spaces) if span.end >= end_offset else span + for span in spans + ] + self._text.append(new_spaces) + self._length += spaces + else: + self.plain += new_spaces + + def highlight_regex( + self, + re_highlight: str, + style: Optional[Union[GetStyleCallable, StyleType]] = None, + *, + style_prefix: str = "", + ) -> int: + """Highlight text with a regular expression, where group names are + translated to styles. + + Args: + re_highlight (str): A regular expression. + style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable + which accepts the matched text and returns a style. Defaults to None. + style_prefix (str, optional): Optional prefix to add to style group names. + + Returns: + int: Number of regex matches + """ + count = 0 + append_span = self._spans.append + _Span = Span + plain = self.plain + for match in re.finditer(re_highlight, plain): + get_span = match.span + if style: + start, end = get_span() + match_style = style(plain[start:end]) if callable(style) else style + if match_style is not None and end > start: + append_span(_Span(start, end, match_style)) + + count += 1 + for name in match.groupdict().keys(): + start, end = get_span(name) + if start != -1 and end > start: + append_span(_Span(start, end, f"{style_prefix}{name}")) + return count + + def highlight_words( + self, + words: Iterable[str], + style: Union[str, Style], + *, + case_sensitive: bool = True, + ) -> int: + """Highlight words with a style. + + Args: + words (Iterable[str]): Words to highlight. + style (Union[str, Style]): Style to apply. + case_sensitive (bool, optional): Enable case sensitive matching. Defaults to True. + + Returns: + int: Number of words highlighted. + """ + re_words = "|".join(re.escape(word) for word in words) + add_span = self._spans.append + count = 0 + _Span = Span + for match in re.finditer( + re_words, self.plain, flags=0 if case_sensitive else re.IGNORECASE + ): + start, end = match.span(0) + add_span(_Span(start, end, style)) + count += 1 + return count + + def rstrip(self) -> None: + """Strip whitespace from end of text.""" + self.plain = self.plain.rstrip() + + def rstrip_end(self, size: int) -> None: + """Remove whitespace beyond a certain width at the end of the text. + + Args: + size (int): The desired size of the text. + """ + text_length = len(self) + if text_length > size: + excess = text_length - size + whitespace_match = _re_whitespace.search(self.plain) + if whitespace_match is not None: + whitespace_count = len(whitespace_match.group(0)) + self.right_crop(min(whitespace_count, excess)) + + def set_length(self, new_length: int) -> None: + """Set new length of the text, clipping or padding is required.""" + length = len(self) + if length != new_length: + if length < new_length: + self.pad_right(new_length - length) + else: + self.right_crop(length - new_length) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + tab_size: int = console.tab_size if self.tab_size is None else self.tab_size + justify = self.justify or options.justify or DEFAULT_JUSTIFY + + overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW + + lines = self.wrap( + console, + options.max_width, + justify=justify, + overflow=overflow, + tab_size=tab_size or 8, + no_wrap=pick_bool(self.no_wrap, options.no_wrap, False), + ) + all_lines = Text("\n").join(lines) + yield from all_lines.render(console, end=self.end) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> Measurement: + text = self.plain + lines = text.splitlines() + max_text_width = max(cell_len(line) for line in lines) if lines else 0 + words = text.split() + min_text_width = ( + max(cell_len(word) for word in words) if words else max_text_width + ) + return Measurement(min_text_width, max_text_width) + + def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: + """Render the text as Segments. + + Args: + console (Console): Console instance. + end (Optional[str], optional): Optional end character. + + Returns: + Iterable[Segment]: Result of render that may be written to the console. + """ + _Segment = Segment + text = self.plain + if not self._spans: + yield Segment(text) + if end: + yield _Segment(end) + return + get_style = partial(console.get_style, default=Style.null()) + + enumerated_spans = list(enumerate(self._spans, 1)) + style_map = {index: get_style(span.style) for index, span in enumerated_spans} + style_map[0] = get_style(self.style) + + spans = [ + (0, False, 0), + *((span.start, False, index) for index, span in enumerated_spans), + *((span.end, True, index) for index, span in enumerated_spans), + (len(text), True, 0), + ] + spans.sort(key=itemgetter(0, 1)) + + stack: List[int] = [] + stack_append = stack.append + stack_pop = stack.remove + + style_cache: Dict[Tuple[Style, ...], Style] = {} + style_cache_get = style_cache.get + combine = Style.combine + + def get_current_style() -> Style: + """Construct current style from stack.""" + styles = tuple(style_map[_style_id] for _style_id in sorted(stack)) + cached_style = style_cache_get(styles) + if cached_style is not None: + return cached_style + current_style = combine(styles) + style_cache[styles] = current_style + return current_style + + for (offset, leaving, style_id), (next_offset, _, _) in zip(spans, spans[1:]): + if leaving: + stack_pop(style_id) + else: + stack_append(style_id) + if next_offset > offset: + yield _Segment(text[offset:next_offset], get_current_style()) + if end: + yield _Segment(end) + + def join(self, lines: Iterable["Text"]) -> "Text": + """Join text together with this instance as the separator. + + Args: + lines (Iterable[Text]): An iterable of Text instances to join. + + Returns: + Text: A new text instance containing join text. + """ + + new_text = self.blank_copy() + + def iter_text() -> Iterable["Text"]: + if self.plain: + for last, line in loop_last(lines): + yield line + if not last: + yield self + else: + yield from lines + + extend_text = new_text._text.extend + append_span = new_text._spans.append + extend_spans = new_text._spans.extend + offset = 0 + _Span = Span + + for text in iter_text(): + extend_text(text._text) + if text.style: + append_span(_Span(offset, offset + len(text), text.style)) + extend_spans( + _Span(offset + start, offset + end, style) + for start, end, style in text._spans + ) + offset += len(text) + new_text._length = offset + return new_text + + def expand_tabs(self, tab_size: Optional[int] = None) -> None: + """Converts tabs to spaces. + + Args: + tab_size (int, optional): Size of tabs. Defaults to 8. + + """ + if "\t" not in self.plain: + return + if tab_size is None: + tab_size = self.tab_size + if tab_size is None: + tab_size = 8 + + new_text: List[Text] = [] + append = new_text.append + + for line in self.split("\n", include_separator=True): + if "\t" not in line.plain: + append(line) + else: + cell_position = 0 + parts = line.split("\t", include_separator=True) + for part in parts: + if part.plain.endswith("\t"): + part._text[-1] = part._text[-1][:-1] + " " + cell_position += part.cell_len + tab_remainder = cell_position % tab_size + if tab_remainder: + spaces = tab_size - tab_remainder + part.extend_style(spaces) + cell_position += spaces + else: + cell_position += part.cell_len + append(part) + + result = Text("").join(new_text) + + self._text = [result.plain] + self._length = len(self.plain) + self._spans[:] = result._spans + + def truncate( + self, + max_width: int, + *, + overflow: Optional["OverflowMethod"] = None, + pad: bool = False, + ) -> None: + """Truncate text if it is longer that a given width. + + Args: + max_width (int): Maximum number of characters in text. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow. + pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False. + """ + _overflow = overflow or self.overflow or DEFAULT_OVERFLOW + if _overflow != "ignore": + length = cell_len(self.plain) + if length > max_width: + if _overflow == "ellipsis": + self.plain = set_cell_size(self.plain, max_width - 1) + "…" + else: + self.plain = set_cell_size(self.plain, max_width) + if pad and length < max_width: + spaces = max_width - length + self._text = [f"{self.plain}{' ' * spaces}"] + self._length = len(self.plain) + + def _trim_spans(self) -> None: + """Remove or modify any spans that are over the end of the text.""" + max_offset = len(self.plain) + _Span = Span + self._spans[:] = [ + ( + span + if span.end < max_offset + else _Span(span.start, min(max_offset, span.end), span.style) + ) + for span in self._spans + if span.start < max_offset + ] + + def pad(self, count: int, character: str = " ") -> None: + """Pad left and right with a given number of characters. + + Args: + count (int): Width of padding. + character (str): The character to pad with. Must be a string of length 1. + """ + assert len(character) == 1, "Character must be a string of length 1" + if count: + pad_characters = character * count + self.plain = f"{pad_characters}{self.plain}{pad_characters}" + _Span = Span + self._spans[:] = [ + _Span(start + count, end + count, style) + for start, end, style in self._spans + ] + + def pad_left(self, count: int, character: str = " ") -> None: + """Pad the left with a given character. + + Args: + count (int): Number of characters to pad. + character (str, optional): Character to pad with. Defaults to " ". + """ + assert len(character) == 1, "Character must be a string of length 1" + if count: + self.plain = f"{character * count}{self.plain}" + _Span = Span + self._spans[:] = [ + _Span(start + count, end + count, style) + for start, end, style in self._spans + ] + + def pad_right(self, count: int, character: str = " ") -> None: + """Pad the right with a given character. + + Args: + count (int): Number of characters to pad. + character (str, optional): Character to pad with. Defaults to " ". + """ + assert len(character) == 1, "Character must be a string of length 1" + if count: + self.plain = f"{self.plain}{character * count}" + + def align(self, align: AlignMethod, width: int, character: str = " ") -> None: + """Align text to a given width. + + Args: + align (AlignMethod): One of "left", "center", or "right". + width (int): Desired width. + character (str, optional): Character to pad with. Defaults to " ". + """ + self.truncate(width) + excess_space = width - cell_len(self.plain) + if excess_space: + if align == "left": + self.pad_right(excess_space, character) + elif align == "center": + left = excess_space // 2 + self.pad_left(left, character) + self.pad_right(excess_space - left, character) + else: + self.pad_left(excess_space, character) + + def append( + self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None + ) -> "Text": + """Add text with an optional style. + + Args: + text (Union[Text, str]): A str or Text to append. + style (str, optional): A style name. Defaults to None. + + Returns: + Text: Returns self for chaining. + """ + + if not isinstance(text, (str, Text)): + raise TypeError("Only str or Text can be appended to Text") + + if len(text): + if isinstance(text, str): + sanitized_text = strip_control_codes(text) + self._text.append(sanitized_text) + offset = len(self) + text_length = len(sanitized_text) + if style: + self._spans.append(Span(offset, offset + text_length, style)) + self._length += text_length + elif isinstance(text, Text): + _Span = Span + if style is not None: + raise ValueError( + "style must not be set when appending Text instance" + ) + text_length = self._length + if text.style: + self._spans.append( + _Span(text_length, text_length + len(text), text.style) + ) + self._text.append(text.plain) + self._spans.extend( + _Span(start + text_length, end + text_length, style) + for start, end, style in text._spans + ) + self._length += len(text) + return self + + def append_text(self, text: "Text") -> "Text": + """Append another Text instance. This method is more performant that Text.append, but + only works for Text. + + Args: + text (Text): The Text instance to append to this instance. + + Returns: + Text: Returns self for chaining. + """ + _Span = Span + text_length = self._length + if text.style: + self._spans.append(_Span(text_length, text_length + len(text), text.style)) + self._text.append(text.plain) + self._spans.extend( + _Span(start + text_length, end + text_length, style) + for start, end, style in text._spans + ) + self._length += len(text) + return self + + def append_tokens( + self, tokens: Iterable[Tuple[str, Optional[StyleType]]] + ) -> "Text": + """Append iterable of str and style. Style may be a Style instance or a str style definition. + + Args: + tokens (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. + + Returns: + Text: Returns self for chaining. + """ + append_text = self._text.append + append_span = self._spans.append + _Span = Span + offset = len(self) + for content, style in tokens: + append_text(content) + if style: + append_span(_Span(offset, offset + len(content), style)) + offset += len(content) + self._length = offset + return self + + def copy_styles(self, text: "Text") -> None: + """Copy styles from another Text instance. + + Args: + text (Text): A Text instance to copy styles from, must be the same length. + """ + self._spans.extend(text._spans) + + def split( + self, + separator: str = "\n", + *, + include_separator: bool = False, + allow_blank: bool = False, + ) -> Lines: + """Split rich text in to lines, preserving styles. + + Args: + separator (str, optional): String to split on. Defaults to "\\\\n". + include_separator (bool, optional): Include the separator in the lines. Defaults to False. + allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False. + + Returns: + List[RichText]: A list of rich text, one per line of the original. + """ + assert separator, "separator must not be empty" + + text = self.plain + if separator not in text: + return Lines([self.copy()]) + + if include_separator: + lines = self.divide( + match.end() for match in re.finditer(re.escape(separator), text) + ) + else: + + def flatten_spans() -> Iterable[int]: + for match in re.finditer(re.escape(separator), text): + start, end = match.span() + yield start + yield end + + lines = Lines( + line for line in self.divide(flatten_spans()) if line.plain != separator + ) + + if not allow_blank and text.endswith(separator): + lines.pop() + + return lines + + def divide(self, offsets: Iterable[int]) -> Lines: + """Divide text in to a number of lines at given offsets. + + Args: + offsets (Iterable[int]): Offsets used to divide text. + + Returns: + Lines: New RichText instances between offsets. + """ + _offsets = list(offsets) + + if not _offsets: + return Lines([self.copy()]) + + text = self.plain + text_length = len(text) + divide_offsets = [0, *_offsets, text_length] + line_ranges = list(zip(divide_offsets, divide_offsets[1:])) + + style = self.style + justify = self.justify + overflow = self.overflow + _Text = Text + new_lines = Lines( + _Text( + text[start:end], + style=style, + justify=justify, + overflow=overflow, + ) + for start, end in line_ranges + ) + if not self._spans: + return new_lines + + _line_appends = [line._spans.append for line in new_lines._lines] + line_count = len(line_ranges) + _Span = Span + + for span_start, span_end, style in self._spans: + lower_bound = 0 + upper_bound = line_count + start_line_no = (lower_bound + upper_bound) // 2 + + while True: + line_start, line_end = line_ranges[start_line_no] + if span_start < line_start: + upper_bound = start_line_no - 1 + elif span_start > line_end: + lower_bound = start_line_no + 1 + else: + break + start_line_no = (lower_bound + upper_bound) // 2 + + if span_end < line_end: + end_line_no = start_line_no + else: + end_line_no = lower_bound = start_line_no + upper_bound = line_count + + while True: + line_start, line_end = line_ranges[end_line_no] + if span_end < line_start: + upper_bound = end_line_no - 1 + elif span_end > line_end: + lower_bound = end_line_no + 1 + else: + break + end_line_no = (lower_bound + upper_bound) // 2 + + for line_no in range(start_line_no, end_line_no + 1): + line_start, line_end = line_ranges[line_no] + new_start = max(0, span_start - line_start) + new_end = min(span_end - line_start, line_end - line_start) + if new_end > new_start: + _line_appends[line_no](_Span(new_start, new_end, style)) + + return new_lines + + def right_crop(self, amount: int = 1) -> None: + """Remove a number of characters from the end of the text.""" + max_offset = len(self.plain) - amount + _Span = Span + self._spans[:] = [ + ( + span + if span.end < max_offset + else _Span(span.start, min(max_offset, span.end), span.style) + ) + for span in self._spans + if span.start < max_offset + ] + self._text = [self.plain[:-amount]] + self._length -= amount + + def wrap( + self, + console: "Console", + width: int, + *, + justify: Optional["JustifyMethod"] = None, + overflow: Optional["OverflowMethod"] = None, + tab_size: int = 8, + no_wrap: Optional[bool] = None, + ) -> Lines: + """Word wrap the text. + + Args: + console (Console): Console instance. + width (int): Number of cells available per line. + justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default". + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. + tab_size (int, optional): Default tab size. Defaults to 8. + no_wrap (bool, optional): Disable wrapping, Defaults to False. + + Returns: + Lines: Number of lines. + """ + wrap_justify = justify or self.justify or DEFAULT_JUSTIFY + wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW + + no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore" + + lines = Lines() + for line in self.split(allow_blank=True): + if "\t" in line: + line.expand_tabs(tab_size) + if no_wrap: + new_lines = Lines([line]) + else: + offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") + new_lines = line.divide(offsets) + for line in new_lines: + line.rstrip_end(width) + if wrap_justify: + new_lines.justify( + console, width, justify=wrap_justify, overflow=wrap_overflow + ) + for line in new_lines: + line.truncate(width, overflow=wrap_overflow) + lines.extend(new_lines) + return lines + + def fit(self, width: int) -> Lines: + """Fit the text in to given width by chopping in to lines. + + Args: + width (int): Maximum characters in a line. + + Returns: + Lines: Lines container. + """ + lines: Lines = Lines() + append = lines.append + for line in self.split(): + line.set_length(width) + append(line) + return lines + + def detect_indentation(self) -> int: + """Auto-detect indentation of code. + + Returns: + int: Number of spaces used to indent code. + """ + + _indentations = { + len(match.group(1)) + for match in re.finditer(r"^( *)(.*)$", self.plain, flags=re.MULTILINE) + } + + try: + indentation = ( + reduce(gcd, [indent for indent in _indentations if not indent % 2]) or 1 + ) + except TypeError: + indentation = 1 + + return indentation + + def with_indent_guides( + self, + indent_size: Optional[int] = None, + *, + character: str = "│", + style: StyleType = "dim green", + ) -> "Text": + """Adds indent guide lines to text. + + Args: + indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None. + character (str, optional): Character to use for indentation. Defaults to "│". + style (Union[Style, str], optional): Style of indent guides. + + Returns: + Text: New text with indentation guides. + """ + + _indent_size = self.detect_indentation() if indent_size is None else indent_size + + text = self.copy() + text.expand_tabs() + indent_line = f"{character}{' ' * (_indent_size - 1)}" + + re_indent = re.compile(r"^( *)(.*)$") + new_lines: List[Text] = [] + add_line = new_lines.append + blank_lines = 0 + for line in text.split(allow_blank=True): + match = re_indent.match(line.plain) + if not match or not match.group(2): + blank_lines += 1 + continue + indent = match.group(1) + full_indents, remaining_space = divmod(len(indent), _indent_size) + new_indent = f"{indent_line * full_indents}{' ' * remaining_space}" + line.plain = new_indent + line.plain[len(new_indent) :] + line.stylize(style, 0, len(new_indent)) + if blank_lines: + new_lines.extend([Text(new_indent, style=style)] * blank_lines) + blank_lines = 0 + add_line(line) + if blank_lines: + new_lines.extend([Text("", style=style)] * blank_lines) + + new_text = text.blank_copy("\n").join(new_lines) + return new_text + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + text = Text( + """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n""" + ) + text.highlight_words(["Lorem"], "bold") + text.highlight_words(["ipsum"], "italic") + + console = Console() + + console.rule("justify='left'") + console.print(text, style="red") + console.print() + + console.rule("justify='center'") + console.print(text, style="green", justify="center") + console.print() + + console.rule("justify='right'") + console.print(text, style="blue", justify="right") + console.print() + + console.rule("justify='full'") + console.print(text, style="magenta", justify="full") + console.print() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/theme.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/theme.py new file mode 100644 index 0000000..471dfb2 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/theme.py @@ -0,0 +1,115 @@ +import configparser +from typing import Dict, List, IO, Mapping, Optional + +from .default_styles import DEFAULT_STYLES +from .style import Style, StyleType + + +class Theme: + """A container for style information, used by :class:`~rich.console.Console`. + + Args: + styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles. + inherit (bool, optional): Inherit default styles. Defaults to True. + """ + + styles: Dict[str, Style] + + def __init__( + self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True + ): + self.styles = DEFAULT_STYLES.copy() if inherit else {} + if styles is not None: + self.styles.update( + { + name: style if isinstance(style, Style) else Style.parse(style) + for name, style in styles.items() + } + ) + + @property + def config(self) -> str: + """Get contents of a config file for this theme.""" + config = "[styles]\n" + "\n".join( + f"{name} = {style}" for name, style in sorted(self.styles.items()) + ) + return config + + @classmethod + def from_file( + cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True + ) -> "Theme": + """Load a theme from a text mode file. + + Args: + config_file (IO[str]): An open conf file. + source (str, optional): The filename of the open file. Defaults to None. + inherit (bool, optional): Inherit default styles. Defaults to True. + + Returns: + Theme: A New theme instance. + """ + config = configparser.ConfigParser() + config.read_file(config_file, source=source) + styles = {name: Style.parse(value) for name, value in config.items("styles")} + theme = Theme(styles, inherit=inherit) + return theme + + @classmethod + def read( + cls, path: str, inherit: bool = True, encoding: Optional[str] = None + ) -> "Theme": + """Read a theme from a path. + + Args: + path (str): Path to a config file readable by Python configparser module. + inherit (bool, optional): Inherit default styles. Defaults to True. + encoding (str, optional): Encoding of the config file. Defaults to None. + + Returns: + Theme: A new theme instance. + """ + with open(path, "rt", encoding=encoding) as config_file: + return cls.from_file(config_file, source=path, inherit=inherit) + + +class ThemeStackError(Exception): + """Base exception for errors related to the theme stack.""" + + +class ThemeStack: + """A stack of themes. + + Args: + theme (Theme): A theme instance + """ + + def __init__(self, theme: Theme) -> None: + self._entries: List[Dict[str, Style]] = [theme.styles] + self.get = self._entries[-1].get + + def push_theme(self, theme: Theme, inherit: bool = True) -> None: + """Push a theme on the top of the stack. + + Args: + theme (Theme): A Theme instance. + inherit (boolean, optional): Inherit styles from current top of stack. + """ + styles: Dict[str, Style] + styles = ( + {**self._entries[-1], **theme.styles} if inherit else theme.styles.copy() + ) + self._entries.append(styles) + self.get = self._entries[-1].get + + def pop_theme(self) -> None: + """Pop (and discard) the top-most theme.""" + if len(self._entries) == 1: + raise ThemeStackError("Unable to pop base theme") + self._entries.pop() + self.get = self._entries[-1].get + + +if __name__ == "__main__": # pragma: no cover + theme = Theme() + print(theme.config) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/themes.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/themes.py new file mode 100644 index 0000000..bf6db10 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/themes.py @@ -0,0 +1,5 @@ +from .default_styles import DEFAULT_STYLES +from .theme import Theme + + +DEFAULT = Theme(DEFAULT_STYLES) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py new file mode 100644 index 0000000..f223ad4 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py @@ -0,0 +1,753 @@ +from __future__ import absolute_import + +import linecache +import os +import platform +import sys +from dataclasses import dataclass, field +from traceback import walk_tb +from types import ModuleType, TracebackType +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from pip._vendor.pygments.lexers import guess_lexer_for_filename +from pip._vendor.pygments.token import Comment, Keyword, Name, Number, Operator, String +from pip._vendor.pygments.token import Text as TextToken +from pip._vendor.pygments.token import Token +from pip._vendor.pygments.util import ClassNotFound + +from . import pretty +from ._loop import loop_last +from .columns import Columns +from .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group +from .constrain import Constrain +from .highlighter import RegexHighlighter, ReprHighlighter +from .panel import Panel +from .scope import render_scope +from .style import Style +from .syntax import Syntax +from .text import Text +from .theme import Theme + +WINDOWS = platform.system() == "Windows" + +LOCALS_MAX_LENGTH = 10 +LOCALS_MAX_STRING = 80 + + +def install( + *, + console: Optional[Console] = None, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + locals_max_length: int = LOCALS_MAX_LENGTH, + locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: Optional[bool] = None, + indent_guides: bool = True, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, +) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]: + """Install a rich traceback handler. + + Once installed, any tracebacks will be printed with syntax highlighting and rich formatting. + + + Args: + console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance. + width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100. + extra_lines (int, optional): Extra lines of code. Defaults to 3. + theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick + a theme appropriate for the platform. + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. + suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + + Returns: + Callable: The previous exception handler that was replaced. + + """ + traceback_console = Console(stderr=True) if console is None else console + + locals_hide_sunder = ( + True + if (traceback_console.is_jupyter and locals_hide_sunder is None) + else locals_hide_sunder + ) + + def excepthook( + type_: Type[BaseException], + value: BaseException, + traceback: Optional[TracebackType], + ) -> None: + traceback_console.print( + Traceback.from_exception( + type_, + value, + traceback, + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + locals_max_length=locals_max_length, + locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=bool(locals_hide_sunder), + indent_guides=indent_guides, + suppress=suppress, + max_frames=max_frames, + ) + ) + + def ipy_excepthook_closure(ip: Any) -> None: # pragma: no cover + tb_data = {} # store information about showtraceback call + default_showtraceback = ip.showtraceback # keep reference of default traceback + + def ipy_show_traceback(*args: Any, **kwargs: Any) -> None: + """wrap the default ip.showtraceback to store info for ip._showtraceback""" + nonlocal tb_data + tb_data = kwargs + default_showtraceback(*args, **kwargs) + + def ipy_display_traceback( + *args: Any, is_syntax: bool = False, **kwargs: Any + ) -> None: + """Internally called traceback from ip._showtraceback""" + nonlocal tb_data + exc_tuple = ip._get_exc_info() + + # do not display trace on syntax error + tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2] + + # determine correct tb_offset + compiled = tb_data.get("running_compiled_code", False) + tb_offset = tb_data.get("tb_offset", 1 if compiled else 0) + # remove ipython internal frames from trace with tb_offset + for _ in range(tb_offset): + if tb is None: + break + tb = tb.tb_next + + excepthook(exc_tuple[0], exc_tuple[1], tb) + tb_data = {} # clear data upon usage + + # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work + # this is also what the ipython docs recommends to modify when subclassing InteractiveShell + ip._showtraceback = ipy_display_traceback + # add wrapper to capture tb_data + ip.showtraceback = ipy_show_traceback + ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback( + *args, is_syntax=True, **kwargs + ) + + try: # pragma: no cover + # if within ipython, use customized traceback + ip = get_ipython() # type: ignore[name-defined] + ipy_excepthook_closure(ip) + return sys.excepthook + except Exception: + # otherwise use default system hook + old_excepthook = sys.excepthook + sys.excepthook = excepthook + return old_excepthook + + +@dataclass +class Frame: + filename: str + lineno: int + name: str + line: str = "" + locals: Optional[Dict[str, pretty.Node]] = None + + +@dataclass +class _SyntaxError: + offset: int + filename: str + line: str + lineno: int + msg: str + + +@dataclass +class Stack: + exc_type: str + exc_value: str + syntax_error: Optional[_SyntaxError] = None + is_cause: bool = False + frames: List[Frame] = field(default_factory=list) + + +@dataclass +class Trace: + stacks: List[Stack] + + +class PathHighlighter(RegexHighlighter): + highlights = [r"(?P.*/)(?P.+)"] + + +class Traceback: + """A Console renderable that renders a traceback. + + Args: + trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses + the last exception. + width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback. + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + + """ + + LEXERS = { + "": "text", + ".py": "python", + ".pxd": "cython", + ".pyx": "cython", + ".pxi": "pyrex", + } + + def __init__( + self, + trace: Optional[Trace] = None, + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + locals_max_length: int = LOCALS_MAX_LENGTH, + locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, + indent_guides: bool = True, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ): + if trace is None: + exc_type, exc_value, traceback = sys.exc_info() + if exc_type is None or exc_value is None or traceback is None: + raise ValueError( + "Value for 'trace' required if not called in except: block" + ) + trace = self.extract( + exc_type, exc_value, traceback, show_locals=show_locals + ) + self.trace = trace + self.width = width + self.extra_lines = extra_lines + self.theme = Syntax.get_theme(theme or "ansi_dark") + self.word_wrap = word_wrap + self.show_locals = show_locals + self.indent_guides = indent_guides + self.locals_max_length = locals_max_length + self.locals_max_string = locals_max_string + self.locals_hide_dunder = locals_hide_dunder + self.locals_hide_sunder = locals_hide_sunder + + self.suppress: Sequence[str] = [] + for suppress_entity in suppress: + if not isinstance(suppress_entity, str): + assert ( + suppress_entity.__file__ is not None + ), f"{suppress_entity!r} must be a module with '__file__' attribute" + path = os.path.dirname(suppress_entity.__file__) + else: + path = suppress_entity + path = os.path.normpath(os.path.abspath(path)) + self.suppress.append(path) + self.max_frames = max(4, max_frames) if max_frames > 0 else 0 + + @classmethod + def from_exception( + cls, + exc_type: Type[Any], + exc_value: BaseException, + traceback: Optional[TracebackType], + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + locals_max_length: int = LOCALS_MAX_LENGTH, + locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, + indent_guides: bool = True, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ) -> "Traceback": + """Create a traceback from exception info + + Args: + exc_type (Type[BaseException]): Exception type. + exc_value (BaseException): Exception value. + traceback (TracebackType): Python Traceback object. + width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback. + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + + Returns: + Traceback: A Traceback instance that may be printed. + """ + rich_traceback = cls.extract( + exc_type, + exc_value, + traceback, + show_locals=show_locals, + locals_max_length=locals_max_length, + locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=locals_hide_sunder, + ) + + return cls( + rich_traceback, + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + indent_guides=indent_guides, + locals_max_length=locals_max_length, + locals_max_string=locals_max_string, + locals_hide_dunder=locals_hide_dunder, + locals_hide_sunder=locals_hide_sunder, + suppress=suppress, + max_frames=max_frames, + ) + + @classmethod + def extract( + cls, + exc_type: Type[BaseException], + exc_value: BaseException, + traceback: Optional[TracebackType], + *, + show_locals: bool = False, + locals_max_length: int = LOCALS_MAX_LENGTH, + locals_max_string: int = LOCALS_MAX_STRING, + locals_hide_dunder: bool = True, + locals_hide_sunder: bool = False, + ) -> Trace: + """Extract traceback information. + + Args: + exc_type (Type[BaseException]): Exception type. + exc_value (BaseException): Exception value. + traceback (TracebackType): Python Traceback object. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. + Defaults to 10. + locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. + locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. + locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. + + Returns: + Trace: A Trace instance which you can use to construct a `Traceback`. + """ + + stacks: List[Stack] = [] + is_cause = False + + from pip._vendor.rich import _IMPORT_CWD + + def safe_str(_object: Any) -> str: + """Don't allow exceptions from __str__ to propagate.""" + try: + return str(_object) + except Exception: + return "" + + while True: + stack = Stack( + exc_type=safe_str(exc_type.__name__), + exc_value=safe_str(exc_value), + is_cause=is_cause, + ) + + if isinstance(exc_value, SyntaxError): + stack.syntax_error = _SyntaxError( + offset=exc_value.offset or 0, + filename=exc_value.filename or "?", + lineno=exc_value.lineno or 0, + line=exc_value.text or "", + msg=exc_value.msg, + ) + + stacks.append(stack) + append = stack.frames.append + + def get_locals( + iter_locals: Iterable[Tuple[str, object]] + ) -> Iterable[Tuple[str, object]]: + """Extract locals from an iterator of key pairs.""" + if not (locals_hide_dunder or locals_hide_sunder): + yield from iter_locals + return + for key, value in iter_locals: + if locals_hide_dunder and key.startswith("__"): + continue + if locals_hide_sunder and key.startswith("_"): + continue + yield key, value + + for frame_summary, line_no in walk_tb(traceback): + filename = frame_summary.f_code.co_filename + if filename and not filename.startswith("<"): + if not os.path.isabs(filename): + filename = os.path.join(_IMPORT_CWD, filename) + if frame_summary.f_locals.get("_rich_traceback_omit", False): + continue + + frame = Frame( + filename=filename or "?", + lineno=line_no, + name=frame_summary.f_code.co_name, + locals={ + key: pretty.traverse( + value, + max_length=locals_max_length, + max_string=locals_max_string, + ) + for key, value in get_locals(frame_summary.f_locals.items()) + } + if show_locals + else None, + ) + append(frame) + if frame_summary.f_locals.get("_rich_traceback_guard", False): + del stack.frames[:] + + cause = getattr(exc_value, "__cause__", None) + if cause: + exc_type = cause.__class__ + exc_value = cause + # __traceback__ can be None, e.g. for exceptions raised by the + # 'multiprocessing' module + traceback = cause.__traceback__ + is_cause = True + continue + + cause = exc_value.__context__ + if cause and not getattr(exc_value, "__suppress_context__", False): + exc_type = cause.__class__ + exc_value = cause + traceback = cause.__traceback__ + is_cause = False + continue + # No cover, code is reached but coverage doesn't recognize it. + break # pragma: no cover + + trace = Trace(stacks=stacks) + return trace + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + theme = self.theme + background_style = theme.get_background_style() + token_style = theme.get_style_for_token + + traceback_theme = Theme( + { + "pretty": token_style(TextToken), + "pygments.text": token_style(Token), + "pygments.string": token_style(String), + "pygments.function": token_style(Name.Function), + "pygments.number": token_style(Number), + "repr.indent": token_style(Comment) + Style(dim=True), + "repr.str": token_style(String), + "repr.brace": token_style(TextToken) + Style(bold=True), + "repr.number": token_style(Number), + "repr.bool_true": token_style(Keyword.Constant), + "repr.bool_false": token_style(Keyword.Constant), + "repr.none": token_style(Keyword.Constant), + "scope.border": token_style(String.Delimiter), + "scope.equals": token_style(Operator), + "scope.key": token_style(Name), + "scope.key.special": token_style(Name.Constant) + Style(dim=True), + }, + inherit=False, + ) + + highlighter = ReprHighlighter() + for last, stack in loop_last(reversed(self.trace.stacks)): + if stack.frames: + stack_renderable: ConsoleRenderable = Panel( + self._render_stack(stack), + title="[traceback.title]Traceback [dim](most recent call last)", + style=background_style, + border_style="traceback.border", + expand=True, + padding=(0, 1), + ) + stack_renderable = Constrain(stack_renderable, self.width) + with console.use_theme(traceback_theme): + yield stack_renderable + if stack.syntax_error is not None: + with console.use_theme(traceback_theme): + yield Constrain( + Panel( + self._render_syntax_error(stack.syntax_error), + style=background_style, + border_style="traceback.border.syntax_error", + expand=True, + padding=(0, 1), + width=self.width, + ), + self.width, + ) + yield Text.assemble( + (f"{stack.exc_type}: ", "traceback.exc_type"), + highlighter(stack.syntax_error.msg), + ) + elif stack.exc_value: + yield Text.assemble( + (f"{stack.exc_type}: ", "traceback.exc_type"), + highlighter(stack.exc_value), + ) + else: + yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type")) + + if not last: + if stack.is_cause: + yield Text.from_markup( + "\n[i]The above exception was the direct cause of the following exception:\n", + ) + else: + yield Text.from_markup( + "\n[i]During handling of the above exception, another exception occurred:\n", + ) + + @group() + def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult: + highlighter = ReprHighlighter() + path_highlighter = PathHighlighter() + if syntax_error.filename != "": + if os.path.exists(syntax_error.filename): + text = Text.assemble( + (f" {syntax_error.filename}", "pygments.string"), + (":", "pygments.text"), + (str(syntax_error.lineno), "pygments.number"), + style="pygments.text", + ) + yield path_highlighter(text) + syntax_error_text = highlighter(syntax_error.line.rstrip()) + syntax_error_text.no_wrap = True + offset = min(syntax_error.offset - 1, len(syntax_error_text)) + syntax_error_text.stylize("bold underline", offset, offset) + syntax_error_text += Text.from_markup( + "\n" + " " * offset + "[traceback.offset]▲[/]", + style="pygments.text", + ) + yield syntax_error_text + + @classmethod + def _guess_lexer(cls, filename: str, code: str) -> str: + ext = os.path.splitext(filename)[-1] + if not ext: + # No extension, look at first line to see if it is a hashbang + # Note, this is an educated guess and not a guarantee + # If it fails, the only downside is that the code is highlighted strangely + new_line_index = code.index("\n") + first_line = code[:new_line_index] if new_line_index != -1 else code + if first_line.startswith("#!") and "python" in first_line.lower(): + return "python" + try: + return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name + except ClassNotFound: + return "text" + + @group() + def _render_stack(self, stack: Stack) -> RenderResult: + path_highlighter = PathHighlighter() + theme = self.theme + + def read_code(filename: str) -> str: + """Read files, and cache results on filename. + + Args: + filename (str): Filename to read + + Returns: + str: Contents of file + """ + return "".join(linecache.getlines(filename)) + + def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: + if frame.locals: + yield render_scope( + frame.locals, + title="locals", + indent_guides=self.indent_guides, + max_length=self.locals_max_length, + max_string=self.locals_max_string, + ) + + exclude_frames: Optional[range] = None + if self.max_frames != 0: + exclude_frames = range( + self.max_frames // 2, + len(stack.frames) - self.max_frames // 2, + ) + + excluded = False + for frame_index, frame in enumerate(stack.frames): + if exclude_frames and frame_index in exclude_frames: + excluded = True + continue + + if excluded: + assert exclude_frames is not None + yield Text( + f"\n... {len(exclude_frames)} frames hidden ...", + justify="center", + style="traceback.error", + ) + excluded = False + + first = frame_index == 0 + frame_filename = frame.filename + suppressed = any(frame_filename.startswith(path) for path in self.suppress) + + if os.path.exists(frame.filename): + text = Text.assemble( + path_highlighter(Text(frame.filename, style="pygments.string")), + (":", "pygments.text"), + (str(frame.lineno), "pygments.number"), + " in ", + (frame.name, "pygments.function"), + style="pygments.text", + ) + else: + text = Text.assemble( + "in ", + (frame.name, "pygments.function"), + (":", "pygments.text"), + (str(frame.lineno), "pygments.number"), + style="pygments.text", + ) + if not frame.filename.startswith("<") and not first: + yield "" + yield text + if frame.filename.startswith("<"): + yield from render_locals(frame) + continue + if not suppressed: + try: + code = read_code(frame.filename) + if not code: + # code may be an empty string if the file doesn't exist, OR + # if the traceback filename is generated dynamically + continue + lexer_name = self._guess_lexer(frame.filename, code) + syntax = Syntax( + code, + lexer_name, + theme=theme, + line_numbers=True, + line_range=( + frame.lineno - self.extra_lines, + frame.lineno + self.extra_lines, + ), + highlight_lines={frame.lineno}, + word_wrap=self.word_wrap, + code_width=88, + indent_guides=self.indent_guides, + dedent=False, + ) + yield "" + except Exception as error: + yield Text.assemble( + (f"\n{error}", "traceback.error"), + ) + else: + yield ( + Columns( + [ + syntax, + *render_locals(frame), + ], + padding=1, + ) + if frame.locals + else syntax + ) + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + console = Console() + import sys + + def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 + one = 1 + print(one / a) + + def foo(a: Any) -> None: + _rich_traceback_guard = True + zed = { + "characters": { + "Paul Atreides", + "Vladimir Harkonnen", + "Thufir Hawat", + "Duncan Idaho", + }, + "atomic_types": (None, False, True), + } + bar(a) + + def error() -> None: + try: + try: + foo(0) + except: + slfkjsldkfj # type: ignore[name-defined] + except: + console.print_exception(show_locals=True) + + error() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py b/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py new file mode 100644 index 0000000..64bc75d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/rich/tree.py @@ -0,0 +1,249 @@ +from typing import Iterator, List, Optional, Tuple + +from ._loop import loop_first, loop_last +from .console import Console, ConsoleOptions, RenderableType, RenderResult +from .jupyter import JupyterMixin +from .measure import Measurement +from .segment import Segment +from .style import Style, StyleStack, StyleType +from .styled import Styled + + +class Tree(JupyterMixin): + """A renderable for a tree structure. + + Args: + label (RenderableType): The renderable or str for the tree label. + style (StyleType, optional): Style of this tree. Defaults to "tree". + guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". + expanded (bool, optional): Also display children. Defaults to True. + highlight (bool, optional): Highlight renderable (if str). Defaults to False. + """ + + def __init__( + self, + label: RenderableType, + *, + style: StyleType = "tree", + guide_style: StyleType = "tree.line", + expanded: bool = True, + highlight: bool = False, + hide_root: bool = False, + ) -> None: + self.label = label + self.style = style + self.guide_style = guide_style + self.children: List[Tree] = [] + self.expanded = expanded + self.highlight = highlight + self.hide_root = hide_root + + def add( + self, + label: RenderableType, + *, + style: Optional[StyleType] = None, + guide_style: Optional[StyleType] = None, + expanded: bool = True, + highlight: Optional[bool] = False, + ) -> "Tree": + """Add a child tree. + + Args: + label (RenderableType): The renderable or str for the tree label. + style (StyleType, optional): Style of this tree. Defaults to "tree". + guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". + expanded (bool, optional): Also display children. Defaults to True. + highlight (Optional[bool], optional): Highlight renderable (if str). Defaults to False. + + Returns: + Tree: A new child Tree, which may be further modified. + """ + node = Tree( + label, + style=self.style if style is None else style, + guide_style=self.guide_style if guide_style is None else guide_style, + expanded=expanded, + highlight=self.highlight if highlight is None else highlight, + ) + self.children.append(node) + return node + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + stack: List[Iterator[Tuple[bool, Tree]]] = [] + pop = stack.pop + push = stack.append + new_line = Segment.line() + + get_style = console.get_style + null_style = Style.null() + guide_style = get_style(self.guide_style, default="") or null_style + SPACE, CONTINUE, FORK, END = range(4) + + ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") + TREE_GUIDES = [ + (" ", "│ ", "├── ", "└── "), + (" ", "┃ ", "┣━━ ", "┗━━ "), + (" ", "║ ", "╠══ ", "╚══ "), + ] + _Segment = Segment + + def make_guide(index: int, style: Style) -> Segment: + """Make a Segment for a level of the guide lines.""" + if options.ascii_only: + line = ASCII_GUIDES[index] + else: + guide = 1 if style.bold else (2 if style.underline2 else 0) + line = TREE_GUIDES[0 if options.legacy_windows else guide][index] + return _Segment(line, style) + + levels: List[Segment] = [make_guide(CONTINUE, guide_style)] + push(iter(loop_last([self]))) + + guide_style_stack = StyleStack(get_style(self.guide_style)) + style_stack = StyleStack(get_style(self.style)) + remove_guide_styles = Style(bold=False, underline2=False) + + depth = 0 + + while stack: + stack_node = pop() + try: + last, node = next(stack_node) + except StopIteration: + levels.pop() + if levels: + guide_style = levels[-1].style or null_style + levels[-1] = make_guide(FORK, guide_style) + guide_style_stack.pop() + style_stack.pop() + continue + push(stack_node) + if last: + levels[-1] = make_guide(END, levels[-1].style or null_style) + + guide_style = guide_style_stack.current + get_style(node.guide_style) + style = style_stack.current + get_style(node.style) + prefix = levels[(2 if self.hide_root else 1) :] + renderable_lines = console.render_lines( + Styled(node.label, style), + options.update( + width=options.max_width + - sum(level.cell_length for level in prefix), + highlight=self.highlight, + height=None, + ), + pad=options.justify is not None, + ) + + if not (depth == 0 and self.hide_root): + for first, line in loop_first(renderable_lines): + if prefix: + yield from _Segment.apply_style( + prefix, + style.background_style, + post_style=remove_guide_styles, + ) + yield from line + yield new_line + if first and prefix: + prefix[-1] = make_guide( + SPACE if last else CONTINUE, prefix[-1].style or null_style + ) + + if node.expanded and node.children: + levels[-1] = make_guide( + SPACE if last else CONTINUE, levels[-1].style or null_style + ) + levels.append( + make_guide(END if len(node.children) == 1 else FORK, guide_style) + ) + style_stack.push(get_style(node.style)) + guide_style_stack.push(get_style(node.guide_style)) + push(iter(loop_last(node.children))) + depth += 1 + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + stack: List[Iterator[Tree]] = [iter([self])] + pop = stack.pop + push = stack.append + minimum = 0 + maximum = 0 + measure = Measurement.get + level = 0 + while stack: + iter_tree = pop() + try: + tree = next(iter_tree) + except StopIteration: + level -= 1 + continue + push(iter_tree) + min_measure, max_measure = measure(console, options, tree.label) + indent = level * 4 + minimum = max(min_measure + indent, minimum) + maximum = max(max_measure + indent, maximum) + if tree.expanded and tree.children: + push(iter(tree.children)) + level += 1 + return Measurement(minimum, maximum) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Group + from pip._vendor.rich.markdown import Markdown + from pip._vendor.rich.panel import Panel + from pip._vendor.rich.syntax import Syntax + from pip._vendor.rich.table import Table + + table = Table(row_styles=["", "dim"]) + + table.add_column("Released", style="cyan", no_wrap=True) + table.add_column("Title", style="magenta") + table.add_column("Box Office", justify="right", style="green") + + table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") + table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") + table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") + table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") + + code = """\ +class Segment(NamedTuple): + text: str = "" + style: Optional[Style] = None + is_control: bool = False +""" + syntax = Syntax(code, "python", theme="monokai", line_numbers=True) + + markdown = Markdown( + """\ +### example.md +> Hello, World! +> +> Markdown _all_ the things +""" + ) + + root = Tree("🌲 [b green]Rich Tree", highlight=True, hide_root=True) + + node = root.add(":file_folder: Renderables", guide_style="red") + simple_node = node.add(":file_folder: [bold yellow]Atomic", guide_style="uu green") + simple_node.add(Group("📄 Syntax", syntax)) + simple_node.add(Group("📄 Markdown", Panel(markdown, border_style="green"))) + + containers_node = node.add( + ":file_folder: [bold magenta]Containers", guide_style="bold magenta" + ) + containers_node.expanded = True + panel = Panel.fit("Just a panel", border_style="red") + containers_node.add(Group("📄 Panels", panel)) + + containers_node.add(Group("📄 [b magenta]Table", table)) + + console = Console() + + console.print(root) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py new file mode 100644 index 0000000..4c6ec97 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2021 Taneli Hukkinen +# Licensed to PSF under a Contributor Agreement. + +__all__ = ("loads", "load", "TOMLDecodeError") +__version__ = "2.0.1" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT + +from ._parser import TOMLDecodeError, load, loads + +# Pretend this exception was created here. +TOMLDecodeError.__module__ = __name__ diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df870254beafb4e09289aaa2eade829d99c7ca27 GIT binary patch literal 404 zcmZ8cu};G<5OwOLsajel76v31qzs9hvLY5*!2on&ijYojZCZ;sj_jmTnfd|jd;{OY z#DIjdG9b1}-I#C$U3kO0chcRxcQ4&;8(ECtcJ}BX^ielkH2%aUvf>Fblpy9L4r?%+ zHY854bQ4#4iRU2RHsXbHbP~#@gb+$aQ$zgY5`sluQKy5Sb_dqI_AkPJSbt>YnwlUo?l7*4S~JbsKfa%75?e Xtva75ens)Ri4KldyKiV;@7SpyDOYV< literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca50185e19ea903625e731c54580cf6378ea80dc GIT binary patch literal 26919 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb86e6ff132d991ff3bef78d9fef10e1a52bf30a GIT binary patch literal 3928 zcmai1?N1xY8J~Ue+uFt$6GD>9-KI1NOJWRpXkiz7U#-tdA&}@#? zxD=%eZ!dgSB0cd|J z!Xj0e65WlrzDfZ2-`g6y)E!}ktoX_i~Y-aVm zA$c8MkxkX{liti~s>9PhKzc>ZnX=<2WKqwnj@K+^^W!?`2;^`foslz>YCnv)Gx?b( z#804w4`pnqeK}n=i^=w(uI`bcuK0-&>kxbnk4Pth6+c?xJwIsgIXT=(W>1V_hg zTcTu#)FY3AYN1O20YQXzjZB=0_sQ|`5#XhJ>c&zB2(*cl>NP5A(SD3rQI+f-p&~@j zR%;W-viZ6NI%quRt^n%)mb8g_#uOyM5{3@MM|wbamo?N4me=foHBxPZHc?SC2gPjO zR3}s{PRrN?Z$3OdPNGCc@6pX+@o*>g`Z+Z{b$aw^k~TRfj$=7fC8;_h1FMGA-+dh;kj!0HJu~>RTtw<1tI{QgY ziu(Atp+X*dgiQ66(E|V&f;fbj&7T4Hb7Y~Z`dKQ1kb72!LE2_)*5+*9_SjzAXZ!7d zE!aU5bX1zftW-7B@z|H}IG1NP*kLvnR+AOG<5}@n<_3}EE&leLp1-PMQV( z%$4MoA6`n1ikfU@CPh;hM_nB1bcs<>$1ku)I|YFh{D7P_R73no&K1-o#vqp+7tKkv zs!q{i5};1Z=oqU86ud&Vkj1NVF00UbrD|ZEyICh?^gr=}(GJsv3BXGXCQ*|7j&}m< zg=xd#;3Q+7hS;Gs_#oJI1b)U}p(~;C_feo>J~S8l zwBhNFkjK03Z(R3B*ZmPnG*JS2;B2RVJN~hK=i>3t>@PF7r7!YdW$y34ms^O!Dq%yF2ejHaT{;FvmXiA|bXB-Znox zH$2Ba4o7F%jbL@FW#x9?-E;R_{>(lMez3}aunC@#OVy{z*NkjY&D0UYp_=b5?mc1Ar}yeP^(t`ObzhJ%pLwk0D;5o>35g|n1I5Q z|3Z^k$3x1<09$DR8xlv)0w$P*W6()F-bLuQpmY4Sn&k;)kkdp83?CpO+uZKQKp3Z? zE1}1Yt&8V=5t-{=9w_xf#5N$6O)a-#iytrTe$cdUy}9+);l<)o&x7WUXC5vfY;vBE zw~Raa+2o5CpUivgnv@t8GyuG3Kq zbsg`ucZ=m&A<=>cY2f>DBTzU>I*L|2ZXz^^I3`CI6D*UwcsrqM3BbF_@NLpb&>2LC z#J`#Wr>S<{a(YJ25xBv}KxT{x_d{1g>s?3x82Ur#Uc&=EUb-+lwYY!z!!Z955YzTA)b|bQ`xd?PHx&35wfqykT^3N|$4n{oIMgzGcK-dj z_seX=!(0W7b?AZL&+*Fz61y9+J zyiKM4GU8%PIp6~Yjjn>25MfKf&7C51k$Kw3AU3#gVx;a?}PW=_uhx&*ht4!_i6a6>t`YUgKWt9Op{mSBOh}lu!n`= z8G?8OBQU@mV!#9AK=*hhAYl5&Mp>}sl`~Q`zludwl9S6Y%gas1IqPxAOOI*9p>|iT zuFJqcW!2{aWCxWU)`h#;J{glH+ysO=@PSwz`A{gUu8{y*xI$Bw1XMe8d@b)l& bUO0yndueUYn)AI`dnzYnX;r2qcJ$OA_*HAe literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py new file mode 100644 index 0000000..f1bb0aa --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py @@ -0,0 +1,691 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2021 Taneli Hukkinen +# Licensed to PSF under a Contributor Agreement. + +from __future__ import annotations + +from collections.abc import Iterable +import string +from types import MappingProxyType +from typing import Any, BinaryIO, NamedTuple + +from ._re import ( + RE_DATETIME, + RE_LOCALTIME, + RE_NUMBER, + match_to_datetime, + match_to_localtime, + match_to_number, +) +from ._types import Key, ParseFloat, Pos + +ASCII_CTRL = frozenset(chr(i) for i in range(32)) | frozenset(chr(127)) + +# Neither of these sets include quotation mark or backslash. They are +# currently handled as separate cases in the parser functions. +ILLEGAL_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t") +ILLEGAL_MULTILINE_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t\n") + +ILLEGAL_LITERAL_STR_CHARS = ILLEGAL_BASIC_STR_CHARS +ILLEGAL_MULTILINE_LITERAL_STR_CHARS = ILLEGAL_MULTILINE_BASIC_STR_CHARS + +ILLEGAL_COMMENT_CHARS = ILLEGAL_BASIC_STR_CHARS + +TOML_WS = frozenset(" \t") +TOML_WS_AND_NEWLINE = TOML_WS | frozenset("\n") +BARE_KEY_CHARS = frozenset(string.ascii_letters + string.digits + "-_") +KEY_INITIAL_CHARS = BARE_KEY_CHARS | frozenset("\"'") +HEXDIGIT_CHARS = frozenset(string.hexdigits) + +BASIC_STR_ESCAPE_REPLACEMENTS = MappingProxyType( + { + "\\b": "\u0008", # backspace + "\\t": "\u0009", # tab + "\\n": "\u000A", # linefeed + "\\f": "\u000C", # form feed + "\\r": "\u000D", # carriage return + '\\"': "\u0022", # quote + "\\\\": "\u005C", # backslash + } +) + + +class TOMLDecodeError(ValueError): + """An error raised if a document is not valid TOML.""" + + +def load(__fp: BinaryIO, *, parse_float: ParseFloat = float) -> dict[str, Any]: + """Parse TOML from a binary file object.""" + b = __fp.read() + try: + s = b.decode() + except AttributeError: + raise TypeError( + "File must be opened in binary mode, e.g. use `open('foo.toml', 'rb')`" + ) from None + return loads(s, parse_float=parse_float) + + +def loads(__s: str, *, parse_float: ParseFloat = float) -> dict[str, Any]: # noqa: C901 + """Parse TOML from a string.""" + + # The spec allows converting "\r\n" to "\n", even in string + # literals. Let's do so to simplify parsing. + src = __s.replace("\r\n", "\n") + pos = 0 + out = Output(NestedDict(), Flags()) + header: Key = () + parse_float = make_safe_parse_float(parse_float) + + # Parse one statement at a time + # (typically means one line in TOML source) + while True: + # 1. Skip line leading whitespace + pos = skip_chars(src, pos, TOML_WS) + + # 2. Parse rules. Expect one of the following: + # - end of file + # - end of line + # - comment + # - key/value pair + # - append dict to list (and move to its namespace) + # - create dict (and move to its namespace) + # Skip trailing whitespace when applicable. + try: + char = src[pos] + except IndexError: + break + if char == "\n": + pos += 1 + continue + if char in KEY_INITIAL_CHARS: + pos = key_value_rule(src, pos, out, header, parse_float) + pos = skip_chars(src, pos, TOML_WS) + elif char == "[": + try: + second_char: str | None = src[pos + 1] + except IndexError: + second_char = None + out.flags.finalize_pending() + if second_char == "[": + pos, header = create_list_rule(src, pos, out) + else: + pos, header = create_dict_rule(src, pos, out) + pos = skip_chars(src, pos, TOML_WS) + elif char != "#": + raise suffixed_err(src, pos, "Invalid statement") + + # 3. Skip comment + pos = skip_comment(src, pos) + + # 4. Expect end of line or end of file + try: + char = src[pos] + except IndexError: + break + if char != "\n": + raise suffixed_err( + src, pos, "Expected newline or end of document after a statement" + ) + pos += 1 + + return out.data.dict + + +class Flags: + """Flags that map to parsed keys/namespaces.""" + + # Marks an immutable namespace (inline array or inline table). + FROZEN = 0 + # Marks a nest that has been explicitly created and can no longer + # be opened using the "[table]" syntax. + EXPLICIT_NEST = 1 + + def __init__(self) -> None: + self._flags: dict[str, dict] = {} + self._pending_flags: set[tuple[Key, int]] = set() + + def add_pending(self, key: Key, flag: int) -> None: + self._pending_flags.add((key, flag)) + + def finalize_pending(self) -> None: + for key, flag in self._pending_flags: + self.set(key, flag, recursive=False) + self._pending_flags.clear() + + def unset_all(self, key: Key) -> None: + cont = self._flags + for k in key[:-1]: + if k not in cont: + return + cont = cont[k]["nested"] + cont.pop(key[-1], None) + + def set(self, key: Key, flag: int, *, recursive: bool) -> None: # noqa: A003 + cont = self._flags + key_parent, key_stem = key[:-1], key[-1] + for k in key_parent: + if k not in cont: + cont[k] = {"flags": set(), "recursive_flags": set(), "nested": {}} + cont = cont[k]["nested"] + if key_stem not in cont: + cont[key_stem] = {"flags": set(), "recursive_flags": set(), "nested": {}} + cont[key_stem]["recursive_flags" if recursive else "flags"].add(flag) + + def is_(self, key: Key, flag: int) -> bool: + if not key: + return False # document root has no flags + cont = self._flags + for k in key[:-1]: + if k not in cont: + return False + inner_cont = cont[k] + if flag in inner_cont["recursive_flags"]: + return True + cont = inner_cont["nested"] + key_stem = key[-1] + if key_stem in cont: + cont = cont[key_stem] + return flag in cont["flags"] or flag in cont["recursive_flags"] + return False + + +class NestedDict: + def __init__(self) -> None: + # The parsed content of the TOML document + self.dict: dict[str, Any] = {} + + def get_or_create_nest( + self, + key: Key, + *, + access_lists: bool = True, + ) -> dict: + cont: Any = self.dict + for k in key: + if k not in cont: + cont[k] = {} + cont = cont[k] + if access_lists and isinstance(cont, list): + cont = cont[-1] + if not isinstance(cont, dict): + raise KeyError("There is no nest behind this key") + return cont + + def append_nest_to_list(self, key: Key) -> None: + cont = self.get_or_create_nest(key[:-1]) + last_key = key[-1] + if last_key in cont: + list_ = cont[last_key] + if not isinstance(list_, list): + raise KeyError("An object other than list found behind this key") + list_.append({}) + else: + cont[last_key] = [{}] + + +class Output(NamedTuple): + data: NestedDict + flags: Flags + + +def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos: + try: + while src[pos] in chars: + pos += 1 + except IndexError: + pass + return pos + + +def skip_until( + src: str, + pos: Pos, + expect: str, + *, + error_on: frozenset[str], + error_on_eof: bool, +) -> Pos: + try: + new_pos = src.index(expect, pos) + except ValueError: + new_pos = len(src) + if error_on_eof: + raise suffixed_err(src, new_pos, f"Expected {expect!r}") from None + + if not error_on.isdisjoint(src[pos:new_pos]): + while src[pos] not in error_on: + pos += 1 + raise suffixed_err(src, pos, f"Found invalid character {src[pos]!r}") + return new_pos + + +def skip_comment(src: str, pos: Pos) -> Pos: + try: + char: str | None = src[pos] + except IndexError: + char = None + if char == "#": + return skip_until( + src, pos + 1, "\n", error_on=ILLEGAL_COMMENT_CHARS, error_on_eof=False + ) + return pos + + +def skip_comments_and_array_ws(src: str, pos: Pos) -> Pos: + while True: + pos_before_skip = pos + pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE) + pos = skip_comment(src, pos) + if pos == pos_before_skip: + return pos + + +def create_dict_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]: + pos += 1 # Skip "[" + pos = skip_chars(src, pos, TOML_WS) + pos, key = parse_key(src, pos) + + if out.flags.is_(key, Flags.EXPLICIT_NEST) or out.flags.is_(key, Flags.FROZEN): + raise suffixed_err(src, pos, f"Cannot declare {key} twice") + out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False) + try: + out.data.get_or_create_nest(key) + except KeyError: + raise suffixed_err(src, pos, "Cannot overwrite a value") from None + + if not src.startswith("]", pos): + raise suffixed_err(src, pos, "Expected ']' at the end of a table declaration") + return pos + 1, key + + +def create_list_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]: + pos += 2 # Skip "[[" + pos = skip_chars(src, pos, TOML_WS) + pos, key = parse_key(src, pos) + + if out.flags.is_(key, Flags.FROZEN): + raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}") + # Free the namespace now that it points to another empty list item... + out.flags.unset_all(key) + # ...but this key precisely is still prohibited from table declaration + out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False) + try: + out.data.append_nest_to_list(key) + except KeyError: + raise suffixed_err(src, pos, "Cannot overwrite a value") from None + + if not src.startswith("]]", pos): + raise suffixed_err(src, pos, "Expected ']]' at the end of an array declaration") + return pos + 2, key + + +def key_value_rule( + src: str, pos: Pos, out: Output, header: Key, parse_float: ParseFloat +) -> Pos: + pos, key, value = parse_key_value_pair(src, pos, parse_float) + key_parent, key_stem = key[:-1], key[-1] + abs_key_parent = header + key_parent + + relative_path_cont_keys = (header + key[:i] for i in range(1, len(key))) + for cont_key in relative_path_cont_keys: + # Check that dotted key syntax does not redefine an existing table + if out.flags.is_(cont_key, Flags.EXPLICIT_NEST): + raise suffixed_err(src, pos, f"Cannot redefine namespace {cont_key}") + # Containers in the relative path can't be opened with the table syntax or + # dotted key/value syntax in following table sections. + out.flags.add_pending(cont_key, Flags.EXPLICIT_NEST) + + if out.flags.is_(abs_key_parent, Flags.FROZEN): + raise suffixed_err( + src, pos, f"Cannot mutate immutable namespace {abs_key_parent}" + ) + + try: + nest = out.data.get_or_create_nest(abs_key_parent) + except KeyError: + raise suffixed_err(src, pos, "Cannot overwrite a value") from None + if key_stem in nest: + raise suffixed_err(src, pos, "Cannot overwrite a value") + # Mark inline table and array namespaces recursively immutable + if isinstance(value, (dict, list)): + out.flags.set(header + key, Flags.FROZEN, recursive=True) + nest[key_stem] = value + return pos + + +def parse_key_value_pair( + src: str, pos: Pos, parse_float: ParseFloat +) -> tuple[Pos, Key, Any]: + pos, key = parse_key(src, pos) + try: + char: str | None = src[pos] + except IndexError: + char = None + if char != "=": + raise suffixed_err(src, pos, "Expected '=' after a key in a key/value pair") + pos += 1 + pos = skip_chars(src, pos, TOML_WS) + pos, value = parse_value(src, pos, parse_float) + return pos, key, value + + +def parse_key(src: str, pos: Pos) -> tuple[Pos, Key]: + pos, key_part = parse_key_part(src, pos) + key: Key = (key_part,) + pos = skip_chars(src, pos, TOML_WS) + while True: + try: + char: str | None = src[pos] + except IndexError: + char = None + if char != ".": + return pos, key + pos += 1 + pos = skip_chars(src, pos, TOML_WS) + pos, key_part = parse_key_part(src, pos) + key += (key_part,) + pos = skip_chars(src, pos, TOML_WS) + + +def parse_key_part(src: str, pos: Pos) -> tuple[Pos, str]: + try: + char: str | None = src[pos] + except IndexError: + char = None + if char in BARE_KEY_CHARS: + start_pos = pos + pos = skip_chars(src, pos, BARE_KEY_CHARS) + return pos, src[start_pos:pos] + if char == "'": + return parse_literal_str(src, pos) + if char == '"': + return parse_one_line_basic_str(src, pos) + raise suffixed_err(src, pos, "Invalid initial character for a key part") + + +def parse_one_line_basic_str(src: str, pos: Pos) -> tuple[Pos, str]: + pos += 1 + return parse_basic_str(src, pos, multiline=False) + + +def parse_array(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, list]: + pos += 1 + array: list = [] + + pos = skip_comments_and_array_ws(src, pos) + if src.startswith("]", pos): + return pos + 1, array + while True: + pos, val = parse_value(src, pos, parse_float) + array.append(val) + pos = skip_comments_and_array_ws(src, pos) + + c = src[pos : pos + 1] + if c == "]": + return pos + 1, array + if c != ",": + raise suffixed_err(src, pos, "Unclosed array") + pos += 1 + + pos = skip_comments_and_array_ws(src, pos) + if src.startswith("]", pos): + return pos + 1, array + + +def parse_inline_table(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, dict]: + pos += 1 + nested_dict = NestedDict() + flags = Flags() + + pos = skip_chars(src, pos, TOML_WS) + if src.startswith("}", pos): + return pos + 1, nested_dict.dict + while True: + pos, key, value = parse_key_value_pair(src, pos, parse_float) + key_parent, key_stem = key[:-1], key[-1] + if flags.is_(key, Flags.FROZEN): + raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}") + try: + nest = nested_dict.get_or_create_nest(key_parent, access_lists=False) + except KeyError: + raise suffixed_err(src, pos, "Cannot overwrite a value") from None + if key_stem in nest: + raise suffixed_err(src, pos, f"Duplicate inline table key {key_stem!r}") + nest[key_stem] = value + pos = skip_chars(src, pos, TOML_WS) + c = src[pos : pos + 1] + if c == "}": + return pos + 1, nested_dict.dict + if c != ",": + raise suffixed_err(src, pos, "Unclosed inline table") + if isinstance(value, (dict, list)): + flags.set(key, Flags.FROZEN, recursive=True) + pos += 1 + pos = skip_chars(src, pos, TOML_WS) + + +def parse_basic_str_escape( + src: str, pos: Pos, *, multiline: bool = False +) -> tuple[Pos, str]: + escape_id = src[pos : pos + 2] + pos += 2 + if multiline and escape_id in {"\\ ", "\\\t", "\\\n"}: + # Skip whitespace until next non-whitespace character or end of + # the doc. Error if non-whitespace is found before newline. + if escape_id != "\\\n": + pos = skip_chars(src, pos, TOML_WS) + try: + char = src[pos] + except IndexError: + return pos, "" + if char != "\n": + raise suffixed_err(src, pos, "Unescaped '\\' in a string") + pos += 1 + pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE) + return pos, "" + if escape_id == "\\u": + return parse_hex_char(src, pos, 4) + if escape_id == "\\U": + return parse_hex_char(src, pos, 8) + try: + return pos, BASIC_STR_ESCAPE_REPLACEMENTS[escape_id] + except KeyError: + raise suffixed_err(src, pos, "Unescaped '\\' in a string") from None + + +def parse_basic_str_escape_multiline(src: str, pos: Pos) -> tuple[Pos, str]: + return parse_basic_str_escape(src, pos, multiline=True) + + +def parse_hex_char(src: str, pos: Pos, hex_len: int) -> tuple[Pos, str]: + hex_str = src[pos : pos + hex_len] + if len(hex_str) != hex_len or not HEXDIGIT_CHARS.issuperset(hex_str): + raise suffixed_err(src, pos, "Invalid hex value") + pos += hex_len + hex_int = int(hex_str, 16) + if not is_unicode_scalar_value(hex_int): + raise suffixed_err(src, pos, "Escaped character is not a Unicode scalar value") + return pos, chr(hex_int) + + +def parse_literal_str(src: str, pos: Pos) -> tuple[Pos, str]: + pos += 1 # Skip starting apostrophe + start_pos = pos + pos = skip_until( + src, pos, "'", error_on=ILLEGAL_LITERAL_STR_CHARS, error_on_eof=True + ) + return pos + 1, src[start_pos:pos] # Skip ending apostrophe + + +def parse_multiline_str(src: str, pos: Pos, *, literal: bool) -> tuple[Pos, str]: + pos += 3 + if src.startswith("\n", pos): + pos += 1 + + if literal: + delim = "'" + end_pos = skip_until( + src, + pos, + "'''", + error_on=ILLEGAL_MULTILINE_LITERAL_STR_CHARS, + error_on_eof=True, + ) + result = src[pos:end_pos] + pos = end_pos + 3 + else: + delim = '"' + pos, result = parse_basic_str(src, pos, multiline=True) + + # Add at maximum two extra apostrophes/quotes if the end sequence + # is 4 or 5 chars long instead of just 3. + if not src.startswith(delim, pos): + return pos, result + pos += 1 + if not src.startswith(delim, pos): + return pos, result + delim + pos += 1 + return pos, result + (delim * 2) + + +def parse_basic_str(src: str, pos: Pos, *, multiline: bool) -> tuple[Pos, str]: + if multiline: + error_on = ILLEGAL_MULTILINE_BASIC_STR_CHARS + parse_escapes = parse_basic_str_escape_multiline + else: + error_on = ILLEGAL_BASIC_STR_CHARS + parse_escapes = parse_basic_str_escape + result = "" + start_pos = pos + while True: + try: + char = src[pos] + except IndexError: + raise suffixed_err(src, pos, "Unterminated string") from None + if char == '"': + if not multiline: + return pos + 1, result + src[start_pos:pos] + if src.startswith('"""', pos): + return pos + 3, result + src[start_pos:pos] + pos += 1 + continue + if char == "\\": + result += src[start_pos:pos] + pos, parsed_escape = parse_escapes(src, pos) + result += parsed_escape + start_pos = pos + continue + if char in error_on: + raise suffixed_err(src, pos, f"Illegal character {char!r}") + pos += 1 + + +def parse_value( # noqa: C901 + src: str, pos: Pos, parse_float: ParseFloat +) -> tuple[Pos, Any]: + try: + char: str | None = src[pos] + except IndexError: + char = None + + # IMPORTANT: order conditions based on speed of checking and likelihood + + # Basic strings + if char == '"': + if src.startswith('"""', pos): + return parse_multiline_str(src, pos, literal=False) + return parse_one_line_basic_str(src, pos) + + # Literal strings + if char == "'": + if src.startswith("'''", pos): + return parse_multiline_str(src, pos, literal=True) + return parse_literal_str(src, pos) + + # Booleans + if char == "t": + if src.startswith("true", pos): + return pos + 4, True + if char == "f": + if src.startswith("false", pos): + return pos + 5, False + + # Arrays + if char == "[": + return parse_array(src, pos, parse_float) + + # Inline tables + if char == "{": + return parse_inline_table(src, pos, parse_float) + + # Dates and times + datetime_match = RE_DATETIME.match(src, pos) + if datetime_match: + try: + datetime_obj = match_to_datetime(datetime_match) + except ValueError as e: + raise suffixed_err(src, pos, "Invalid date or datetime") from e + return datetime_match.end(), datetime_obj + localtime_match = RE_LOCALTIME.match(src, pos) + if localtime_match: + return localtime_match.end(), match_to_localtime(localtime_match) + + # Integers and "normal" floats. + # The regex will greedily match any type starting with a decimal + # char, so needs to be located after handling of dates and times. + number_match = RE_NUMBER.match(src, pos) + if number_match: + return number_match.end(), match_to_number(number_match, parse_float) + + # Special floats + first_three = src[pos : pos + 3] + if first_three in {"inf", "nan"}: + return pos + 3, parse_float(first_three) + first_four = src[pos : pos + 4] + if first_four in {"-inf", "+inf", "-nan", "+nan"}: + return pos + 4, parse_float(first_four) + + raise suffixed_err(src, pos, "Invalid value") + + +def suffixed_err(src: str, pos: Pos, msg: str) -> TOMLDecodeError: + """Return a `TOMLDecodeError` where error message is suffixed with + coordinates in source.""" + + def coord_repr(src: str, pos: Pos) -> str: + if pos >= len(src): + return "end of document" + line = src.count("\n", 0, pos) + 1 + if line == 1: + column = pos + 1 + else: + column = pos - src.rindex("\n", 0, pos) + return f"line {line}, column {column}" + + return TOMLDecodeError(f"{msg} (at {coord_repr(src, pos)})") + + +def is_unicode_scalar_value(codepoint: int) -> bool: + return (0 <= codepoint <= 55295) or (57344 <= codepoint <= 1114111) + + +def make_safe_parse_float(parse_float: ParseFloat) -> ParseFloat: + """A decorator to make `parse_float` safe. + + `parse_float` must not return dicts or lists, because these types + would be mixed with parsed TOML tables and arrays, thus confusing + the parser. The returned decorated callable raises `ValueError` + instead of returning illegal types. + """ + # The default `float` callable never returns illegal types. Optimize it. + if parse_float is float: # type: ignore[comparison-overlap] + return float + + def safe_parse_float(float_str: str) -> Any: + float_value = parse_float(float_str) + if isinstance(float_value, (dict, list)): + raise ValueError("parse_float must not return dicts or lists") + return float_value + + return safe_parse_float diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py new file mode 100644 index 0000000..994bb74 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2021 Taneli Hukkinen +# Licensed to PSF under a Contributor Agreement. + +from __future__ import annotations + +from datetime import date, datetime, time, timedelta, timezone, tzinfo +from functools import lru_cache +import re +from typing import Any + +from ._types import ParseFloat + +# E.g. +# - 00:32:00.999999 +# - 00:32:00 +_TIME_RE_STR = r"([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\.([0-9]{1,6})[0-9]*)?" + +RE_NUMBER = re.compile( + r""" +0 +(?: + x[0-9A-Fa-f](?:_?[0-9A-Fa-f])* # hex + | + b[01](?:_?[01])* # bin + | + o[0-7](?:_?[0-7])* # oct +) +| +[+-]?(?:0|[1-9](?:_?[0-9])*) # dec, integer part +(?P + (?:\.[0-9](?:_?[0-9])*)? # optional fractional part + (?:[eE][+-]?[0-9](?:_?[0-9])*)? # optional exponent part +) +""", + flags=re.VERBOSE, +) +RE_LOCALTIME = re.compile(_TIME_RE_STR) +RE_DATETIME = re.compile( + rf""" +([0-9]{{4}})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) # date, e.g. 1988-10-27 +(?: + [Tt ] + {_TIME_RE_STR} + (?:([Zz])|([+-])([01][0-9]|2[0-3]):([0-5][0-9]))? # optional time offset +)? +""", + flags=re.VERBOSE, +) + + +def match_to_datetime(match: re.Match) -> datetime | date: + """Convert a `RE_DATETIME` match to `datetime.datetime` or `datetime.date`. + + Raises ValueError if the match does not correspond to a valid date + or datetime. + """ + ( + year_str, + month_str, + day_str, + hour_str, + minute_str, + sec_str, + micros_str, + zulu_time, + offset_sign_str, + offset_hour_str, + offset_minute_str, + ) = match.groups() + year, month, day = int(year_str), int(month_str), int(day_str) + if hour_str is None: + return date(year, month, day) + hour, minute, sec = int(hour_str), int(minute_str), int(sec_str) + micros = int(micros_str.ljust(6, "0")) if micros_str else 0 + if offset_sign_str: + tz: tzinfo | None = cached_tz( + offset_hour_str, offset_minute_str, offset_sign_str + ) + elif zulu_time: + tz = timezone.utc + else: # local date-time + tz = None + return datetime(year, month, day, hour, minute, sec, micros, tzinfo=tz) + + +@lru_cache(maxsize=None) +def cached_tz(hour_str: str, minute_str: str, sign_str: str) -> timezone: + sign = 1 if sign_str == "+" else -1 + return timezone( + timedelta( + hours=sign * int(hour_str), + minutes=sign * int(minute_str), + ) + ) + + +def match_to_localtime(match: re.Match) -> time: + hour_str, minute_str, sec_str, micros_str = match.groups() + micros = int(micros_str.ljust(6, "0")) if micros_str else 0 + return time(int(hour_str), int(minute_str), int(sec_str), micros) + + +def match_to_number(match: re.Match, parse_float: ParseFloat) -> Any: + if match.group("floatpart"): + return parse_float(match.group()) + return int(match.group(), 0) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py new file mode 100644 index 0000000..d949412 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2021 Taneli Hukkinen +# Licensed to PSF under a Contributor Agreement. + +from typing import Any, Callable, Tuple + +# Type annotations +ParseFloat = Callable[[str], Any] +Key = Tuple[str, ...] +Pos = int diff --git a/env/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed new file mode 100644 index 0000000..7632ecf --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py new file mode 100644 index 0000000..e468bf8 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py @@ -0,0 +1,36 @@ +"""Verify certificates using native system trust stores""" + +import sys as _sys + +if _sys.version_info < (3, 10): + raise ImportError("truststore requires Python 3.10 or later") + +# Detect Python runtimes which don't implement SSLObject.get_unverified_chain() API +# This API only became public in Python 3.13 but was available in CPython and PyPy since 3.10. +if _sys.version_info < (3, 13): + try: + import ssl as _ssl + except ImportError: + raise ImportError("truststore requires the 'ssl' module") + else: + _sslmem = _ssl.MemoryBIO() + _sslobj = _ssl.create_default_context().wrap_bio( + _sslmem, + _sslmem, + ) + try: + while not hasattr(_sslobj, "get_unverified_chain"): + _sslobj = _sslobj._sslobj # type: ignore[attr-defined] + except AttributeError: + raise ImportError( + "truststore requires peer certificate chain APIs to be available" + ) from None + + del _ssl, _sslobj, _sslmem # noqa: F821 + +from ._api import SSLContext, extract_from_ssl, inject_into_ssl # noqa: E402 + +del _api, _sys # type: ignore[name-defined] # noqa: F821 + +__all__ = ["SSLContext", "inject_into_ssl", "extract_from_ssl"] +__version__ = "0.10.0" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86fc9db7b22a36bff31f83cc262a2b110b802723 GIT binary patch literal 1364 zcmZ`%&2Jl35P$n&d;J+_o!YIXhAlM;mTIpHNK_Rhwc83J63EYIfhuZ+`DLGy8Kg z8AD*V)z8~LkI>WLFgG|)?R3Z>^a$xlK{}(eCZn*J?S|*D7jK<=z#>Eh7GYlJ_n<1U z9p-<~p($F4&R9cA80x~^)U0aJ@0}f#fH~Y17jv`kIih>+YiITocC6_t`yC*?29~apZ4&Eohnul*r^V76M@E3gp zVA8z-?KrmdcKK>Wa)@LCIVrMaT9t$5c?+PAj?4F=ZLW=AvZ;l``DdKi;MmC_U| zRqt)O5_O~omb5L+Ftvt>hlN)W&<>W?T-RKaEJyE~_$2s=ikug_fB()+$ENrp_0r&o z)}(5SIF<@vZ^^K`7y^b(ogh%;hyZmYXqrU94Z{^^uUsjvco9|Aou;aK9L&t))xam9 zH`j1%AZR&WeADVVgx)5^A%FsYK!J~bge`{*YMXa~1OgVeylj(T7?`T#mex0^+C0-J zY!j`gHVkJ5bsAkS($QRvQsSkm;EhI~;@K6vs`ZSS;6UqCbs$qSO^_K^)ww$L2XqPm z^qk5a$HKDJ?`W2#>GCb7*|)GwUHJope%NowS1Xm$Ep6bI?zT!d9UaTq-jYqDA@`=s zhF!lUy9ULjp4NPzwXrMrjGhb^*}6mI7mJZq7>PkuwcHzc!h5rwtdrM3M6ek5Z*V@x zFw7CU{uGJFT;z~j+2>Y9+rMzDN3nC`?2Ut1b<9_N0rA2@&S%BY<==%o#50#hg-7LY z$_L`>yOD`l8Wj%3(!N+a5amPh+P-*glE}bw8sajs-H0!QqvwyZ7azCBYw!P>U7zGH zeJ6h_k0O6@D7QL|{+3<$Qz*GST6_HNpJ-zrZ5;E$ZsCvE#+Q*vD*ILZAO8YMuRcQ@ zFo_o@=}%5MHj_He_p>8vl{6 YT|qy+v0BTcC;6pXk$Z9_RlCmp2QA8TP5=M^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7301ce7fdc24b18d904386e4b4f361699062b2b5 GIT binary patch literal 16793 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f47b313bdf75207ca3b7cc378b1bb409dc8f6f GIT binary patch literal 19007 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 O)es6q9)>}4@AN-`$pC`@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b58740e5311f43f554eb5917b54805a48d6d111a GIT binary patch literal 1119 zcmZ`&%}*0S6rb%*x1~^&q!_J$1j0v&?E)T*h+M$vfsX^~VPi5`xtbSYpjwcg?2=XU|_X;Td`u*U1-3>ltnV1n{Rol-vbA1CU$ zZJ$`)_1TVN^Il4eDBnoKd-pIgw|!J{49pdRnMdq=leMr$(HkI(dA=e<8L$uxgw^fU zM6GChyRGbleW}$43HTr*t!HGOMh-CxrmYuIqsY$HNKC}?7(x^?gfbBlv^WH5aOCLd z-`DDnQ^IP=+tEuU-B4GYyjQ|Dqv{irJ@vNKx!Kw5itf|w#&&jD+)Tyxo?0}w)CL9j za&z-4H5tyjdVW_gV5+*NtD-$@8xB!BgsZ5@6=k|epL2aa6qeORp@?cTNRpz!Au(xM zh&SLu0ns}(I8%i)H8@{|^T!WA_kM$`=VBLR2DmKp2;oz%FyA%p0#9^!;HeHrU1&7q ziv+KS$2VMNI)X$FMLg!$5YlbiVS0d4gm}MMa*H_NCWJV&^%5pQPf5^Jt~gs3&NH5P z5nf_Va24L+2$0~pkiPJgMe%odMZ83Yg(-cqkcSg0#tB69+!&t#=04_4*Dnw+l6>38N= zdFnLtr~)TXXL40Ib(T>>eW?Pc>WVC_Nv8v;^2p&xT@H=h+$a0UZWw3Lo{MOJhK2tF D({~}< literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35d92c2629ce8197d1be8138cbad30cf98513c0f GIT binary patch literal 15785 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 None: + """Injects the :class:`truststore.SSLContext` into the ``ssl`` + module by replacing :class:`ssl.SSLContext`. + """ + setattr(ssl, "SSLContext", SSLContext) + # urllib3 holds on to its own reference of ssl.SSLContext + # so we need to replace that reference too. + try: + import pip._vendor.urllib3.util.ssl_ as urllib3_ssl + + setattr(urllib3_ssl, "SSLContext", SSLContext) + except ImportError: + pass + + +def extract_from_ssl() -> None: + """Restores the :class:`ssl.SSLContext` class to its original state""" + setattr(ssl, "SSLContext", _original_SSLContext) + try: + import pip._vendor.urllib3.util.ssl_ as urllib3_ssl + + urllib3_ssl.SSLContext = _original_SSLContext # type: ignore[assignment] + except ImportError: + pass + + +class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc] + """SSLContext API that uses system certificates on all platforms""" + + @property # type: ignore[misc] + def __class__(self) -> type: + # Dirty hack to get around isinstance() checks + # for ssl.SSLContext instances in aiohttp/trustme + # when using non-CPython implementations. + return _truststore_SSLContext_dunder_class or SSLContext + + def __init__(self, protocol: int = None) -> None: # type: ignore[assignment] + self._ctx = _original_SSLContext(protocol) + + class TruststoreSSLObject(ssl.SSLObject): + # This object exists because wrap_bio() doesn't + # immediately do the handshake so we need to do + # certificate verifications after SSLObject.do_handshake() + + def do_handshake(self) -> None: + ret = super().do_handshake() + _verify_peercerts(self, server_hostname=self.server_hostname) + return ret + + self._ctx.sslobject_class = TruststoreSSLObject + + def wrap_socket( + self, + sock: socket.socket, + server_side: bool = False, + do_handshake_on_connect: bool = True, + suppress_ragged_eofs: bool = True, + server_hostname: str | None = None, + session: ssl.SSLSession | None = None, + ) -> ssl.SSLSocket: + # Use a context manager here because the + # inner SSLContext holds on to our state + # but also does the actual handshake. + with _configure_context(self._ctx): + ssl_sock = self._ctx.wrap_socket( + sock, + server_side=server_side, + server_hostname=server_hostname, + do_handshake_on_connect=do_handshake_on_connect, + suppress_ragged_eofs=suppress_ragged_eofs, + session=session, + ) + try: + _verify_peercerts(ssl_sock, server_hostname=server_hostname) + except Exception: + ssl_sock.close() + raise + return ssl_sock + + def wrap_bio( + self, + incoming: ssl.MemoryBIO, + outgoing: ssl.MemoryBIO, + server_side: bool = False, + server_hostname: str | None = None, + session: ssl.SSLSession | None = None, + ) -> ssl.SSLObject: + with _configure_context(self._ctx): + ssl_obj = self._ctx.wrap_bio( + incoming, + outgoing, + server_hostname=server_hostname, + server_side=server_side, + session=session, + ) + return ssl_obj + + def load_verify_locations( + self, + cafile: str | bytes | os.PathLike[str] | os.PathLike[bytes] | None = None, + capath: str | bytes | os.PathLike[str] | os.PathLike[bytes] | None = None, + cadata: typing.Union[str, "Buffer", None] = None, + ) -> None: + return self._ctx.load_verify_locations( + cafile=cafile, capath=capath, cadata=cadata + ) + + def load_cert_chain( + self, + certfile: _StrOrBytesPath, + keyfile: _StrOrBytesPath | None = None, + password: _PasswordType | None = None, + ) -> None: + return self._ctx.load_cert_chain( + certfile=certfile, keyfile=keyfile, password=password + ) + + def load_default_certs( + self, purpose: ssl.Purpose = ssl.Purpose.SERVER_AUTH + ) -> None: + return self._ctx.load_default_certs(purpose) + + def set_alpn_protocols(self, alpn_protocols: typing.Iterable[str]) -> None: + return self._ctx.set_alpn_protocols(alpn_protocols) + + def set_npn_protocols(self, npn_protocols: typing.Iterable[str]) -> None: + return self._ctx.set_npn_protocols(npn_protocols) + + def set_ciphers(self, __cipherlist: str) -> None: + return self._ctx.set_ciphers(__cipherlist) + + def get_ciphers(self) -> typing.Any: + return self._ctx.get_ciphers() + + def session_stats(self) -> dict[str, int]: + return self._ctx.session_stats() + + def cert_store_stats(self) -> dict[str, int]: + raise NotImplementedError() + + def set_default_verify_paths(self) -> None: + self._ctx.set_default_verify_paths() + + @typing.overload + def get_ca_certs( + self, binary_form: typing.Literal[False] = ... + ) -> list[typing.Any]: ... + + @typing.overload + def get_ca_certs(self, binary_form: typing.Literal[True] = ...) -> list[bytes]: ... + + @typing.overload + def get_ca_certs(self, binary_form: bool = ...) -> typing.Any: ... + + def get_ca_certs(self, binary_form: bool = False) -> list[typing.Any] | list[bytes]: + raise NotImplementedError() + + @property + def check_hostname(self) -> bool: + return self._ctx.check_hostname + + @check_hostname.setter + def check_hostname(self, value: bool) -> None: + self._ctx.check_hostname = value + + @property + def hostname_checks_common_name(self) -> bool: + return self._ctx.hostname_checks_common_name + + @hostname_checks_common_name.setter + def hostname_checks_common_name(self, value: bool) -> None: + self._ctx.hostname_checks_common_name = value + + @property + def keylog_filename(self) -> str: + return self._ctx.keylog_filename + + @keylog_filename.setter + def keylog_filename(self, value: str) -> None: + self._ctx.keylog_filename = value + + @property + def maximum_version(self) -> ssl.TLSVersion: + return self._ctx.maximum_version + + @maximum_version.setter + def maximum_version(self, value: ssl.TLSVersion) -> None: + _original_super_SSLContext.maximum_version.__set__( # type: ignore[attr-defined] + self._ctx, value + ) + + @property + def minimum_version(self) -> ssl.TLSVersion: + return self._ctx.minimum_version + + @minimum_version.setter + def minimum_version(self, value: ssl.TLSVersion) -> None: + _original_super_SSLContext.minimum_version.__set__( # type: ignore[attr-defined] + self._ctx, value + ) + + @property + def options(self) -> ssl.Options: + return self._ctx.options + + @options.setter + def options(self, value: ssl.Options) -> None: + _original_super_SSLContext.options.__set__( # type: ignore[attr-defined] + self._ctx, value + ) + + @property + def post_handshake_auth(self) -> bool: + return self._ctx.post_handshake_auth + + @post_handshake_auth.setter + def post_handshake_auth(self, value: bool) -> None: + self._ctx.post_handshake_auth = value + + @property + def protocol(self) -> ssl._SSLMethod: + return self._ctx.protocol + + @property + def security_level(self) -> int: + return self._ctx.security_level + + @property + def verify_flags(self) -> ssl.VerifyFlags: + return self._ctx.verify_flags + + @verify_flags.setter + def verify_flags(self, value: ssl.VerifyFlags) -> None: + _original_super_SSLContext.verify_flags.__set__( # type: ignore[attr-defined] + self._ctx, value + ) + + @property + def verify_mode(self) -> ssl.VerifyMode: + return self._ctx.verify_mode + + @verify_mode.setter + def verify_mode(self, value: ssl.VerifyMode) -> None: + _original_super_SSLContext.verify_mode.__set__( # type: ignore[attr-defined] + self._ctx, value + ) + + +# Python 3.13+ makes get_unverified_chain() a public API that only returns DER +# encoded certificates. We detect whether we need to call public_bytes() for 3.10->3.12 +# Pre-3.13 returned None instead of an empty list from get_unverified_chain() +if sys.version_info >= (3, 13): + + def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]: + unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined] + return [ + cert if isinstance(cert, bytes) else cert.public_bytes(_ssl.ENCODING_DER) + for cert in unverified_chain + ] + +else: + + def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]: + unverified_chain = sslobj.get_unverified_chain() or () # type: ignore[attr-defined] + return [cert.public_bytes(_ssl.ENCODING_DER) for cert in unverified_chain] + + +def _verify_peercerts( + sock_or_sslobj: ssl.SSLSocket | ssl.SSLObject, server_hostname: str | None +) -> None: + """ + Verifies the peer certificates from an SSLSocket or SSLObject + against the certificates in the OS trust store. + """ + sslobj: ssl.SSLObject = sock_or_sslobj # type: ignore[assignment] + try: + while not hasattr(sslobj, "get_unverified_chain"): + sslobj = sslobj._sslobj # type: ignore[attr-defined] + except AttributeError: + pass + + cert_bytes = _get_unverified_chain_bytes(sslobj) + _verify_peercerts_impl( + sock_or_sslobj.context, cert_bytes, server_hostname=server_hostname + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py new file mode 100644 index 0000000..3450307 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py @@ -0,0 +1,571 @@ +import contextlib +import ctypes +import platform +import ssl +import typing +from ctypes import ( + CDLL, + POINTER, + c_bool, + c_char_p, + c_int32, + c_long, + c_uint32, + c_ulong, + c_void_p, +) +from ctypes.util import find_library + +from ._ssl_constants import _set_ssl_context_verify_mode + +_mac_version = platform.mac_ver()[0] +_mac_version_info = tuple(map(int, _mac_version.split("."))) +if _mac_version_info < (10, 8): + raise ImportError( + f"Only OS X 10.8 and newer are supported, not {_mac_version_info[0]}.{_mac_version_info[1]}" + ) + +_is_macos_version_10_14_or_later = _mac_version_info >= (10, 14) + + +def _load_cdll(name: str, macos10_16_path: str) -> CDLL: + """Loads a CDLL by name, falling back to known path on 10.16+""" + try: + # Big Sur is technically 11 but we use 10.16 due to the Big Sur + # beta being labeled as 10.16. + path: str | None + if _mac_version_info >= (10, 16): + path = macos10_16_path + else: + path = find_library(name) + if not path: + raise OSError # Caught and reraised as 'ImportError' + return CDLL(path, use_errno=True) + except OSError: + raise ImportError(f"The library {name} failed to load") from None + + +Security = _load_cdll( + "Security", "/System/Library/Frameworks/Security.framework/Security" +) +CoreFoundation = _load_cdll( + "CoreFoundation", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", +) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFErrorRef = POINTER(CFError) +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFArrayCallBacks = c_void_p +CFOptionFlags = c_uint32 + +SecCertificateRef = POINTER(c_void_p) +SecPolicyRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 + +try: + Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [SecCertificateRef] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argtypes = [SecTrustRef, Boolean] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecPolicyCreateRevocation.argtypes = [CFOptionFlags] + Security.SecPolicyCreateRevocation.restype = SecPolicyRef + + Security.SecPolicyCreateSSL.argtypes = [Boolean, CFStringRef] + Security.SecPolicyCreateSSL.restype = SecPolicyRef + + Security.SecTrustCreateWithCertificates.argtypes = [ + CFTypeRef, + CFTypeRef, + POINTER(SecTrustRef), + ] + Security.SecTrustCreateWithCertificates.restype = OSStatus + + Security.SecTrustGetTrustResult.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType), + ] + Security.SecTrustGetTrustResult.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType), + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustRef = SecTrustRef # type: ignore[attr-defined] + Security.SecTrustResultType = SecTrustResultType # type: ignore[attr-defined] + Security.OSStatus = OSStatus # type: ignore[attr-defined] + + kSecRevocationUseAnyAvailableMethod = 3 + kSecRevocationRequirePositiveResponse = 8 + + CoreFoundation.CFRelease.argtypes = [CFTypeRef] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding, + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding, + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.CFErrorGetCode.argtypes = [CFErrorRef] + CoreFoundation.CFErrorGetCode.restype = CFIndex + + CoreFoundation.CFErrorCopyDescription.argtypes = [CFErrorRef] + CoreFoundation.CFErrorCopyDescription.restype = CFStringRef + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( # type: ignore[attr-defined] + CoreFoundation, "kCFAllocatorDefault" + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( # type: ignore[attr-defined] + CoreFoundation, "kCFTypeArrayCallBacks" + ) + + CoreFoundation.CFTypeRef = CFTypeRef # type: ignore[attr-defined] + CoreFoundation.CFArrayRef = CFArrayRef # type: ignore[attr-defined] + CoreFoundation.CFStringRef = CFStringRef # type: ignore[attr-defined] + CoreFoundation.CFErrorRef = CFErrorRef # type: ignore[attr-defined] + +except AttributeError as e: + raise ImportError(f"Error initializing ctypes: {e}") from None + +# SecTrustEvaluateWithError is macOS 10.14+ +if _is_macos_version_10_14_or_later: + try: + Security.SecTrustEvaluateWithError.argtypes = [ + SecTrustRef, + POINTER(CFErrorRef), + ] + Security.SecTrustEvaluateWithError.restype = c_bool + except AttributeError as e: + raise ImportError(f"Error initializing ctypes: {e}") from None + + +def _handle_osstatus(result: OSStatus, _: typing.Any, args: typing.Any) -> typing.Any: + """ + Raises an error if the OSStatus value is non-zero. + """ + if int(result) == 0: + return args + + # Returns a CFString which we need to transform + # into a UTF-8 Python string. + error_message_cfstring = None + try: + error_message_cfstring = Security.SecCopyErrorMessageString(result, None) + + # First step is convert the CFString into a C string pointer. + # We try the fast no-copy way first. + error_message_cfstring_c_void_p = ctypes.cast( + error_message_cfstring, ctypes.POINTER(ctypes.c_void_p) + ) + message = CoreFoundation.CFStringGetCStringPtr( + error_message_cfstring_c_void_p, CFConst.kCFStringEncodingUTF8 + ) + + # Quoting the Apple dev docs: + # + # "A pointer to a C string or NULL if the internal + # storage of theString does not allow this to be + # returned efficiently." + # + # So we need to get our hands dirty. + if message is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + error_message_cfstring_c_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8, + ) + if not result: + raise OSError("Error copying C string from CFStringRef") + message = buffer.value + + finally: + if error_message_cfstring is not None: + CoreFoundation.CFRelease(error_message_cfstring) + + # If no message can be found for this status we come + # up with a generic one that forwards the status code. + if message is None or message == "": + message = f"SecureTransport operation returned a non-zero OSStatus: {result}" + + raise ssl.SSLError(message) + + +Security.SecTrustCreateWithCertificates.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustSetAnchorCertificates.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustSetAnchorCertificatesOnly.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustGetTrustResult.errcheck = _handle_osstatus # type: ignore[assignment] +Security.SecTrustEvaluate.errcheck = _handle_osstatus # type: ignore[assignment] + + +class CFConst: + """CoreFoundation constants""" + + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + errSecIncompleteCertRevocationCheck = -67635 + errSecHostNameMismatch = -67602 + errSecCertificateExpired = -67818 + errSecNotTrusted = -67843 + + +def _bytes_to_cf_data_ref(value: bytes) -> CFDataRef: # type: ignore[valid-type] + return CoreFoundation.CFDataCreate( # type: ignore[no-any-return] + CoreFoundation.kCFAllocatorDefault, value, len(value) + ) + + +def _bytes_to_cf_string(value: bytes) -> CFString: + """ + Given a Python binary data, create a CFString. + The string must be CFReleased by the caller. + """ + c_str = ctypes.c_char_p(value) + cf_str = CoreFoundation.CFStringCreateWithCString( + CoreFoundation.kCFAllocatorDefault, + c_str, + CFConst.kCFStringEncodingUTF8, + ) + return cf_str # type: ignore[no-any-return] + + +def _cf_string_ref_to_str(cf_string_ref: CFStringRef) -> str | None: # type: ignore[valid-type] + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + Yes, it annoys me quite a lot that this function is this complex. + """ + + string = CoreFoundation.CFStringGetCStringPtr( + cf_string_ref, CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + cf_string_ref, buffer, 1024, CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError("Error copying C string from CFStringRef") + string = buffer.value + if string is not None: + string = string.decode("utf-8") + return string # type: ignore[no-any-return] + + +def _der_certs_to_cf_cert_array(certs: list[bytes]) -> CFMutableArrayRef: # type: ignore[valid-type] + """Builds a CFArray of SecCertificateRefs from a list of DER-encoded certificates. + Responsibility of the caller to call CoreFoundation.CFRelease on the CFArray. + """ + cf_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + if not cf_array: + raise MemoryError("Unable to allocate memory!") + + for cert_data in certs: + cf_data = None + sec_cert_ref = None + try: + cf_data = _bytes_to_cf_data_ref(cert_data) + sec_cert_ref = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, cf_data + ) + CoreFoundation.CFArrayAppendValue(cf_array, sec_cert_ref) + finally: + if cf_data: + CoreFoundation.CFRelease(cf_data) + if sec_cert_ref: + CoreFoundation.CFRelease(sec_cert_ref) + + return cf_array # type: ignore[no-any-return] + + +@contextlib.contextmanager +def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: + check_hostname = ctx.check_hostname + verify_mode = ctx.verify_mode + ctx.check_hostname = False + _set_ssl_context_verify_mode(ctx, ssl.CERT_NONE) + try: + yield + finally: + ctx.check_hostname = check_hostname + _set_ssl_context_verify_mode(ctx, verify_mode) + + +def _verify_peercerts_impl( + ssl_context: ssl.SSLContext, + cert_chain: list[bytes], + server_hostname: str | None = None, +) -> None: + certs = None + policies = None + trust = None + try: + # Only set a hostname on the policy if we're verifying the hostname + # on the leaf certificate. + if server_hostname is not None and ssl_context.check_hostname: + cf_str_hostname = None + try: + cf_str_hostname = _bytes_to_cf_string(server_hostname.encode("ascii")) + ssl_policy = Security.SecPolicyCreateSSL(True, cf_str_hostname) + finally: + if cf_str_hostname: + CoreFoundation.CFRelease(cf_str_hostname) + else: + ssl_policy = Security.SecPolicyCreateSSL(True, None) + + policies = ssl_policy + if ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_CHAIN: + # Add explicit policy requiring positive revocation checks + policies = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + CoreFoundation.CFArrayAppendValue(policies, ssl_policy) + CoreFoundation.CFRelease(ssl_policy) + revocation_policy = Security.SecPolicyCreateRevocation( + kSecRevocationUseAnyAvailableMethod + | kSecRevocationRequirePositiveResponse + ) + CoreFoundation.CFArrayAppendValue(policies, revocation_policy) + CoreFoundation.CFRelease(revocation_policy) + elif ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_LEAF: + raise NotImplementedError("VERIFY_CRL_CHECK_LEAF not implemented for macOS") + + certs = None + try: + certs = _der_certs_to_cf_cert_array(cert_chain) + + # Now that we have certificates loaded and a SecPolicy + # we can finally create a SecTrust object! + trust = Security.SecTrustRef() + Security.SecTrustCreateWithCertificates( + certs, policies, ctypes.byref(trust) + ) + + finally: + # The certs are now being held by SecTrust so we can + # release our handles for the array. + if certs: + CoreFoundation.CFRelease(certs) + + # If there are additional trust anchors to load we need to transform + # the list of DER-encoded certificates into a CFArray. + ctx_ca_certs_der: list[bytes] | None = ssl_context.get_ca_certs( + binary_form=True + ) + if ctx_ca_certs_der: + ctx_ca_certs = None + try: + ctx_ca_certs = _der_certs_to_cf_cert_array(ctx_ca_certs_der) + Security.SecTrustSetAnchorCertificates(trust, ctx_ca_certs) + finally: + if ctx_ca_certs: + CoreFoundation.CFRelease(ctx_ca_certs) + + # We always want system certificates. + Security.SecTrustSetAnchorCertificatesOnly(trust, False) + + # macOS 10.13 and earlier don't support SecTrustEvaluateWithError() + # so we use SecTrustEvaluate() which means we need to construct error + # messages ourselves. + if _is_macos_version_10_14_or_later: + _verify_peercerts_impl_macos_10_14(ssl_context, trust) + else: + _verify_peercerts_impl_macos_10_13(ssl_context, trust) + finally: + if policies: + CoreFoundation.CFRelease(policies) + if trust: + CoreFoundation.CFRelease(trust) + + +def _verify_peercerts_impl_macos_10_13( + ssl_context: ssl.SSLContext, sec_trust_ref: typing.Any +) -> None: + """Verify using 'SecTrustEvaluate' API for macOS 10.13 and earlier. + macOS 10.14 added the 'SecTrustEvaluateWithError' API. + """ + sec_trust_result_type = Security.SecTrustResultType() + Security.SecTrustEvaluate(sec_trust_ref, ctypes.byref(sec_trust_result_type)) + + try: + sec_trust_result_type_as_int = int(sec_trust_result_type.value) + except (ValueError, TypeError): + sec_trust_result_type_as_int = -1 + + # Apple doesn't document these values in their own API docs. + # See: https://github.com/xybp888/iOS-SDKs/blob/master/iPhoneOS13.0.sdk/System/Library/Frameworks/Security.framework/Headers/SecTrust.h#L84 + if ( + ssl_context.verify_mode == ssl.CERT_REQUIRED + and sec_trust_result_type_as_int not in (1, 4) + ): + # Note that we're not able to ignore only hostname errors + # for macOS 10.13 and earlier, so check_hostname=False will + # still return an error. + sec_trust_result_type_to_message = { + 0: "Invalid trust result type", + # 1: "Trust evaluation succeeded", + 2: "User confirmation required", + 3: "User specified that certificate is not trusted", + # 4: "Trust result is unspecified", + 5: "Recoverable trust failure occurred", + 6: "Fatal trust failure occurred", + 7: "Other error occurred, certificate may be revoked", + } + error_message = sec_trust_result_type_to_message.get( + sec_trust_result_type_as_int, + f"Unknown trust result: {sec_trust_result_type_as_int}", + ) + + err = ssl.SSLCertVerificationError(error_message) + err.verify_message = error_message + err.verify_code = sec_trust_result_type_as_int + raise err + + +def _verify_peercerts_impl_macos_10_14( + ssl_context: ssl.SSLContext, sec_trust_ref: typing.Any +) -> None: + """Verify using 'SecTrustEvaluateWithError' API for macOS 10.14+.""" + cf_error = CoreFoundation.CFErrorRef() + sec_trust_eval_result = Security.SecTrustEvaluateWithError( + sec_trust_ref, ctypes.byref(cf_error) + ) + # sec_trust_eval_result is a bool (0 or 1) + # where 1 means that the certs are trusted. + if sec_trust_eval_result == 1: + is_trusted = True + elif sec_trust_eval_result == 0: + is_trusted = False + else: + raise ssl.SSLError( + f"Unknown result from Security.SecTrustEvaluateWithError: {sec_trust_eval_result!r}" + ) + + cf_error_code = 0 + if not is_trusted: + cf_error_code = CoreFoundation.CFErrorGetCode(cf_error) + + # If the error is a known failure that we're + # explicitly okay with from SSLContext configuration + # we can set is_trusted accordingly. + if ssl_context.verify_mode != ssl.CERT_REQUIRED and ( + cf_error_code == CFConst.errSecNotTrusted + or cf_error_code == CFConst.errSecCertificateExpired + ): + is_trusted = True + + # If we're still not trusted then we start to + # construct and raise the SSLCertVerificationError. + if not is_trusted: + cf_error_string_ref = None + try: + cf_error_string_ref = CoreFoundation.CFErrorCopyDescription(cf_error) + + # Can this ever return 'None' if there's a CFError? + cf_error_message = ( + _cf_string_ref_to_str(cf_error_string_ref) + or "Certificate verification failed" + ) + + # TODO: Not sure if we need the SecTrustResultType for anything? + # We only care whether or not it's a success or failure for now. + sec_trust_result_type = Security.SecTrustResultType() + Security.SecTrustGetTrustResult( + sec_trust_ref, ctypes.byref(sec_trust_result_type) + ) + + err = ssl.SSLCertVerificationError(cf_error_message) + err.verify_message = cf_error_message + err.verify_code = cf_error_code + raise err + finally: + if cf_error_string_ref: + CoreFoundation.CFRelease(cf_error_string_ref) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py new file mode 100644 index 0000000..9951cf7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py @@ -0,0 +1,66 @@ +import contextlib +import os +import re +import ssl +import typing + +# candidates based on https://github.com/tiran/certifi-system-store by Christian Heimes +_CA_FILE_CANDIDATES = [ + # Alpine, Arch, Fedora 34+, OpenWRT, RHEL 9+, BSD + "/etc/ssl/cert.pem", + # Fedora <= 34, RHEL <= 9, CentOS <= 9 + "/etc/pki/tls/cert.pem", + # Debian, Ubuntu (requires ca-certificates) + "/etc/ssl/certs/ca-certificates.crt", + # SUSE + "/etc/ssl/ca-bundle.pem", +] + +_HASHED_CERT_FILENAME_RE = re.compile(r"^[0-9a-fA-F]{8}\.[0-9]$") + + +@contextlib.contextmanager +def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: + # First, check whether the default locations from OpenSSL + # seem like they will give us a usable set of CA certs. + # ssl.get_default_verify_paths already takes care of: + # - getting cafile from either the SSL_CERT_FILE env var + # or the path configured when OpenSSL was compiled, + # and verifying that that path exists + # - getting capath from either the SSL_CERT_DIR env var + # or the path configured when OpenSSL was compiled, + # and verifying that that path exists + # In addition we'll check whether capath appears to contain certs. + defaults = ssl.get_default_verify_paths() + if defaults.cafile or (defaults.capath and _capath_contains_certs(defaults.capath)): + ctx.set_default_verify_paths() + else: + # cafile from OpenSSL doesn't exist + # and capath from OpenSSL doesn't contain certs. + # Let's search other common locations instead. + for cafile in _CA_FILE_CANDIDATES: + if os.path.isfile(cafile): + ctx.load_verify_locations(cafile=cafile) + break + + yield + + +def _capath_contains_certs(capath: str) -> bool: + """Check whether capath exists and contains certs in the expected format.""" + if not os.path.isdir(capath): + return False + for name in os.listdir(capath): + if _HASHED_CERT_FILENAME_RE.match(name): + return True + return False + + +def _verify_peercerts_impl( + ssl_context: ssl.SSLContext, + cert_chain: list[bytes], + server_hostname: str | None = None, +) -> None: + # This is a no-op because we've enabled SSLContext's built-in + # verification via verify_mode=CERT_REQUIRED, and don't need to repeat it. + pass diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py new file mode 100644 index 0000000..b1ee7a3 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py @@ -0,0 +1,31 @@ +import ssl +import sys +import typing + +# Hold on to the original class so we can create it consistently +# even if we inject our own SSLContext into the ssl module. +_original_SSLContext = ssl.SSLContext +_original_super_SSLContext = super(_original_SSLContext, _original_SSLContext) + +# CPython is known to be good, but non-CPython implementations +# may implement SSLContext differently so to be safe we don't +# subclass the SSLContext. + +# This is returned by truststore.SSLContext.__class__() +_truststore_SSLContext_dunder_class: typing.Optional[type] + +# This value is the superclass of truststore.SSLContext. +_truststore_SSLContext_super_class: type + +if sys.implementation.name == "cpython": + _truststore_SSLContext_super_class = _original_SSLContext + _truststore_SSLContext_dunder_class = None +else: + _truststore_SSLContext_super_class = object + _truststore_SSLContext_dunder_class = _original_SSLContext + + +def _set_ssl_context_verify_mode( + ssl_context: ssl.SSLContext, verify_mode: ssl.VerifyMode +) -> None: + _original_super_SSLContext.verify_mode.__set__(ssl_context, verify_mode) # type: ignore[attr-defined] diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py new file mode 100644 index 0000000..a9bf9ab --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py @@ -0,0 +1,567 @@ +import contextlib +import ssl +import typing +from ctypes import WinDLL # type: ignore +from ctypes import WinError # type: ignore +from ctypes import ( + POINTER, + Structure, + c_char_p, + c_ulong, + c_void_p, + c_wchar_p, + cast, + create_unicode_buffer, + pointer, + sizeof, +) +from ctypes.wintypes import ( + BOOL, + DWORD, + HANDLE, + LONG, + LPCSTR, + LPCVOID, + LPCWSTR, + LPFILETIME, + LPSTR, + LPWSTR, +) +from typing import TYPE_CHECKING, Any + +from ._ssl_constants import _set_ssl_context_verify_mode + +HCERTCHAINENGINE = HANDLE +HCERTSTORE = HANDLE +HCRYPTPROV_LEGACY = HANDLE + + +class CERT_CONTEXT(Structure): + _fields_ = ( + ("dwCertEncodingType", DWORD), + ("pbCertEncoded", c_void_p), + ("cbCertEncoded", DWORD), + ("pCertInfo", c_void_p), + ("hCertStore", HCERTSTORE), + ) + + +PCERT_CONTEXT = POINTER(CERT_CONTEXT) +PCCERT_CONTEXT = POINTER(PCERT_CONTEXT) + + +class CERT_ENHKEY_USAGE(Structure): + _fields_ = ( + ("cUsageIdentifier", DWORD), + ("rgpszUsageIdentifier", POINTER(LPSTR)), + ) + + +PCERT_ENHKEY_USAGE = POINTER(CERT_ENHKEY_USAGE) + + +class CERT_USAGE_MATCH(Structure): + _fields_ = ( + ("dwType", DWORD), + ("Usage", CERT_ENHKEY_USAGE), + ) + + +class CERT_CHAIN_PARA(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("RequestedUsage", CERT_USAGE_MATCH), + ("RequestedIssuancePolicy", CERT_USAGE_MATCH), + ("dwUrlRetrievalTimeout", DWORD), + ("fCheckRevocationFreshnessTime", BOOL), + ("dwRevocationFreshnessTime", DWORD), + ("pftCacheResync", LPFILETIME), + ("pStrongSignPara", c_void_p), + ("dwStrongSignFlags", DWORD), + ) + + +if TYPE_CHECKING: + PCERT_CHAIN_PARA = pointer[CERT_CHAIN_PARA] # type: ignore[misc] +else: + PCERT_CHAIN_PARA = POINTER(CERT_CHAIN_PARA) + + +class CERT_TRUST_STATUS(Structure): + _fields_ = ( + ("dwErrorStatus", DWORD), + ("dwInfoStatus", DWORD), + ) + + +class CERT_CHAIN_ELEMENT(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("pCertContext", PCERT_CONTEXT), + ("TrustStatus", CERT_TRUST_STATUS), + ("pRevocationInfo", c_void_p), + ("pIssuanceUsage", PCERT_ENHKEY_USAGE), + ("pApplicationUsage", PCERT_ENHKEY_USAGE), + ("pwszExtendedErrorInfo", LPCWSTR), + ) + + +PCERT_CHAIN_ELEMENT = POINTER(CERT_CHAIN_ELEMENT) + + +class CERT_SIMPLE_CHAIN(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("TrustStatus", CERT_TRUST_STATUS), + ("cElement", DWORD), + ("rgpElement", POINTER(PCERT_CHAIN_ELEMENT)), + ("pTrustListInfo", c_void_p), + ("fHasRevocationFreshnessTime", BOOL), + ("dwRevocationFreshnessTime", DWORD), + ) + + +PCERT_SIMPLE_CHAIN = POINTER(CERT_SIMPLE_CHAIN) + + +class CERT_CHAIN_CONTEXT(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("TrustStatus", CERT_TRUST_STATUS), + ("cChain", DWORD), + ("rgpChain", POINTER(PCERT_SIMPLE_CHAIN)), + ("cLowerQualityChainContext", DWORD), + ("rgpLowerQualityChainContext", c_void_p), + ("fHasRevocationFreshnessTime", BOOL), + ("dwRevocationFreshnessTime", DWORD), + ) + + +PCERT_CHAIN_CONTEXT = POINTER(CERT_CHAIN_CONTEXT) +PCCERT_CHAIN_CONTEXT = POINTER(PCERT_CHAIN_CONTEXT) + + +class SSL_EXTRA_CERT_CHAIN_POLICY_PARA(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("dwAuthType", DWORD), + ("fdwChecks", DWORD), + ("pwszServerName", LPCWSTR), + ) + + +class CERT_CHAIN_POLICY_PARA(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("dwFlags", DWORD), + ("pvExtraPolicyPara", c_void_p), + ) + + +PCERT_CHAIN_POLICY_PARA = POINTER(CERT_CHAIN_POLICY_PARA) + + +class CERT_CHAIN_POLICY_STATUS(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("dwError", DWORD), + ("lChainIndex", LONG), + ("lElementIndex", LONG), + ("pvExtraPolicyStatus", c_void_p), + ) + + +PCERT_CHAIN_POLICY_STATUS = POINTER(CERT_CHAIN_POLICY_STATUS) + + +class CERT_CHAIN_ENGINE_CONFIG(Structure): + _fields_ = ( + ("cbSize", DWORD), + ("hRestrictedRoot", HCERTSTORE), + ("hRestrictedTrust", HCERTSTORE), + ("hRestrictedOther", HCERTSTORE), + ("cAdditionalStore", DWORD), + ("rghAdditionalStore", c_void_p), + ("dwFlags", DWORD), + ("dwUrlRetrievalTimeout", DWORD), + ("MaximumCachedCertificates", DWORD), + ("CycleDetectionModulus", DWORD), + ("hExclusiveRoot", HCERTSTORE), + ("hExclusiveTrustedPeople", HCERTSTORE), + ("dwExclusiveFlags", DWORD), + ) + + +PCERT_CHAIN_ENGINE_CONFIG = POINTER(CERT_CHAIN_ENGINE_CONFIG) +PHCERTCHAINENGINE = POINTER(HCERTCHAINENGINE) + +X509_ASN_ENCODING = 0x00000001 +PKCS_7_ASN_ENCODING = 0x00010000 +CERT_STORE_PROV_MEMORY = b"Memory" +CERT_STORE_ADD_USE_EXISTING = 2 +USAGE_MATCH_TYPE_OR = 1 +OID_PKIX_KP_SERVER_AUTH = c_char_p(b"1.3.6.1.5.5.7.3.1") +CERT_CHAIN_REVOCATION_CHECK_END_CERT = 0x10000000 +CERT_CHAIN_REVOCATION_CHECK_CHAIN = 0x20000000 +CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS = 0x00000007 +CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG = 0x00000008 +CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG = 0x00000010 +CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG = 0x00000040 +CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG = 0x00000020 +CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG = 0x00000080 +CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS = 0x00000F00 +CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG = 0x00008000 +CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG = 0x00004000 +SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000 +AUTHTYPE_SERVER = 2 +CERT_CHAIN_POLICY_SSL = 4 +FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000 +FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200 + +# Flags to set for SSLContext.verify_mode=CERT_NONE +CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGS = ( + CERT_CHAIN_POLICY_IGNORE_ALL_NOT_TIME_VALID_FLAGS + | CERT_CHAIN_POLICY_IGNORE_INVALID_BASIC_CONSTRAINTS_FLAG + | CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG + | CERT_CHAIN_POLICY_IGNORE_INVALID_NAME_FLAG + | CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG + | CERT_CHAIN_POLICY_IGNORE_INVALID_POLICY_FLAG + | CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS + | CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG + | CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG +) + +wincrypt = WinDLL("crypt32.dll") +kernel32 = WinDLL("kernel32.dll") + + +def _handle_win_error(result: bool, _: Any, args: Any) -> Any: + if not result: + # Note, actually raises OSError after calling GetLastError and FormatMessage + raise WinError() + return args + + +CertCreateCertificateChainEngine = wincrypt.CertCreateCertificateChainEngine +CertCreateCertificateChainEngine.argtypes = ( + PCERT_CHAIN_ENGINE_CONFIG, + PHCERTCHAINENGINE, +) +CertCreateCertificateChainEngine.errcheck = _handle_win_error + +CertOpenStore = wincrypt.CertOpenStore +CertOpenStore.argtypes = (LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, c_void_p) +CertOpenStore.restype = HCERTSTORE +CertOpenStore.errcheck = _handle_win_error + +CertAddEncodedCertificateToStore = wincrypt.CertAddEncodedCertificateToStore +CertAddEncodedCertificateToStore.argtypes = ( + HCERTSTORE, + DWORD, + c_char_p, + DWORD, + DWORD, + PCCERT_CONTEXT, +) +CertAddEncodedCertificateToStore.restype = BOOL + +CertCreateCertificateContext = wincrypt.CertCreateCertificateContext +CertCreateCertificateContext.argtypes = (DWORD, c_char_p, DWORD) +CertCreateCertificateContext.restype = PCERT_CONTEXT +CertCreateCertificateContext.errcheck = _handle_win_error + +CertGetCertificateChain = wincrypt.CertGetCertificateChain +CertGetCertificateChain.argtypes = ( + HCERTCHAINENGINE, + PCERT_CONTEXT, + LPFILETIME, + HCERTSTORE, + PCERT_CHAIN_PARA, + DWORD, + c_void_p, + PCCERT_CHAIN_CONTEXT, +) +CertGetCertificateChain.restype = BOOL +CertGetCertificateChain.errcheck = _handle_win_error + +CertVerifyCertificateChainPolicy = wincrypt.CertVerifyCertificateChainPolicy +CertVerifyCertificateChainPolicy.argtypes = ( + c_ulong, + PCERT_CHAIN_CONTEXT, + PCERT_CHAIN_POLICY_PARA, + PCERT_CHAIN_POLICY_STATUS, +) +CertVerifyCertificateChainPolicy.restype = BOOL + +CertCloseStore = wincrypt.CertCloseStore +CertCloseStore.argtypes = (HCERTSTORE, DWORD) +CertCloseStore.restype = BOOL +CertCloseStore.errcheck = _handle_win_error + +CertFreeCertificateChain = wincrypt.CertFreeCertificateChain +CertFreeCertificateChain.argtypes = (PCERT_CHAIN_CONTEXT,) + +CertFreeCertificateContext = wincrypt.CertFreeCertificateContext +CertFreeCertificateContext.argtypes = (PCERT_CONTEXT,) + +CertFreeCertificateChainEngine = wincrypt.CertFreeCertificateChainEngine +CertFreeCertificateChainEngine.argtypes = (HCERTCHAINENGINE,) + +FormatMessageW = kernel32.FormatMessageW +FormatMessageW.argtypes = ( + DWORD, + LPCVOID, + DWORD, + DWORD, + LPWSTR, + DWORD, + c_void_p, +) +FormatMessageW.restype = DWORD + + +def _verify_peercerts_impl( + ssl_context: ssl.SSLContext, + cert_chain: list[bytes], + server_hostname: str | None = None, +) -> None: + """Verify the cert_chain from the server using Windows APIs.""" + + # If the peer didn't send any certificates then + # we can't do verification. Raise an error. + if not cert_chain: + raise ssl.SSLCertVerificationError("Peer sent no certificates to verify") + + pCertContext = None + hIntermediateCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None) + try: + # Add intermediate certs to an in-memory cert store + for cert_bytes in cert_chain[1:]: + CertAddEncodedCertificateToStore( + hIntermediateCertStore, + X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, + cert_bytes, + len(cert_bytes), + CERT_STORE_ADD_USE_EXISTING, + None, + ) + + # Cert context for leaf cert + leaf_cert = cert_chain[0] + pCertContext = CertCreateCertificateContext( + X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, leaf_cert, len(leaf_cert) + ) + + # Chain params to match certs for serverAuth extended usage + cert_enhkey_usage = CERT_ENHKEY_USAGE() + cert_enhkey_usage.cUsageIdentifier = 1 + cert_enhkey_usage.rgpszUsageIdentifier = (c_char_p * 1)(OID_PKIX_KP_SERVER_AUTH) + cert_usage_match = CERT_USAGE_MATCH() + cert_usage_match.Usage = cert_enhkey_usage + chain_params = CERT_CHAIN_PARA() + chain_params.RequestedUsage = cert_usage_match + chain_params.cbSize = sizeof(chain_params) + pChainPara = pointer(chain_params) + + if ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_CHAIN: + chain_flags = CERT_CHAIN_REVOCATION_CHECK_CHAIN + elif ssl_context.verify_flags & ssl.VERIFY_CRL_CHECK_LEAF: + chain_flags = CERT_CHAIN_REVOCATION_CHECK_END_CERT + else: + chain_flags = 0 + + try: + # First attempt to verify using the default Windows system trust roots + # (default chain engine). + _get_and_verify_cert_chain( + ssl_context, + None, + hIntermediateCertStore, + pCertContext, + pChainPara, + server_hostname, + chain_flags=chain_flags, + ) + except ssl.SSLCertVerificationError as e: + # If that fails but custom CA certs have been added + # to the SSLContext using load_verify_locations, + # try verifying using a custom chain engine + # that trusts the custom CA certs. + custom_ca_certs: list[bytes] | None = ssl_context.get_ca_certs( + binary_form=True + ) + if custom_ca_certs: + try: + _verify_using_custom_ca_certs( + ssl_context, + custom_ca_certs, + hIntermediateCertStore, + pCertContext, + pChainPara, + server_hostname, + chain_flags=chain_flags, + ) + # Raise the original error, not the new error. + except ssl.SSLCertVerificationError: + raise e from None + else: + raise + finally: + CertCloseStore(hIntermediateCertStore, 0) + if pCertContext: + CertFreeCertificateContext(pCertContext) + + +def _get_and_verify_cert_chain( + ssl_context: ssl.SSLContext, + hChainEngine: HCERTCHAINENGINE | None, + hIntermediateCertStore: HCERTSTORE, + pPeerCertContext: c_void_p, + pChainPara: PCERT_CHAIN_PARA, # type: ignore[valid-type] + server_hostname: str | None, + chain_flags: int, +) -> None: + ppChainContext = None + try: + # Get cert chain + ppChainContext = pointer(PCERT_CHAIN_CONTEXT()) + CertGetCertificateChain( + hChainEngine, # chain engine + pPeerCertContext, # leaf cert context + None, # current system time + hIntermediateCertStore, # additional in-memory cert store + pChainPara, # chain-building parameters + chain_flags, + None, # reserved + ppChainContext, # the resulting chain context + ) + pChainContext = ppChainContext.contents + + # Verify cert chain + ssl_extra_cert_chain_policy_para = SSL_EXTRA_CERT_CHAIN_POLICY_PARA() + ssl_extra_cert_chain_policy_para.cbSize = sizeof( + ssl_extra_cert_chain_policy_para + ) + ssl_extra_cert_chain_policy_para.dwAuthType = AUTHTYPE_SERVER + ssl_extra_cert_chain_policy_para.fdwChecks = 0 + if ssl_context.check_hostname is False: + ssl_extra_cert_chain_policy_para.fdwChecks = ( + SECURITY_FLAG_IGNORE_CERT_CN_INVALID + ) + if server_hostname: + ssl_extra_cert_chain_policy_para.pwszServerName = c_wchar_p(server_hostname) + + chain_policy = CERT_CHAIN_POLICY_PARA() + chain_policy.pvExtraPolicyPara = cast( + pointer(ssl_extra_cert_chain_policy_para), c_void_p + ) + if ssl_context.verify_mode == ssl.CERT_NONE: + chain_policy.dwFlags |= CERT_CHAIN_POLICY_VERIFY_MODE_NONE_FLAGS + chain_policy.cbSize = sizeof(chain_policy) + + pPolicyPara = pointer(chain_policy) + policy_status = CERT_CHAIN_POLICY_STATUS() + policy_status.cbSize = sizeof(policy_status) + pPolicyStatus = pointer(policy_status) + CertVerifyCertificateChainPolicy( + CERT_CHAIN_POLICY_SSL, + pChainContext, + pPolicyPara, + pPolicyStatus, + ) + + # Check status + error_code = policy_status.dwError + if error_code: + # Try getting a human readable message for an error code. + error_message_buf = create_unicode_buffer(1024) + error_message_chars = FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + None, + error_code, + 0, + error_message_buf, + sizeof(error_message_buf), + None, + ) + + # See if we received a message for the error, + # otherwise we use a generic error with the + # error code and hope that it's search-able. + if error_message_chars <= 0: + error_message = f"Certificate chain policy error {error_code:#x} [{policy_status.lElementIndex}]" + else: + error_message = error_message_buf.value.strip() + + err = ssl.SSLCertVerificationError(error_message) + err.verify_message = error_message + err.verify_code = error_code + raise err from None + finally: + if ppChainContext: + CertFreeCertificateChain(ppChainContext.contents) + + +def _verify_using_custom_ca_certs( + ssl_context: ssl.SSLContext, + custom_ca_certs: list[bytes], + hIntermediateCertStore: HCERTSTORE, + pPeerCertContext: c_void_p, + pChainPara: PCERT_CHAIN_PARA, # type: ignore[valid-type] + server_hostname: str | None, + chain_flags: int, +) -> None: + hChainEngine = None + hRootCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, None, 0, None) + try: + # Add custom CA certs to an in-memory cert store + for cert_bytes in custom_ca_certs: + CertAddEncodedCertificateToStore( + hRootCertStore, + X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, + cert_bytes, + len(cert_bytes), + CERT_STORE_ADD_USE_EXISTING, + None, + ) + + # Create a custom cert chain engine which exclusively trusts + # certs from our hRootCertStore + cert_chain_engine_config = CERT_CHAIN_ENGINE_CONFIG() + cert_chain_engine_config.cbSize = sizeof(cert_chain_engine_config) + cert_chain_engine_config.hExclusiveRoot = hRootCertStore + pConfig = pointer(cert_chain_engine_config) + phChainEngine = pointer(HCERTCHAINENGINE()) + CertCreateCertificateChainEngine( + pConfig, + phChainEngine, + ) + hChainEngine = phChainEngine.contents + + # Get and verify a cert chain using the custom chain engine + _get_and_verify_cert_chain( + ssl_context, + hChainEngine, + hIntermediateCertStore, + pPeerCertContext, + pChainPara, + server_hostname, + chain_flags, + ) + finally: + if hChainEngine: + CertFreeCertificateChainEngine(hChainEngine) + CertCloseStore(hRootCertStore, 0) + + +@contextlib.contextmanager +def _configure_context(ctx: ssl.SSLContext) -> typing.Iterator[None]: + check_hostname = ctx.check_hostname + verify_mode = ctx.verify_mode + ctx.check_hostname = False + _set_ssl_context_verify_mode(ctx, ssl.CERT_NONE) + try: + yield + finally: + ctx.check_hostname = check_hostname + _set_ssl_context_verify_mode(ctx, verify_mode) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed b/env/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py b/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py new file mode 100644 index 0000000..e429384 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py @@ -0,0 +1,3641 @@ +import abc +import collections +import collections.abc +import contextlib +import functools +import inspect +import operator +import sys +import types as _types +import typing +import warnings + +__all__ = [ + # Super-special typing primitives. + 'Any', + 'ClassVar', + 'Concatenate', + 'Final', + 'LiteralString', + 'ParamSpec', + 'ParamSpecArgs', + 'ParamSpecKwargs', + 'Self', + 'Type', + 'TypeVar', + 'TypeVarTuple', + 'Unpack', + + # ABCs (from collections.abc). + 'Awaitable', + 'AsyncIterator', + 'AsyncIterable', + 'Coroutine', + 'AsyncGenerator', + 'AsyncContextManager', + 'Buffer', + 'ChainMap', + + # Concrete collection types. + 'ContextManager', + 'Counter', + 'Deque', + 'DefaultDict', + 'NamedTuple', + 'OrderedDict', + 'TypedDict', + + # Structural checks, a.k.a. protocols. + 'SupportsAbs', + 'SupportsBytes', + 'SupportsComplex', + 'SupportsFloat', + 'SupportsIndex', + 'SupportsInt', + 'SupportsRound', + + # One-off things. + 'Annotated', + 'assert_never', + 'assert_type', + 'clear_overloads', + 'dataclass_transform', + 'deprecated', + 'Doc', + 'get_overloads', + 'final', + 'get_args', + 'get_origin', + 'get_original_bases', + 'get_protocol_members', + 'get_type_hints', + 'IntVar', + 'is_protocol', + 'is_typeddict', + 'Literal', + 'NewType', + 'overload', + 'override', + 'Protocol', + 'reveal_type', + 'runtime', + 'runtime_checkable', + 'Text', + 'TypeAlias', + 'TypeAliasType', + 'TypeGuard', + 'TypeIs', + 'TYPE_CHECKING', + 'Never', + 'NoReturn', + 'ReadOnly', + 'Required', + 'NotRequired', + + # Pure aliases, have always been in typing + 'AbstractSet', + 'AnyStr', + 'BinaryIO', + 'Callable', + 'Collection', + 'Container', + 'Dict', + 'ForwardRef', + 'FrozenSet', + 'Generator', + 'Generic', + 'Hashable', + 'IO', + 'ItemsView', + 'Iterable', + 'Iterator', + 'KeysView', + 'List', + 'Mapping', + 'MappingView', + 'Match', + 'MutableMapping', + 'MutableSequence', + 'MutableSet', + 'NoDefault', + 'Optional', + 'Pattern', + 'Reversible', + 'Sequence', + 'Set', + 'Sized', + 'TextIO', + 'Tuple', + 'Union', + 'ValuesView', + 'cast', + 'no_type_check', + 'no_type_check_decorator', +] + +# for backward compatibility +PEP_560 = True +GenericMeta = type +_PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta") + +# The functions below are modified copies of typing internal helpers. +# They are needed by _ProtocolMeta and they provide support for PEP 646. + + +class _Sentinel: + def __repr__(self): + return "" + + +_marker = _Sentinel() + + +if sys.version_info >= (3, 10): + def _should_collect_from_parameters(t): + return isinstance( + t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType) + ) +elif sys.version_info >= (3, 9): + def _should_collect_from_parameters(t): + return isinstance(t, (typing._GenericAlias, _types.GenericAlias)) +else: + def _should_collect_from_parameters(t): + return isinstance(t, typing._GenericAlias) and not t._special + + +NoReturn = typing.NoReturn + +# Some unconstrained type variables. These are used by the container types. +# (These are not for export.) +T = typing.TypeVar('T') # Any type. +KT = typing.TypeVar('KT') # Key type. +VT = typing.TypeVar('VT') # Value type. +T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. +T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. + + +if sys.version_info >= (3, 11): + from typing import Any +else: + + class _AnyMeta(type): + def __instancecheck__(self, obj): + if self is Any: + raise TypeError("typing_extensions.Any cannot be used with isinstance()") + return super().__instancecheck__(obj) + + def __repr__(self): + if self is Any: + return "typing_extensions.Any" + return super().__repr__() + + class Any(metaclass=_AnyMeta): + """Special type indicating an unconstrained type. + - Any is compatible with every type. + - Any assumed to have all methods. + - All values assumed to be instances of Any. + Note that all the above statements are true from the point of view of + static type checkers. At runtime, Any should not be used with instance + checks. + """ + def __new__(cls, *args, **kwargs): + if cls is Any: + raise TypeError("Any cannot be instantiated") + return super().__new__(cls, *args, **kwargs) + + +ClassVar = typing.ClassVar + + +class _ExtensionsSpecialForm(typing._SpecialForm, _root=True): + def __repr__(self): + return 'typing_extensions.' + self._name + + +Final = typing.Final + +if sys.version_info >= (3, 11): + final = typing.final +else: + # @final exists in 3.8+, but we backport it for all versions + # before 3.11 to keep support for the __final__ attribute. + # See https://bugs.python.org/issue46342 + def final(f): + """This decorator can be used to indicate to type checkers that + the decorated method cannot be overridden, and decorated class + cannot be subclassed. For example: + + class Base: + @final + def done(self) -> None: + ... + class Sub(Base): + def done(self) -> None: # Error reported by type checker + ... + @final + class Leaf: + ... + class Other(Leaf): # Error reported by type checker + ... + + There is no runtime checking of these properties. The decorator + sets the ``__final__`` attribute to ``True`` on the decorated object + to allow runtime introspection. + """ + try: + f.__final__ = True + except (AttributeError, TypeError): + # Skip the attribute silently if it is not writable. + # AttributeError happens if the object has __slots__ or a + # read-only property, TypeError if it's a builtin class. + pass + return f + + +def IntVar(name): + return typing.TypeVar(name) + + +# A Literal bug was fixed in 3.11.0, 3.10.1 and 3.9.8 +if sys.version_info >= (3, 10, 1): + Literal = typing.Literal +else: + def _flatten_literal_params(parameters): + """An internal helper for Literal creation: flatten Literals among parameters""" + params = [] + for p in parameters: + if isinstance(p, _LiteralGenericAlias): + params.extend(p.__args__) + else: + params.append(p) + return tuple(params) + + def _value_and_type_iter(params): + for p in params: + yield p, type(p) + + class _LiteralGenericAlias(typing._GenericAlias, _root=True): + def __eq__(self, other): + if not isinstance(other, _LiteralGenericAlias): + return NotImplemented + these_args_deduped = set(_value_and_type_iter(self.__args__)) + other_args_deduped = set(_value_and_type_iter(other.__args__)) + return these_args_deduped == other_args_deduped + + def __hash__(self): + return hash(frozenset(_value_and_type_iter(self.__args__))) + + class _LiteralForm(_ExtensionsSpecialForm, _root=True): + def __init__(self, doc: str): + self._name = 'Literal' + self._doc = self.__doc__ = doc + + def __getitem__(self, parameters): + if not isinstance(parameters, tuple): + parameters = (parameters,) + + parameters = _flatten_literal_params(parameters) + + val_type_pairs = list(_value_and_type_iter(parameters)) + try: + deduped_pairs = set(val_type_pairs) + except TypeError: + # unhashable parameters + pass + else: + # similar logic to typing._deduplicate on Python 3.9+ + if len(deduped_pairs) < len(val_type_pairs): + new_parameters = [] + for pair in val_type_pairs: + if pair in deduped_pairs: + new_parameters.append(pair[0]) + deduped_pairs.remove(pair) + assert not deduped_pairs, deduped_pairs + parameters = tuple(new_parameters) + + return _LiteralGenericAlias(self, parameters) + + Literal = _LiteralForm(doc="""\ + A type that can be used to indicate to type checkers + that the corresponding value has a value literally equivalent + to the provided parameter. For example: + + var: Literal[4] = 4 + + The type checker understands that 'var' is literally equal to + the value 4 and no other value. + + Literal[...] cannot be subclassed. There is no runtime + checking verifying that the parameter is actually a value + instead of a type.""") + + +_overload_dummy = typing._overload_dummy + + +if hasattr(typing, "get_overloads"): # 3.11+ + overload = typing.overload + get_overloads = typing.get_overloads + clear_overloads = typing.clear_overloads +else: + # {module: {qualname: {firstlineno: func}}} + _overload_registry = collections.defaultdict( + functools.partial(collections.defaultdict, dict) + ) + + def overload(func): + """Decorator for overloaded functions/methods. + + In a stub file, place two or more stub definitions for the same + function in a row, each decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + + In a non-stub file (i.e. a regular .py file), do the same but + follow it with an implementation. The implementation should *not* + be decorated with @overload. For example: + + @overload + def utf8(value: None) -> None: ... + @overload + def utf8(value: bytes) -> bytes: ... + @overload + def utf8(value: str) -> bytes: ... + def utf8(value): + # implementation goes here + + The overloads for a function can be retrieved at runtime using the + get_overloads() function. + """ + # classmethod and staticmethod + f = getattr(func, "__func__", func) + try: + _overload_registry[f.__module__][f.__qualname__][ + f.__code__.co_firstlineno + ] = func + except AttributeError: + # Not a normal function; ignore. + pass + return _overload_dummy + + def get_overloads(func): + """Return all defined overloads for *func* as a sequence.""" + # classmethod and staticmethod + f = getattr(func, "__func__", func) + if f.__module__ not in _overload_registry: + return [] + mod_dict = _overload_registry[f.__module__] + if f.__qualname__ not in mod_dict: + return [] + return list(mod_dict[f.__qualname__].values()) + + def clear_overloads(): + """Clear all overloads in the registry.""" + _overload_registry.clear() + + +# This is not a real generic class. Don't use outside annotations. +Type = typing.Type + +# Various ABCs mimicking those in collections.abc. +# A few are simply re-exported for completeness. +Awaitable = typing.Awaitable +Coroutine = typing.Coroutine +AsyncIterable = typing.AsyncIterable +AsyncIterator = typing.AsyncIterator +Deque = typing.Deque +DefaultDict = typing.DefaultDict +OrderedDict = typing.OrderedDict +Counter = typing.Counter +ChainMap = typing.ChainMap +Text = typing.Text +TYPE_CHECKING = typing.TYPE_CHECKING + + +if sys.version_info >= (3, 13, 0, "beta"): + from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generator +else: + def _is_dunder(attr): + return attr.startswith('__') and attr.endswith('__') + + # Python <3.9 doesn't have typing._SpecialGenericAlias + _special_generic_alias_base = getattr( + typing, "_SpecialGenericAlias", typing._GenericAlias + ) + + class _SpecialGenericAlias(_special_generic_alias_base, _root=True): + def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()): + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + self.__origin__ = origin + self._nparams = nparams + super().__init__(origin, nparams, special=True, inst=inst, name=name) + else: + # Python >= 3.9 + super().__init__(origin, nparams, inst=inst, name=name) + self._defaults = defaults + + def __setattr__(self, attr, val): + allowed_attrs = {'_name', '_inst', '_nparams', '_defaults'} + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + allowed_attrs.add("__origin__") + if _is_dunder(attr) or attr in allowed_attrs: + object.__setattr__(self, attr, val) + else: + setattr(self.__origin__, attr, val) + + @typing._tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + msg = "Parameters to generic types must be types." + params = tuple(typing._type_check(p, msg) for p in params) + if ( + self._defaults + and len(params) < self._nparams + and len(params) + len(self._defaults) >= self._nparams + ): + params = (*params, *self._defaults[len(params) - self._nparams:]) + actual_len = len(params) + + if actual_len != self._nparams: + if self._defaults: + expected = f"at least {self._nparams - len(self._defaults)}" + else: + expected = str(self._nparams) + if not self._nparams: + raise TypeError(f"{self} is not a generic class") + raise TypeError( + f"Too {'many' if actual_len > self._nparams else 'few'}" + f" arguments for {self};" + f" actual {actual_len}, expected {expected}" + ) + return self.copy_with(params) + + _NoneType = type(None) + Generator = _SpecialGenericAlias( + collections.abc.Generator, 3, defaults=(_NoneType, _NoneType) + ) + AsyncGenerator = _SpecialGenericAlias( + collections.abc.AsyncGenerator, 2, defaults=(_NoneType,) + ) + ContextManager = _SpecialGenericAlias( + contextlib.AbstractContextManager, + 2, + name="ContextManager", + defaults=(typing.Optional[bool],) + ) + AsyncContextManager = _SpecialGenericAlias( + contextlib.AbstractAsyncContextManager, + 2, + name="AsyncContextManager", + defaults=(typing.Optional[bool],) + ) + + +_PROTO_ALLOWLIST = { + 'collections.abc': [ + 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', + 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer', + ], + 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'], + 'typing_extensions': ['Buffer'], +} + + +_EXCLUDED_ATTRS = frozenset(typing.EXCLUDED_ATTRIBUTES) | { + "__match_args__", "__protocol_attrs__", "__non_callable_proto_members__", + "__final__", +} + + +def _get_protocol_attrs(cls): + attrs = set() + for base in cls.__mro__[:-1]: # without object + if base.__name__ in {'Protocol', 'Generic'}: + continue + annotations = getattr(base, '__annotations__', {}) + for attr in (*base.__dict__, *annotations): + if (not attr.startswith('_abc_') and attr not in _EXCLUDED_ATTRS): + attrs.add(attr) + return attrs + + +def _caller(depth=2): + try: + return sys._getframe(depth).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): # For platforms without _getframe() + return None + + +# `__match_args__` attribute was removed from protocol members in 3.13, +# we want to backport this change to older Python versions. +if sys.version_info >= (3, 13): + Protocol = typing.Protocol +else: + def _allow_reckless_class_checks(depth=3): + """Allow instance and class checks for special stdlib modules. + The abc and functools modules indiscriminately call isinstance() and + issubclass() on the whole MRO of a user class, which may contain protocols. + """ + return _caller(depth) in {'abc', 'functools', None} + + def _no_init(self, *args, **kwargs): + if type(self)._is_protocol: + raise TypeError('Protocols cannot be instantiated') + + def _type_check_issubclass_arg_1(arg): + """Raise TypeError if `arg` is not an instance of `type` + in `issubclass(arg, )`. + + In most cases, this is verified by type.__subclasscheck__. + Checking it again unnecessarily would slow down issubclass() checks, + so, we don't perform this check unless we absolutely have to. + + For various error paths, however, + we want to ensure that *this* error message is shown to the user + where relevant, rather than a typing.py-specific error message. + """ + if not isinstance(arg, type): + # Same error message as for issubclass(1, int). + raise TypeError('issubclass() arg 1 must be a class') + + # Inheriting from typing._ProtocolMeta isn't actually desirable, + # but is necessary to allow typing.Protocol and typing_extensions.Protocol + # to mix without getting TypeErrors about "metaclass conflict" + class _ProtocolMeta(type(typing.Protocol)): + # This metaclass is somewhat unfortunate, + # but is necessary for several reasons... + # + # NOTE: DO NOT call super() in any methods in this class + # That would call the methods on typing._ProtocolMeta on Python 3.8-3.11 + # and those are slow + def __new__(mcls, name, bases, namespace, **kwargs): + if name == "Protocol" and len(bases) < 2: + pass + elif {Protocol, typing.Protocol} & set(bases): + for base in bases: + if not ( + base in {object, typing.Generic, Protocol, typing.Protocol} + or base.__name__ in _PROTO_ALLOWLIST.get(base.__module__, []) + or is_protocol(base) + ): + raise TypeError( + f"Protocols can only inherit from other protocols, " + f"got {base!r}" + ) + return abc.ABCMeta.__new__(mcls, name, bases, namespace, **kwargs) + + def __init__(cls, *args, **kwargs): + abc.ABCMeta.__init__(cls, *args, **kwargs) + if getattr(cls, "_is_protocol", False): + cls.__protocol_attrs__ = _get_protocol_attrs(cls) + + def __subclasscheck__(cls, other): + if cls is Protocol: + return type.__subclasscheck__(cls, other) + if ( + getattr(cls, '_is_protocol', False) + and not _allow_reckless_class_checks() + ): + if not getattr(cls, '_is_runtime_protocol', False): + _type_check_issubclass_arg_1(other) + raise TypeError( + "Instance and class checks can only be used with " + "@runtime_checkable protocols" + ) + if ( + # this attribute is set by @runtime_checkable: + cls.__non_callable_proto_members__ + and cls.__dict__.get("__subclasshook__") is _proto_hook + ): + _type_check_issubclass_arg_1(other) + non_method_attrs = sorted(cls.__non_callable_proto_members__) + raise TypeError( + "Protocols with non-method members don't support issubclass()." + f" Non-method members: {str(non_method_attrs)[1:-1]}." + ) + return abc.ABCMeta.__subclasscheck__(cls, other) + + def __instancecheck__(cls, instance): + # We need this method for situations where attributes are + # assigned in __init__. + if cls is Protocol: + return type.__instancecheck__(cls, instance) + if not getattr(cls, "_is_protocol", False): + # i.e., it's a concrete subclass of a protocol + return abc.ABCMeta.__instancecheck__(cls, instance) + + if ( + not getattr(cls, '_is_runtime_protocol', False) and + not _allow_reckless_class_checks() + ): + raise TypeError("Instance and class checks can only be used with" + " @runtime_checkable protocols") + + if abc.ABCMeta.__instancecheck__(cls, instance): + return True + + for attr in cls.__protocol_attrs__: + try: + val = inspect.getattr_static(instance, attr) + except AttributeError: + break + # this attribute is set by @runtime_checkable: + if val is None and attr not in cls.__non_callable_proto_members__: + break + else: + return True + + return False + + def __eq__(cls, other): + # Hack so that typing.Generic.__class_getitem__ + # treats typing_extensions.Protocol + # as equivalent to typing.Protocol + if abc.ABCMeta.__eq__(cls, other) is True: + return True + return cls is Protocol and other is typing.Protocol + + # This has to be defined, or the abc-module cache + # complains about classes with this metaclass being unhashable, + # if we define only __eq__! + def __hash__(cls) -> int: + return type.__hash__(cls) + + @classmethod + def _proto_hook(cls, other): + if not cls.__dict__.get('_is_protocol', False): + return NotImplemented + + for attr in cls.__protocol_attrs__: + for base in other.__mro__: + # Check if the members appears in the class dictionary... + if attr in base.__dict__: + if base.__dict__[attr] is None: + return NotImplemented + break + + # ...or in annotations, if it is a sub-protocol. + annotations = getattr(base, '__annotations__', {}) + if ( + isinstance(annotations, collections.abc.Mapping) + and attr in annotations + and is_protocol(other) + ): + break + else: + return NotImplemented + return True + + class Protocol(typing.Generic, metaclass=_ProtocolMeta): + __doc__ = typing.Protocol.__doc__ + __slots__ = () + _is_protocol = True + _is_runtime_protocol = False + + def __init_subclass__(cls, *args, **kwargs): + super().__init_subclass__(*args, **kwargs) + + # Determine if this is a protocol or a concrete subclass. + if not cls.__dict__.get('_is_protocol', False): + cls._is_protocol = any(b is Protocol for b in cls.__bases__) + + # Set (or override) the protocol subclass hook. + if '__subclasshook__' not in cls.__dict__: + cls.__subclasshook__ = _proto_hook + + # Prohibit instantiation for protocol classes + if cls._is_protocol and cls.__init__ is Protocol.__init__: + cls.__init__ = _no_init + + +if sys.version_info >= (3, 13): + runtime_checkable = typing.runtime_checkable +else: + def runtime_checkable(cls): + """Mark a protocol class as a runtime protocol. + + Such protocol can be used with isinstance() and issubclass(). + Raise TypeError if applied to a non-protocol class. + This allows a simple-minded structural check very similar to + one trick ponies in collections.abc such as Iterable. + + For example:: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + Warning: this will check only the presence of the required methods, + not their type signatures! + """ + if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False): + raise TypeError(f'@runtime_checkable can be only applied to protocol classes,' + f' got {cls!r}') + cls._is_runtime_protocol = True + + # typing.Protocol classes on <=3.11 break if we execute this block, + # because typing.Protocol classes on <=3.11 don't have a + # `__protocol_attrs__` attribute, and this block relies on the + # `__protocol_attrs__` attribute. Meanwhile, typing.Protocol classes on 3.12.2+ + # break if we *don't* execute this block, because *they* assume that all + # protocol classes have a `__non_callable_proto_members__` attribute + # (which this block sets) + if isinstance(cls, _ProtocolMeta) or sys.version_info >= (3, 12, 2): + # PEP 544 prohibits using issubclass() + # with protocols that have non-method members. + # See gh-113320 for why we compute this attribute here, + # rather than in `_ProtocolMeta.__init__` + cls.__non_callable_proto_members__ = set() + for attr in cls.__protocol_attrs__: + try: + is_callable = callable(getattr(cls, attr, None)) + except Exception as e: + raise TypeError( + f"Failed to determine whether protocol member {attr!r} " + "is a method member" + ) from e + else: + if not is_callable: + cls.__non_callable_proto_members__.add(attr) + + return cls + + +# The "runtime" alias exists for backwards compatibility. +runtime = runtime_checkable + + +# Our version of runtime-checkable protocols is faster on Python 3.8-3.11 +if sys.version_info >= (3, 12): + SupportsInt = typing.SupportsInt + SupportsFloat = typing.SupportsFloat + SupportsComplex = typing.SupportsComplex + SupportsBytes = typing.SupportsBytes + SupportsIndex = typing.SupportsIndex + SupportsAbs = typing.SupportsAbs + SupportsRound = typing.SupportsRound +else: + @runtime_checkable + class SupportsInt(Protocol): + """An ABC with one abstract method __int__.""" + __slots__ = () + + @abc.abstractmethod + def __int__(self) -> int: + pass + + @runtime_checkable + class SupportsFloat(Protocol): + """An ABC with one abstract method __float__.""" + __slots__ = () + + @abc.abstractmethod + def __float__(self) -> float: + pass + + @runtime_checkable + class SupportsComplex(Protocol): + """An ABC with one abstract method __complex__.""" + __slots__ = () + + @abc.abstractmethod + def __complex__(self) -> complex: + pass + + @runtime_checkable + class SupportsBytes(Protocol): + """An ABC with one abstract method __bytes__.""" + __slots__ = () + + @abc.abstractmethod + def __bytes__(self) -> bytes: + pass + + @runtime_checkable + class SupportsIndex(Protocol): + __slots__ = () + + @abc.abstractmethod + def __index__(self) -> int: + pass + + @runtime_checkable + class SupportsAbs(Protocol[T_co]): + """ + An ABC with one abstract method __abs__ that is covariant in its return type. + """ + __slots__ = () + + @abc.abstractmethod + def __abs__(self) -> T_co: + pass + + @runtime_checkable + class SupportsRound(Protocol[T_co]): + """ + An ABC with one abstract method __round__ that is covariant in its return type. + """ + __slots__ = () + + @abc.abstractmethod + def __round__(self, ndigits: int = 0) -> T_co: + pass + + +def _ensure_subclassable(mro_entries): + def inner(func): + if sys.implementation.name == "pypy" and sys.version_info < (3, 9): + cls_dict = { + "__call__": staticmethod(func), + "__mro_entries__": staticmethod(mro_entries) + } + t = type(func.__name__, (), cls_dict) + return functools.update_wrapper(t(), func) + else: + func.__mro_entries__ = mro_entries + return func + return inner + + +# Update this to something like >=3.13.0b1 if and when +# PEP 728 is implemented in CPython +_PEP_728_IMPLEMENTED = False + +if _PEP_728_IMPLEMENTED: + # The standard library TypedDict in Python 3.8 does not store runtime information + # about which (if any) keys are optional. See https://bugs.python.org/issue38834 + # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" + # keyword with old-style TypedDict(). See https://bugs.python.org/issue42059 + # The standard library TypedDict below Python 3.11 does not store runtime + # information about optional and required keys when using Required or NotRequired. + # Generic TypedDicts are also impossible using typing.TypedDict on Python <3.11. + # Aaaand on 3.12 we add __orig_bases__ to TypedDict + # to enable better runtime introspection. + # On 3.13 we deprecate some odd ways of creating TypedDicts. + # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier. + # PEP 728 (still pending) makes more changes. + TypedDict = typing.TypedDict + _TypedDictMeta = typing._TypedDictMeta + is_typeddict = typing.is_typeddict +else: + # 3.10.0 and later + _TAKES_MODULE = "module" in inspect.signature(typing._type_check).parameters + + def _get_typeddict_qualifiers(annotation_type): + while True: + annotation_origin = get_origin(annotation_type) + if annotation_origin is Annotated: + annotation_args = get_args(annotation_type) + if annotation_args: + annotation_type = annotation_args[0] + else: + break + elif annotation_origin is Required: + yield Required + annotation_type, = get_args(annotation_type) + elif annotation_origin is NotRequired: + yield NotRequired + annotation_type, = get_args(annotation_type) + elif annotation_origin is ReadOnly: + yield ReadOnly + annotation_type, = get_args(annotation_type) + else: + break + + class _TypedDictMeta(type): + def __new__(cls, name, bases, ns, *, total=True, closed=False): + """Create new typed dict class object. + + This method is called when TypedDict is subclassed, + or when TypedDict is instantiated. This way + TypedDict supports all three syntax forms described in its docstring. + Subclasses and instances of TypedDict return actual dictionaries. + """ + for base in bases: + if type(base) is not _TypedDictMeta and base is not typing.Generic: + raise TypeError('cannot inherit from both a TypedDict type ' + 'and a non-TypedDict base class') + + if any(issubclass(b, typing.Generic) for b in bases): + generic_base = (typing.Generic,) + else: + generic_base = () + + # typing.py generally doesn't let you inherit from plain Generic, unless + # the name of the class happens to be "Protocol" + tp_dict = type.__new__(_TypedDictMeta, "Protocol", (*generic_base, dict), ns) + tp_dict.__name__ = name + if tp_dict.__qualname__ == "Protocol": + tp_dict.__qualname__ = name + + if not hasattr(tp_dict, '__orig_bases__'): + tp_dict.__orig_bases__ = bases + + annotations = {} + if "__annotations__" in ns: + own_annotations = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + own_annotations = ns["__annotate__"](1) + else: + own_annotations = {} + msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" + if _TAKES_MODULE: + own_annotations = { + n: typing._type_check(tp, msg, module=tp_dict.__module__) + for n, tp in own_annotations.items() + } + else: + own_annotations = { + n: typing._type_check(tp, msg) + for n, tp in own_annotations.items() + } + required_keys = set() + optional_keys = set() + readonly_keys = set() + mutable_keys = set() + extra_items_type = None + + for base in bases: + base_dict = base.__dict__ + + annotations.update(base_dict.get('__annotations__', {})) + required_keys.update(base_dict.get('__required_keys__', ())) + optional_keys.update(base_dict.get('__optional_keys__', ())) + readonly_keys.update(base_dict.get('__readonly_keys__', ())) + mutable_keys.update(base_dict.get('__mutable_keys__', ())) + base_extra_items_type = base_dict.get('__extra_items__', None) + if base_extra_items_type is not None: + extra_items_type = base_extra_items_type + + if closed and extra_items_type is None: + extra_items_type = Never + if closed and "__extra_items__" in own_annotations: + annotation_type = own_annotations.pop("__extra_items__") + qualifiers = set(_get_typeddict_qualifiers(annotation_type)) + if Required in qualifiers: + raise TypeError( + "Special key __extra_items__ does not support " + "Required" + ) + if NotRequired in qualifiers: + raise TypeError( + "Special key __extra_items__ does not support " + "NotRequired" + ) + extra_items_type = annotation_type + + annotations.update(own_annotations) + for annotation_key, annotation_type in own_annotations.items(): + qualifiers = set(_get_typeddict_qualifiers(annotation_type)) + + if Required in qualifiers: + required_keys.add(annotation_key) + elif NotRequired in qualifiers: + optional_keys.add(annotation_key) + elif total: + required_keys.add(annotation_key) + else: + optional_keys.add(annotation_key) + if ReadOnly in qualifiers: + mutable_keys.discard(annotation_key) + readonly_keys.add(annotation_key) + else: + mutable_keys.add(annotation_key) + readonly_keys.discard(annotation_key) + + tp_dict.__annotations__ = annotations + tp_dict.__required_keys__ = frozenset(required_keys) + tp_dict.__optional_keys__ = frozenset(optional_keys) + tp_dict.__readonly_keys__ = frozenset(readonly_keys) + tp_dict.__mutable_keys__ = frozenset(mutable_keys) + if not hasattr(tp_dict, '__total__'): + tp_dict.__total__ = total + tp_dict.__closed__ = closed + tp_dict.__extra_items__ = extra_items_type + return tp_dict + + __call__ = dict # static method + + def __subclasscheck__(cls, other): + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') + + __instancecheck__ = __subclasscheck__ + + _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) + + @_ensure_subclassable(lambda bases: (_TypedDict,)) + def TypedDict(typename, fields=_marker, /, *, total=True, closed=False, **kwargs): + """A simple typed namespace. At runtime it is equivalent to a plain dict. + + TypedDict creates a dictionary type such that a type checker will expect all + instances to have a certain set of keys, where each key is + associated with a value of a consistent type. This expectation + is not checked at runtime. + + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info can be accessed via the Point2D.__annotations__ dict, and + the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. + TypedDict supports an additional equivalent form:: + + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + By default, all keys must be present in a TypedDict. It is possible + to override this by specifying totality:: + + class Point2D(TypedDict, total=False): + x: int + y: int + + This means that a Point2D TypedDict can have any of the keys omitted. A type + checker is only expected to support a literal False or True as the value of + the total argument. True is the default, and makes all items defined in the + class body be required. + + The Required and NotRequired special forms can also be used to mark + individual keys as being required or not required:: + + class Point2D(TypedDict): + x: int # the "x" key must always be present (Required is the default) + y: NotRequired[int] # the "y" key can be omitted + + See PEP 655 for more details on Required and NotRequired. + """ + if fields is _marker or fields is None: + if fields is _marker: + deprecated_thing = "Failing to pass a value for the 'fields' parameter" + else: + deprecated_thing = "Passing `None` as the 'fields' parameter" + + example = f"`{typename} = TypedDict({typename!r}, {{}})`" + deprecation_msg = ( + f"{deprecated_thing} is deprecated and will be disallowed in " + "Python 3.15. To create a TypedDict class with 0 fields " + "using the functional syntax, pass an empty dictionary, e.g. " + ) + example + "." + warnings.warn(deprecation_msg, DeprecationWarning, stacklevel=2) + if closed is not False and closed is not True: + kwargs["closed"] = closed + closed = False + fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + if kwargs: + if sys.version_info >= (3, 13): + raise TypeError("TypedDict takes no keyword arguments") + warnings.warn( + "The kwargs-based syntax for TypedDict definitions is deprecated " + "in Python 3.11, will be removed in Python 3.13, and may not be " + "understood by third-party type checkers.", + DeprecationWarning, + stacklevel=2, + ) + + ns = {'__annotations__': dict(fields)} + module = _caller() + if module is not None: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = module + + td = _TypedDictMeta(typename, (), ns, total=total, closed=closed) + td.__orig_bases__ = (TypedDict,) + return td + + if hasattr(typing, "_TypedDictMeta"): + _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta) + else: + _TYPEDDICT_TYPES = (_TypedDictMeta,) + + def is_typeddict(tp): + """Check if an annotation is a TypedDict class + + For example:: + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(Union[list, str]) # => False + """ + # On 3.8, this would otherwise return True + if hasattr(typing, "TypedDict") and tp is typing.TypedDict: + return False + return isinstance(tp, _TYPEDDICT_TYPES) + + +if hasattr(typing, "assert_type"): + assert_type = typing.assert_type + +else: + def assert_type(val, typ, /): + """Assert (to the type checker) that the value is of the given type. + + When the type checker encounters a call to assert_type(), it + emits an error if the value is not of the specified type:: + + def greet(name: str) -> None: + assert_type(name, str) # ok + assert_type(name, int) # type checker error + + At runtime this returns the first argument unchanged and otherwise + does nothing. + """ + return val + + +if hasattr(typing, "ReadOnly"): # 3.13+ + get_type_hints = typing.get_type_hints +else: # <=3.13 + # replaces _strip_annotations() + def _strip_extras(t): + """Strips Annotated, Required and NotRequired from a given type.""" + if isinstance(t, _AnnotatedAlias): + return _strip_extras(t.__origin__) + if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly): + return _strip_extras(t.__args__[0]) + if isinstance(t, typing._GenericAlias): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return t.copy_with(stripped_args) + if hasattr(_types, "GenericAlias") and isinstance(t, _types.GenericAlias): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return _types.GenericAlias(t.__origin__, stripped_args) + if hasattr(_types, "UnionType") and isinstance(t, _types.UnionType): + stripped_args = tuple(_strip_extras(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return functools.reduce(operator.or_, stripped_args) + + return t + + def get_type_hints(obj, globalns=None, localns=None, include_extras=False): + """Return type hints for an object. + + This is often the same as obj.__annotations__, but it handles + forward references encoded as string literals, adds Optional[t] if a + default value equal to None is set and recursively replaces all + 'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T' + (unless 'include_extras=True'). + + The argument may be a module, class, method, or function. The annotations + are returned as a dictionary. For classes, annotations include also + inherited members. + + TypeError is raised if the argument is not of a type that can contain + annotations, and an empty dictionary is returned if no annotations are + present. + + BEWARE -- the behavior of globalns and localns is counterintuitive + (unless you are familiar with how eval() and exec() work). The + search order is locals first, then globals. + + - If no dict arguments are passed, an attempt is made to use the + globals from obj (or the respective module's globals for classes), + and these are also used as the locals. If the object does not appear + to have globals, an empty dictionary is used. + + - If one dict argument is passed, it is used for both globals and + locals. + + - If two dict arguments are passed, they specify globals and + locals, respectively. + """ + if hasattr(typing, "Annotated"): # 3.9+ + hint = typing.get_type_hints( + obj, globalns=globalns, localns=localns, include_extras=True + ) + else: # 3.8 + hint = typing.get_type_hints(obj, globalns=globalns, localns=localns) + if include_extras: + return hint + return {k: _strip_extras(t) for k, t in hint.items()} + + +# Python 3.9+ has PEP 593 (Annotated) +if hasattr(typing, 'Annotated'): + Annotated = typing.Annotated + # Not exported and not a public API, but needed for get_origin() and get_args() + # to work. + _AnnotatedAlias = typing._AnnotatedAlias +# 3.8 +else: + class _AnnotatedAlias(typing._GenericAlias, _root=True): + """Runtime representation of an annotated type. + + At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' + with extra annotations. The alias behaves like a normal typing alias, + instantiating is the same as instantiating the underlying type, binding + it to types is also the same. + """ + def __init__(self, origin, metadata): + if isinstance(origin, _AnnotatedAlias): + metadata = origin.__metadata__ + metadata + origin = origin.__origin__ + super().__init__(origin, origin) + self.__metadata__ = metadata + + def copy_with(self, params): + assert len(params) == 1 + new_type = params[0] + return _AnnotatedAlias(new_type, self.__metadata__) + + def __repr__(self): + return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, " + f"{', '.join(repr(a) for a in self.__metadata__)}]") + + def __reduce__(self): + return operator.getitem, ( + Annotated, (self.__origin__, *self.__metadata__) + ) + + def __eq__(self, other): + if not isinstance(other, _AnnotatedAlias): + return NotImplemented + if self.__origin__ != other.__origin__: + return False + return self.__metadata__ == other.__metadata__ + + def __hash__(self): + return hash((self.__origin__, self.__metadata__)) + + class Annotated: + """Add context specific metadata to a type. + + Example: Annotated[int, runtime_check.Unsigned] indicates to the + hypothetical runtime_check module that this type is an unsigned int. + Every other consumer of this type can ignore this metadata and treat + this type as int. + + The first argument to Annotated must be a valid type (and will be in + the __origin__ field), the remaining arguments are kept as a tuple in + the __extra__ field. + + Details: + + - It's an error to call `Annotated` with less than two arguments. + - Nested Annotated are flattened:: + + Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] + + - Instantiating an annotated type is equivalent to instantiating the + underlying type:: + + Annotated[C, Ann1](5) == C(5) + + - Annotated can be used as a generic type alias:: + + Optimized = Annotated[T, runtime.Optimize()] + Optimized[int] == Annotated[int, runtime.Optimize()] + + OptimizedList = Annotated[List[T], runtime.Optimize()] + OptimizedList[int] == Annotated[List[int], runtime.Optimize()] + """ + + __slots__ = () + + def __new__(cls, *args, **kwargs): + raise TypeError("Type Annotated cannot be instantiated.") + + @typing._tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple) or len(params) < 2: + raise TypeError("Annotated[...] should be used " + "with at least two arguments (a type and an " + "annotation).") + allowed_special_forms = (ClassVar, Final) + if get_origin(params[0]) in allowed_special_forms: + origin = params[0] + else: + msg = "Annotated[t, ...]: t must be a type." + origin = typing._type_check(params[0], msg) + metadata = tuple(params[1:]) + return _AnnotatedAlias(origin, metadata) + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + f"Cannot subclass {cls.__module__}.Annotated" + ) + +# Python 3.8 has get_origin() and get_args() but those implementations aren't +# Annotated-aware, so we can't use those. Python 3.9's versions don't support +# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do. +if sys.version_info[:2] >= (3, 10): + get_origin = typing.get_origin + get_args = typing.get_args +# 3.8-3.9 +else: + try: + # 3.9+ + from typing import _BaseGenericAlias + except ImportError: + _BaseGenericAlias = typing._GenericAlias + try: + # 3.9+ + from typing import GenericAlias as _typing_GenericAlias + except ImportError: + _typing_GenericAlias = typing._GenericAlias + + def get_origin(tp): + """Get the unsubscripted version of a type. + + This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar + and Annotated. Return None for unsupported types. Examples:: + + get_origin(Literal[42]) is Literal + get_origin(int) is None + get_origin(ClassVar[int]) is ClassVar + get_origin(Generic) is Generic + get_origin(Generic[T]) is Generic + get_origin(Union[T, int]) is Union + get_origin(List[Tuple[T, T]][int]) == list + get_origin(P.args) is P + """ + if isinstance(tp, _AnnotatedAlias): + return Annotated + if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias, _BaseGenericAlias, + ParamSpecArgs, ParamSpecKwargs)): + return tp.__origin__ + if tp is typing.Generic: + return typing.Generic + return None + + def get_args(tp): + """Get type arguments with all substitutions performed. + + For unions, basic simplifications used by Union constructor are performed. + Examples:: + get_args(Dict[str, int]) == (str, int) + get_args(int) == () + get_args(Union[int, Union[T, int], str][int]) == (int, str) + get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) + get_args(Callable[[], T][int]) == ([], int) + """ + if isinstance(tp, _AnnotatedAlias): + return (tp.__origin__, *tp.__metadata__) + if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)): + if getattr(tp, "_special", False): + return () + res = tp.__args__ + if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: + res = (list(res[:-1]), res[-1]) + return res + return () + + +# 3.10+ +if hasattr(typing, 'TypeAlias'): + TypeAlias = typing.TypeAlias +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_ExtensionsSpecialForm + def TypeAlias(self, parameters): + """Special marker indicating that an assignment should + be recognized as a proper type alias definition by type + checkers. + + For example:: + + Predicate: TypeAlias = Callable[..., bool] + + It's invalid when used anywhere except as in the example above. + """ + raise TypeError(f"{self} is not subscriptable") +# 3.8 +else: + TypeAlias = _ExtensionsSpecialForm( + 'TypeAlias', + doc="""Special marker indicating that an assignment should + be recognized as a proper type alias definition by type + checkers. + + For example:: + + Predicate: TypeAlias = Callable[..., bool] + + It's invalid when used anywhere except as in the example + above.""" + ) + + +if hasattr(typing, "NoDefault"): + NoDefault = typing.NoDefault +else: + class NoDefaultTypeMeta(type): + def __setattr__(cls, attr, value): + # TypeError is consistent with the behavior of NoneType + raise TypeError( + f"cannot set {attr!r} attribute of immutable type {cls.__name__!r}" + ) + + class NoDefaultType(metaclass=NoDefaultTypeMeta): + """The type of the NoDefault singleton.""" + + __slots__ = () + + def __new__(cls): + return globals().get("NoDefault") or object.__new__(cls) + + def __repr__(self): + return "typing_extensions.NoDefault" + + def __reduce__(self): + return "NoDefault" + + NoDefault = NoDefaultType() + del NoDefaultType, NoDefaultTypeMeta + + +def _set_default(type_param, default): + type_param.has_default = lambda: default is not NoDefault + type_param.__default__ = default + + +def _set_module(typevarlike): + # for pickling: + def_mod = _caller(depth=3) + if def_mod != 'typing_extensions': + typevarlike.__module__ = def_mod + + +class _DefaultMixin: + """Mixin for TypeVarLike defaults.""" + + __slots__ = () + __init__ = _set_default + + +# Classes using this metaclass must provide a _backported_typevarlike ClassVar +class _TypeVarLikeMeta(type): + def __instancecheck__(cls, __instance: Any) -> bool: + return isinstance(__instance, cls._backported_typevarlike) + + +if _PEP_696_IMPLEMENTED: + from typing import TypeVar +else: + # Add default and infer_variance parameters from PEP 696 and 695 + class TypeVar(metaclass=_TypeVarLikeMeta): + """Type variable.""" + + _backported_typevarlike = typing.TypeVar + + def __new__(cls, name, *constraints, bound=None, + covariant=False, contravariant=False, + default=NoDefault, infer_variance=False): + if hasattr(typing, "TypeAliasType"): + # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant, + infer_variance=infer_variance) + else: + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant) + if infer_variance and (covariant or contravariant): + raise ValueError("Variance cannot be specified with infer_variance.") + typevar.__infer_variance__ = infer_variance + + _set_default(typevar, default) + _set_module(typevar) + + def _tvar_prepare_subst(alias, args): + if ( + typevar.has_default() + and alias.__parameters__.index(typevar) == len(args) + ): + args += (typevar.__default__,) + return args + + typevar.__typing_prepare_subst__ = _tvar_prepare_subst + return typevar + + def __init_subclass__(cls) -> None: + raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") + + +# Python 3.10+ has PEP 612 +if hasattr(typing, 'ParamSpecArgs'): + ParamSpecArgs = typing.ParamSpecArgs + ParamSpecKwargs = typing.ParamSpecKwargs +# 3.8-3.9 +else: + class _Immutable: + """Mixin to indicate that object should not be copied.""" + __slots__ = () + + def __copy__(self): + return self + + def __deepcopy__(self, memo): + return self + + class ParamSpecArgs(_Immutable): + """The args for a ParamSpec object. + + Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. + + ParamSpecArgs objects have a reference back to their ParamSpec: + + P.args.__origin__ is P + + This type is meant for runtime introspection and has no special meaning to + static type checkers. + """ + def __init__(self, origin): + self.__origin__ = origin + + def __repr__(self): + return f"{self.__origin__.__name__}.args" + + def __eq__(self, other): + if not isinstance(other, ParamSpecArgs): + return NotImplemented + return self.__origin__ == other.__origin__ + + class ParamSpecKwargs(_Immutable): + """The kwargs for a ParamSpec object. + + Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. + + ParamSpecKwargs objects have a reference back to their ParamSpec: + + P.kwargs.__origin__ is P + + This type is meant for runtime introspection and has no special meaning to + static type checkers. + """ + def __init__(self, origin): + self.__origin__ = origin + + def __repr__(self): + return f"{self.__origin__.__name__}.kwargs" + + def __eq__(self, other): + if not isinstance(other, ParamSpecKwargs): + return NotImplemented + return self.__origin__ == other.__origin__ + + +if _PEP_696_IMPLEMENTED: + from typing import ParamSpec + +# 3.10+ +elif hasattr(typing, 'ParamSpec'): + + # Add default parameter - PEP 696 + class ParamSpec(metaclass=_TypeVarLikeMeta): + """Parameter specification.""" + + _backported_typevarlike = typing.ParamSpec + + def __new__(cls, name, *, bound=None, + covariant=False, contravariant=False, + infer_variance=False, default=NoDefault): + if hasattr(typing, "TypeAliasType"): + # PEP 695 implemented, can pass infer_variance to typing.TypeVar + paramspec = typing.ParamSpec(name, bound=bound, + covariant=covariant, + contravariant=contravariant, + infer_variance=infer_variance) + else: + paramspec = typing.ParamSpec(name, bound=bound, + covariant=covariant, + contravariant=contravariant) + paramspec.__infer_variance__ = infer_variance + + _set_default(paramspec, default) + _set_module(paramspec) + + def _paramspec_prepare_subst(alias, args): + params = alias.__parameters__ + i = params.index(paramspec) + if i == len(args) and paramspec.has_default(): + args = [*args, paramspec.__default__] + if i >= len(args): + raise TypeError(f"Too few arguments for {alias}") + # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. + if len(params) == 1 and not typing._is_param_expr(args[0]): + assert i == 0 + args = (args,) + # Convert lists to tuples to help other libraries cache the results. + elif isinstance(args[i], list): + args = (*args[:i], tuple(args[i]), *args[i + 1:]) + return args + + paramspec.__typing_prepare_subst__ = _paramspec_prepare_subst + return paramspec + + def __init_subclass__(cls) -> None: + raise TypeError(f"type '{__name__}.ParamSpec' is not an acceptable base type") + +# 3.8-3.9 +else: + + # Inherits from list as a workaround for Callable checks in Python < 3.9.2. + class ParamSpec(list, _DefaultMixin): + """Parameter specification variable. + + Usage:: + + P = ParamSpec('P') + + Parameter specification variables exist primarily for the benefit of static + type checkers. They are used to forward the parameter types of one + callable to another callable, a pattern commonly found in higher order + functions and decorators. They are only valid when used in ``Concatenate``, + or s the first argument to ``Callable``. In Python 3.10 and higher, + they are also supported in user-defined Generics at runtime. + See class Generic for more information on generic types. An + example for annotating a decorator:: + + T = TypeVar('T') + P = ParamSpec('P') + + def add_logging(f: Callable[P, T]) -> Callable[P, T]: + '''A type-safe decorator to add logging to a function.''' + def inner(*args: P.args, **kwargs: P.kwargs) -> T: + logging.info(f'{f.__name__} was called') + return f(*args, **kwargs) + return inner + + @add_logging + def add_two(x: float, y: float) -> float: + '''Add two numbers together.''' + return x + y + + Parameter specification variables defined with covariant=True or + contravariant=True can be used to declare covariant or contravariant + generic types. These keyword arguments are valid, but their actual semantics + are yet to be decided. See PEP 612 for details. + + Parameter specification variables can be introspected. e.g.: + + P.__name__ == 'T' + P.__bound__ == None + P.__covariant__ == False + P.__contravariant__ == False + + Note that only parameter specification variables defined in global scope can + be pickled. + """ + + # Trick Generic __parameters__. + __class__ = typing.TypeVar + + @property + def args(self): + return ParamSpecArgs(self) + + @property + def kwargs(self): + return ParamSpecKwargs(self) + + def __init__(self, name, *, bound=None, covariant=False, contravariant=False, + infer_variance=False, default=NoDefault): + list.__init__(self, [self]) + self.__name__ = name + self.__covariant__ = bool(covariant) + self.__contravariant__ = bool(contravariant) + self.__infer_variance__ = bool(infer_variance) + if bound: + self.__bound__ = typing._type_check(bound, 'Bound must be a type.') + else: + self.__bound__ = None + _DefaultMixin.__init__(self, default) + + # for pickling: + def_mod = _caller() + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + def __repr__(self): + if self.__infer_variance__: + prefix = '' + elif self.__covariant__: + prefix = '+' + elif self.__contravariant__: + prefix = '-' + else: + prefix = '~' + return prefix + self.__name__ + + def __hash__(self): + return object.__hash__(self) + + def __eq__(self, other): + return self is other + + def __reduce__(self): + return self.__name__ + + # Hack to get typing._type_check to pass. + def __call__(self, *args, **kwargs): + pass + + +# 3.8-3.9 +if not hasattr(typing, 'Concatenate'): + # Inherits from list as a workaround for Callable checks in Python < 3.9.2. + class _ConcatenateGenericAlias(list): + + # Trick Generic into looking into this for __parameters__. + __class__ = typing._GenericAlias + + # Flag in 3.8. + _special = False + + def __init__(self, origin, args): + super().__init__(args) + self.__origin__ = origin + self.__args__ = args + + def __repr__(self): + _type_repr = typing._type_repr + return (f'{_type_repr(self.__origin__)}' + f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]') + + def __hash__(self): + return hash((self.__origin__, self.__args__)) + + # Hack to get typing._type_check to pass in Generic. + def __call__(self, *args, **kwargs): + pass + + @property + def __parameters__(self): + return tuple( + tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) + ) + + +# 3.8-3.9 +@typing._tp_cache +def _concatenate_getitem(self, parameters): + if parameters == (): + raise TypeError("Cannot take a Concatenate of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + if not isinstance(parameters[-1], ParamSpec): + raise TypeError("The last parameter to Concatenate should be a " + "ParamSpec variable.") + msg = "Concatenate[arg, ...]: each arg must be a type." + parameters = tuple(typing._type_check(p, msg) for p in parameters) + return _ConcatenateGenericAlias(self, parameters) + + +# 3.10+ +if hasattr(typing, 'Concatenate'): + Concatenate = typing.Concatenate + _ConcatenateGenericAlias = typing._ConcatenateGenericAlias +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_ExtensionsSpecialForm + def Concatenate(self, parameters): + """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a + higher order function which adds, removes or transforms parameters of a + callable. + + For example:: + + Callable[Concatenate[int, P], int] + + See PEP 612 for detailed information. + """ + return _concatenate_getitem(self, parameters) +# 3.8 +else: + class _ConcatenateForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + return _concatenate_getitem(self, parameters) + + Concatenate = _ConcatenateForm( + 'Concatenate', + doc="""Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a + higher order function which adds, removes or transforms parameters of a + callable. + + For example:: + + Callable[Concatenate[int, P], int] + + See PEP 612 for detailed information. + """) + +# 3.10+ +if hasattr(typing, 'TypeGuard'): + TypeGuard = typing.TypeGuard +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_ExtensionsSpecialForm + def TypeGuard(self, parameters): + """Special typing form used to annotate the return type of a user-defined + type guard function. ``TypeGuard`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeGuard[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeGuard`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the type inside ``TypeGuard``. + + For example:: + + def is_str(val: Union[str, float]): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower + form of ``TypeA`` (it can even be a wider form) and this may lead to + type-unsafe results. The main reason is to allow for things like + narrowing ``List[object]`` to ``List[str]`` even though the latter is not + a subtype of the former, since ``List`` is invariant. The responsibility of + writing type-safe type guards is left to the user. + + ``TypeGuard`` also works with type variables. For more information, see + PEP 647 (User-Defined Type Guards). + """ + item = typing._type_check(parameters, f'{self} accepts only a single type.') + return typing._GenericAlias(self, (item,)) +# 3.8 +else: + class _TypeGuardForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type') + return typing._GenericAlias(self, (item,)) + + TypeGuard = _TypeGuardForm( + 'TypeGuard', + doc="""Special typing form used to annotate the return type of a user-defined + type guard function. ``TypeGuard`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeGuard[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeGuard`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the type inside ``TypeGuard``. + + For example:: + + def is_str(val: Union[str, float]): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower + form of ``TypeA`` (it can even be a wider form) and this may lead to + type-unsafe results. The main reason is to allow for things like + narrowing ``List[object]`` to ``List[str]`` even though the latter is not + a subtype of the former, since ``List`` is invariant. The responsibility of + writing type-safe type guards is left to the user. + + ``TypeGuard`` also works with type variables. For more information, see + PEP 647 (User-Defined Type Guards). + """) + +# 3.13+ +if hasattr(typing, 'TypeIs'): + TypeIs = typing.TypeIs +# 3.9 +elif sys.version_info[:2] >= (3, 9): + @_ExtensionsSpecialForm + def TypeIs(self, parameters): + """Special typing form used to annotate the return type of a user-defined + type narrower function. ``TypeIs`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeIs[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeIs`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the intersection of the type inside ``TypeGuard`` and the argument's + previously known type. + + For example:: + + def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]: + return hasattr(val, '__await__') + + def f(val: Union[int, Awaitable[int]]) -> int: + if is_awaitable(val): + assert_type(val, Awaitable[int]) + else: + assert_type(val, int) + + ``TypeIs`` also works with type variables. For more information, see + PEP 742 (Narrowing types with TypeIs). + """ + item = typing._type_check(parameters, f'{self} accepts only a single type.') + return typing._GenericAlias(self, (item,)) +# 3.8 +else: + class _TypeIsForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type') + return typing._GenericAlias(self, (item,)) + + TypeIs = _TypeIsForm( + 'TypeIs', + doc="""Special typing form used to annotate the return type of a user-defined + type narrower function. ``TypeIs`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard". + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeIs[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeIs`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the intersection of the type inside ``TypeGuard`` and the argument's + previously known type. + + For example:: + + def is_awaitable(val: object) -> TypeIs[Awaitable[Any]]: + return hasattr(val, '__await__') + + def f(val: Union[int, Awaitable[int]]) -> int: + if is_awaitable(val): + assert_type(val, Awaitable[int]) + else: + assert_type(val, int) + + ``TypeIs`` also works with type variables. For more information, see + PEP 742 (Narrowing types with TypeIs). + """) + + +# Vendored from cpython typing._SpecialFrom +class _SpecialForm(typing._Final, _root=True): + __slots__ = ('_name', '__doc__', '_getitem') + + def __init__(self, getitem): + self._getitem = getitem + self._name = getitem.__name__ + self.__doc__ = getitem.__doc__ + + def __getattr__(self, item): + if item in {'__name__', '__qualname__'}: + return self._name + + raise AttributeError(item) + + def __mro_entries__(self, bases): + raise TypeError(f"Cannot subclass {self!r}") + + def __repr__(self): + return f'typing_extensions.{self._name}' + + def __reduce__(self): + return self._name + + def __call__(self, *args, **kwds): + raise TypeError(f"Cannot instantiate {self!r}") + + def __or__(self, other): + return typing.Union[self, other] + + def __ror__(self, other): + return typing.Union[other, self] + + def __instancecheck__(self, obj): + raise TypeError(f"{self} cannot be used with isinstance()") + + def __subclasscheck__(self, cls): + raise TypeError(f"{self} cannot be used with issubclass()") + + @typing._tp_cache + def __getitem__(self, parameters): + return self._getitem(self, parameters) + + +if hasattr(typing, "LiteralString"): # 3.11+ + LiteralString = typing.LiteralString +else: + @_SpecialForm + def LiteralString(self, params): + """Represents an arbitrary literal string. + + Example:: + + from pip._vendor.typing_extensions import LiteralString + + def query(sql: LiteralString) -> ...: + ... + + query("SELECT * FROM table") # ok + query(f"SELECT * FROM {input()}") # not ok + + See PEP 675 for details. + + """ + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, "Self"): # 3.11+ + Self = typing.Self +else: + @_SpecialForm + def Self(self, params): + """Used to spell the type of "self" in classes. + + Example:: + + from typing import Self + + class ReturnsSelf: + def parse(self, data: bytes) -> Self: + ... + return self + + """ + + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, "Never"): # 3.11+ + Never = typing.Never +else: + @_SpecialForm + def Never(self, params): + """The bottom type, a type that has no members. + + This can be used to define a function that should never be + called, or a function that never returns:: + + from pip._vendor.typing_extensions import Never + + def never_call_me(arg: Never) -> None: + pass + + def int_or_str(arg: int | str) -> None: + never_call_me(arg) # type checker error + match arg: + case int(): + print("It's an int") + case str(): + print("It's a str") + case _: + never_call_me(arg) # ok, arg is of type Never + + """ + + raise TypeError(f"{self} is not subscriptable") + + +if hasattr(typing, 'Required'): # 3.11+ + Required = typing.Required + NotRequired = typing.NotRequired +elif sys.version_info[:2] >= (3, 9): # 3.9-3.10 + @_ExtensionsSpecialForm + def Required(self, parameters): + """A special typing construct to mark a key of a total=False TypedDict + as required. For example: + + class Movie(TypedDict, total=False): + title: Required[str] + year: int + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + + There is no runtime checking that a required key is actually provided + when instantiating a related TypedDict. + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + @_ExtensionsSpecialForm + def NotRequired(self, parameters): + """A special typing construct to mark a key of a TypedDict as + potentially missing. For example: + + class Movie(TypedDict): + title: str + year: NotRequired[int] + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + +else: # 3.8 + class _RequiredForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + Required = _RequiredForm( + 'Required', + doc="""A special typing construct to mark a key of a total=False TypedDict + as required. For example: + + class Movie(TypedDict, total=False): + title: Required[str] + year: int + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + + There is no runtime checking that a required key is actually provided + when instantiating a related TypedDict. + """) + NotRequired = _RequiredForm( + 'NotRequired', + doc="""A special typing construct to mark a key of a TypedDict as + potentially missing. For example: + + class Movie(TypedDict): + title: str + year: NotRequired[int] + + m = Movie( + title='The Matrix', # typechecker error if key is omitted + year=1999, + ) + """) + + +if hasattr(typing, 'ReadOnly'): + ReadOnly = typing.ReadOnly +elif sys.version_info[:2] >= (3, 9): # 3.9-3.12 + @_ExtensionsSpecialForm + def ReadOnly(self, parameters): + """A special typing construct to mark an item of a TypedDict as read-only. + + For example: + + class Movie(TypedDict): + title: ReadOnly[str] + year: int + + def mutate_movie(m: Movie) -> None: + m["year"] = 1992 # allowed + m["title"] = "The Matrix" # typechecker error + + There is no runtime checking for this property. + """ + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + +else: # 3.8 + class _ReadOnlyForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return typing._GenericAlias(self, (item,)) + + ReadOnly = _ReadOnlyForm( + 'ReadOnly', + doc="""A special typing construct to mark a key of a TypedDict as read-only. + + For example: + + class Movie(TypedDict): + title: ReadOnly[str] + year: int + + def mutate_movie(m: Movie) -> None: + m["year"] = 1992 # allowed + m["title"] = "The Matrix" # typechecker error + + There is no runtime checking for this propery. + """) + + +_UNPACK_DOC = """\ +Type unpack operator. + +The type unpack operator takes the child types from some container type, +such as `tuple[int, str]` or a `TypeVarTuple`, and 'pulls them out'. For +example: + + # For some generic class `Foo`: + Foo[Unpack[tuple[int, str]]] # Equivalent to Foo[int, str] + + Ts = TypeVarTuple('Ts') + # Specifies that `Bar` is generic in an arbitrary number of types. + # (Think of `Ts` as a tuple of an arbitrary number of individual + # `TypeVar`s, which the `Unpack` is 'pulling out' directly into the + # `Generic[]`.) + class Bar(Generic[Unpack[Ts]]): ... + Bar[int] # Valid + Bar[int, str] # Also valid + +From Python 3.11, this can also be done using the `*` operator: + + Foo[*tuple[int, str]] + class Bar(Generic[*Ts]): ... + +The operator can also be used along with a `TypedDict` to annotate +`**kwargs` in a function signature. For instance: + + class Movie(TypedDict): + name: str + year: int + + # This function expects two keyword arguments - *name* of type `str` and + # *year* of type `int`. + def foo(**kwargs: Unpack[Movie]): ... + +Note that there is only some runtime checking of this operator. Not +everything the runtime allows may be accepted by static type checkers. + +For more information, see PEP 646 and PEP 692. +""" + + +if sys.version_info >= (3, 12): # PEP 692 changed the repr of Unpack[] + Unpack = typing.Unpack + + def _is_unpack(obj): + return get_origin(obj) is Unpack + +elif sys.version_info[:2] >= (3, 9): # 3.9+ + class _UnpackSpecialForm(_ExtensionsSpecialForm, _root=True): + def __init__(self, getitem): + super().__init__(getitem) + self.__doc__ = _UNPACK_DOC + + class _UnpackAlias(typing._GenericAlias, _root=True): + __class__ = typing.TypeVar + + @property + def __typing_unpacked_tuple_args__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + arg, = self.__args__ + if isinstance(arg, (typing._GenericAlias, _types.GenericAlias)): + if arg.__origin__ is not tuple: + raise TypeError("Unpack[...] must be used with a tuple type") + return arg.__args__ + return None + + @_UnpackSpecialForm + def Unpack(self, parameters): + item = typing._type_check(parameters, f'{self._name} accepts only a single type.') + return _UnpackAlias(self, (item,)) + + def _is_unpack(obj): + return isinstance(obj, _UnpackAlias) + +else: # 3.8 + class _UnpackAlias(typing._GenericAlias, _root=True): + __class__ = typing.TypeVar + + class _UnpackForm(_ExtensionsSpecialForm, _root=True): + def __getitem__(self, parameters): + item = typing._type_check(parameters, + f'{self._name} accepts only a single type.') + return _UnpackAlias(self, (item,)) + + Unpack = _UnpackForm('Unpack', doc=_UNPACK_DOC) + + def _is_unpack(obj): + return isinstance(obj, _UnpackAlias) + + +if _PEP_696_IMPLEMENTED: + from typing import TypeVarTuple + +elif hasattr(typing, "TypeVarTuple"): # 3.11+ + + def _unpack_args(*args): + newargs = [] + for arg in args: + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs is not None and not (subargs and subargs[-1] is ...): + newargs.extend(subargs) + else: + newargs.append(arg) + return newargs + + # Add default parameter - PEP 696 + class TypeVarTuple(metaclass=_TypeVarLikeMeta): + """Type variable tuple.""" + + _backported_typevarlike = typing.TypeVarTuple + + def __new__(cls, name, *, default=NoDefault): + tvt = typing.TypeVarTuple(name) + _set_default(tvt, default) + _set_module(tvt) + + def _typevartuple_prepare_subst(alias, args): + params = alias.__parameters__ + typevartuple_index = params.index(tvt) + for param in params[typevartuple_index + 1:]: + if isinstance(param, TypeVarTuple): + raise TypeError( + f"More than one TypeVarTuple parameter in {alias}" + ) + + alen = len(args) + plen = len(params) + left = typevartuple_index + right = plen - typevartuple_index - 1 + var_tuple_index = None + fillarg = None + for k, arg in enumerate(args): + if not isinstance(arg, type): + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs and len(subargs) == 2 and subargs[-1] is ...: + if var_tuple_index is not None: + raise TypeError( + "More than one unpacked " + "arbitrary-length tuple argument" + ) + var_tuple_index = k + fillarg = subargs[0] + if var_tuple_index is not None: + left = min(left, var_tuple_index) + right = min(right, alen - var_tuple_index - 1) + elif left + right > alen: + raise TypeError(f"Too few arguments for {alias};" + f" actual {alen}, expected at least {plen - 1}") + if left == alen - right and tvt.has_default(): + replacement = _unpack_args(tvt.__default__) + else: + replacement = args[left: alen - right] + + return ( + *args[:left], + *([fillarg] * (typevartuple_index - left)), + replacement, + *([fillarg] * (plen - right - left - typevartuple_index - 1)), + *args[alen - right:], + ) + + tvt.__typing_prepare_subst__ = _typevartuple_prepare_subst + return tvt + + def __init_subclass__(self, *args, **kwds): + raise TypeError("Cannot subclass special typing classes") + +else: # <=3.10 + class TypeVarTuple(_DefaultMixin): + """Type variable tuple. + + Usage:: + + Ts = TypeVarTuple('Ts') + + In the same way that a normal type variable is a stand-in for a single + type such as ``int``, a type variable *tuple* is a stand-in for a *tuple* + type such as ``Tuple[int, str]``. + + Type variable tuples can be used in ``Generic`` declarations. + Consider the following example:: + + class Array(Generic[*Ts]): ... + + The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``, + where ``T1`` and ``T2`` are type variables. To use these type variables + as type parameters of ``Array``, we must *unpack* the type variable tuple using + the star operator: ``*Ts``. The signature of ``Array`` then behaves + as if we had simply written ``class Array(Generic[T1, T2]): ...``. + In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows + us to parameterise the class with an *arbitrary* number of type parameters. + + Type variable tuples can be used anywhere a normal ``TypeVar`` can. + This includes class definitions, as shown above, as well as function + signatures and variable annotations:: + + class Array(Generic[*Ts]): + + def __init__(self, shape: Tuple[*Ts]): + self._shape: Tuple[*Ts] = shape + + def get_shape(self) -> Tuple[*Ts]: + return self._shape + + shape = (Height(480), Width(640)) + x: Array[Height, Width] = Array(shape) + y = abs(x) # Inferred type is Array[Height, Width] + z = x + x # ... is Array[Height, Width] + x.get_shape() # ... is tuple[Height, Width] + + """ + + # Trick Generic __parameters__. + __class__ = typing.TypeVar + + def __iter__(self): + yield self.__unpacked__ + + def __init__(self, name, *, default=NoDefault): + self.__name__ = name + _DefaultMixin.__init__(self, default) + + # for pickling: + def_mod = _caller() + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + self.__unpacked__ = Unpack[self] + + def __repr__(self): + return self.__name__ + + def __hash__(self): + return object.__hash__(self) + + def __eq__(self, other): + return self is other + + def __reduce__(self): + return self.__name__ + + def __init_subclass__(self, *args, **kwds): + if '_root' not in kwds: + raise TypeError("Cannot subclass special typing classes") + + +if hasattr(typing, "reveal_type"): # 3.11+ + reveal_type = typing.reveal_type +else: # <=3.10 + def reveal_type(obj: T, /) -> T: + """Reveal the inferred type of a variable. + + When a static type checker encounters a call to ``reveal_type()``, + it will emit the inferred type of the argument:: + + x: int = 1 + reveal_type(x) + + Running a static type checker (e.g., ``mypy``) on this example + will produce output similar to 'Revealed type is "builtins.int"'. + + At runtime, the function prints the runtime type of the + argument and returns it unchanged. + + """ + print(f"Runtime type is {type(obj).__name__!r}", file=sys.stderr) + return obj + + +if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"): # 3.11+ + _ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH +else: # <=3.10 + _ASSERT_NEVER_REPR_MAX_LENGTH = 100 + + +if hasattr(typing, "assert_never"): # 3.11+ + assert_never = typing.assert_never +else: # <=3.10 + def assert_never(arg: Never, /) -> Never: + """Assert to the type checker that a line of code is unreachable. + + Example:: + + def int_or_str(arg: int | str) -> None: + match arg: + case int(): + print("It's an int") + case str(): + print("It's a str") + case _: + assert_never(arg) + + If a type checker finds that a call to assert_never() is + reachable, it will emit an error. + + At runtime, this throws an exception when called. + + """ + value = repr(arg) + if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH: + value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...' + raise AssertionError(f"Expected code to be unreachable, but got: {value}") + + +if sys.version_info >= (3, 12): # 3.12+ + # dataclass_transform exists in 3.11 but lacks the frozen_default parameter + dataclass_transform = typing.dataclass_transform +else: # <=3.11 + def dataclass_transform( + *, + eq_default: bool = True, + order_default: bool = False, + kw_only_default: bool = False, + frozen_default: bool = False, + field_specifiers: typing.Tuple[ + typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], + ... + ] = (), + **kwargs: typing.Any, + ) -> typing.Callable[[T], T]: + """Decorator that marks a function, class, or metaclass as providing + dataclass-like behavior. + + Example: + + from pip._vendor.typing_extensions import dataclass_transform + + _T = TypeVar("_T") + + # Used on a decorator function + @dataclass_transform() + def create_model(cls: type[_T]) -> type[_T]: + ... + return cls + + @create_model + class CustomerModel: + id: int + name: str + + # Used on a base class + @dataclass_transform() + class ModelBase: ... + + class CustomerModel(ModelBase): + id: int + name: str + + # Used on a metaclass + @dataclass_transform() + class ModelMeta(type): ... + + class ModelBase(metaclass=ModelMeta): ... + + class CustomerModel(ModelBase): + id: int + name: str + + Each of the ``CustomerModel`` classes defined in this example will now + behave similarly to a dataclass created with the ``@dataclasses.dataclass`` + decorator. For example, the type checker will synthesize an ``__init__`` + method. + + The arguments to this decorator can be used to customize this behavior: + - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be + True or False if it is omitted by the caller. + - ``order_default`` indicates whether the ``order`` parameter is + assumed to be True or False if it is omitted by the caller. + - ``kw_only_default`` indicates whether the ``kw_only`` parameter is + assumed to be True or False if it is omitted by the caller. + - ``frozen_default`` indicates whether the ``frozen`` parameter is + assumed to be True or False if it is omitted by the caller. + - ``field_specifiers`` specifies a static list of supported classes + or functions that describe fields, similar to ``dataclasses.field()``. + + At runtime, this decorator records its arguments in the + ``__dataclass_transform__`` attribute on the decorated object. + + See PEP 681 for details. + + """ + def decorator(cls_or_fn): + cls_or_fn.__dataclass_transform__ = { + "eq_default": eq_default, + "order_default": order_default, + "kw_only_default": kw_only_default, + "frozen_default": frozen_default, + "field_specifiers": field_specifiers, + "kwargs": kwargs, + } + return cls_or_fn + return decorator + + +if hasattr(typing, "override"): # 3.12+ + override = typing.override +else: # <=3.11 + _F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any]) + + def override(arg: _F, /) -> _F: + """Indicate that a method is intended to override a method in a base class. + + Usage: + + class Base: + def method(self) -> None: + pass + + class Child(Base): + @override + def method(self) -> None: + super().method() + + When this decorator is applied to a method, the type checker will + validate that it overrides a method with the same name on a base class. + This helps prevent bugs that may occur when a base class is changed + without an equivalent change to a child class. + + There is no runtime checking of these properties. The decorator + sets the ``__override__`` attribute to ``True`` on the decorated object + to allow runtime introspection. + + See PEP 698 for details. + + """ + try: + arg.__override__ = True + except (AttributeError, TypeError): + # Skip the attribute silently if it is not writable. + # AttributeError happens if the object has __slots__ or a + # read-only property, TypeError if it's a builtin class. + pass + return arg + + +if hasattr(warnings, "deprecated"): + deprecated = warnings.deprecated +else: + _T = typing.TypeVar("_T") + + class deprecated: + """Indicate that a class, function or overload is deprecated. + + When this decorator is applied to an object, the type checker + will generate a diagnostic on usage of the deprecated object. + + Usage: + + @deprecated("Use B instead") + class A: + pass + + @deprecated("Use g instead") + def f(): + pass + + @overload + @deprecated("int support is deprecated") + def g(x: int) -> int: ... + @overload + def g(x: str) -> int: ... + + The warning specified by *category* will be emitted at runtime + on use of deprecated objects. For functions, that happens on calls; + for classes, on instantiation and on creation of subclasses. + If the *category* is ``None``, no warning is emitted at runtime. + The *stacklevel* determines where the + warning is emitted. If it is ``1`` (the default), the warning + is emitted at the direct caller of the deprecated object; if it + is higher, it is emitted further up the stack. + Static type checker behavior is not affected by the *category* + and *stacklevel* arguments. + + The deprecation message passed to the decorator is saved in the + ``__deprecated__`` attribute on the decorated object. + If applied to an overload, the decorator + must be after the ``@overload`` decorator for the attribute to + exist on the overload as returned by ``get_overloads()``. + + See PEP 702 for details. + + """ + def __init__( + self, + message: str, + /, + *, + category: typing.Optional[typing.Type[Warning]] = DeprecationWarning, + stacklevel: int = 1, + ) -> None: + if not isinstance(message, str): + raise TypeError( + "Expected an object of type str for 'message', not " + f"{type(message).__name__!r}" + ) + self.message = message + self.category = category + self.stacklevel = stacklevel + + def __call__(self, arg: _T, /) -> _T: + # Make sure the inner functions created below don't + # retain a reference to self. + msg = self.message + category = self.category + stacklevel = self.stacklevel + if category is None: + arg.__deprecated__ = msg + return arg + elif isinstance(arg, type): + import functools + from types import MethodType + + original_new = arg.__new__ + + @functools.wraps(original_new) + def __new__(cls, *args, **kwargs): + if cls is arg: + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + if original_new is not object.__new__: + return original_new(cls, *args, **kwargs) + # Mirrors a similar check in object.__new__. + elif cls.__init__ is object.__init__ and (args or kwargs): + raise TypeError(f"{cls.__name__}() takes no arguments") + else: + return original_new(cls) + + arg.__new__ = staticmethod(__new__) + + original_init_subclass = arg.__init_subclass__ + # We need slightly different behavior if __init_subclass__ + # is a bound method (likely if it was implemented in Python) + if isinstance(original_init_subclass, MethodType): + original_init_subclass = original_init_subclass.__func__ + + @functools.wraps(original_init_subclass) + def __init_subclass__(*args, **kwargs): + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return original_init_subclass(*args, **kwargs) + + arg.__init_subclass__ = classmethod(__init_subclass__) + # Or otherwise, which likely means it's a builtin such as + # object's implementation of __init_subclass__. + else: + @functools.wraps(original_init_subclass) + def __init_subclass__(*args, **kwargs): + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return original_init_subclass(*args, **kwargs) + + arg.__init_subclass__ = __init_subclass__ + + arg.__deprecated__ = __new__.__deprecated__ = msg + __init_subclass__.__deprecated__ = msg + return arg + elif callable(arg): + import functools + + @functools.wraps(arg) + def wrapper(*args, **kwargs): + warnings.warn(msg, category=category, stacklevel=stacklevel + 1) + return arg(*args, **kwargs) + + arg.__deprecated__ = wrapper.__deprecated__ = msg + return wrapper + else: + raise TypeError( + "@deprecated decorator with non-None category must be applied to " + f"a class or callable, not {arg!r}" + ) + + +# We have to do some monkey patching to deal with the dual nature of +# Unpack/TypeVarTuple: +# - We want Unpack to be a kind of TypeVar so it gets accepted in +# Generic[Unpack[Ts]] +# - We want it to *not* be treated as a TypeVar for the purposes of +# counting generic parameters, so that when we subscript a generic, +# the runtime doesn't try to substitute the Unpack with the subscripted type. +if not hasattr(typing, "TypeVarTuple"): + def _check_generic(cls, parameters, elen=_marker): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + if elen is _marker: + if not hasattr(cls, "__parameters__") or not cls.__parameters__: + raise TypeError(f"{cls} is not a generic class") + elen = len(cls.__parameters__) + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) + if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): + return + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + things = "arguments" if sys.version_info >= (3, 10) else "parameters" + raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}" + f" for {cls}; actual {alen}, expected {expect_val}") +else: + # Python 3.11+ + + def _check_generic(cls, parameters, elen): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments" + f" for {cls}; actual {alen}, expected {expect_val}") + +if not _PEP_696_IMPLEMENTED: + typing._check_generic = _check_generic + + +def _has_generic_or_protocol_as_origin() -> bool: + try: + frame = sys._getframe(2) + # - Catch AttributeError: not all Python implementations have sys._getframe() + # - Catch ValueError: maybe we're called from an unexpected module + # and the call stack isn't deep enough + except (AttributeError, ValueError): + return False # err on the side of leniency + else: + # If we somehow get invoked from outside typing.py, + # also err on the side of leniency + if frame.f_globals.get("__name__") != "typing": + return False + origin = frame.f_locals.get("origin") + # Cannot use "in" because origin may be an object with a buggy __eq__ that + # throws an error. + return origin is typing.Generic or origin is Protocol or origin is typing.Protocol + + +_TYPEVARTUPLE_TYPES = {TypeVarTuple, getattr(typing, "TypeVarTuple", None)} + + +def _is_unpacked_typevartuple(x) -> bool: + if get_origin(x) is not Unpack: + return False + args = get_args(x) + return ( + bool(args) + and len(args) == 1 + and type(args[0]) in _TYPEVARTUPLE_TYPES + ) + + +# Python 3.11+ _collect_type_vars was renamed to _collect_parameters +if hasattr(typing, '_collect_type_vars'): + def _collect_type_vars(types, typevar_types=None): + """Collect all type variable contained in types in order of + first appearance (lexicographic order). For example:: + + _collect_type_vars((T, List[S, T])) == (T, S) + """ + if typevar_types is None: + typevar_types = typing.TypeVar + tvars = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with a default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in types: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + elif isinstance(t, typevar_types) and t not in tvars: + if enforce_default_ordering: + has_default = getattr(t, '__default__', NoDefault) is not NoDefault + if has_default: + if type_var_tuple_encountered: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + tvars.append(t) + if _should_collect_from_parameters(t): + tvars.extend([t for t in t.__parameters__ if t not in tvars]) + return tuple(tvars) + + typing._collect_type_vars = _collect_type_vars +else: + def _collect_parameters(args): + """Collect all type variables and parameter specifications in args + in order of first appearance (lexicographic order). + + For example:: + + assert _collect_parameters((T, Callable[P, T])) == (T, P) + """ + parameters = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in args: + if isinstance(t, type): + # We don't want __parameters__ descriptor of a bare Python class. + pass + elif isinstance(t, tuple): + # `t` might be a tuple, when `ParamSpec` is substituted with + # `[T, int]`, or `[int, *Ts]`, etc. + for x in t: + for collected in _collect_parameters([x]): + if collected not in parameters: + parameters.append(collected) + elif hasattr(t, '__typing_subst__'): + if t not in parameters: + if enforce_default_ordering: + has_default = ( + getattr(t, '__default__', NoDefault) is not NoDefault + ) + + if type_var_tuple_encountered and has_default: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + + if has_default: + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + parameters.append(t) + else: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + for x in getattr(t, '__parameters__', ()): + if x not in parameters: + parameters.append(x) + + return tuple(parameters) + + if not _PEP_696_IMPLEMENTED: + typing._collect_parameters = _collect_parameters + +# Backport typing.NamedTuple as it exists in Python 3.13. +# In 3.11, the ability to define generic `NamedTuple`s was supported. +# This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. +# On 3.12, we added __orig_bases__ to call-based NamedTuples +# On 3.13, we deprecated kwargs-based NamedTuples +if sys.version_info >= (3, 13): + NamedTuple = typing.NamedTuple +else: + def _make_nmtuple(name, types, module, defaults=()): + fields = [n for n, t in types] + annotations = {n: typing._type_check(t, f"field {n} annotation must be a type") + for n, t in types} + nm_tpl = collections.namedtuple(name, fields, + defaults=defaults, module=module) + nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = annotations + # The `_field_types` attribute was removed in 3.9; + # in earlier versions, it is the same as the `__annotations__` attribute + if sys.version_info < (3, 9): + nm_tpl._field_types = annotations + return nm_tpl + + _prohibited_namedtuple_fields = typing._prohibited + _special_namedtuple_fields = frozenset({'__module__', '__name__', '__annotations__'}) + + class _NamedTupleMeta(type): + def __new__(cls, typename, bases, ns): + assert _NamedTuple in bases + for base in bases: + if base is not _NamedTuple and base is not typing.Generic: + raise TypeError( + 'can only inherit from a NamedTuple type and Generic') + bases = tuple(tuple if base is _NamedTuple else base for base in bases) + if "__annotations__" in ns: + types = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + types = ns["__annotate__"](1) + else: + types = {} + default_names = [] + for field_name in types: + if field_name in ns: + default_names.append(field_name) + elif default_names: + raise TypeError(f"Non-default namedtuple field {field_name} " + f"cannot follow default field" + f"{'s' if len(default_names) > 1 else ''} " + f"{', '.join(default_names)}") + nm_tpl = _make_nmtuple( + typename, types.items(), + defaults=[ns[n] for n in default_names], + module=ns['__module__'] + ) + nm_tpl.__bases__ = bases + if typing.Generic in bases: + if hasattr(typing, '_generic_class_getitem'): # 3.12+ + nm_tpl.__class_getitem__ = classmethod(typing._generic_class_getitem) + else: + class_getitem = typing.Generic.__class_getitem__.__func__ + nm_tpl.__class_getitem__ = classmethod(class_getitem) + # update from user namespace without overriding special namedtuple attributes + for key, val in ns.items(): + if key in _prohibited_namedtuple_fields: + raise AttributeError("Cannot overwrite NamedTuple attribute " + key) + elif key not in _special_namedtuple_fields: + if key not in nm_tpl._fields: + setattr(nm_tpl, key, ns[key]) + try: + set_name = type(val).__set_name__ + except AttributeError: + pass + else: + try: + set_name(val, nm_tpl, key) + except BaseException as e: + msg = ( + f"Error calling __set_name__ on {type(val).__name__!r} " + f"instance {key!r} in {typename!r}" + ) + # BaseException.add_note() existed on py311, + # but the __set_name__ machinery didn't start + # using add_note() until py312. + # Making sure exceptions are raised in the same way + # as in "normal" classes seems most important here. + if sys.version_info >= (3, 12): + e.add_note(msg) + raise + else: + raise RuntimeError(msg) from e + + if typing.Generic in bases: + nm_tpl.__init_subclass__() + return nm_tpl + + _NamedTuple = type.__new__(_NamedTupleMeta, 'NamedTuple', (), {}) + + def _namedtuple_mro_entries(bases): + assert NamedTuple in bases + return (_NamedTuple,) + + @_ensure_subclassable(_namedtuple_mro_entries) + def NamedTuple(typename, fields=_marker, /, **kwargs): + """Typed version of namedtuple. + + Usage:: + + class Employee(NamedTuple): + name: str + id: int + + This is equivalent to:: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + The resulting class has an extra __annotations__ attribute, giving a + dict that maps field names to types. (The field names are also in + the _fields attribute, which is part of the namedtuple API.) + An alternative equivalent functional syntax is also accepted:: + + Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + """ + if fields is _marker: + if kwargs: + deprecated_thing = "Creating NamedTuple classes using keyword arguments" + deprecation_msg = ( + "{name} is deprecated and will be disallowed in Python {remove}. " + "Use the class-based or functional syntax instead." + ) + else: + deprecated_thing = "Failing to pass a value for the 'fields' parameter" + example = f"`{typename} = NamedTuple({typename!r}, [])`" + deprecation_msg = ( + "{name} is deprecated and will be disallowed in Python {remove}. " + "To create a NamedTuple class with 0 fields " + "using the functional syntax, " + "pass an empty list, e.g. " + ) + example + "." + elif fields is None: + if kwargs: + raise TypeError( + "Cannot pass `None` as the 'fields' parameter " + "and also specify fields using keyword arguments" + ) + else: + deprecated_thing = "Passing `None` as the 'fields' parameter" + example = f"`{typename} = NamedTuple({typename!r}, [])`" + deprecation_msg = ( + "{name} is deprecated and will be disallowed in Python {remove}. " + "To create a NamedTuple class with 0 fields " + "using the functional syntax, " + "pass an empty list, e.g. " + ) + example + "." + elif kwargs: + raise TypeError("Either list of fields or keywords" + " can be provided to NamedTuple, not both") + if fields is _marker or fields is None: + warnings.warn( + deprecation_msg.format(name=deprecated_thing, remove="3.15"), + DeprecationWarning, + stacklevel=2, + ) + fields = kwargs.items() + nt = _make_nmtuple(typename, fields, module=_caller()) + nt.__orig_bases__ = (NamedTuple,) + return nt + + +if hasattr(collections.abc, "Buffer"): + Buffer = collections.abc.Buffer +else: + class Buffer(abc.ABC): # noqa: B024 + """Base class for classes that implement the buffer protocol. + + The buffer protocol allows Python objects to expose a low-level + memory buffer interface. Before Python 3.12, it is not possible + to implement the buffer protocol in pure Python code, or even + to check whether a class implements the buffer protocol. In + Python 3.12 and higher, the ``__buffer__`` method allows access + to the buffer protocol from Python code, and the + ``collections.abc.Buffer`` ABC allows checking whether a class + implements the buffer protocol. + + To indicate support for the buffer protocol in earlier versions, + inherit from this ABC, either in a stub file or at runtime, + or use ABC registration. This ABC provides no methods, because + there is no Python-accessible methods shared by pre-3.12 buffer + classes. It is useful primarily for static checks. + + """ + + # As a courtesy, register the most common stdlib buffer classes. + Buffer.register(memoryview) + Buffer.register(bytearray) + Buffer.register(bytes) + + +# Backport of types.get_original_bases, available on 3.12+ in CPython +if hasattr(_types, "get_original_bases"): + get_original_bases = _types.get_original_bases +else: + def get_original_bases(cls, /): + """Return the class's "original" bases prior to modification by `__mro_entries__`. + + Examples:: + + from typing import TypeVar, Generic + from pip._vendor.typing_extensions import NamedTuple, TypedDict + + T = TypeVar("T") + class Foo(Generic[T]): ... + class Bar(Foo[int], float): ... + class Baz(list[str]): ... + Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) + Spam = TypedDict("Spam", {"a": int, "b": str}) + + assert get_original_bases(Bar) == (Foo[int], float) + assert get_original_bases(Baz) == (list[str],) + assert get_original_bases(Eggs) == (NamedTuple,) + assert get_original_bases(Spam) == (TypedDict,) + assert get_original_bases(int) == (object,) + """ + try: + return cls.__dict__.get("__orig_bases__", cls.__bases__) + except AttributeError: + raise TypeError( + f'Expected an instance of type, not {type(cls).__name__!r}' + ) from None + + +# NewType is a class on Python 3.10+, making it pickleable +# The error message for subclassing instances of NewType was improved on 3.11+ +if sys.version_info >= (3, 11): + NewType = typing.NewType +else: + class NewType: + """NewType creates simple unique types with almost zero + runtime overhead. NewType(name, tp) is considered a subtype of tp + by static type checkers. At runtime, NewType(name, tp) returns + a dummy callable that simply returns its argument. Usage:: + UserId = NewType('UserId', int) + def name_by_id(user_id: UserId) -> str: + ... + UserId('user') # Fails type check + name_by_id(42) # Fails type check + name_by_id(UserId(42)) # OK + num = UserId(5) + 1 # type: int + """ + + def __call__(self, obj, /): + return obj + + def __init__(self, name, tp): + self.__qualname__ = name + if '.' in name: + name = name.rpartition('.')[-1] + self.__name__ = name + self.__supertype__ = tp + def_mod = _caller() + if def_mod != 'typing_extensions': + self.__module__ = def_mod + + def __mro_entries__(self, bases): + # We defined __mro_entries__ to get a better error message + # if a user attempts to subclass a NewType instance. bpo-46170 + supercls_name = self.__name__ + + class Dummy: + def __init_subclass__(cls): + subcls_name = cls.__name__ + raise TypeError( + f"Cannot subclass an instance of NewType. " + f"Perhaps you were looking for: " + f"`{subcls_name} = NewType({subcls_name!r}, {supercls_name})`" + ) + + return (Dummy,) + + def __repr__(self): + return f'{self.__module__}.{self.__qualname__}' + + def __reduce__(self): + return self.__qualname__ + + if sys.version_info >= (3, 10): + # PEP 604 methods + # It doesn't make sense to have these methods on Python <3.10 + + def __or__(self, other): + return typing.Union[self, other] + + def __ror__(self, other): + return typing.Union[other, self] + + +if hasattr(typing, "TypeAliasType"): + TypeAliasType = typing.TypeAliasType +else: + def _is_unionable(obj): + """Corresponds to is_unionable() in unionobject.c in CPython.""" + return obj is None or isinstance(obj, ( + type, + _types.GenericAlias, + _types.UnionType, + TypeAliasType, + )) + + class TypeAliasType: + """Create named, parameterized type aliases. + + This provides a backport of the new `type` statement in Python 3.12: + + type ListOrSet[T] = list[T] | set[T] + + is equivalent to: + + T = TypeVar("T") + ListOrSet = TypeAliasType("ListOrSet", list[T] | set[T], type_params=(T,)) + + The name ListOrSet can then be used as an alias for the type it refers to. + + The type_params argument should contain all the type parameters used + in the value of the type alias. If the alias is not generic, this + argument is omitted. + + Static type checkers should only support type aliases declared using + TypeAliasType that follow these rules: + + - The first argument (the name) must be a string literal. + - The TypeAliasType instance must be immediately assigned to a variable + of the same name. (For example, 'X = TypeAliasType("Y", int)' is invalid, + as is 'X, Y = TypeAliasType("X", int), TypeAliasType("Y", int)'). + + """ + + def __init__(self, name: str, value, *, type_params=()): + if not isinstance(name, str): + raise TypeError("TypeAliasType name must be a string") + self.__value__ = value + self.__type_params__ = type_params + + parameters = [] + for type_param in type_params: + if isinstance(type_param, TypeVarTuple): + parameters.extend(type_param) + else: + parameters.append(type_param) + self.__parameters__ = tuple(parameters) + def_mod = _caller() + if def_mod != 'typing_extensions': + self.__module__ = def_mod + # Setting this attribute closes the TypeAliasType from further modification + self.__name__ = name + + def __setattr__(self, name: str, value: object, /) -> None: + if hasattr(self, "__name__"): + self._raise_attribute_error(name) + super().__setattr__(name, value) + + def __delattr__(self, name: str, /) -> Never: + self._raise_attribute_error(name) + + def _raise_attribute_error(self, name: str) -> Never: + # Match the Python 3.12 error messages exactly + if name == "__name__": + raise AttributeError("readonly attribute") + elif name in {"__value__", "__type_params__", "__parameters__", "__module__"}: + raise AttributeError( + f"attribute '{name}' of 'typing.TypeAliasType' objects " + "is not writable" + ) + else: + raise AttributeError( + f"'typing.TypeAliasType' object has no attribute '{name}'" + ) + + def __repr__(self) -> str: + return self.__name__ + + def __getitem__(self, parameters): + if not isinstance(parameters, tuple): + parameters = (parameters,) + parameters = [ + typing._type_check( + item, f'Subscripting {self.__name__} requires a type.' + ) + for item in parameters + ] + return typing._GenericAlias(self, tuple(parameters)) + + def __reduce__(self): + return self.__name__ + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + "type 'typing_extensions.TypeAliasType' is not an acceptable base type" + ) + + # The presence of this method convinces typing._type_check + # that TypeAliasTypes are types. + def __call__(self): + raise TypeError("Type alias is not callable") + + if sys.version_info >= (3, 10): + def __or__(self, right): + # For forward compatibility with 3.12, reject Unions + # that are not accepted by the built-in Union. + if not _is_unionable(right): + return NotImplemented + return typing.Union[self, right] + + def __ror__(self, left): + if not _is_unionable(left): + return NotImplemented + return typing.Union[left, self] + + +if hasattr(typing, "is_protocol"): + is_protocol = typing.is_protocol + get_protocol_members = typing.get_protocol_members +else: + def is_protocol(tp: type, /) -> bool: + """Return True if the given type is a Protocol. + + Example:: + + >>> from typing_extensions import Protocol, is_protocol + >>> class P(Protocol): + ... def a(self) -> str: ... + ... b: int + >>> is_protocol(P) + True + >>> is_protocol(int) + False + """ + return ( + isinstance(tp, type) + and getattr(tp, '_is_protocol', False) + and tp is not Protocol + and tp is not typing.Protocol + ) + + def get_protocol_members(tp: type, /) -> typing.FrozenSet[str]: + """Return the set of members defined in a Protocol. + + Example:: + + >>> from typing_extensions import Protocol, get_protocol_members + >>> class P(Protocol): + ... def a(self) -> str: ... + ... b: int + >>> get_protocol_members(P) + frozenset({'a', 'b'}) + + Raise a TypeError for arguments that are not Protocols. + """ + if not is_protocol(tp): + raise TypeError(f'{tp!r} is not a Protocol') + if hasattr(tp, '__protocol_attrs__'): + return frozenset(tp.__protocol_attrs__) + return frozenset(_get_protocol_attrs(tp)) + + +if hasattr(typing, "Doc"): + Doc = typing.Doc +else: + class Doc: + """Define the documentation of a type annotation using ``Annotated``, to be + used in class attributes, function and method parameters, return values, + and variables. + + The value should be a positional-only string literal to allow static tools + like editors and documentation generators to use it. + + This complements docstrings. + + The string value passed is available in the attribute ``documentation``. + + Example:: + + >>> from typing_extensions import Annotated, Doc + >>> def hi(to: Annotated[str, Doc("Who to say hi to")]) -> None: ... + """ + def __init__(self, documentation: str, /) -> None: + self.documentation = documentation + + def __repr__(self) -> str: + return f"Doc({self.documentation!r})" + + def __hash__(self) -> int: + return hash(self.documentation) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Doc): + return NotImplemented + return self.documentation == other.documentation + + +_CapsuleType = getattr(_types, "CapsuleType", None) + +if _CapsuleType is None: + try: + import _socket + except ImportError: + pass + else: + _CAPI = getattr(_socket, "CAPI", None) + if _CAPI is not None: + _CapsuleType = type(_CAPI) + +if _CapsuleType is not None: + CapsuleType = _CapsuleType + __all__.append("CapsuleType") + + +# Aliases for items that have always been in typing. +# Explicitly assign these (rather than using `from typing import *` at the top), +# so that we get a CI error if one of these is deleted from typing.py +# in a future version of Python +AbstractSet = typing.AbstractSet +AnyStr = typing.AnyStr +BinaryIO = typing.BinaryIO +Callable = typing.Callable +Collection = typing.Collection +Container = typing.Container +Dict = typing.Dict +ForwardRef = typing.ForwardRef +FrozenSet = typing.FrozenSet +Generic = typing.Generic +Hashable = typing.Hashable +IO = typing.IO +ItemsView = typing.ItemsView +Iterable = typing.Iterable +Iterator = typing.Iterator +KeysView = typing.KeysView +List = typing.List +Mapping = typing.Mapping +MappingView = typing.MappingView +Match = typing.Match +MutableMapping = typing.MutableMapping +MutableSequence = typing.MutableSequence +MutableSet = typing.MutableSet +Optional = typing.Optional +Pattern = typing.Pattern +Reversible = typing.Reversible +Sequence = typing.Sequence +Set = typing.Set +Sized = typing.Sized +TextIO = typing.TextIO +Tuple = typing.Tuple +Union = typing.Union +ValuesView = typing.ValuesView +cast = typing.cast +no_type_check = typing.no_type_check +no_type_check_decorator = typing.no_type_check_decorator diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..c6fa382 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,102 @@ +""" +Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more +""" +from __future__ import absolute_import + +# Set default logging handler to avoid "No handler found" warnings. +import logging +import warnings +from logging import NullHandler + +from . import exceptions +from ._version import __version__ +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host + +# === NOTE TO REPACKAGERS AND VENDORS === +# Please delete this block, this logic is only +# for urllib3 being distributed via PyPI. +# See: https://github.com/urllib3/urllib3/issues/2680 +try: + import urllib3_secure_extra # type: ignore # noqa: F401 +except ImportError: + pass +else: + warnings.warn( + "'urllib3[secure]' extra is deprecated and will be removed " + "in a future release of urllib3 2.x. Read more in this issue: " + "https://github.com/urllib3/urllib3/issues/2680", + category=DeprecationWarning, + stacklevel=2, + ) + +__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" +__license__ = "MIT" +__version__ = __version__ + +__all__ = ( + "HTTPConnectionPool", + "HTTPSConnectionPool", + "PoolManager", + "ProxyManager", + "HTTPResponse", + "Retry", + "Timeout", + "add_stderr_logger", + "connection_from_url", + "disable_warnings", + "encode_multipart_formdata", + "get_host", + "make_headers", + "proxy_from_url", +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug("Added a stderr logging handler to logger: %s", __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter("always", exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter("default", exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter("default", exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter("ignore", category) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a9bc955abf7da65dcfa34b2fc3d5e5c5eebaeaa GIT binary patch literal 3425 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∓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 O?C|zKEquI}NBQs4(Ht!R literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c42935b5e162c91f7e64cb94e09f86c9b408b9ac GIT binary patch literal 238 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

    ~76Wt?$ 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 T^9S2_inoUcozDN_;1U0S*MX^N literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e92702f4ed32f1dbbb2adccb174960a7286ae48 GIT binary patch literal 36558 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..894cf14af20d6f7de588c77551cb04a6b8bf68f3 GIT binary patch literal 13513 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8eb9db94854aea249aaf943f0a384d795ac2cdbd GIT binary patch literal 10422 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3afa531f9619d14daa0901459e2ff5616fd87217 GIT binary patch literal 4032 zcmbVP|8En?6`%F@Z;4|Y!k6%6?*b`?*e2n6kd!Z?7dXNZ=#~Cbi<7hQj>(2yubCMK z9642bLalQ_jZZz5AR!&6o^*#$rT*A|pz05mszlC}bT3F$q*eKilKY|br@q&Sb7!t@sgo$|rVn)```7K-@txk_8oMLRt_w?NA+Q zhdDaaPIGjnT`)RTx8_NEfX5}fRj=kt`%K!S`n5nhVA5VSsD;uY0XYzMj_tG$Y>u+; zplPWi15Jo24MV3n(d&a*z%LUra4Fq3YorCTU zVs+IJ8gtkz&5?0#vyFLdsyWJn{bBYviI~rRKV}-ko>?P}l+jqr`ZYe29Zd;kbQ#5+ z6Bh#_v`a-IVr@hsM50v5UsX#93b&zRk>G+VWwD0yOw8#-)D#UfT~}!`JF4pxXGZj5 zUY1BHX$pGQ2FDm~iDnfg?lpWPO5UUm?a!(MerMu8uctrqODwNo$oV7VuvcerC@C8(kkpk*@hdygd4pRp4C4<_Z||~xk(wZhNC>JQ>6VrJ4zWf z%q!%B3}Vx2YuC%d0Q%q%LX(cBOO_q1;Y5wI+-1ivggX$ox3{yPEom%dQ_ZpL_!+8m zCS0f_{K|Plh&v{JV*0}%!$e|O)WyN_5Yo=)r~P!7tCuM|*3b-oN`%H1?8mJwH6%d3wLF&YxVcY(kC- z#9GMN)R%V2!Y%Z={xpCdf=u2n1Bl#0WwdrB?vxVX*rsigNm0fHg0o@Pkn-O0ujlMbC3bcrEjansg1^gpDdx%oX!lzS&ej=V*=@PKtwIb1cc-Vv%C8 zpELCj|GT+{yTu!$N_G^GjulCszP^Wvb%Xzp4s8MDI?HjZ9f4={AaoWIl+gzebypzr zCxuBzStvVlc09H~lp!8v4}^;k&;zI8NFFwXYlbjR*ZHRZ_*I<8Hw)zC#GdAN)8uhg z&q^vinQXl8hhu36bf&k?hx-;fkKKK1u4hiFMyjVj@xb)uDtE6BBeC^9_kU_mIzbrO z$GiQ|t<#&tVdcMRe4Ov%L1t+j?7BPtF{@smd!zDxRk(fj?)Xc>?=tQp+hHJ_(+qmT z3x~KscEe!h7b}i~Yc7a%!^;F`;2lKo_Ga|{Dctw@kuOescH-CVi=D@6;l6oa-=F#E zwP4r0tBbV5j%)+CVZt*UzogZRu(~!V?SSIOoeD6{W46Y+&!Zp00(A*tiFzo>DJfbx;eZ?LJ0fHvo7)=-cdf9HAy*BVPW zUulWP4alzbJd==o$9Oz$X!h-w-8lzTZ*J**8+Om+dG#bpX3hjCgo2Di>F}_XvxbKO z1fi}2yu_kbRGCtc2undhrzK>GN#fAp&>3FeX%ef$SwC<{T0Lj?2O#5_Z2;0|Q@$l# zgu1Yq#c`?o^&mXH{v^BXYo0Zj6Z1L~X#r;yI0=v()X&35TGgXy?+|Y&sw$3Pk>edN zH)QK;8%o!~zgaHSOT7(c9@Gr{8z(%8#D3ZmpgfLS0uw$yO(cNY?CQSLP~*gY8gC^W zCe3=$tOE@94PIgpUalJ+i#A#bl%7yFj6!z81gZ~i0u!hVr;=yzcfm-#L}Bd&od~F%{^wJV42NAxgFSalT5<{GTh|m z>BnIADR}5#p##ioN1@nE-_*d8H$3m%wj6u27TZ_xtwcKSpZ#OxP{qCE3(W?m1E2I% z)Ax@pZ0)Ya5{tg%im$c8Wr_Wc}VrbVB z>)`6quY4WPccW;tYXn;|58}y3fa>n{2$hBuIl==Vu7Ui9v<+fTbL<^@H@AXAV)gOM84yiE*DjN zl5lHq^rmN_d+rnj;W6rZio#!`mamcjF>3z{5+9=-k5R`He|x2UcK7t|>W!Lz?|osx f|K^nEg~uywd9fuT9C>jdEPU&meVszw{NjHBI=!h* literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c99e674eedcb56569455f42422a4b22159f45bb5 GIT binary patch literal 20449 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 VS2wk-)RF&7o!&XAXd{xKe+TOQ`M3Z8 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1030b67b19743db80d81f83718e39bbe7aa0905c GIT binary patch literal 33963 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

    O>3pe@*Yy8r!3`4)C&=X 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..bceb845 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,355 @@ +from __future__ import absolute_import + +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict + +from .exceptions import InvalidHeader +from .packages import six +from .packages.six import iterkeys, itervalues + +__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError( + "Iteration over this class is unlikely to be threadsafe." + ) + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ", ".join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, "keys"): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return dict((k.lower(), v) for k, v in self.itermerged()) == dict( + (k.lower(), v) for k, v in other.itermerged() + ) + + def __ne__(self, other): + return not self.__eq__(other) + + if six.PY2: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + """D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + """ + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError( + "extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args)) + ) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + def _prepare_for_method_change(self): + """ + Remove content-specific header fields before changing the request + method to GET or HEAD according to RFC 9110, Section 15.4. + """ + content_specific_headers = [ + "Content-Encoding", + "Content-Language", + "Content-Location", + "Content-Type", + "Content-Length", + "Digest", + "Last-Modified", + ] + for header in content_specific_headers: + self.discard(header) + return self + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ", ".join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (" ", "\t") + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + "Header continuation with no previous header: %s" % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + " " + line.strip()) + continue + + key, value = line.split(":", 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py new file mode 100644 index 0000000..d49df2a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py @@ -0,0 +1,2 @@ +# This file is protected via CODEOWNERS +__version__ = "1.26.20" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..de35b63 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py @@ -0,0 +1,572 @@ +from __future__ import absolute_import + +import datetime +import logging +import os +import re +import socket +import warnings +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 +from .util.proxy import create_proxy_ssl_context + +try: # Compiled with SSL? + import ssl + + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: + # Python 3: not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: + # Python 2 + class ConnectionError(Exception): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + BrokenPipeError = BrokenPipeError +except NameError: # Python 2: + + class BrokenPipeError(Exception): + pass + + +from ._collections import HTTPHeaderDict # noqa (historical, removed in v2) +from ._version import __version__ +from .exceptions import ( + ConnectTimeoutError, + NewConnectionError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection +from .util.ssl_ import ( + assert_fingerprint, + create_urllib3_context, + is_ipaddress, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .util.ssl_match_hostname import CertificateError, match_hostname + +log = logging.getLogger(__name__) + +port_by_scheme = {"http": 80, "https": 443} + +# When it comes time to update this value as a part of regular maintenance +# (ie test_recent_date is failing) update it to ~6 months before the current date. +RECENT_DATE = datetime.date(2024, 1, 1) + +_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on :class:`http.client.HTTPConnection` but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass: + + .. code-block:: python + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme["http"] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + #: Whether this proxy connection (if used) verifies the proxy host's + #: certificate. + proxy_is_verified = None + + def __init__(self, *args, **kw): + if not six.PY2: + kw.pop("strict", None) + + # Pre-set source_address. + self.source_address = kw.get("source_address") + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop("socket_options", self.default_socket_options) + + # Proxy options provided by the user. + self.proxy = kw.pop("proxy", None) + self.proxy_config = kw.pop("proxy_config", None) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip(".") + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw["source_address"] = self.source_address + + if self.socket_options: + extra_kw["socket_options"] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw + ) + + except SocketTimeout: + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + return conn + + def _is_using_tunnel(self): + # Google App Engine's httplib does not define _tunnel_host + return getattr(self, "_tunnel_host", None) + + def _prepare_conn(self, conn): + self.sock = conn + if self._is_using_tunnel(): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def putrequest(self, method, url, *args, **kwargs): + """ """ + # Empty docstring because the indentation of CPython's implementation + # is broken but we don't want this method in our documentation. + match = _CONTAINS_CONTROL_CHAR_RE.search(method) + if match: + raise ValueError( + "Method cannot contain non-token characters %r (found at least %r)" + % (method, match.group()) + ) + + return _HTTPConnection.putrequest(self, method, url, *args, **kwargs) + + def putheader(self, header, *values): + """ """ + if not any(isinstance(v, str) and v == SKIP_HEADER for v in values): + _HTTPConnection.putheader(self, header, *values) + elif six.ensure_str(header.lower()) not in SKIPPABLE_HEADERS: + raise ValueError( + "urllib3.util.SKIP_HEADER only supports '%s'" + % ("', '".join(map(str.title, sorted(SKIPPABLE_HEADERS))),) + ) + + def request(self, method, url, body=None, headers=None): + # Update the inner socket's timeout value to send the request. + # This only triggers if the connection is re-used. + if getattr(self, "sock", None) is not None: + self.sock.settimeout(self.timeout) + + if headers is None: + headers = {} + else: + # Avoid modifying the headers passed into .request() + headers = headers.copy() + if "user-agent" not in (six.ensure_str(k.lower()) for k in headers): + headers["User-Agent"] = _get_default_user_agent() + super(HTTPConnection, self).request(method, url, body=body, headers=headers) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = headers or {} + header_keys = set([six.ensure_str(k.lower()) for k in headers]) + skip_accept_encoding = "accept-encoding" in header_keys + skip_host = "host" in header_keys + self.putrequest( + method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host + ) + if "user-agent" not in header_keys: + self.putheader("User-Agent", _get_default_user_agent()) + for header, value in headers.items(): + self.putheader(header, value) + if "transfer-encoding" not in header_keys: + self.putheader("Transfer-Encoding", "chunked") + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode("utf8") + len_str = hex(len(chunk))[2:] + to_send = bytearray(len_str.encode()) + to_send += b"\r\n" + to_send += chunk + to_send += b"\r\n" + self.send(to_send) + + # After the if clause, to always have a closed body + self.send(b"0\r\n\r\n") + + +class HTTPSConnection(HTTPConnection): + """ + Many of the parameters to this constructor are passed to the underlying SSL + socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. + """ + + default_port = port_by_scheme["https"] + + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ca_cert_data = None + ssl_version = None + assert_fingerprint = None + tls_in_tls_required = False + + def __init__( + self, + host, + port=None, + key_file=None, + cert_file=None, + key_password=None, + strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, + server_hostname=None, + **kw + ): + + HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.key_password = key_password + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = "https" + + def set_cert( + self, + key_file=None, + cert_file=None, + cert_reqs=None, + key_password=None, + ca_certs=None, + assert_hostname=None, + assert_fingerprint=None, + ca_cert_dir=None, + ca_cert_data=None, + ): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also + # have an SSLContext object in which case we'll use its verify_mode. + if cert_reqs is None: + if self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + else: + cert_reqs = resolve_cert_reqs(None) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + self.ca_cert_data = ca_cert_data + + def connect(self): + # Add certificate verification + self.sock = conn = self._new_conn() + hostname = self.host + tls_in_tls = False + + if self._is_using_tunnel(): + if self.tls_in_tls_required: + self.sock = conn = self._connect_tls_proxy(hostname, conn) + tls_in_tls = True + + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn( + ( + "System time is way off (before {0}). This will probably " + "lead to SSL verification errors" + ).format(RECENT_DATE), + SystemTimeWarning, + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + default_ssl_context = False + if self.ssl_context is None: + default_ssl_context = True + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + + # Try to load OS default certs if none are given. + # Works well on Windows (requires Python3.4+) + if ( + not self.ca_certs + and not self.ca_cert_dir + and not self.ca_cert_data + and default_ssl_context + and hasattr(context, "load_default_certs") + ): + context.load_default_certs() + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + key_password=self.key_password, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + server_hostname=server_hostname, + ssl_context=context, + tls_in_tls=tls_in_tls, + ) + + # If we're using all defaults and the connection + # is TLSv1 or TLSv1.1 we throw a DeprecationWarning + # for the host. + if ( + default_ssl_context + and self.ssl_version is None + and hasattr(self.sock, "version") + and self.sock.version() in {"TLSv1", "TLSv1.1"} + ): # Defensive: + warnings.warn( + "Negotiating TLSv1/TLSv1.1 by default is deprecated " + "and will be disabled in urllib3 v2.0.0. Connecting to " + "'%s' with '%s' can be enabled by explicitly opting-in " + "with 'ssl_version'" % (self.host, self.sock.version()), + DeprecationWarning, + ) + + if self.assert_fingerprint: + assert_fingerprint( + self.sock.getpeercert(binary_form=True), self.assert_fingerprint + ) + elif ( + context.verify_mode != ssl.CERT_NONE + and not getattr(context, "check_hostname", False) + and self.assert_hostname is not False + ): + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get("subjectAltName", ()): + warnings.warn( + ( + "Certificate for {0} has no `subjectAltName`, falling back to check for a " + "`commonName` for now. This feature is being removed by major browsers and " + "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " + "for details.)".format(hostname) + ), + SubjectAltNameWarning, + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED + or self.assert_fingerprint is not None + ) + + def _connect_tls_proxy(self, hostname, conn): + """ + Establish a TLS connection to the proxy using the provided SSL context. + """ + proxy_config = self.proxy_config + ssl_context = proxy_config.ssl_context + if ssl_context: + # If the user provided a proxy context, we assume CA and client + # certificates have already been set + return ssl_wrap_socket( + sock=conn, + server_hostname=hostname, + ssl_context=ssl_context, + ) + + ssl_context = create_proxy_ssl_context( + self.ssl_version, + self.cert_reqs, + self.ca_certs, + self.ca_cert_dir, + self.ca_cert_data, + ) + + # If no cert was provided, use only the default options for server + # certificate validation + socket = ssl_wrap_socket( + sock=conn, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + server_hostname=hostname, + ssl_context=ssl_context, + ) + + if ssl_context.verify_mode != ssl.CERT_NONE and not getattr( + ssl_context, "check_hostname", False + ): + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = socket.getpeercert() + if not cert.get("subjectAltName", ()): + warnings.warn( + ( + "Certificate for {0} has no `subjectAltName`, falling back to check for a " + "`commonName` for now. This feature is being removed by major browsers and " + "deprecated by RFC 2818. (See https://github.com/urllib3/urllib3/issues/497 " + "for details.)".format(hostname) + ), + SubjectAltNameWarning, + ) + _match_hostname(cert, hostname) + + self.proxy_is_verified = ssl_context.verify_mode == ssl.CERT_REQUIRED + return socket + + +def _match_hostname(cert, asserted_hostname): + # Our upstream implementation of ssl.match_hostname() + # only applies this normalization to IP addresses so it doesn't + # match DNS SANs so we do the same thing! + stripped_hostname = asserted_hostname.strip("u[]") + if is_ipaddress(stripped_hostname): + asserted_hostname = stripped_hostname + + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.warning( + "Certificate did not match expected hostname: %s. Certificate: %s", + asserted_hostname, + cert, + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +def _get_default_user_agent(): + return "python-urllib3/%s" % __version__ + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + + pass + + +if not ssl: + HTTPSConnection = DummyConnection # noqa: F811 + + +VerifiedHTTPSConnection = HTTPSConnection diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..0872ed7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,1140 @@ +from __future__ import absolute_import + +import errno +import logging +import re +import socket +import sys +import warnings +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from ._collections import HTTPHeaderDict +from .connection import ( + BaseSSLError, + BrokenPipeError, + DummyConnection, + HTTPConnection, + HTTPException, + HTTPSConnection, + VerifiedHTTPSConnection, + port_by_scheme, +) +from .exceptions import ( + ClosedPoolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + InsecureRequestWarning, + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, +) +from .packages import six +from .packages.six.moves import queue +from .request import RequestMethods +from .response import HTTPResponse +from .util.connection import is_connection_dropped +from .util.proxy import connection_requires_http_tunnel +from .util.queue import LifoQueue +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.ssl_match_hostname import CertificateError +from .util.timeout import Timeout +from .util.url import Url, _encode_target +from .util.url import _normalize_host as normalize_host +from .util.url import get_host, parse_url + +try: # Platform-specific: Python 3 + import weakref + + weakref_finalize = weakref.finalize +except AttributeError: # Platform-specific: Python 2 + from .packages.backports.weakref_finalize import weakref_finalize + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + + .. note:: + ConnectionPool.urlopen() does not normalize or percent-encode target URIs + which is useful if your target server doesn't support percent-encoded + target URIs. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _normalize_host(host, scheme=self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return "%s(host=%r, port=%r)" % (type(self).__name__, self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`http.client.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`http.client.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`http.client.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.ProxyManager` + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.ProxyManager` + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = "http" + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__( + self, + host, + port=None, + strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, + maxsize=1, + block=False, + headers=None, + retries=None, + _proxy=None, + _proxy_headers=None, + _proxy_config=None, + **conn_kw + ): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + self.proxy_config = _proxy_config + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault("socket_options", []) + + self.conn_kw["proxy"] = self.proxy + self.conn_kw["proxy_config"] = self.proxy_config + + # Do not pass 'self' as callback to 'finalize'. + # Then the 'finalize' would keep an endless living (leak) to self. + # By just passing a reference to the pool allows the garbage collector + # to free self if nobody else has a reference to it. + pool = self.pool + + # Close all the HTTPConnections in the pool before the + # HTTPConnectionPool object is garbage collected. + weakref_finalize(self, _close_pool_connections, pool) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTP connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "80", + ) + + conn = self.ConnectionCls( + host=self.host, + port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, + **self.conn_kw + ) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError( + self, + "Pool reached maximum size and no more connections are allowed.", + ) + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, "auto_open", 1) == 0: + # This is a proxied connection that has been mutated by + # http.client._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s. Connection pool size: %s", + self.host, + self.pool.qsize(), + ) + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """Helper that always returns a :class:`urllib3.util.Timeout`""" + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, "errno") and err.errno in _blocking_errnos: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if "timed out" in str(err) or "did not complete (read)" in str( + err + ): # Python < 2.7.4 + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % timeout_value + ) + + def _make_request( + self, conn, method, url, timeout=_Default, chunked=False, **httplib_request_kw + ): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout) + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls http.client.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + try: + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # We are swallowing BrokenPipeError (errno.EPIPE) since the server is + # legitimately able to close the connection after sending a valid response. + # With this behaviour, the received response is still readable. + except BrokenPipeError: + # Python 3 + pass + except IOError as e: + # Python 2 and macOS/Linux + # EPIPE and ESHUTDOWN are BrokenPipeError on Python 2, and EPROTOTYPE/ECONNRESET are needed on macOS + # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ + if e.errno not in { + errno.EPIPE, + errno.ESHUTDOWN, + errno.EPROTOTYPE, + errno.ECONNRESET, + }: + raise + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, "sock", None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout + ) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: + # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: + # Python 3 + try: + httplib_response = conn.getresponse() + except BaseException as e: + # Remove the TypeError from the exception chain in + # Python 3 (including for exceptions like SystemExit). + # Otherwise it looks like a bug in the code. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, "_http_vsn_str", "HTTP/?") + log.debug( + '%s://%s:%s "%s %s %s" %s %s', + self.scheme, + self.host, + self.port, + method, + url, + http_version, + httplib_response.status, + httplib_response.length, + ) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + "Failed to parse headers (url=%s): %s", + self._absolute_url(url), + hpe, + exc_info=True, + ) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + # Close all the HTTPConnections in the pool. + _close_pool_connections(old_pool) + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith("/"): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + if host is not None: + host = _normalize_host(host, scheme=scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=None, + redirect=True, + assert_same_host=True, + timeout=_Default, + pool_timeout=None, + release_conn=None, + chunked=False, + body_pos=None, + **response_kw + ): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When ``False``, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + + parsed_url = parse_url(url) + destination_scheme = parsed_url.scheme + + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get("preload_content", True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + # Ensure that the URL we're connecting to is properly encoded + if url.startswith("/"): + url = six.ensure_str(_encode_target(url)) + else: + url = six.ensure_str(parsed_url.url) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + http_tunnel_required = connection_requires_http_tunnel( + self.proxy, self.proxy_config, destination_scheme + ) + + # Merge the proxy headers. Only done when not using HTTP CONNECT. We + # have to copy the headers dict so we can safely change it without those + # changes being reflected in anyone else's copy. + if not http_tunnel_required: + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr( + conn, "sock", None + ) + if is_new_proxy_conn and http_tunnel_required: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request( + conn, + method, + url, + timeout=timeout_obj, + body=body, + headers=headers, + chunked=chunked, + ) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw["request_method"] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib( + httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw + ) + + # Everything went great! + clean_exit = True + + except EmptyPoolError: + # Didn't get a connection from the pool, no need to clean up + clean_exit = True + release_this_conn = False + raise + + except ( + TimeoutError, + HTTPException, + SocketError, + ProtocolError, + BaseSSLError, + SSLError, + CertificateError, + ) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + + def _is_ssl_error_message_from_http_proxy(ssl_error): + # We're trying to detect the message 'WRONG_VERSION_NUMBER' but + # SSLErrors are kinda all over the place when it comes to the message, + # so we try to cover our bases here! + message = " ".join(re.split("[^a-z]", str(ssl_error).lower())) + return ( + "wrong version number" in message + or "unknown protocol" in message + or "record layer failure" in message + ) + + # Try to detect a common user error with proxies which is to + # set an HTTP proxy to be HTTPS when it should be 'http://' + # (ie {'http': 'http://proxy', 'https': 'https://proxy'}) + # Instead we add a nice error message and point to a URL. + if ( + isinstance(e, BaseSSLError) + and self.proxy + and _is_ssl_error_message_from_http_proxy(e) + and conn.proxy + and conn.proxy.scheme == "https" + ): + e = ProxyError( + "Your proxy appears to only use HTTP and not HTTPS, " + "try changing your proxy URL to be HTTP. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#https-proxy-error-http-proxy", + SSLError(e), + ) + elif isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError("Cannot connect to proxy.", e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError("Connection aborted.", e) + + retries = retries.increment( + method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] + ) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning( + "Retrying (%r) after connection broken by '%r': %s", retries, err, url + ) + return self.urlopen( + method, + url, + body, + headers, + retries, + redirect, + assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. + method = "GET" + # And lose the body not to transfer anything sensitive. + body = None + headers = HTTPHeaderDict(headers)._prepare_for_method_change() + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, + redirect_location, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.headers.get("Retry-After")) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, + url, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + **response_kw + ) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + :class:`.HTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` + is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = "https" + ConnectionCls = HTTPSConnection + + def __init__( + self, + host, + port=None, + strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, + maxsize=1, + block=False, + headers=None, + retries=None, + _proxy=None, + _proxy_headers=None, + key_file=None, + cert_file=None, + cert_reqs=None, + key_password=None, + ca_certs=None, + ssl_version=None, + assert_hostname=None, + assert_fingerprint=None, + ca_cert_dir=None, + **conn_kw + ): + + HTTPConnectionPool.__init__( + self, + host, + port, + strict, + timeout, + maxsize, + block, + headers, + retries, + _proxy, + _proxy_headers, + **conn_kw + ) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert( + key_file=self.key_file, + key_password=self.key_password, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint, + ) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establishes a tunnel connection through HTTP CONNECT. + + Tunnel connection is established early because otherwise httplib would + improperly set Host: header to proxy's IP:port. + """ + + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + + if self.proxy.scheme == "https": + conn.tls_in_tls_required = True + + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`http.client.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTPS connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "443", + ) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError( + "Can't connect to HTTPS URL because the SSL module is not available." + ) + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls( + host=actual_host, + port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, + cert_file=self.cert_file, + key_file=self.key_file, + key_password=self.key_password, + **self.conn_kw + ) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, "sock", None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn( + ( + "Unverified HTTPS request is being made to host '%s'. " + "Adding certificate verification is strongly advised. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings" % conn.host + ), + InsecureRequestWarning, + ) + + if getattr(conn, "proxy_is_verified", None) is False: + warnings.warn( + ( + "Unverified HTTPS connection done to an HTTPS proxy. " + "Adding certificate verification is strongly advised. See: " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings" + ), + InsecureRequestWarning, + ) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == "https": + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _normalize_host(host, scheme): + """ + Normalize hosts for comparisons and use with sockets. + """ + + host = normalize_host(host, scheme) + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + if host.startswith("[") and host.endswith("]"): + host = host[1:-1] + return host + + +def _close_pool_connections(pool): + """Drains a queue of connections and closes each one.""" + try: + while True: + conn = pool.get(block=False) + if conn: + conn.close() + except queue.Empty: + pass # Done. diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8462ef300f4c5ce649a9899219a168f600e8bbdf GIT binary patch literal 218 zcmZ8bOA5j;6ilpw2tA04`21|ejTK$#1%wdWXoJm%dpMJXBP()+Aza!gA+o#KXBh*@QkfCN$vI+`a2FaCouoZq6 zPB5EJNx`Bchcj90iUU_IG~xs%`dX{SWHtvUJST>gS9akJj4(i3t}1OI*d}EcP-^9E hdZJV);VGS%_#7^!u0q3Cc95FjMAw;jhB3BTaz7*iI{yFw literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20d3352fe273af32bef193a234b97ae75aa2759d GIT binary patch literal 1868 zcmdT_&ub(_6t3#|>C9wz6GPYyI#xEgah7CyH!BIqx)9AIF45T~i3&kzI$f3Np7eAz zRW)NKr-&W|FW#ach#<(4(}J)k!Mm62#>3Kh5Il&tHQAFVU-kUhY!d$fAN1=t?^VD4 z>U&@H{4y|*Ltqu_quNgig#OS!dS-NkqcQ}$h@v$_F*SU=hH2t6v}VvG_ykRXPtr8_ z6wQE7w~bPE`>oun>q*k!wCOVv3f}T4gWt>!BvG7DrkJCMav7NmLsAK9Ucd+oTAtuR zg9WOb`%43;I$ap?O=AL_sEbMAUU9D*Y+;$hNa;1P_3|sIgsUYZ8uFy&bI0~AI}BO; z(r6HJ0FXXQ-9tzE>3=>oUEW}3qv_g>hE2_R?ld(vX)b!|o#wiE{o1vudAlvA?rcoG z%_%cs1E%k-n_*kIJh)N5K5a@*v8m8@HtiadX6S{c)nWnV!fXm3*4{839w-41Jp*8M zi71Edr~vT#V8si7D+`w#2DgKL%fEb(f8|kr=GXDp55{NqlQSX%g|kUpfXXg9i!?C; zr1b`l>Pc95!YIB38ES04h7gdMu*ZS>WfpRwB=I)lK>|twGZ)Pu@PZogf;hY338_ep z1x(n=;{lO&K-c+JIhP|~tDpeMfC74a4fIf60|a9WMnEZU;K9)RHj&Enecjsb^_e8= zO+`EvchizpRC=xJ6wI&^xIh$mI3+Psk z+eyZVt5hi8FipqjOX@D_CE|HT2A5H$J93c*p5q}3J?Cin`1q|Zcj7#h3UEmRZU;R*hYA`u(-6JTskcYJ>d8peGUPfZLHwlv3g$yy$nJvw1tHU z66vSTT2)W=%l&{FG_lw1Sl7xtVKlkdJ;NZXR8{1m9-UvQEPqg0wpQ*etbRDRT#3+j zVV<>^&qICs%zH^O0PDm#y*N>0D#`)*AjFS7<(}YA=&i}?ap=M5{m}=-`^CrEOJ7YNC5-9xpXm#q)W0kqq{)+%ksAA-kthcBzK6hV z4=u);J@%b7#f!T7ywZdoU+i9jK+b|Y&D6wyGPOVW>OuO7rfT9eRnV)WH$9DA)W#)a zJ3r4t!5mvLT3+a2c^*(Sa_YluHChcRE<%&ba7m4L2mPME5WlgMi87W2XVJ1c`q1CX z_@s115bsYvdt&2J_GagA>XsOVs@9_{fqRm`82@b;IC+#sICq%Fc=j-x!SCY3;RGH# PEF|#6QNh52@!S6e*}9@o literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1accea3626dd61641acd0f57a2d95691d7d7317f GIT binary patch literal 11584 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 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes import ( + CDLL, + CFUNCTYPE, + POINTER, + c_bool, + c_byte, + c_char_p, + c_int32, + c_long, + c_size_t, + c_uint32, + c_ulong, + c_void_p, +) +from ctypes.util import find_library + +from ...packages.six import raise_from + +if platform.system() != "Darwin": + raise ImportError("Only macOS is supported") + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split("."))) +if version_info < (10, 8): + raise OSError( + "Only OS X 10.8 and newer are supported, not %s.%s" + % (version_info[0], version_info[1]) + ) + + +def load_cdll(name, macos10_16_path): + """Loads a CDLL by name, falling back to known path on 10.16+""" + try: + # Big Sur is technically 11 but we use 10.16 due to the Big Sur + # beta being labeled as 10.16. + if version_info >= (10, 16): + path = macos10_16_path + else: + path = find_library(name) + if not path: + raise OSError # Caught and reraised as 'ImportError' + return CDLL(path, use_errno=True) + except OSError: + raise_from(ImportError("The library %s failed to load" % name), None) + + +Security = load_cdll( + "Security", "/System/Library/Frameworks/Security.framework/Security" +) +CoreFoundation = load_cdll( + "CoreFoundation", + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", +) + + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [CFAllocatorRef, CFDataRef] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [SecCertificateRef] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef), + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef), + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [SecKeychainRef] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef), + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE( + OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t) + ) + + Security.SSLSetIOFuncs.argtypes = [SSLContextRef, SSLReadFunc, SSLWriteFunc] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [SSLContextRef, c_char_p, c_size_t] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [SSLContextRef, CFArrayRef] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [SSLContextRef, CFTypeRef, Boolean] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [SSLContextRef, SSLConnectionRef] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [SSLContextRef, c_char_p, c_size_t] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [SSLContextRef] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [SSLContextRef, c_char_p, c_size_t, POINTER(c_size_t)] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [SSLContextRef] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [SSLContextRef, POINTER(c_size_t)] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t), + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t, + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [SSLContextRef, POINTER(c_size_t)] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t), + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [SSLContextRef, POINTER(SSLCipherSuite)] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol), + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [SSLContextRef, POINTER(SecTrustRef)] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [SecTrustRef, CFArrayRef] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [SecTrustRef, Boolean] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [SecTrustRef, POINTER(SecTrustResultType)] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [SecTrustRef] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [SecTrustRef, CFIndex] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType, + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [SSLContextRef, SSLSessionOption, Boolean] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [SSLContextRef, SSLProtocol] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [SSLContextRef, SSLProtocol] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + try: + Security.SSLSetALPNProtocols.argtypes = [SSLContextRef, CFArrayRef] + Security.SSLSetALPNProtocols.restype = OSStatus + except AttributeError: + # Supported only in 10.12+ + pass + + Security.SecCopyErrorMessageString.argtypes = [OSStatus, c_void_p] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, "kSecImportExportPassphrase" + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, "kSecImportItemIdentity" + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [CFTypeRef] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [CFTypeRef] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [CFTypeRef] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding, + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [CFStringRef, CFStringEncoding] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding, + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [CFAllocatorRef, c_char_p, CFIndex] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [CFDataRef] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [CFDataRef] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks, + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [CFDictionaryRef, CFTypeRef] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [CFMutableArrayRef, c_void_p] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [CFArrayRef] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [CFArrayRef, CFIndex] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, "kCFAllocatorDefault" + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeArrayCallBacks" + ) + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeDictionaryKeyCallBacks" + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, "kCFTypeDictionaryValueCallBacks" + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError("Error initializing ctypes") + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + # SecureTransport does not support TLS 1.3 even if there's a constant for it + kTLSProtocol13 = 10 + kTLSProtocolMaxSupported = 999 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + # Source: https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9 + TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_AES_128_CCM_8_SHA256 = 0x1305 + TLS_AES_128_CCM_SHA256 = 0x1304 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..fa0b245 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,397 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import os +import re +import ssl +import struct +import tempfile + +from .bindings import CFConst, CoreFoundation, Security + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cfstr(py_bstr): + """ + Given a Python binary data, create a CFString. + The string must be CFReleased by the caller. + """ + c_str = ctypes.c_char_p(py_bstr) + cf_str = CoreFoundation.CFStringCreateWithCString( + CoreFoundation.kCFAllocatorDefault, + c_str, + CFConst.kCFStringEncodingUTF8, + ) + return cf_str + + +def _create_cfstring_array(lst): + """ + Given a list of Python binary data, create an associated CFMutableArray. + The array must be CFReleased by the caller. + + Raises an ssl.SSLError on failure. + """ + cf_arr = None + try: + cf_arr = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + if not cf_arr: + raise MemoryError("Unable to allocate memory!") + for item in lst: + cf_str = _cfstr(item) + if not cf_str: + raise MemoryError("Unable to allocate memory!") + try: + CoreFoundation.CFArrayAppendValue(cf_arr, cf_str) + finally: + CoreFoundation.CFRelease(cf_str) + except BaseException as e: + if cf_arr: + CoreFoundation.CFRelease(cf_arr) + raise ssl.SSLError("Unable to allocate array: %s" % (e,)) + return cf_arr + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, buffer, 1024, CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError("Error copying C string from CFStringRef") + string = buffer.value + if string is not None: + string = string.decode("utf-8") + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u"": + output = u"OSStatus %s" % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + raise + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode("utf-8") + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode("utf-8") + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, len(password), password, False, None, ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, "rb") as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, raw_filedata, len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array), # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex(result_array, index) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file(keychain, file_path) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, certificates[0], ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) + + +TLS_PROTOCOL_VERSIONS = { + "SSLv2": (0, 2), + "SSLv3": (3, 0), + "TLSv1": (3, 1), + "TLSv1.1": (3, 2), + "TLSv1.2": (3, 3), +} + + +def _build_tls_unknown_ca_alert(version): + """ + Builds a TLS alert record for an unknown CA. + """ + ver_maj, ver_min = TLS_PROTOCOL_VERSIONS[version] + severity_fatal = 0x02 + description_unknown_ca = 0x30 + msg = struct.pack(">BB", severity_fatal, description_unknown_ca) + msg_len = len(msg) + record_type_alert = 0x15 + record = struct.pack(">BBBH", record_type_alert, ver_maj, ver_min, msg_len) + msg + return record diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..1717ee2 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,314 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from pip._vendor.urllib3 import PoolManager + from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations `_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + `_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import + +import io +import logging +import warnings + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + SSLError, + TimeoutError, +) +from ..packages.six.moves.urllib.parse import urljoin +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.retry import Retry +from ..util.timeout import Timeout +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabytes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__( + self, + headers=None, + retries=None, + validate_certificate=True, + urlfetch_retries=True, + ): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment." + ) + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/1.26.x/reference/urllib3.contrib.html.", + AppEnginePlatformWarning, + ) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=None, + redirect=True, + timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw + ): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = redirect and retries.redirect != 0 and retries.total + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if "too large" in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", + e, + ) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if "Too many redirects" in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", + e, + ) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e + ) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw + ) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if self.urlfetch_retries and retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = "GET" + + try: + retries = retries.increment( + method, url, response=http_response, _pool=self + ) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, + redirect_url, + body, + headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw + ) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.headers.get("Retry-After")) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment(method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, + url, + body=body, + headers=headers, + retries=retries, + redirect=redirect, + timeout=timeout, + **response_kw + ) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get("content-encoding") + + if content_encoding == "deflate": + del urlfetch_resp.headers["content-encoding"] + + transfer_encoding = urlfetch_resp.headers.get("transfer-encoding") + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == "chunked": + encodings = transfer_encoding.split(",") + encodings.remove("chunked") + urlfetch_resp.headers["transfer-encoding"] = ",".join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning, + ) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning, + ) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..4716657 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,130 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +import warnings +from logging import getLogger + +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + +warnings.warn( + "The 'urllib3.contrib.ntlmpool' module is deprecated and will be removed " + "in urllib3 v2.0 release, urllib3 is not able to support it properly due " + "to reasons listed in issue: https://github.com/urllib3/urllib3/issues/2282. " + "If you are a user of this module please comment in the mentioned issue.", + DeprecationWarning, +) + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = "https" + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split("\\", 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug( + "Starting NTLM HTTPS connection no. %d: https://%s%s", + self.num_connections, + self.host, + self.authurl, + ) + + headers = {"Connection": "Keep-Alive"} + req_header = "Authorization" + resp_header = "www-authenticate" + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = "NTLM %s" % ntlm.create_NTLM_NEGOTIATE_MESSAGE( + self.rawuser + ) + log.debug("Request headers: %s", headers) + conn.request("GET", self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.headers) + log.debug("Response status: %s %s", res.status, res.reason) + log.debug("Response headers: %s", reshdr) + log.debug("Response data: %s [...]", res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(", ") + auth_header_value = None + for s in auth_header_values: + if s[:5] == "NTLM ": + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception( + "Unexpected %s response header: %s" % (resp_header, reshdr[resp_header]) + ) + + # Send authentication message + ServerChallenge, NegotiateFlags = ntlm.parse_NTLM_CHALLENGE_MESSAGE( + auth_header_value + ) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE( + ServerChallenge, self.user, self.domain, self.pw, NegotiateFlags + ) + headers[req_header] = "NTLM %s" % auth_msg + log.debug("Request headers: %s", headers) + conn.request("GET", self.authurl, None, headers) + res = conn.getresponse() + log.debug("Response status: %s %s", res.status, res.reason) + log.debug("Response headers: %s", dict(res.headers)) + log.debug("Response data: %s [...]", res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception("Server rejected request: wrong username or password") + raise Exception("Wrong server response: %s %s" % (res.status, res.reason)) + + res.fp = None + log.debug("Connection established") + return conn + + def urlopen( + self, + method, + url, + body=None, + headers=None, + retries=3, + redirect=True, + assert_same_host=True, + ): + if headers is None: + headers = {} + headers["Connection"] = "Keep-Alive" + return super(NTLMConnectionPool, self).urlopen( + method, url, body, headers, retries, redirect, assert_same_host + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..19e4aa9 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,518 @@ +""" +TLS with SNI_-support for Python 2. Follow these instructions if you would +like to verify TLS certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* `pyOpenSSL`_ (tested with 16.0.0) +* `cryptography`_ (minimum 1.3.4, from pyopenssl) +* `idna`_ (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + +.. code-block:: bash + + $ python -m pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this: + +.. code-block:: python + + try: + import pip._vendor.urllib3.contrib.pyopenssl as pyopenssl + pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +.. _pyopenssl: https://www.pyopenssl.org +.. _cryptography: https://cryptography.io +.. _idna: https://github.com/kjd/idna +""" +from __future__ import absolute_import + +import OpenSSL.crypto +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend + +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + + +from io import BytesIO +from socket import error as SocketError +from socket import timeout + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +import sys +import warnings + +from .. import util +from ..packages import six +from ..util.ssl_ import PROTOCOL_TLS_CLIENT + +warnings.warn( + "'urllib3.contrib.pyopenssl' module is deprecated and will be removed " + "in a future release of urllib3 2.x. Read more in this issue: " + "https://github.com/urllib3/urllib3/issues/2680", + category=DeprecationWarning, + stacklevel=2, +) + +__all__ = ["inject_into_urllib3", "extract_from_urllib3"] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + util.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, + PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, "PROTOCOL_SSLv3") and hasattr(OpenSSL.SSL, "SSLv3_METHOD"): + _openssl_versions[ssl.PROTOCOL_SSLv3] = OpenSSL.SSL.SSLv3_METHOD + +if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER + + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict((v, k) for k, v in _stdlib_to_openssl_verify.items()) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." + + _validate_dependencies_met() + + util.SSLContext = PyOpenSSLContext + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + "Undo monkey-patching by :func:`inject_into_urllib3`." + + util.SSLContext = orig_util_SSLContext + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError( + "'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer." + ) + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError( + "'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer." + ) + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + from pip._vendor import idna + + try: + for prefix in [u"*.", u"."]: + if name.startswith(prefix): + name = name[len(prefix) :] + return prefix.encode("ascii") + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + # Don't send IPv6 addresses through the IDNA encoder. + if ":" in name: + return name + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode("utf-8") + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, peer_cert) + cert = x509.load_der_x509_certificate(der, openssl_backend) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except ( + x509.DuplicateExtension, + UnsupportedExtension, + x509.UnsupportedGeneralNameType, + UnicodeError, + ) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ("DNS", name) + for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + """API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + """ + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return b"" + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b"" + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") + else: + return self.recv(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("read error: %r" % e) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") + else: + return self.recv_into(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("read error: %r" % e) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done( + data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] + ) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) + + return { + "subject": ((("commonName", x509.get_subject().CN),),), + "subjectAltName": get_subj_alt_name(x509), + } + + def version(self): + return self.connection.get_protocol_version_name() + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode("utf-8") + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode("utf-8") + if capath is not None: + capath = capath.encode("utf-8") + try: + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("unable to load trusted certificates: %r" % e) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + if not isinstance(password, six.binary_type): + password = password.encode("utf-8") + self._ctx.set_passwd_cb(lambda *_: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def set_alpn_protocols(self, protocols): + protocols = [six.ensure_binary(p) for p in protocols] + return self._ctx.set_alpn_protos(protocols) + + def wrap_socket( + self, + sock, + server_side=False, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, + server_hostname=None, + ): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode("utf-8") + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout("select timed out") + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError("bad handshake: %r" % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..722ee4e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,920 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import pip._vendor.urllib3.contrib.securetransport as securetransport + securetransport.inject_into_urllib3() + +Happy TLSing! + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + +.. code-block:: + + Copyright (c) 2015-2016 Will Bond + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import struct +import threading +import weakref + +from .. import util +from ..packages import six +from ..util.ssl_ import PROTOCOL_TLS_CLIENT +from ._securetransport.bindings import CoreFoundation, Security, SecurityConst +from ._securetransport.low_level import ( + _assert_no_error, + _build_tls_unknown_ca_alert, + _cert_array_from_pem, + _create_cfstring_array, + _load_client_cert_chain, + _temporary_keychain, +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ["inject_into_urllib3", "extract_from_urllib3"] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_AES_128_CCM_8_SHA256, + SecurityConst.TLS_AES_128_CCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +# TLSv1 to 1.2 are supported on macOS 10.8+ +_protocol_to_min_max = { + util.PROTOCOL_TLS: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), + PROTOCOL_TLS_CLIENT: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, + SecurityConst.kSSLProtocol2, + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, + SecurityConst.kSSLProtocol3, + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, + SecurityConst.kTLSProtocol1, + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, + SecurityConst.kTLSProtocol11, + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, + SecurityConst.kTLSProtocol12, + ) + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.SSLContext = SecureTransportContext + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.SSLContext = orig_util_SSLContext + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, "timed out") + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, "timed out") + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _set_alpn_protocols(self, protocols): + """ + Sets up the ALPN protocols on the context. + """ + if not protocols: + return + protocols_arr = _create_cfstring_array(protocols) + try: + result = Security.SSLSetALPNProtocols(self.context, protocols_arr) + _assert_no_error(result) + finally: + CoreFoundation.CFRelease(protocols_arr) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + Raises an SSLError if the connection is not trusted. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed, + ) + try: + trust_result = self._evaluate_trust(trust_bundle) + if trust_result in successes: + return + reason = "error code: %d" % (trust_result,) + except Exception as e: + # Do not trust on error + reason = "exception: %r" % (e,) + + # SecureTransport does not send an alert nor shuts down the connection. + rec = _build_tls_unknown_ca_alert(self.version()) + self.socket.sendall(rec) + # close the connection immediately + # l_onoff = 1, activate linger + # l_linger = 0, linger for 0 seoncds + opts = struct.pack("ii", 1, 0) + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, opts) + self.close() + raise ssl.SSLError("certificate verify failed, %s" % reason) + + def _evaluate_trust(self, trust_bundle): + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, "rb") as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate(trust, ctypes.byref(trust_result)) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + return trust_result.value + + def handshake( + self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase, + alpn_protocols, + ): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode("utf-8") + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Setup the ALPN protocols. + self._set_alpn_protocols(alpn_protocols) + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, SecurityConst.kSSLSessionOptionBreakOnServerAuth, True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate(self.context, self._client_cert_chain) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if result == SecurityConst.errSSLWouldBlock: + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in ( + SecurityConst.errSSLClosedGraceful, + SecurityConst.errSSLClosedNoNotify, + ): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError("SecureTransport only supports dumping binary certs") + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust(self.context, ctypes.byref(trust)) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def version(self): + protocol = Security.SSLProtocol() + result = Security.SSLGetNegotiatedProtocolVersion( + self.context, ctypes.byref(protocol) + ) + _assert_no_error(result) + if protocol.value == SecurityConst.kTLSProtocol13: + raise ssl.SSLError("SecureTransport does not support TLS 1.3") + elif protocol.value == SecurityConst.kTLSProtocol12: + return "TLSv1.2" + elif protocol.value == SecurityConst.kTLSProtocol11: + return "TLSv1.1" + elif protocol.value == SecurityConst.kTLSProtocol1: + return "TLSv1" + elif protocol.value == SecurityConst.kSSLProtocol3: + return "SSLv3" + elif protocol.value == SecurityConst.kSSLProtocol2: + return "SSLv2" + else: + raise ssl.SSLError("Unknown TLS version: %r" % protocol) + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + +else: # Platform-specific: Python 3 + + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + self._alpn_protocols = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError("SecureTransport doesn't support custom cipher strings") + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError("SecureTransport does not support cert directories") + + # Raise if cafile does not exist. + if cafile is not None: + with open(cafile): + pass + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def set_alpn_protocols(self, protocols): + """ + Sets the ALPN protocols that will later be set on the context. + + Raises a NotImplementedError if ALPN is not supported. + """ + if not hasattr(Security, "SSLSetALPNProtocols"): + raise NotImplementedError( + "SecureTransport supports ALPN only in macOS 10.12+" + ) + self._alpn_protocols = [six.ensure_binary(p) for p in protocols] + + def wrap_socket( + self, + sock, + server_side=False, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, + server_hostname=None, + ): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, + self._verify, + self._trust_bundle, + self._min_version, + self._max_version, + self._client_cert, + self._client_key, + self._client_key_passphrase, + self._alpn_protocols, + ) + return wrapped_socket diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..c326e80 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4A (``proxy_url='socks4a://...``) +- SOCKS4 (``proxy_url='socks4://...``) +- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) +- SOCKS5 with local DNS (``proxy_url='socks5://...``) +- Usernames and passwords for the SOCKS proxy + +.. note:: + It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in + your ``proxy_url`` to ensure that DNS resolution is done from the remote + server instead of client-side when connecting to a domain name. + +SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 +supports IPv4, IPv6, and domain names. + +When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` +will be sent as the ``userid`` section of the SOCKS request: + +.. code-block:: python + + proxy_url="socks4a://@proxy-host" + +When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion +of the ``proxy_url`` will be sent as the username/password to authenticate +with the proxy: + +.. code-block:: python + + proxy_url="socks5h://:@proxy-host" + +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + + from ..exceptions import DependencyWarning + + warnings.warn( + ( + "SOCKS support in urllib3 requires the installation of optional " + "dependencies: specifically, PySocks. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies" + ), + DependencyWarning, + ) + raise + +from socket import error as SocketError +from socket import timeout as SocketTimeout + +from ..connection import HTTPConnection, HTTPSConnection +from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop("_socks_options") + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw["source_address"] = self.source_address + + if self.socket_options: + extra_kw["socket_options"] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options["socks_version"], + proxy_addr=self._socks_options["proxy_host"], + proxy_port=self._socks_options["proxy_port"], + proxy_username=self._socks_options["username"], + proxy_password=self._socks_options["password"], + proxy_rdns=self._socks_options["rdns"], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout: + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" + % (self.host, self.timeout), + ) + else: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e + ) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + + pool_classes_by_scheme = { + "http": SOCKSHTTPConnectionPool, + "https": SOCKSHTTPSConnectionPool, + } + + def __init__( + self, + proxy_url, + username=None, + password=None, + num_pools=10, + headers=None, + **connection_pool_kw + ): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(":") + if len(split) == 2: + username, password = split + if parsed.scheme == "socks5": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == "socks5h": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == "socks4": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == "socks4a": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError("Unable to determine SOCKS version from %s" % proxy_url) + + self.proxy_url = proxy_url + + socks_options = { + "socks_version": socks_version, + "proxy_host": parsed.host, + "proxy_port": parsed.port, + "username": username, + "password": password, + "rdns": rdns, + } + connection_pool_kw["_socks_options"] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..cba6f3f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,323 @@ +from __future__ import absolute_import + +from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead + +# Base Exceptions + + +class HTTPError(Exception): + """Base exception used by this module.""" + + pass + + +class HTTPWarning(Warning): + """Base warning used by this module.""" + + pass + + +class PoolError(HTTPError): + """Base exception for errors caused within a pool.""" + + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + """Base exception for PoolErrors that have associated URLs.""" + + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + """Raised when SSL certificate fails in an HTTPS connection.""" + + pass + + +class ProxyError(HTTPError): + """Raised when the connection to a proxy fails.""" + + def __init__(self, message, error, *args): + super(ProxyError, self).__init__(message, error, *args) + self.original_error = error + + +class DecodeError(HTTPError): + """Raised when automatic decoding based on Content-Type fails.""" + + pass + + +class ProtocolError(HTTPError): + """Raised when something unexpected happens mid-request/response.""" + + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % (url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + """Raised when an existing pool gets a request for a foreign host.""" + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """Raised when passing an invalid state to a timeout""" + + pass + + +class TimeoutError(HTTPError): + """Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + """Raised when a socket timeout occurs while receiving data from a server""" + + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + """Raised when a socket timeout occurs while connecting to a server""" + + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + """Raised when we fail to establish a new connection. Usually ECONNREFUSED.""" + + pass + + +class EmptyPoolError(PoolError): + """Raised when a pool runs out of connections and no more are allowed.""" + + pass + + +class ClosedPoolError(PoolError): + """Raised when a request enters a pool after the pool has been closed.""" + + pass + + +class LocationValueError(ValueError, HTTPError): + """Raised when there is something wrong with a given URL input.""" + + pass + + +class LocationParseError(LocationValueError): + """Raised when get_host or similar fails to parse the URL input.""" + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class URLSchemeUnknown(LocationValueError): + """Raised when a URL input has an unsupported scheme.""" + + def __init__(self, scheme): + message = "Not supported URL scheme %s" % scheme + super(URLSchemeUnknown, self).__init__(message) + + self.scheme = scheme + + +class ResponseError(HTTPError): + """Used as a container for an error reason supplied in a MaxRetryError.""" + + GENERIC_ERROR = "too many error responses" + SPECIFIC_ERROR = "too many {status_code} error responses" + + +class SecurityWarning(HTTPWarning): + """Warned when performing security reducing actions""" + + pass + + +class SubjectAltNameWarning(SecurityWarning): + """Warned when connecting to a host with a certificate missing a SAN.""" + + pass + + +class InsecureRequestWarning(SecurityWarning): + """Warned when making an unverified HTTPS request.""" + + pass + + +class SystemTimeWarning(SecurityWarning): + """Warned when system time is suspected to be wrong""" + + pass + + +class InsecurePlatformWarning(SecurityWarning): + """Warned when certain TLS/SSL configuration is not available on a platform.""" + + pass + + +class SNIMissingWarning(HTTPWarning): + """Warned when making a HTTPS request without SNI available.""" + + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + """Response needs to be chunked in order to read it as chunks.""" + + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be :class:`http.client.HTTPResponse` like + (have an fp attribute which returns raw chunks) for read_chunked(). + """ + + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of :class:`http.client.IncompleteRead` to allow int value + for ``partial`` to avoid creating large objects on streamed reads. + """ + + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return "IncompleteRead(%i bytes read, %i more expected)" % ( + self.partial, + self.expected, + ) + + +class InvalidChunkLength(HTTPError, httplib_IncompleteRead): + """Invalid chunk length in a chunked response.""" + + def __init__(self, response, length): + super(InvalidChunkLength, self).__init__( + response.tell(), response.length_remaining + ) + self.response = response + self.length = length + + def __repr__(self): + return "InvalidChunkLength(got length %r, %i bytes read)" % ( + self.length, + self.partial, + ) + + +class InvalidHeader(HTTPError): + """The header provided was somehow invalid.""" + + pass + + +class ProxySchemeUnknown(AssertionError, URLSchemeUnknown): + """ProxyManager does not support the supplied scheme""" + + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + # 'localhost' is here because our URL parser parses + # localhost:8080 -> scheme=localhost, remove if we fix this. + if scheme == "localhost": + scheme = None + if scheme is None: + message = "Proxy URL had no scheme, should start with http:// or https://" + else: + message = ( + "Proxy URL had unsupported scheme %s, should use http:// or https://" + % scheme + ) + super(ProxySchemeUnknown, self).__init__(message) + + +class ProxySchemeUnsupported(ValueError): + """Fetching HTTPS resources through HTTPS proxies is unsupported""" + + pass + + +class HeaderParsingError(HTTPError): + """Raised by assert_header_parsing, but we convert it to a log.warning statement.""" + + def __init__(self, defects, unparsed_data): + message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + """urllib3 encountered an error when trying to rewind a body""" + + pass diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..9d630f4 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,274 @@ +from __future__ import absolute_import + +import email.utils +import mimetypes +import re + +from .packages import six + + +def guess_content_type(filename, default="application/octet-stream"): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param_rfc2231(name, value): + """ + Helper function to format and quote a single header parameter using the + strategy defined in RFC 2231. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows + `RFC 2388 Section 4.4 `_. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as ``bytes`` or `str``. + :ret: + An RFC-2231-formatted unicode string. + """ + if isinstance(value, six.binary_type): + value = value.decode("utf-8") + + if not any(ch in value for ch in '"\\\r\n'): + result = u'%s="%s"' % (name, value) + try: + result.encode("ascii") + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + + if six.PY2: # Python 2: + value = value.encode("utf-8") + + # encode_rfc2231 accepts an encoded string and returns an ascii-encoded + # string in Python 2 but accepts and returns unicode strings in Python 3 + value = email.utils.encode_rfc2231(value, "utf-8") + value = "%s*=%s" % (name, value) + + if six.PY2: # Python 2: + value = value.decode("utf-8") + + return value + + +_HTML5_REPLACEMENTS = { + u"\u0022": u"%22", + # Replace "\" with "\\". + u"\u005C": u"\u005C\u005C", +} + +# All control characters from 0x00 to 0x1F *except* 0x1B. +_HTML5_REPLACEMENTS.update( + { + six.unichr(cc): u"%{:02X}".format(cc) + for cc in range(0x00, 0x1F + 1) + if cc not in (0x1B,) + } +) + + +def _replace_multiple(value, needles_and_replacements): + def replacer(match): + return needles_and_replacements[match.group(0)] + + pattern = re.compile( + r"|".join([re.escape(needle) for needle in needles_and_replacements.keys()]) + ) + + result = pattern.sub(replacer, value) + + return result + + +def format_header_param_html5(name, value): + """ + Helper function to format and quote a single header parameter using the + HTML5 strategy. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows the `HTML5 Working Draft + Section 4.10.22.7`_ and matches the behavior of curl and modern browsers. + + .. _HTML5 Working Draft Section 4.10.22.7: + https://w3c.github.io/html/sec-forms.html#multipart-form-data + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as ``bytes`` or `str``. + :ret: + A unicode string, stripped of troublesome characters. + """ + if isinstance(value, six.binary_type): + value = value.decode("utf-8") + + value = _replace_multiple(value, _HTML5_REPLACEMENTS) + + return u'%s="%s"' % (name, value) + + +# For backwards-compatibility. +format_header_param = format_header_param_html5 + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. Must be unicode. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. Must be unicode. + :param headers: + An optional dict-like object of headers to initially use for the field. + :param header_formatter: + An optional callable that is used to encode and format the headers. By + default, this is :func:`format_header_param_html5`. + """ + + def __init__( + self, + name, + data, + filename=None, + headers=None, + header_formatter=format_header_param_html5, + ): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + self.header_formatter = header_formatter + + @classmethod + def from_tuples(cls, fieldname, value, header_formatter=format_header_param_html5): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls( + fieldname, data, filename=filename, header_formatter=header_formatter + ) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. By + default, this calls ``self.header_formatter``. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + + return self.header_formatter(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return u"; ".join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append(u"%s: %s" % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append(u"%s: %s" % (header_name, header_value)) + + lines.append(u"\r\n") + return u"\r\n".join(lines) + + def make_multipart( + self, content_disposition=None, content_type=None, content_location=None + ): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers["Content-Disposition"] = content_disposition or u"form-data" + self.headers["Content-Disposition"] += u"; ".join( + [ + u"", + self._render_parts( + ((u"name", self._name), (u"filename", self._filename)) + ), + ] + ) + self.headers["Content-Type"] = content_type + self.headers["Content-Location"] = content_location diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..36c9252 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import + +import binascii +import codecs +import os +from io import BytesIO + +from .fields import RequestField +from .packages import six +from .packages.six import b + +writer = codecs.lookup("utf-8")[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if not six.PY2: + boundary = boundary.decode("ascii") + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b("--%s\r\n" % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b"\r\n") + + body.write(b("--%s--\r\n" % (boundary))) + + content_type = str("multipart/form-data; boundary=%s" % boundary) + + return body.getvalue(), content_type diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1e7d606f8ce530a8885d7fc40571318d5bd7488 GIT binary patch literal 219 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 X&I=WmPs&Z?Ry!{=Sw2}}g8RP!3EfvT literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85d7adeade74d1f224e01a57d8d276c001982406 GIT binary patch literal 229 zcmX@j%ge<81g`Nh=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJVwdiN$=celCmS!a8 z<|d}-yW}UA=BDPA6zjWZmUxsV=^Gjt=(;3U7VG+_={o19r0S>UmFeeXCg~ScmSp7T z8S5Du=@(~~r0NzVCTAz6rxxoMWESYhm!;;VlIYq;;_lhPbtkwwJTx;I*Jj9i$RQ!%#4hTMa)1J02&@YPyhe` literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38b7280aac9a3df2a24e8b4e18a9cb20a9b62102 GIT binary patch literal 1845 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 ZJ+tE7HRt-w`3BE*E}Z`Z!7mf+e*r4mM&SSe literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..b8fb215 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io +from socket import SocketIO + + +def backport_makefile( + self, mode="r", buffering=None, encoding=None, errors=None, newline=None +): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py new file mode 100644 index 0000000..a2f2966 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +""" +backports.weakref_finalize +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``weakref.finalize`` method. +""" +from __future__ import absolute_import + +import itertools +import sys +from weakref import ref + +__all__ = ["weakref_finalize"] + + +class weakref_finalize(object): + """Class for finalization of weakrefable objects + finalize(obj, func, *args, **kwargs) returns a callable finalizer + object which will be called when obj is garbage collected. The + first time the finalizer is called it evaluates func(*arg, **kwargs) + and returns the result. After this the finalizer is dead, and + calling it just returns None. + When the program exits any remaining finalizers for which the + atexit attribute is true will be run in reverse order of creation. + By default atexit is true. + """ + + # Finalizer objects don't have any state of their own. They are + # just used as keys to lookup _Info objects in the registry. This + # ensures that they cannot be part of a ref-cycle. + + __slots__ = () + _registry = {} + _shutdown = False + _index_iter = itertools.count() + _dirty = False + _registered_with_atexit = False + + class _Info(object): + __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") + + def __init__(self, obj, func, *args, **kwargs): + if not self._registered_with_atexit: + # We may register the exit function more than once because + # of a thread race, but that is harmless + import atexit + + atexit.register(self._exitfunc) + weakref_finalize._registered_with_atexit = True + info = self._Info() + info.weakref = ref(obj, self) + info.func = func + info.args = args + info.kwargs = kwargs or None + info.atexit = True + info.index = next(self._index_iter) + self._registry[self] = info + weakref_finalize._dirty = True + + def __call__(self, _=None): + """If alive then mark as dead and return func(*args, **kwargs); + otherwise return None""" + info = self._registry.pop(self, None) + if info and not self._shutdown: + return info.func(*info.args, **(info.kwargs or {})) + + def detach(self): + """If alive then mark as dead and return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None and self._registry.pop(self, None): + return (obj, info.func, info.args, info.kwargs or {}) + + def peek(self): + """If alive then return (obj, func, args, kwargs); + otherwise return None""" + info = self._registry.get(self) + obj = info and info.weakref() + if obj is not None: + return (obj, info.func, info.args, info.kwargs or {}) + + @property + def alive(self): + """Whether finalizer is alive""" + return self in self._registry + + @property + def atexit(self): + """Whether finalizer should be called at exit""" + info = self._registry.get(self) + return bool(info) and info.atexit + + @atexit.setter + def atexit(self, value): + info = self._registry.get(self) + if info: + info.atexit = bool(value) + + def __repr__(self): + info = self._registry.get(self) + obj = info and info.weakref() + if obj is None: + return "<%s object at %#x; dead>" % (type(self).__name__, id(self)) + else: + return "<%s object at %#x; for %r at %#x>" % ( + type(self).__name__, + id(self), + type(obj).__name__, + id(obj), + ) + + @classmethod + def _select_for_exit(cls): + # Return live finalizers marked for exit, oldest first + L = [(f, i) for (f, i) in cls._registry.items() if i.atexit] + L.sort(key=lambda item: item[1].index) + return [f for (f, i) in L] + + @classmethod + def _exitfunc(cls): + # At shutdown invoke finalizers for which atexit is true. + # This is called once all other non-daemonic threads have been + # joined. + reenable_gc = False + try: + if cls._registry: + import gc + + if gc.isenabled(): + reenable_gc = True + gc.disable() + pending = None + while True: + if pending is None or weakref_finalize._dirty: + pending = cls._select_for_exit() + weakref_finalize._dirty = False + if not pending: + break + f = pending.pop() + try: + # gc is disabled, so (assuming no daemonic + # threads) the following is the only line in + # this function which might trigger creation + # of a new finalizer + f() + except Exception: + sys.excepthook(*sys.exc_info()) + assert f not in cls._registry + finally: + # prevent any more finalizers from executing during shutdown + weakref_finalize._shutdown = True + if reenable_gc: + gc.enable() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..f099a3d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,1076 @@ +# Copyright (c) 2010-2020 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.16.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = (str,) + integer_types = (int,) + class_types = (type,) + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = (basestring,) + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + +if PY34: + from importlib.util import spec_from_loader +else: + spec_from_loader = None + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def find_spec(self, fullname, path, target=None): + if fullname in self.known_modules: + return spec_from_loader(fullname, self) + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + + get_source = get_code # same as get_code + + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass + + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute( + "filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse" + ), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute( + "reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload" + ), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute( + "zip_longest", "itertools", "itertools", "izip_longest", "zip_longest" + ), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule( + "collections_abc", + "collections", + "collections.abc" if sys.version_info >= (3, 3) else "collections", + ), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), + MovedModule( + "_dummy_thread", + "dummy_thread", + "_dummy_thread" if sys.version_info < (3, 9) else "_thread", + ), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule( + "email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart" + ), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute( + "unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes" + ), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", + "moves.urllib.parse", +) + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", + "moves.urllib.error", +) + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", + "moves.urllib.request", +) + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module( + Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", + "moves.urllib.response", +) + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = ( + _urllib_robotparser_moved_attributes +) + +_importer._add_module( + Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", + "moves.urllib.robotparser", +) + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ["parse", "error", "request", "response", "robotparser"] + + +_importer._add_module( + Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib" +) + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + + def advance_iterator(it): + return it.next() + + +next = advance_iterator + + +try: + callable = callable +except NameError: + + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc( + get_unbound_function, """Get the function out of a possibly unbound function""" +) + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc( + iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary." +) + + +if PY3: + + def b(s): + return s.encode("latin-1") + + def u(s): + return s + + unichr = chr + import struct + + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + + StringIO = io.StringIO + BytesIO = io.BytesIO + del io + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" + _assertNotRegex = "assertNotRegex" +else: + + def b(s): + return s + + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r"\\", r"\\\\"), "unicode_escape") + + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + _assertNotRegex = "assertNotRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +def assertNotRegex(self, *args, **kwargs): + return getattr(self, _assertNotRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec ("""exec _code_ in _globs_, _locs_""") + + exec_( + """def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""" + ) + + +if sys.version_info[:2] > (3,): + exec_( + """def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""" + ) +else: + + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if ( + isinstance(fp, file) + and isinstance(data, unicode) + and fp.encoding is not None + ): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + + +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + # This does exactly the same what the :func:`py3:functools.update_wrapper` + # function does on Python versions after 3.2. It sets the ``__wrapped__`` + # attribute on ``wrapper`` object and it doesn't raise an error if any of + # the attributes mentioned in ``assigned`` and ``updated`` are missing on + # ``wrapped`` object. + def _update_wrapper( + wrapper, + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, + ): + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + continue + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + wrapper.__wrapped__ = wrapped + return wrapper + + _update_wrapper.__doc__ = functools.update_wrapper.__doc__ + + def wraps( + wrapped, + assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES, + ): + return functools.partial( + _update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated + ) + + wraps.__doc__ = functools.wraps.__doc__ + +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + def __new__(cls, name, this_bases, d): + if sys.version_info[:2] >= (3, 7): + # This version introduced PEP 560 that requires a bit + # of extra care (we mimic what is done by __build_class__). + resolved_bases = types.resolve_bases(bases) + if resolved_bases is not bases: + d["__orig_bases__"] = bases + else: + resolved_bases = bases + return meta(name, resolved_bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + + return type.__new__(metaclass, "temporary_class", (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get("__slots__") + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop("__dict__", None) + orig_vars.pop("__weakref__", None) + if hasattr(cls, "__qualname__"): + orig_vars["__qualname__"] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + + return wrapper + + +def ensure_binary(s, encoding="utf-8", errors="strict"): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, binary_type): + return s + if isinstance(s, text_type): + return s.encode(encoding, errors) + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding="utf-8", errors="strict"): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + # Optimization: Fast return for the common case. + if type(s) is str: + return s + if PY2 and isinstance(s, text_type): + return s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + return s.decode(encoding, errors) + elif not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + return s + + +def ensure_text(s, encoding="utf-8", errors="strict"): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def python_2_unicode_compatible(klass): + """ + A class decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if "__str__" not in klass.__dict__: + raise ValueError( + "@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % klass.__name__ + ) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode("utf-8") + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if ( + type(importer).__name__ == "_SixMetaPathImporter" + and importer.name == __name__ + ): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fb51bf7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,540 @@ +from __future__ import absolute_import + +import collections +import functools +import logging + +from ._collections import HTTPHeaderDict, RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme +from .exceptions import ( + LocationValueError, + MaxRetryError, + ProxySchemeUnknown, + ProxySchemeUnsupported, + URLSchemeUnknown, +) +from .packages import six +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.proxy import connection_requires_http_tunnel +from .util.retry import Retry +from .util.url import parse_url + +__all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ( + "key_file", + "cert_file", + "cert_reqs", + "ca_certs", + "ssl_version", + "ca_cert_dir", + "ssl_context", + "key_password", + "server_hostname", +) + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + "key_scheme", # str + "key_host", # str + "key_port", # int + "key_timeout", # int or float or Timeout + "key_retries", # int or Retry + "key_strict", # bool + "key_block", # bool + "key_source_address", # str + "key_key_file", # str + "key_key_password", # str + "key_cert_file", # str + "key_cert_reqs", # str + "key_ca_certs", # str + "key_ssl_version", # str + "key_ca_cert_dir", # str + "key_ssl_context", # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + "key_maxsize", # int + "key_headers", # dict + "key__proxy", # parsed proxy url + "key__proxy_headers", # dict + "key__proxy_config", # class + "key_socket_options", # list of (level (int), optname (int), value (int or str)) tuples + "key__socks_options", # dict + "key_assert_hostname", # bool or string + "key_assert_fingerprint", # str + "key_server_hostname", # str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple("PoolKey", _key_fields) + +_proxy_config_fields = ("ssl_context", "use_forwarding_for_https") +ProxyConfig = collections.namedtuple("ProxyConfig", _proxy_config_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context["scheme"] = context["scheme"].lower() + context["host"] = context["host"].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ("headers", "_proxy_headers", "_socks_options"): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get("socket_options") + if socket_opts is not None: + context["socket_options"] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context["key_" + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + "http": functools.partial(_default_key_normalizer, PoolKey), + "https": functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSConnectionPool} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + proxy_config = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`urllib3.connectionpool.ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ("scheme", "host", "port"): + request_context.pop(key, None) + + if scheme == "http": + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context["scheme"] = scheme or "http" + if not port: + port = port_by_scheme.get(request_context["scheme"].lower(), 80) + request_context["port"] = port + request_context["host"] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context["scheme"].lower() + pool_key_constructor = self.key_fn_by_scheme.get(scheme) + if not pool_key_constructor: + raise URLSchemeUnknown(scheme) + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context["scheme"] + host = request_context["host"] + port = request_context["port"] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host( + u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs + ) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def _proxy_requires_url_absolute_form(self, parsed_url): + """ + Indicates if the proxy requires the complete destination URL in the + request. Normally this is only needed when not using an HTTP CONNECT + tunnel. + """ + if self.proxy is None: + return False + + return not connection_requires_http_tunnel( + self.proxy, self.proxy_config, parsed_url.scheme + ) + + def _validate_proxy_scheme_url_selection(self, url_scheme): + """ + Validates that were not attempting to do TLS in TLS connections on + Python2 or with unsupported SSL implementations. + """ + if self.proxy is None or url_scheme != "https": + return + + if self.proxy.scheme != "https": + return + + if six.PY2 and not self.proxy_config.use_forwarding_for_https: + raise ProxySchemeUnsupported( + "Contacting HTTPS destinations through HTTPS proxies " + "'via CONNECT tunnels' is not supported in Python 2" + ) + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + self._validate_proxy_scheme_url_selection(u.scheme) + + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw["assert_same_host"] = False + kw["redirect"] = False + + if "headers" not in kw: + kw["headers"] = self.headers.copy() + + if self._proxy_requires_url_absolute_form(u): + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. + method = "GET" + # And lose the body not to transfer anything sensitive. + kw["body"] = None + kw["headers"] = HTTPHeaderDict(kw["headers"])._prepare_for_method_change() + + retries = kw.get("retries") + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if retries.remove_headers_on_redirect and not conn.is_same_host( + redirect_location + ): + headers = list(six.iterkeys(kw["headers"])) + for header in headers: + if header.lower() in retries.remove_headers_on_redirect: + kw["headers"].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + kw["retries"] = retries + kw["redirect"] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + + response.drain_conn() + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + :param proxy_ssl_context: + The proxy SSL context is used to establish the TLS connection to the + proxy when using HTTPS proxies. + + :param use_forwarding_for_https: + (Defaults to False) If set to True will forward requests to the HTTPS + proxy to be made on behalf of the client instead of creating a TLS + tunnel via the CONNECT method. **Enabling this flag means that request + and response headers and content will be visible from the HTTPS proxy** + whereas tunneling keeps request and response headers and content + private. IP address, target hostname, SNI, and port are always visible + to an HTTPS proxy even when this flag is disabled. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__( + self, + proxy_url, + num_pools=10, + headers=None, + proxy_headers=None, + proxy_ssl_context=None, + use_forwarding_for_https=False, + **connection_pool_kw + ): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = "%s://%s:%i" % ( + proxy_url.scheme, + proxy_url.host, + proxy_url.port, + ) + proxy = parse_url(proxy_url) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + self.proxy_ssl_context = proxy_ssl_context + self.proxy_config = ProxyConfig(proxy_ssl_context, use_forwarding_for_https) + + connection_pool_kw["_proxy"] = self.proxy + connection_pool_kw["_proxy_headers"] = self.proxy_headers + connection_pool_kw["_proxy_config"] = self.proxy_config + + super(ProxyManager, self).__init__(num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme="http", pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs + ) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs + ) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {"Accept": "*/*"} + + netloc = parse_url(url).netloc + if netloc: + headers_["Host"] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + if not connection_requires_http_tunnel(self.proxy, self.proxy_config, u.scheme): + # For connections using HTTP CONNECT, httplib sets the necessary + # headers on the CONNECT to the proxy. If we're not using CONNECT, + # we'll definitely need to set 'Host' at the very least. + headers = kw.get("headers", self.headers) + kw["headers"] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..3b4cf99 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py @@ -0,0 +1,191 @@ +from __future__ import absolute_import + +import sys + +from .filepost import encode_multipart_formdata +from .packages import six +from .packages.six.moves.urllib.parse import urlencode + +__all__ = ["RequestMethods"] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`urllib3.HTTPConnectionPool` and + :class:`urllib3.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen( + self, + method, + url, + body=None, + headers=None, + encode_multipart=True, + multipart_boundary=None, + **kw + ): # Abstract + raise NotImplementedError( + "Classes extending RequestMethods must implement " + "their own ``urlopen`` method." + ) + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw["request_url"] = url + + if method in self._encode_url_methods: + return self.request_encode_url( + method, url, fields=fields, headers=headers, **urlopen_kw + ) + else: + return self.request_encode_body( + method, url, fields=fields, headers=headers, **urlopen_kw + ) + + def request_encode_url(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {"headers": headers} + extra_kw.update(urlopen_kw) + + if fields: + url += "?" + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body( + self, + method, + url, + fields=None, + headers=None, + encode_multipart=True, + multipart_boundary=None, + **urlopen_kw + ): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :func:`urllib3.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :func:`urllib.parse.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {"headers": {}} + + if fields: + if "body" in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one." + ) + + if encode_multipart: + body, content_type = encode_multipart_formdata( + fields, boundary=multipart_boundary + ) + else: + body, content_type = ( + urlencode(fields), + "application/x-www-form-urlencoded", + ) + + extra_kw["body"] = body + extra_kw["headers"] = {"Content-Type": content_type} + + extra_kw["headers"].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) + + +if not six.PY2: + + class RequestModule(sys.modules[__name__].__class__): + def __call__(self, *args, **kwargs): + """ + If user tries to call this module directly urllib3 v2.x style raise an error to the user + suggesting they may need urllib3 v2 + """ + raise TypeError( + "'module' object is not callable\n" + "urllib3.request() method is not supported in this release, " + "upgrade to urllib3 v2 to use it\n" + "see https://urllib3.readthedocs.io/en/stable/v2-migration-guide.html" + ) + + sys.modules[__name__].__class__ = RequestModule diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..8909f84 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py @@ -0,0 +1,879 @@ +from __future__ import absolute_import + +import io +import logging +import sys +import warnings +import zlib +from contextlib import contextmanager +from socket import error as SocketError +from socket import timeout as SocketTimeout + +brotli = None + +from . import util +from ._collections import HTTPHeaderDict +from .connection import BaseSSLError, HTTPException +from .exceptions import ( + BodyNotHttplibCompatible, + DecodeError, + HTTPError, + IncompleteRead, + InvalidChunkLength, + InvalidHeader, + ProtocolError, + ReadTimeoutError, + ResponseNotChunked, + SSLError, +) +from .packages import six +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + def __init__(self): + self._first_try = True + self._data = b"" + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +if brotli is not None: + + class BrotliDecoder(object): + # Supports both 'brotlipy' and 'Brotli' packages + # since they share an import name. The top branches + # are for 'brotlipy' and bottom branches for 'Brotli' + def __init__(self): + self._obj = brotli.Decompressor() + if hasattr(self._obj, "decompress"): + self.decompress = self._obj.decompress + else: + self.decompress = self._obj.process + + def flush(self): + if hasattr(self._obj, "flush"): + return self._obj.flush() + return b"" + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if "," in mode: + return MultiDecoder(mode) + + if mode == "gzip": + return GzipDecoder() + + if brotli is not None and mode == "br": + return BrotliDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse` + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ["gzip", "deflate"] + if brotli is not None: + CONTENT_DECODERS += ["br"] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__( + self, + body="", + headers=None, + status=0, + version=0, + reason=None, + strict=0, + preload_content=True, + decode_content=True, + original_response=None, + pool=None, + connection=None, + msg=None, + retries=None, + enforce_content_length=False, + request_method=None, + request_url=None, + auto_close=True, + ): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + self.auto_close = auto_close + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (six.string_types, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, "read"): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get("transfer-encoding", "").lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get("location") + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + def drain_conn(self): + """ + Read and discard any remaining HTTP response data in the response connection. + + Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. + """ + try: + self.read() + except (HTTPError, SocketError, BaseSSLError, HTTPException): + pass + + @property + def data(self): + # For backwards-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``urllib3.response.HTTPResponse.read`` + if bytes are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get("content-length") + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning( + "Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked." + ) + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(",")]) + if len(lengths) > 1: + raise InvalidHeader( + "Content-Length contained multiple " + "unmatching values (%s)" % length + ) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get("content-encoding", "").lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif "," in content_encoding: + encodings = [ + e.strip() + for e in content_encoding.split(",") + if e.strip() in self.CONTENT_DECODERS + ] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + DECODER_ERROR_CLASSES = (IOError, zlib.error) + if brotli is not None: + DECODER_ERROR_CLASSES += (brotli.error,) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + if not decode_content: + return data + + try: + if self._decoder: + data = self._decoder.decompress(data) + except self.DECODER_ERROR_CLASSES as e: + content_encoding = self.headers.get("content-encoding", "").lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, + e, + ) + if flush_decoder: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b"") + return buf + self._decoder.flush() + + return b"" + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, "Read timed out.") + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if "read operation timed out" not in str(e): + # SSL errors related to framing/MAC get wrapped and reraised here + raise SSLError(e) + + raise ReadTimeoutError(self._pool, None, "Read timed out.") + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError("Connection broken: %r" % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def _fp_read(self, amt): + """ + Read a response with the thought that reading the number of bytes + larger than can fit in a 32-bit int at a time via SSL in some + known cases leads to an overflow error that has to be prevented + if `amt` or `self.length_remaining` indicate that a problem may + happen. + + The known cases: + * 3.8 <= CPython < 3.9.7 because of a bug + https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900. + * urllib3 injected with pyOpenSSL-backed SSL-support. + * CPython < 3.10 only when `amt` does not fit 32-bit int. + """ + assert self._fp + c_int_max = 2 ** 31 - 1 + if ( + ( + (amt and amt > c_int_max) + or (self.length_remaining and self.length_remaining > c_int_max) + ) + and not util.IS_SECURETRANSPORT + and (util.IS_PYOPENSSL or sys.version_info < (3, 10)) + ): + buffer = io.BytesIO() + # Besides `max_chunk_amt` being a maximum chunk size, it + # affects memory overhead of reading a response by this + # method in CPython. + # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum + # chunk size that does not lead to an overflow error, but + # 256 MiB is a compromise. + max_chunk_amt = 2 ** 28 + while amt is None or amt != 0: + if amt is not None: + chunk_amt = min(amt, max_chunk_amt) + amt -= chunk_amt + else: + chunk_amt = max_chunk_amt + data = self._fp.read(chunk_amt) + if not data: + break + buffer.write(data) + del data # to reduce peak memory usage by `max_chunk_amt`. + return buffer.getvalue() + else: + # StringIO doesn't like amt=None + return self._fp.read(amt) if amt is not None else self._fp.read() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`http.client.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + fp_closed = getattr(self._fp, "closed", False) + + with self._error_catcher(): + data = self._fp_read(amt) if not fp_closed else b"" + if amt is None: + flush_decoder = True + else: + cache_content = False + if ( + amt != 0 and not data + ): # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in ( + 0, + None, + ): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2 ** 16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`http.client.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if six.PY2: + # Python 2.7 + headers = HTTPHeaderDict.from_httplib(headers) + else: + headers = HTTPHeaderDict(headers.items()) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, "strict", 0) + resp = ResponseCls( + body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw + ) + return resp + + # Backwards-compatibility methods for http.client.HTTPResponse + def getheaders(self): + warnings.warn( + "HTTPResponse.getheaders() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.", + category=DeprecationWarning, + stacklevel=2, + ) + return self.headers + + def getheader(self, name, default=None): + warnings.warn( + "HTTPResponse.getheader() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).", + category=DeprecationWarning, + stacklevel=2, + ) + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + if not self.auto_close: + io.IOBase.close(self) + + @property + def closed(self): + if not self.auto_close: + return io.IOBase.closed.__get__(self) + elif self._fp is None: + return True + elif hasattr(self._fp, "isclosed"): + return self._fp.isclosed() + elif hasattr(self._fp, "closed"): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError( + "The file-like object this HTTPResponse is wrapped " + "around has no file descriptor" + ) + + def flush(self): + if ( + self._fp is not None + and hasattr(self._fp, "flush") + and not getattr(self._fp, "closed", False) + ): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[: len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + :class:`http.client.HTTPResponse` object. We do this by testing for + the fp attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, "fp") + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b";", 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise InvalidChunkLength(self, line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing." + ) + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be http.client.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks." + ) + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode( + chunk, decode_content=decode_content, flush_decoder=False + ) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b"\r\n": + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url + + def __iter__(self): + buffer = [] + for chunk in self.stream(decode_content=True): + if b"\n" in chunk: + chunk = chunk.split(b"\n") + yield b"".join(buffer) + chunk[0] + b"\n" + for x in chunk[1:-1]: + yield x + b"\n" + if chunk[-1]: + buffer = [chunk[-1]] + else: + buffer = [] + else: + buffer.append(chunk) + if buffer: + yield b"".join(buffer) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..4547fc5 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,49 @@ +from __future__ import absolute_import + +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers +from .response import is_fp_closed +from .retry import Retry +from .ssl_ import ( + ALPN_PROTOCOLS, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + PROTOCOL_TLS, + SSLContext, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import Timeout, current_time +from .url import Url, get_host, parse_url, split_first +from .wait import wait_for_read, wait_for_write + +__all__ = ( + "HAS_SNI", + "IS_PYOPENSSL", + "IS_SECURETRANSPORT", + "SSLContext", + "PROTOCOL_TLS", + "ALPN_PROTOCOLS", + "Retry", + "Timeout", + "Url", + "assert_fingerprint", + "current_time", + "is_connection_dropped", + "is_fp_closed", + "get_host", + "parse_url", + "make_headers", + "resolve_cert_reqs", + "resolve_ssl_version", + "split_first", + "ssl_wrap_socket", + "wait_for_read", + "wait_for_write", + "SKIP_HEADER", + "SKIPPABLE_HEADERS", +) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb6ed091948b2c3f1400d341ff5c8e426acde48 GIT binary patch literal 1166 zcmZ9L%Wm676o!YoQFmGLC35VfNeTo}3!6y;WYrc>Y@s${NP?&=Iw&xp#j!=y6hF5kqPSzckc z`4-;d+jyJb!FTvwd^f9C**E+izQ^z5`!=uP2a9^I@fIZX9McMpm0+o+B;tvX`mJ+a zUyl@-i8!V+9f_EPQX~ltdwEmyUmT9f!JxlCn3y&sO453WKM&SN@Xvo z+k;LLGGjv7{f;S4sFsUf)inD@;~^POM$^&W=*TzjLEk6-@X*u`eKP)aG#(6n|HyP~ z<`4E>P6pFSf9Q`#lc}lS>>^XUv1*s?iCEJ=wCMy&QK`vE6rWO=$SBsPEvc1wPRR`3 zNcy`nt2ZU37&*6%T8*X!$%PCOqQvZs>R!&c(}+`%YEz%3QqouxZ414E$-k7$luxN9 zbD^}UB!N_vq_$X735%csso;dhMF5$Q_TnHk%`fSNj5O_aW!?HM8-ONY1<(T20PqdU zb-*n^8?XT=0xEzmU=vUVbO5V>+kiE|7GN7t0=O2#-nXVo$VsYGNePj8TQk+=#Ip;G zYu!qz(#w6>C8lisOGIp~h89dw!c4PfO#xiIZvHE2nW{`*CS%zs^k`gg)>?h77Brf? z_48WyQX_~m1#oex%D99Cj1lq|dT(E&Pv_oTaO&}N9&jFn-oBWn+)htk|^=)mlB6UdbTaQ z_NkZZhL-hLdB<@s(ZdfV&t8_hv literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ef0e1de71466860b27ddc4a1abada6cef2aa01b GIT binary patch literal 4767 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92108a912c45a9c094fb1db7cd5963476663edaa GIT binary patch literal 4203 zcmbtXO>7&-6`tikmw)=T6DO9(l5Lu{NZPgQwnAc9mSkJ5BMFghAZk#0$sLJnFL&A5 zp=7cWOdC1a@I^%n*ag}qEplk#+?qpy_L8=T0KG_+i_!}fwb7(SZc3y>;8WiWxg@0~ zZGo(`!SjtbI@B=NpW zcNN?-Zs@yJkM1dWXS|~C)qMs3jK2_=3BcGl6LcXW&mqIw9FHC2N^_iII#}D4LYPqhR*bNn+$o zm3-o=3-w+xC|S@9Rmtk)tf`jAC^c!qWlLE*q8W_L5t?D;BC#r+XU?3N{`UA(=EB(U z=-BHpO1PiLlw6J!SyE`#j5*trH!b#DE?I;ol{sRtN_eiK6$e!^t1FC5=#{>SG~i9*a1=MYnTm&hK@=$<9ml zJ8vuS3bY1LU-q5*SWgR{l2R<#mBZ`5u1S>denmSR8L9A;Q8^mC)#VDAX zYMS7zj~P`Ai=)iK%*63_+{Ihsmp~6*&~zR4&G2Rl4*p*;Z_v9%5gs^++08WSNqQ@ zte_a_Q5-?bFPmzoOx!-gGUBMfO@Z%0<XinqjOli#!>+m5T!{RL-O2{`VpM1+?ezb68= ztXZ02F~!Ic+YOOydw5*i9v+8wY{`DX&0oP}8Gk zu2g_fw$kS{cA=C_A3t_1IjWScVez(Jv3FcaalsK&g%Im{$1;#-evP$ z>v8C4E!?pl+5Ir~UeDu5s@Avv?fj4P@7!AJ`^LS=kNT2#Cu;{!-u16^>|YJ^Kl69i z@R7Uz7yGntE+D_1cGXYpJWN16M&Rwi>|C{JU$3 zAtc)BOfokP`07EfJMa_7q$+;cOv! zVy#sd264fhCwNxV2`@q{uP~4UCRML2lTZQZf@VS5SRiqzK?-A}P-I+|0>U9jx9R1@ zdA7t#R8)<+h6&rlh^{AmcBszWGFhN)wjYWa=%RE#m~H#VCk2tS{gc!6PAGG3c>L1X z=;g6Xmw?`R#3VQDz~V=NG2P4Oby|dFxa}EdZ!`hV--O%BLj&-WQ6N;kwI1kR9(_3Q zIMBDzg~GAw#jQ>xcP{rV&p%{q!2>J7V;e4Su&>s&>p|iNi60)lJF*cLa(7QuFMhri zLY*)CWcNyJ|7XY@?A!98?!J2?Peak_#f=a=cy4j_^mfMy^y}W?u=|6M1noA=G@0W^ zAou{a<3*KJmxGBV*P`q8o;JitjHeWFIjEv?5V?T&wb-GA$}nPKN3sMNvc>w;CM&xm zu_nt?y{yxbZ)vK4osSx9_Kx&lP!|T&HF>4lWRrKKCh~lhe+uLcw*!VVcVI|rnd3*n zIYODD8BJi;5i>=#f zmn%^)6))t80ao%|x06-jfcm!T+ks@tXgO7R{ffcqL0fQ%xOA{Bc+i)qQ%js=f=?Y6 zIXX}B)p&T|LJ5c@P(yPT^DiXWh4@?=gpS34KVuDeCQ!zMRw@ys1Aq?N!5jYFK@afe zAa6L7=^y1pjurpQ@9z2Kh4%}O_mA=bjXnwYF6aLe-UneVcm3!)t3kXT z9oTS5k&~NlcTC=Z@RYY?6nn82KKsYZA0Gb0cUQyHkn#B|S5W?ZtG7Lpqw8JqS_gmM z9fkLi=!V-Jj6SzGvVR^J?m-{)yfmD4Cwvp)N_5$BCR0yvnGEF{vVBmr$*Gf~^4l`G z$-gck#ahBmcG#(-DNDO4h=K5?9cue9wS%+NtPlfIncc~sPYs{FG}icPou<5$+P*q^ zh1*4e6=_a5@K=cL1Ce?@47^e>)sjw5({I5u9>~@eXg1uEB>fE?`WU_ZF-rX%9fjl; z>#v5M^z8j}-}$wk3oEGeX&0`>o<)1^=c}QO0P5(e^}JAvb@Tt;7a=chM#dzm`?D!m OOp0wDcuA7Qvi}CQK69o3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4194e83dff35b0b95fcce07975583c8e8c8bc4d GIT binary patch literal 3012 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 STdsxzyRPT{OQBx||9=5xg2cN3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf94a9365a7ae990268015e266efad82084a0923 GIT binary patch literal 15805 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 E11Sobl>h($ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5643d047195eb35c38ac18f88e2ab6311e45acc7 GIT binary patch literal 4423 zcmc&%-A^3X6~A|8c6Rm~%-RG9WMey!^#^M^ZqhdXs2zK4s}ZEJQ_INGYSRXqCS9Wid#>lZ_gwd1&4c@L;(wJ?GATUK)_3&oKIXI?$}Mpzpzs)u4-d*6&edfBN|PU0jH(|l=p=J z0cs&FW~2d$5)aObX;(%bkSQ4^n(GgAKoQ6VqRG=lbL*aaqOyG)>fItwn2snO#sfL*0_6`-tw| zPnd_IO%mATLYuCU4_==nH^ggXl19Vd;KqGXYP-i(W~J0LG(8z3Ygk4$m4uFDr80U{ zwA=cOt7`rVh?EsK*kvO*rd#J3GngHigt5es!4gbYH9J`EPO_AxCmWwe2(5ND{m@t- zIzcZE2zeS6n9MB^Z6%S&su?|zu)T>y#?W$UZ2J?5w{vRRnYl|gaiPa7HezJ-SSB~3 zW-_W4J7*+w89i&6u?s2dVs0>Y^vIFJ=hVD;xPR#IYlf!B^z1||of?dd=dBSV`%>@G zV=)tqJUp%@$JAlnjE$$pV~Ghps~IeoV`FcBitWKB{S zcKLWz_y&*o8=OiCAZi6i@!8x3Vu1*xKnnC;)g_n7UE0S2FcTGQVJK_6(eXykGI5DW zgoU88gWzI|Gx&etmKB8KYw64N{k<}x{Pz2fWFXLcKX2}s9X5>j;bJW=~L%lotd4+1F07y8Im3AUFz`d5N)l$AHu0-;izi-&IC zniBjlFdLZDR+Wy2ZvXb~mY;Z=Z|_;?obOzc@5uM%70)ZBvz5++ch25-uXKKYS!yrE zXX115iZ3)LKWI9z*bQPSzT!JrmJT|6wjd+r65_=114m2`+Ben zmMI8V&=j81+yO?8W`l=zV!RrEz9-MhqjeZLJE4RdK&kx2#?2%r{tHjjh&4Fw00pScP^^;2;F6v-?d-L4HfSQ=5s z5uN%stb$pIFXi6o`6Hq>ZGSHc$0d)pXd( zjDUEAH0Pf=x#kbdg=a6#oLLLCeps9>F8*XC^jukaj-Pu}Vf#UsM}sZD(f|7Em-=is z*8Oi?VaH&~R+v7VGA-cYZq&q(iMm-2wt?&ki=yBpEM-)4jC~LL=or%t!ij?)IiC{V z=?mBoLG2pq8z8{yZ^wbpUpmJ_z<*m_2+RkTmChN72LTQQ=Yz{i*NjvN?f&rQ?9KO! zrHgBl|8r^gvb1|nTRgWaJ-;Q3uE>^`_?vDA7bowySDKEj_>PvPqYn6C-+IBbMPO_` z17d;f%(1{oQ(ajj;so|#{q0<8LQO+@6j3MCR9YQO>ru*6mb(J$goSK*Y!a`qCsK}Z zHV5bZ)Pb^7pq_!p#7nwFD&BqN{pVJ^=gZRhZ(ECDh8Ay5gIItRqG9i7Js4rCT53U4 zBn?I{kexIkZK=LbNnU_Nq#mYLJ^kQGhlqJ^UaVj45H$GWm3Y+Ua4dqzA==;>%VMd) zoaOK_Ylj(d6UPb$Of?hRl^9Vc^u(mW#!}f~j(v6prr(CgMDLWyx+1&6m6o=JSLa{7 zb#g|jD0}8^EEMO9OX{lf;<`eb!jHDxB+&8kg|ct|2BEIq4@2Q~5$eZ0p?mkhVe*&I zY4NZ0w3vh?>jf`5e*6|RwjY1Zb-OH6P{r52c&_X_xD;RBc13K*Q$6MFf)%&B z30bf}KNV{KV(>xY)X%R%hHpmTKZf7baHO@Ouz(ZpU6PQpcOR zm19{mf_Hl)H59Q%^y+*hW%9)^)(%BrMDKl=c>VL00kx+pe6Sn94jif$qrHm|RQ`jaNQ5&AEn@6VAWyDb^1Y$UJ5V1keMeUl9KnB=80Cen~plC6V@gDRpfq z#P?%ba&O6$dX_v}1giDpL~?&Fwk(S+a}y85&P|EBIySsvSLbGL6Fs!q-As>dyhv%B zZYW+F-e~v3V3$NsZUrTJ>e2c&i6|{VOtj~pQaA40^Vn<#BW}xQ+Q?^ZzB4`IXWbO! Fe*tVGz>@#~ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..6af1138 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,149 @@ +from __future__ import absolute_import + +import socket + +from ..contrib import _appengine_environ +from ..exceptions import LocationParseError +from ..packages import six +from .wait import NoWayToWaitForSocketError, wait_for_read + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`http.client.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, "sock", False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection( + address, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, + socket_options=None, +): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`socket.getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith("["): + host = host.strip("[]") + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + try: + host.encode("idna") + except UnicodeError: + return six.raise_from( + LocationParseError(u"'%s', label empty or too long" % host), None + ) + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """Returns True if the system can bind an IPv6 address.""" + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/urllib3/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6("::1") diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py new file mode 100644 index 0000000..2199cc7 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py @@ -0,0 +1,57 @@ +from .ssl_ import create_urllib3_context, resolve_cert_reqs, resolve_ssl_version + + +def connection_requires_http_tunnel( + proxy_url=None, proxy_config=None, destination_scheme=None +): + """ + Returns True if the connection requires an HTTP CONNECT through the proxy. + + :param URL proxy_url: + URL of the proxy. + :param ProxyConfig proxy_config: + Proxy configuration from poolmanager.py + :param str destination_scheme: + The scheme of the destination. (i.e https, http, etc) + """ + # If we're not using a proxy, no way to use a tunnel. + if proxy_url is None: + return False + + # HTTP destinations never require tunneling, we always forward. + if destination_scheme == "http": + return False + + # Support for forwarding with HTTPS proxies and HTTPS destinations. + if ( + proxy_url.scheme == "https" + and proxy_config + and proxy_config.use_forwarding_for_https + ): + return False + + # Otherwise always use a tunnel. + return True + + +def create_proxy_ssl_context( + ssl_version, cert_reqs, ca_certs=None, ca_cert_dir=None, ca_cert_data=None +): + """ + Generates a default proxy ssl context if one hasn't been provided by the + user. + """ + ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(ssl_version), + cert_reqs=resolve_cert_reqs(cert_reqs), + ) + + if ( + not ca_certs + and not ca_cert_dir + and not ca_cert_data + and hasattr(ssl_context, "load_default_certs") + ): + ssl_context.load_default_certs() + + return ssl_context diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..4178410 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,22 @@ +import collections + +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..330766e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,137 @@ +from __future__ import absolute_import + +from base64 import b64encode + +from ..exceptions import UnrewindableBodyError +from ..packages.six import b, integer_types + +# Pass as a value within ``headers`` to skip +# emitting some HTTP headers that are added automatically. +# The only headers that are supported are ``Accept-Encoding``, +# ``Host``, and ``User-Agent``. +SKIP_HEADER = "@@@SKIP_HEADER@@@" +SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) + +ACCEPT_ENCODING = "gzip,deflate" + +_FAILEDTELL = object() + + +def make_headers( + keep_alive=None, + accept_encoding=None, + user_agent=None, + basic_auth=None, + proxy_basic_auth=None, + disable_cache=None, +): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ",".join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers["accept-encoding"] = accept_encoding + + if user_agent: + headers["user-agent"] = user_agent + + if keep_alive: + headers["connection"] = "keep-alive" + + if basic_auth: + headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8") + + if proxy_basic_auth: + headers["proxy-authorization"] = "Basic " + b64encode( + b(proxy_basic_auth) + ).decode("utf-8") + + if disable_cache: + headers["cache-control"] = "no-cache" + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, "tell", None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, "seek", None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect/retry." + ) + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError( + "Unable to record file position for rewinding " + "request body during a redirect/retry." + ) + else: + raise ValueError( + "body_pos must be of type integer, instead it was %s." % type(body_pos) + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..5ea609c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,107 @@ +from __future__ import absolute_import + +from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect + +from ..exceptions import HeaderParsingError +from ..packages.six.moves import http_client as httplib + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param http.client.HTTPMessage headers: Headers to verify. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError("expected httplib.Message, got {0}.".format(type(headers))) + + defects = getattr(headers, "defects", None) + get_payload = getattr(headers, "get_payload", None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + if defects: + # httplib is assuming a response body is available + # when parsing headers even when httplib only sends + # header data to parse_headers() This results in + # defects on multipart responses in particular. + # See: https://github.com/urllib3/urllib3/issues/800 + + # So we ignore the following defects: + # - StartBoundaryNotFoundDefect: + # The claimed start boundary was never found. + # - MultipartInvariantViolationDefect: + # A message claimed to be a multipart but no subparts were found. + defects = [ + defect + for defect in defects + if not isinstance( + defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) + ) + ] + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param http.client.HTTPResponse response: + Response to check if the originating request + used 'HEAD' as a method. + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == "HEAD" diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..9a1e90d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,622 @@ +from __future__ import absolute_import + +import email +import logging +import re +import time +import warnings +from collections import namedtuple +from itertools import takewhile + +from ..exceptions import ( + ConnectTimeoutError, + InvalidHeader, + MaxRetryError, + ProtocolError, + ProxyError, + ReadTimeoutError, + ResponseError, +) +from ..packages import six + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple( + "RequestHistory", ["method", "url", "error", "status", "redirect_location"] +) + + +# TODO: In v2 we can remove this sentinel and metaclass with deprecated options. +_Default = object() + + +class _RetryMeta(type): + @property + def DEFAULT_METHOD_WHITELIST(cls): + warnings.warn( + "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", + DeprecationWarning, + ) + return cls.DEFAULT_ALLOWED_METHODS + + @DEFAULT_METHOD_WHITELIST.setter + def DEFAULT_METHOD_WHITELIST(cls, value): + warnings.warn( + "Using 'Retry.DEFAULT_METHOD_WHITELIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_ALLOWED_METHODS' instead", + DeprecationWarning, + ) + cls.DEFAULT_ALLOWED_METHODS = value + + @property + def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls): + warnings.warn( + "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", + DeprecationWarning, + ) + return cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT + + @DEFAULT_REDIRECT_HEADERS_BLACKLIST.setter + def DEFAULT_REDIRECT_HEADERS_BLACKLIST(cls, value): + warnings.warn( + "Using 'Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT' instead", + DeprecationWarning, + ) + cls.DEFAULT_REMOVE_HEADERS_ON_REDIRECT = value + + @property + def BACKOFF_MAX(cls): + warnings.warn( + "Using 'Retry.BACKOFF_MAX' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", + DeprecationWarning, + ) + return cls.DEFAULT_BACKOFF_MAX + + @BACKOFF_MAX.setter + def BACKOFF_MAX(cls, value): + warnings.warn( + "Using 'Retry.BACKOFF_MAX' is deprecated and " + "will be removed in v2.0. Use 'Retry.DEFAULT_BACKOFF_MAX' instead", + DeprecationWarning, + ) + cls.DEFAULT_BACKOFF_MAX = value + + +@six.add_metaclass(_RetryMeta) +class Retry(object): + """Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param int other: + How many times to retry on other errors. + + Other errors are errors that are not connect, read, redirect or status errors. + These errors might be raised after the request was sent to the server, so the + request might have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + If ``total`` is not set, it's a good idea to set this to 0 to account + for unexpected edge cases and avoid infinite retry loops. + + :param iterable allowed_methods: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_ALLOWED_METHODS`. + + Set to a ``False`` value to retry on any verb. + + .. warning:: + + Previously this parameter was named ``method_whitelist``, that + usage is deprecated in v1.26.0 and will be removed in v2.0. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``allowed_methods`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.DEFAULT_BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + #: Default methods to be used for ``allowed_methods`` + DEFAULT_ALLOWED_METHODS = frozenset( + ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] + ) + + #: Default status codes to be used for ``status_forcelist`` + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Default headers to be used for ``remove_headers_on_redirect`` + DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset( + ["Cookie", "Authorization", "Proxy-Authorization"] + ) + + #: Maximum backoff time. + DEFAULT_BACKOFF_MAX = 120 + + def __init__( + self, + total=10, + connect=None, + read=None, + redirect=None, + status=None, + other=None, + allowed_methods=_Default, + status_forcelist=None, + backoff_factor=0, + raise_on_redirect=True, + raise_on_status=True, + history=None, + respect_retry_after_header=True, + remove_headers_on_redirect=_Default, + # TODO: Deprecated, remove in v2.0 + method_whitelist=_Default, + ): + + if method_whitelist is not _Default: + if allowed_methods is not _Default: + raise ValueError( + "Using both 'allowed_methods' and " + "'method_whitelist' together is not allowed. " + "Instead only use 'allowed_methods'" + ) + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + stacklevel=2, + ) + allowed_methods = method_whitelist + if allowed_methods is _Default: + allowed_methods = self.DEFAULT_ALLOWED_METHODS + if remove_headers_on_redirect is _Default: + remove_headers_on_redirect = self.DEFAULT_REMOVE_HEADERS_ON_REDIRECT + + self.total = total + self.connect = connect + self.read = read + self.status = status + self.other = other + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.allowed_methods = allowed_methods + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = frozenset( + [h.lower() for h in remove_headers_on_redirect] + ) + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, + read=self.read, + redirect=self.redirect, + status=self.status, + other=self.other, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect, + respect_retry_after_header=self.respect_retry_after_header, + ) + + # TODO: If already given in **kw we use what's given to us + # If not given we need to figure out what to pass. We decide + # based on whether our class has the 'method_whitelist' property + # and if so we pass the deprecated 'method_whitelist' otherwise + # we use 'allowed_methods'. Remove in v2.0 + if "method_whitelist" not in kw and "allowed_methods" not in kw: + if "method_whitelist" in self.__dict__: + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + params["method_whitelist"] = self.allowed_methods + else: + params["allowed_methods"] = self.allowed_methods + + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len( + list( + takewhile(lambda x: x.redirect_location is None, reversed(self.history)) + ) + ) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.DEFAULT_BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate_tz(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + if retry_date_tuple[9] is None: # Python 2 + # Assume UTC if no timezone was specified + # On Python2.7, parsedate_tz returns None for a timezone offset + # instead of 0 if no timezone is given, where mktime_tz treats + # a None timezone offset as local time. + retry_date_tuple = retry_date_tuple[:9] + (0,) + retry_date_tuple[10:] + + retry_date = email.utils.mktime_tz(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """Get the value of Retry-After in seconds.""" + + retry_after = response.headers.get("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if self.respect_retry_after_header and response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + if isinstance(err, ProxyError): + err = err.original_error + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """Checks if a given HTTP method should be retried upon, depending if + it is included in the allowed_methods + """ + # TODO: For now favor if the Retry implementation sets its own method_whitelist + # property outside of our constructor to avoid breaking custom implementations. + if "method_whitelist" in self.__dict__: + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + allowed_methods = self.method_whitelist + else: + allowed_methods = self.allowed_methods + + if allowed_methods and method.upper() not in allowed_methods: + return False + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """Is this method/status code retryable? (Based on allowlists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return ( + self.total + and self.respect_retry_after_header + and has_retry_after + and (status_code in self.RETRY_AFTER_STATUS_CODES) + ) + + def is_exhausted(self): + """Are we out of retries?""" + retry_counts = ( + self.total, + self.connect, + self.read, + self.redirect, + self.status, + self.other, + ) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment( + self, + method=None, + url=None, + response=None, + error=None, + _pool=None, + _stacktrace=None, + ): + """Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + other = self.other + cause = "unknown" + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif error: + # Other retry? + if other is not None: + other -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = "too many redirects" + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and the given method is in the allowed_methods + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) + status = response.status + + history = self.history + ( + RequestHistory(method, url, error, status, redirect_location), + ) + + new_retry = self.new( + total=total, + connect=connect, + read=read, + redirect=redirect, + status=status_count, + other=other, + history=history, + ) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ( + "{cls.__name__}(total={self.total}, connect={self.connect}, " + "read={self.read}, redirect={self.redirect}, status={self.status})" + ).format(cls=type(self), self=self) + + def __getattr__(self, item): + if item == "method_whitelist": + # TODO: Remove this deprecated alias in v2.0 + warnings.warn( + "Using 'method_whitelist' with Retry is deprecated and " + "will be removed in v2.0. Use 'allowed_methods' instead", + DeprecationWarning, + ) + return self.allowed_methods + try: + return getattr(super(Retry, self), item) + except AttributeError: + return getattr(Retry, item) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..0a6a0e0 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,504 @@ +from __future__ import absolute_import + +import hashlib +import hmac +import os +import sys +import warnings +from binascii import hexlify, unhexlify + +from ..exceptions import ( + InsecurePlatformWarning, + ProxySchemeUnsupported, + SNIMissingWarning, + SSLError, +) +from ..packages import six +from .url import BRACELESS_IPV6_ADDRZ_RE, IPV4_RE + +SSLContext = None +SSLTransport = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False +ALPN_PROTOCOLS = ["http/1.1"] + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + length: getattr(hashlib, algorithm, None) + for length, algorithm in ((32, "md5"), (40, "sha1"), (64, "sha256")) +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for left, right in zip(bytearray(a), bytearray(b)): + result |= left ^ right + return result == 0 + + +_const_compare_digest = getattr(hmac, "compare_digest", _const_compare_digest_backport) + +try: # Test for SSL features + import ssl + from ssl import CERT_REQUIRED, wrap_socket +except ImportError: + pass + +try: + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + +try: + from .ssltransport import SSLTransport +except ImportError: + pass + + +try: # Platform-specific: Python 3.6 + from ssl import PROTOCOL_TLS + + PROTOCOL_SSLv23 = PROTOCOL_TLS +except ImportError: + try: + from ssl import PROTOCOL_SSLv23 as PROTOCOL_TLS + + PROTOCOL_SSLv23 = PROTOCOL_TLS + except ImportError: + PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 + +try: + from ssl import PROTOCOL_TLS_CLIENT +except ImportError: + PROTOCOL_TLS_CLIENT = PROTOCOL_TLS + + +try: + from ssl import OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3 +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +try: # OP_NO_TICKET was added in Python 3.6 + from ssl import OP_NO_TICKET +except ImportError: + OP_NO_TICKET = 0x4000 + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs, DSS, and other +# insecure ciphers for security reasons. +# - NOTE: TLS 1.3 cipher suites are managed through a different interface +# not exposed by CPython (yet!) and are enabled by default if they're available. +DEFAULT_CIPHERS = ":".join( + [ + "ECDHE+AESGCM", + "ECDHE+CHACHA20", + "DHE+AESGCM", + "DHE+CHACHA20", + "ECDH+AESGCM", + "DH+AESGCM", + "ECDH+AES", + "DH+AES", + "RSA+AESGCM", + "RSA+AES", + "!aNULL", + "!eNULL", + "!MD5", + "!DSS", + ] +) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + if cadata is not None: + raise SSLError("CA data not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + "A true SSLContext object is not available. This prevents " + "urllib3 from configuring SSL appropriately and may cause " + "certain SSL connections to fail. You can upgrade to a newer " + "version of Python to solve this. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings", + InsecurePlatformWarning, + ) + kwargs = { + "keyfile": self.keyfile, + "certfile": self.certfile, + "ca_certs": self.ca_certs, + "cert_reqs": self.verify_mode, + "ssl_version": self.protocol, + "server_side": server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(":", "").lower() + digest_length = len(fingerprint) + if digest_length not in HASHFUNC_MAP: + raise SSLError("Fingerprint of invalid length: {0}".format(fingerprint)) + hashfunc = HASHFUNC_MAP.get(digest_length) + if hashfunc is None: + raise SSLError( + "Hash function implementation unavailable for fingerprint length: {0}".format( + digest_length + ) + ) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError( + 'Fingerprints did not match. Expected "{0}", got "{1}".'.format( + fingerprint, hexlify(cert_digest) + ) + ) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_REQUIRED`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_REQUIRED + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "CERT_" + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_TLS + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "PROTOCOL_" + candidate) + return res + + return candidate + + +def create_urllib3_context( + ssl_version=None, cert_reqs=None, options=None, ciphers=None +): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from pip._vendor.urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + # PROTOCOL_TLS is deprecated in Python 3.10 + if not ssl_version or ssl_version == PROTOCOL_TLS: + ssl_version = PROTOCOL_TLS_CLIENT + + context = SSLContext(ssl_version) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + # TLSv1.2 only. Unless set explicitly, do not request tickets. + # This may save some bandwidth on wire, and although the ticket is encrypted, + # there is a risk associated with it being on wire, + # if the server is not rotating its ticketing keys properly. + options |= OP_NO_TICKET + + context.options |= options + + # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is + # necessary for conditional client cert authentication with TLS 1.3. + # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older + # versions of Python. We only enable on Python 3.7.4+ or if certificate + # verification is enabled to work around Python issue #37428 + # See: https://bugs.python.org/issue37428 + if (cert_reqs == ssl.CERT_REQUIRED or sys.version_info >= (3, 7, 4)) and getattr( + context, "post_handshake_auth", None + ) is not None: + context.post_handshake_auth = True + + def disable_check_hostname(): + if ( + getattr(context, "check_hostname", None) is not None + ): # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + + # The order of the below lines setting verify_mode and check_hostname + # matter due to safe-guards SSLContext has to prevent an SSLContext with + # check_hostname=True, verify_mode=NONE/OPTIONAL. This is made even more + # complex because we don't know whether PROTOCOL_TLS_CLIENT will be used + # or not so we don't know the initial state of the freshly created SSLContext. + if cert_reqs == ssl.CERT_REQUIRED: + context.verify_mode = cert_reqs + disable_check_hostname() + else: + disable_check_hostname() + context.verify_mode = cert_reqs + + # Enable logging of TLS session keys via defacto standard environment variable + # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values. + if hasattr(context, "keylog_filename"): + sslkeylogfile = os.environ.get("SSLKEYLOGFILE") + if sslkeylogfile: + context.keylog_filename = sslkeylogfile + + return context + + +def ssl_wrap_socket( + sock, + keyfile=None, + certfile=None, + cert_reqs=None, + ca_certs=None, + server_hostname=None, + ssl_version=None, + ciphers=None, + ssl_context=None, + ca_cert_dir=None, + key_password=None, + ca_cert_data=None, + tls_in_tls=False, +): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + :param key_password: + Optional password if the keyfile is encrypted. + :param ca_cert_data: + Optional string containing CA certificates in PEM format suitable for + passing as the cadata parameter to SSLContext.load_verify_locations() + :param tls_in_tls: + Use SSLTransport to wrap the existing socket. + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) + + if ca_certs or ca_cert_dir or ca_cert_data: + try: + context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data) + except (IOError, OSError) as e: + raise SSLError(e) + + elif ssl_context is None and hasattr(context, "load_default_certs"): + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + # Attempt to detect if we get the goofy behavior of the + # keyfile being encrypted and OpenSSL asking for the + # passphrase via the terminal and instead error out. + if keyfile and key_password is None and _is_key_file_encrypted(keyfile): + raise SSLError("Client private key is encrypted, password is required") + + if certfile: + if key_password is None: + context.load_cert_chain(certfile, keyfile) + else: + context.load_cert_chain(certfile, keyfile, key_password) + + try: + if hasattr(context, "set_alpn_protocols"): + context.set_alpn_protocols(ALPN_PROTOCOLS) + except NotImplementedError: # Defensive: in CI, we always have set_alpn_protocols + pass + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + use_sni_hostname = server_hostname and not is_ipaddress(server_hostname) + # SecureTransport uses server_hostname in certificate verification. + send_sni = (use_sni_hostname and HAS_SNI) or ( + IS_SECURETRANSPORT and server_hostname + ) + # Do not warn the user if server_hostname is an invalid SNI hostname. + if not HAS_SNI and use_sni_hostname: + warnings.warn( + "An HTTPS request has been made, but the SNI (Server Name " + "Indication) extension to TLS is not available on this platform. " + "This may cause the server to present an incorrect TLS " + "certificate, which can cause validation failures. You can upgrade to " + "a newer version of Python to solve this. For more information, see " + "https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html" + "#ssl-warnings", + SNIMissingWarning, + ) + + if send_sni: + ssl_sock = _ssl_wrap_socket_impl( + sock, context, tls_in_tls, server_hostname=server_hostname + ) + else: + ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls) + return ssl_sock + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IPv4 or IPv6 address. + Also detects IPv6 addresses with Zone IDs. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if not six.PY2 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode("ascii") + return bool(IPV4_RE.match(hostname) or BRACELESS_IPV6_ADDRZ_RE.match(hostname)) + + +def _is_key_file_encrypted(key_file): + """Detects if a key file is encrypted or not.""" + with open(key_file, "r") as f: + for line in f: + # Look for Proc-Type: 4,ENCRYPTED + if "ENCRYPTED" in line: + return True + + return False + + +def _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname=None): + if tls_in_tls: + if not SSLTransport: + # Import error, ssl is not available. + raise ProxySchemeUnsupported( + "TLS in TLS requires support for the 'ssl' module" + ) + + SSLTransport._validate_ssl_context_for_tls_in_tls(ssl_context) + return SSLTransport(sock, ssl_context, server_hostname) + + if server_hostname: + return ssl_context.wrap_socket(sock, server_hostname=server_hostname) + else: + return ssl_context.wrap_socket(sock) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py new file mode 100644 index 0000000..1dd950c --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py @@ -0,0 +1,159 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# util.ssl_match_hostname to continue to be used in Python 2.7. +try: + import ipaddress +except ImportError: + ipaddress = None + +__version__ = "3.5.0.1" + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r".") + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count("*") + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn) + ) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == "*": + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append("[^.]+") + elif leftmost.startswith("xn--") or hostname.startswith("xn--"): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + # ignored flake8 # F821 to support python 2.7 function + obj = unicode(obj, encoding="ascii", errors="strict") # noqa: F821 + return obj + + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError( + "empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED" + ) + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except (UnicodeError, ValueError): + # ValueError: Not an IP address (common case) + # UnicodeError: Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: # Defensive + raise + dnsnames = [] + san = cert.get("subjectAltName", ()) + for key, value in san: + if key == "DNS": + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == "IP Address": + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get("subject", ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == "commonName": + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError( + "hostname %r " + "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) + ) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0])) + else: + raise CertificateError( + "no appropriate commonName or subjectAltName fields were found" + ) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py new file mode 100644 index 0000000..4a7105d --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py @@ -0,0 +1,221 @@ +import io +import socket +import ssl + +from ..exceptions import ProxySchemeUnsupported +from ..packages import six + +SSL_BLOCKSIZE = 16384 + + +class SSLTransport: + """ + The SSLTransport wraps an existing socket and establishes an SSL connection. + + Contrary to Python's implementation of SSLSocket, it allows you to chain + multiple TLS connections together. It's particularly useful if you need to + implement TLS within TLS. + + The class supports most of the socket API operations. + """ + + @staticmethod + def _validate_ssl_context_for_tls_in_tls(ssl_context): + """ + Raises a ProxySchemeUnsupported if the provided ssl_context can't be used + for TLS in TLS. + + The only requirement is that the ssl_context provides the 'wrap_bio' + methods. + """ + + if not hasattr(ssl_context, "wrap_bio"): + if six.PY2: + raise ProxySchemeUnsupported( + "TLS in TLS requires SSLContext.wrap_bio() which isn't " + "supported on Python 2" + ) + else: + raise ProxySchemeUnsupported( + "TLS in TLS requires SSLContext.wrap_bio() which isn't " + "available on non-native SSLContext" + ) + + def __init__( + self, socket, ssl_context, server_hostname=None, suppress_ragged_eofs=True + ): + """ + Create an SSLTransport around socket using the provided ssl_context. + """ + self.incoming = ssl.MemoryBIO() + self.outgoing = ssl.MemoryBIO() + + self.suppress_ragged_eofs = suppress_ragged_eofs + self.socket = socket + + self.sslobj = ssl_context.wrap_bio( + self.incoming, self.outgoing, server_hostname=server_hostname + ) + + # Perform initial handshake. + self._ssl_io_loop(self.sslobj.do_handshake) + + def __enter__(self): + return self + + def __exit__(self, *_): + self.close() + + def fileno(self): + return self.socket.fileno() + + def read(self, len=1024, buffer=None): + return self._wrap_ssl_read(len, buffer) + + def recv(self, len=1024, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv") + return self._wrap_ssl_read(len) + + def recv_into(self, buffer, nbytes=None, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv_into") + if buffer and (nbytes is None): + nbytes = len(buffer) + elif nbytes is None: + nbytes = 1024 + return self.read(nbytes, buffer) + + def sendall(self, data, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to sendall") + count = 0 + with memoryview(data) as view, view.cast("B") as byte_view: + amount = len(byte_view) + while count < amount: + v = self.send(byte_view[count:]) + count += v + + def send(self, data, flags=0): + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to send") + response = self._ssl_io_loop(self.sslobj.write, data) + return response + + def makefile( + self, mode="r", buffering=None, encoding=None, errors=None, newline=None + ): + """ + Python's httpclient uses makefile and buffered io when reading HTTP + messages and we need to support it. + + This is unfortunately a copy and paste of socket.py makefile with small + changes to point to the socket directly. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) + + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = socket.SocketIO(self, rawmode) + self.socket._io_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text + + def unwrap(self): + self._ssl_io_loop(self.sslobj.unwrap) + + def close(self): + self.socket.close() + + def getpeercert(self, binary_form=False): + return self.sslobj.getpeercert(binary_form) + + def version(self): + return self.sslobj.version() + + def cipher(self): + return self.sslobj.cipher() + + def selected_alpn_protocol(self): + return self.sslobj.selected_alpn_protocol() + + def selected_npn_protocol(self): + return self.sslobj.selected_npn_protocol() + + def shared_ciphers(self): + return self.sslobj.shared_ciphers() + + def compression(self): + return self.sslobj.compression() + + def settimeout(self, value): + self.socket.settimeout(value) + + def gettimeout(self): + return self.socket.gettimeout() + + def _decref_socketios(self): + self.socket._decref_socketios() + + def _wrap_ssl_read(self, len, buffer=None): + try: + return self._ssl_io_loop(self.sslobj.read, len, buffer) + except ssl.SSLError as e: + if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs: + return 0 # eof, return 0. + else: + raise + + def _ssl_io_loop(self, func, *args): + """Performs an I/O loop between incoming/outgoing and the socket.""" + should_loop = True + ret = None + + while should_loop: + errno = None + try: + ret = func(*args) + except ssl.SSLError as e: + if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): + # WANT_READ, and WANT_WRITE are expected, others are not. + raise e + errno = e.errno + + buf = self.outgoing.read() + self.socket.sendall(buf) + + if errno is None: + should_loop = False + elif errno == ssl.SSL_ERROR_WANT_READ: + buf = self.socket.recv(SSL_BLOCKSIZE) + if buf: + self.incoming.write(buf) + else: + self.incoming.write_eof() + return ret diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..78e18a6 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,271 @@ +from __future__ import absolute_import + +import time + +# The default socket timeout, used by httplib to indicate that no timeout was; specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT, getdefaulttimeout + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """Timeout configuration. + + Timeouts can be defined as a default for a pool: + + .. code-block:: python + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool): + + .. code-block:: python + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``: + + .. code-block:: python + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: int, float, or None + + :param connect: + The maximum amount of time (in seconds) to wait for a connection + attempt to a server to succeed. Omitting the parameter will default the + connect timeout to the system default, probably `the global default + timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: int, float, or None + + :param read: + The maximum amount of time (in seconds) to wait between consecutive + read operations for a response from the server. Omitting the parameter + will default the read timeout to the system default, probably `the + global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: int, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, "connect") + self._read = self._validate_timeout(read, "read") + self.total = self._validate_timeout(total, "total") + self._start_connect = None + + def __repr__(self): + return "%s(connect=%r, read=%r, total=%r)" % ( + type(self).__name__, + self._connect, + self._read, + self.total, + ) + + # __str__ provided for backwards compatibility + __str__ = __repr__ + + @classmethod + def resolve_default_timeout(cls, timeout): + return getdefaulttimeout() if timeout is cls.DEFAULT_TIMEOUT else timeout + + @classmethod + def _validate_timeout(cls, value, name): + """Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError( + "Timeout cannot be a boolean value. It must " + "be an int, float or None." + ) + try: + float(value) + except (TypeError, ValueError): + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) + + try: + if value <= 0: + raise ValueError( + "Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value) + ) + except TypeError: + # Python 3 + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) + + return value + + @classmethod + def from_float(cls, timeout): + """Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, total=self.total) + + def start_connect(self): + """Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time in seconds. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError( + "Can't get connect duration for timer that has not started." + ) + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if ( + self.total is not None + and self.total is not self.DEFAULT_TIMEOUT + and self._read is not None + and self._read is not self.DEFAULT_TIMEOUT + ): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..a960b2f --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,435 @@ +from __future__ import absolute_import + +import re +from collections import namedtuple + +from ..exceptions import LocationParseError +from ..packages import six + +url_attrs = ["scheme", "auth", "host", "port", "path", "query", "fragment"] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ("http", "https", None) + +# Almost all of these patterns were derived from the +# 'rfc3986' module: https://github.com/python-hyper/rfc3986 +PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}") +SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)") +URI_RE = re.compile( + r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?" + r"(?://([^\\/?#]*))?" + r"([^?#]*)" + r"(?:\?([^#]*))?" + r"(?:#(.*))?$", + re.UNICODE | re.DOTALL, +) + +IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}" +HEX_PAT = "[0-9A-Fa-f]{1,4}" +LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=HEX_PAT, ipv4=IPV4_PAT) +_subs = {"hex": HEX_PAT, "ls32": LS32_PAT} +_variations = [ + # 6( h16 ":" ) ls32 + "(?:%(hex)s:){6}%(ls32)s", + # "::" 5( h16 ":" ) ls32 + "::(?:%(hex)s:){5}%(ls32)s", + # [ h16 ] "::" 4( h16 ":" ) ls32 + "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s", + # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s", + # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s", + # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s", + # [ *4( h16 ":" ) h16 ] "::" ls32 + "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s", + # [ *5( h16 ":" ) h16 ] "::" h16 + "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s", + # [ *6( h16 ":" ) h16 ] "::" + "(?:(?:%(hex)s:){0,6}%(hex)s)?::", +] + +UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._\-~" +IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" +ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" +IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]" +REG_NAME_PAT = r"(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*" +TARGET_RE = re.compile(r"^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$") + +IPV4_RE = re.compile("^" + IPV4_PAT + "$") +IPV6_RE = re.compile("^" + IPV6_PAT + "$") +IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$") +BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT[2:-2] + "$") +ZONE_ID_RE = re.compile("(" + ZONE_ID_PAT + r")\]$") + +_HOST_PORT_PAT = ("^(%s|%s|%s)(?::0*?(|0|[1-9][0-9]{0,4}))?$") % ( + REG_NAME_PAT, + IPV4_PAT, + IPV6_ADDRZ_PAT, +) +_HOST_PORT_RE = re.compile(_HOST_PORT_PAT, re.UNICODE | re.DOTALL) + +UNRESERVED_CHARS = set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~" +) +SUB_DELIM_CHARS = set("!$&'()*+,;=") +USERINFO_CHARS = UNRESERVED_CHARS | SUB_DELIM_CHARS | {":"} +PATH_CHARS = USERINFO_CHARS | {"@", "/"} +QUERY_CHARS = FRAGMENT_CHARS = PATH_CHARS | {"?"} + + +class Url(namedtuple("Url", url_attrs)): + """ + Data structure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + + __slots__ = () + + def __new__( + cls, + scheme=None, + auth=None, + host=None, + port=None, + path=None, + query=None, + fragment=None, + ): + if path and not path.startswith("/"): + path = "/" + path + if scheme is not None: + scheme = scheme.lower() + return super(Url, cls).__new__( + cls, scheme, auth, host, port, path, query, fragment + ) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or "/" + + if self.query is not None: + uri += "?" + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return "%s:%d" % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = u"" + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + u"://" + if auth is not None: + url += auth + u"@" + if host is not None: + url += host + if port is not None: + url += u":" + str(port) + if path is not None: + url += path + if query is not None: + url += u"?" + query + if fragment is not None: + url += u"#" + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + .. deprecated:: 1.25 + + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, "", None + + return s[:min_idx], s[min_idx + 1 :], min_delim + + +def _encode_invalid_chars(component, allowed_chars, encoding="utf-8"): + """Percent-encodes a URI component without reapplying + onto an already percent-encoded component. + """ + if component is None: + return component + + component = six.ensure_text(component) + + # Normalize existing percent-encoded bytes. + # Try to see if the component we're encoding is already percent-encoded + # so we can skip all '%' characters but still encode all others. + component, percent_encodings = PERCENT_RE.subn( + lambda match: match.group(0).upper(), component + ) + + uri_bytes = component.encode("utf-8", "surrogatepass") + is_percent_encoded = percent_encodings == uri_bytes.count(b"%") + encoded_component = bytearray() + + for i in range(0, len(uri_bytes)): + # Will return a single character bytestring on both Python 2 & 3 + byte = uri_bytes[i : i + 1] + byte_ord = ord(byte) + if (is_percent_encoded and byte == b"%") or ( + byte_ord < 128 and byte.decode() in allowed_chars + ): + encoded_component += byte + continue + encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) + + return encoded_component.decode(encoding) + + +def _remove_path_dot_segments(path): + # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code + segments = path.split("/") # Turn the path into a list of segments + output = [] # Initialize the variable to use to store output + + for segment in segments: + # '.' is the current directory, so ignore it, it is superfluous + if segment == ".": + continue + # Anything other than '..', should be appended to the output + elif segment != "..": + output.append(segment) + # In this case segment == '..', if we can, we should pop the last + # element + elif output: + output.pop() + + # If the path starts with '/' and the output is empty or the first string + # is non-empty + if path.startswith("/") and (not output or output[0]): + output.insert(0, "") + + # If the path starts with '/.' or '/..' ensure we add one more empty + # string to add a trailing '/' + if path.endswith(("/.", "/..")): + output.append("") + + return "/".join(output) + + +def _normalize_host(host, scheme): + if host: + if isinstance(host, six.binary_type): + host = six.ensure_str(host) + + if scheme in NORMALIZABLE_SCHEMES: + is_ipv6 = IPV6_ADDRZ_RE.match(host) + if is_ipv6: + # IPv6 hosts of the form 'a::b%zone' are encoded in a URL as + # such per RFC 6874: 'a::b%25zone'. Unquote the ZoneID + # separator as necessary to return a valid RFC 4007 scoped IP. + match = ZONE_ID_RE.search(host) + if match: + start, end = match.span(1) + zone_id = host[start:end] + + if zone_id.startswith("%25") and zone_id != "%25": + zone_id = zone_id[3:] + else: + zone_id = zone_id[1:] + zone_id = "%" + _encode_invalid_chars(zone_id, UNRESERVED_CHARS) + return host[:start].lower() + zone_id + host[end:] + else: + return host.lower() + elif not IPV4_RE.match(host): + return six.ensure_str( + b".".join([_idna_encode(label) for label in host.split(".")]) + ) + return host + + +def _idna_encode(name): + if name and any(ord(x) >= 128 for x in name): + try: + from pip._vendor import idna + except ImportError: + six.raise_from( + LocationParseError("Unable to parse URL without the 'idna' module"), + None, + ) + try: + return idna.encode(name.lower(), strict=True, std3_rules=True) + except idna.IDNAError: + six.raise_from( + LocationParseError(u"Name '%s' is not a valid IDNA label" % name), None + ) + return name.lower().encode("ascii") + + +def _encode_target(target): + """Percent-encodes a request target so that there are no invalid characters""" + path, query = TARGET_RE.match(target).groups() + target = _encode_invalid_chars(path, PATH_CHARS) + query = _encode_invalid_chars(query, QUERY_CHARS) + if query is not None: + target += "?" + query + return target + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + This parser is RFC 3986 and RFC 6874 compliant. + + The parser logic and helper functions are based heavily on + work done in the ``rfc3986`` module. + + :param str url: URL to parse into a :class:`.Url` namedtuple. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + if not url: + # Empty + return Url() + + source_url = url + if not SCHEME_RE.search(url): + url = "//" + url + + try: + scheme, authority, path, query, fragment = URI_RE.match(url).groups() + normalize_uri = scheme is None or scheme.lower() in NORMALIZABLE_SCHEMES + + if scheme: + scheme = scheme.lower() + + if authority: + auth, _, host_port = authority.rpartition("@") + auth = auth or None + host, port = _HOST_PORT_RE.match(host_port).groups() + if auth and normalize_uri: + auth = _encode_invalid_chars(auth, USERINFO_CHARS) + if port == "": + port = None + else: + auth, host, port = None, None, None + + if port is not None: + port = int(port) + if not (0 <= port <= 65535): + raise LocationParseError(url) + + host = _normalize_host(host, scheme) + + if normalize_uri and path: + path = _remove_path_dot_segments(path) + path = _encode_invalid_chars(path, PATH_CHARS) + if normalize_uri and query: + query = _encode_invalid_chars(query, QUERY_CHARS) + if normalize_uri and fragment: + fragment = _encode_invalid_chars(fragment, FRAGMENT_CHARS) + + except (ValueError, AttributeError): + return six.raise_from(LocationParseError(source_url), None) + + # For the sake of backwards compatibility we put empty + # string values for path if there are any defined values + # beyond the path in the URL. + # TODO: Remove this when we break backwards compatibility. + if not path: + if query is not None or fragment is not None: + path = "" + else: + path = None + + # Ensure that each part of the URL is a `str` for + # backwards compatibility. + if isinstance(url, six.text_type): + ensure_func = six.ensure_text + else: + ensure_func = six.ensure_str + + def ensure_type(x): + return x if x is None else ensure_func(x) + + return Url( + scheme=ensure_type(scheme), + auth=ensure_type(auth), + host=ensure_type(host), + port=port, + path=ensure_type(path), + query=ensure_type(query), + fragment=ensure_type(fragment), + ) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or "http", p.hostname, p.port diff --git a/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..21b4590 --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,152 @@ +import errno +import select +import sys +from functools import partial + +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) + +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt b/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt new file mode 100644 index 0000000..2ba053a --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/_vendor/vendor.txt @@ -0,0 +1,18 @@ +CacheControl==0.14.0 +distlib==0.3.9 +distro==1.9.0 +msgpack==1.0.8 +packaging==24.1 +platformdirs==4.2.2 +pyproject-hooks==1.0.0 +requests==2.32.3 + certifi==2024.8.30 + idna==3.7 + urllib3==1.26.20 +rich==13.7.1 + pygments==2.18.0 + typing_extensions==4.12.2 +resolvelib==1.0.1 +setuptools==70.3.0 +tomli==2.0.1 +truststore==0.10.0 diff --git a/env/lib/python3.12/site-packages/pip/py.typed b/env/lib/python3.12/site-packages/pip/py.typed new file mode 100644 index 0000000..493b53e --- /dev/null +++ b/env/lib/python3.12/site-packages/pip/py.typed @@ -0,0 +1,4 @@ +pip is a command line program. While it is implemented in Python, and so is +available for import, you must not use pip's internal APIs in this way. Typing +information is provided as a convenience only and is not a guarantee. Expect +unannounced changes to the API and types in releases. diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE new file mode 100644 index 0000000..3a97119 --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2014, Saurabh Kumar (python-dotenv), 2013, Ted Tieken (django-dotenv-rw), 2013, Jacob Kaplan-Moss (django-dotenv) + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +- Neither the name of django-dotenv 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 OWNER 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/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA new file mode 100644 index 0000000..b9af7fe --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/METADATA @@ -0,0 +1,692 @@ +Metadata-Version: 2.1 +Name: python-dotenv +Version: 1.0.1 +Summary: Read key-value pairs from a .env file and set them as environment variables +Home-page: https://github.com/theskumar/python-dotenv +Author: Saurabh Kumar +Author-email: me+github@saurabh-kumar.com +License: BSD-3-Clause +Keywords: environment variables,deployments,settings,env,dotenv,configurations,python +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: Implementation :: PyPy +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Classifier: Environment :: Web Environment +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: cli +Requires-Dist: click >=5.0 ; extra == 'cli' + +# python-dotenv + +[![Build Status][build_status_badge]][build_status_link] +[![PyPI version][pypi_badge]][pypi_link] + +Python-dotenv reads key-value pairs from a `.env` file and can set them as environment +variables. It helps in the development of applications following the +[12-factor](https://12factor.net/) principles. + +- [Getting Started](#getting-started) +- [Other Use Cases](#other-use-cases) + * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment) + * [Parse configuration as a stream](#parse-configuration-as-a-stream) + * [Load .env files in IPython](#load-env-files-in-ipython) +- [Command-line Interface](#command-line-interface) +- [File format](#file-format) + * [Multiline values](#multiline-values) + * [Variable expansion](#variable-expansion) +- [Related Projects](#related-projects) +- [Acknowledgements](#acknowledgements) + +## Getting Started + +```shell +pip install python-dotenv +``` + +If your application takes its configuration from environment variables, like a 12-factor +application, launching it in development is not very practical because you have to set +those environment variables yourself. + +To help you with that, you can add Python-dotenv to your application to make it load the +configuration from a `.env` file when it is present (e.g. in development) while remaining +configurable via the environment: + +```python +from dotenv import load_dotenv + +load_dotenv() # take environment variables from .env. + +# Code of your application, which uses environment variables (e.g. from `os.environ` or +# `os.getenv`) as if they came from the actual environment. +``` + +By default, `load_dotenv` doesn't override existing environment variables. + +To configure the development environment, add a `.env` in the root directory of your +project: + +``` +. +├── .env +└── foo.py +``` + +The syntax of `.env` files supported by python-dotenv is similar to that of Bash: + +```bash +# Development settings +DOMAIN=example.org +ADMIN_EMAIL=admin@${DOMAIN} +ROOT_URL=${DOMAIN}/app +``` + +If you use variables in values, ensure they are surrounded with `{` and `}`, like +`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded. + +You will probably want to add `.env` to your `.gitignore`, especially if it contains +secrets like a password. + +See the section "File format" below for more information about what you can write in a +`.env` file. + +## Other Use Cases + +### Load configuration without altering the environment + +The function `dotenv_values` works more or less the same way as `load_dotenv`, except it +doesn't touch the environment, it just returns a `dict` with the values parsed from the +`.env` file. + +```python +from dotenv import dotenv_values + +config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"} +``` + +This notably enables advanced configuration management: + +```python +import os +from dotenv import dotenv_values + +config = { + **dotenv_values(".env.shared"), # load shared development variables + **dotenv_values(".env.secret"), # load sensitive variables + **os.environ, # override loaded values with environment variables +} +``` + +### Parse configuration as a stream + +`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream` +argument. It is thus possible to load the variables from sources other than the +filesystem (e.g. the network). + +```python +from io import StringIO + +from dotenv import load_dotenv + +config = StringIO("USER=foo\nEMAIL=foo@example.org") +load_dotenv(stream=config) +``` + +### Load .env files in IPython + +You can use dotenv in IPython. By default, it will use `find_dotenv` to search for a +`.env` file: + +```python +%load_ext dotenv +%dotenv +``` + +You can also specify a path: + +```python +%dotenv relative/or/absolute/path/to/.env +``` + +Optional flags: + +- `-o` to override existing variables. +- `-v` for increased verbosity. + +## Command-line Interface + +A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file +without manually opening it. + +```shell +$ pip install "python-dotenv[cli]" +$ dotenv set USER foo +$ dotenv set EMAIL foo@example.org +$ dotenv list +USER=foo +EMAIL=foo@example.org +$ dotenv list --format=json +{ + "USER": "foo", + "EMAIL": "foo@example.org" +} +$ dotenv run -- python foo.py +``` + +Run `dotenv --help` for more information about the options and subcommands. + +## File format + +The format is not formally specified and still improves over time. That being said, +`.env` files should mostly look like Bash files. + +Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted. +Spaces before and after keys, equal signs, and values are ignored. Values can be followed +by a comment. Lines can start with the `export` directive, which does not affect their +interpretation. + +Allowed escape sequences: + +- in single-quoted values: `\\`, `\'` +- in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v` + +### Multiline values + +It is possible for single- or double-quoted values to span multiple lines. The following +examples are equivalent: + +```bash +FOO="first line +second line" +``` + +```bash +FOO="first line\nsecond line" +``` + +### Variable without a value + +A variable can have no value: + +```bash +FOO +``` + +It results in `dotenv_values` associating that variable name with the value `None` (e.g. +`{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. + +This shouldn't be confused with `FOO=`, in which case the variable is associated with the +empty string. + +### Variable expansion + +Python-dotenv can interpolate variables using POSIX variable expansion. + +With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the +first of the values defined in the following list: + +- Value of that variable in the `.env` file. +- Value of that variable in the environment. +- Default value, if provided. +- Empty string. + +With `load_dotenv(override=False)`, the value of a variable is the first of the values +defined in the following list: + +- Value of that variable in the environment. +- Value of that variable in the `.env` file. +- Default value, if provided. +- Empty string. + +## Related Projects + +- [Honcho](https://github.com/nickstenning/honcho) - For managing + Procfile-based applications. +- [django-dotenv](https://github.com/jpadilla/django-dotenv) +- [django-environ](https://github.com/joke2k/django-environ) +- [django-environ-2](https://github.com/sergeyklay/django-environ-2) +- [django-configuration](https://github.com/jezdez/django-configurations) +- [dump-env](https://github.com/sobolevn/dump-env) +- [environs](https://github.com/sloria/environs) +- [dynaconf](https://github.com/rochacbruno/dynaconf) +- [parse_it](https://github.com/naorlivne/parse_it) +- [python-decouple](https://github.com/HBNetwork/python-decouple) + +## Acknowledgements + +This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and +[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible +without the support of these [awesome +people](https://github.com/theskumar/python-dotenv/graphs/contributors). + +[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg +[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml +[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg +[pypi_link]: https://badge.fury.io/py/python-dotenv +[python_streams]: https://docs.python.org/3/library/io.html + +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this +project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.1] - 2024-01-23 + +**Fixed** + +* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma]) +* Allow modules using load_dotenv to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton]) +* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133]) + +**Misc** +* Use pathlib.Path in tests ([#466] by [@eumiro]) +* Fix year in release date in changelog.md ([#454] by [@jankislinger]) +* Use https in README links ([#474] by [@Nicals]) + +## [1.0.0] - 2023-02-24 + +**Fixed** + +* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar]) +* Handle situations where the cwd does not exist. (#446 by [@jctanner]) + +## [0.21.1] - 2023-01-21 + +**Added** + +* Use Python 3.11 non-beta in CI (#438 by [@bbc2]) +* Modernize variables code (#434 by [@Nougat-Waffle]) +* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle]) +* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle]) +* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2]) +* Updated License to align with BSD OSI template (#433 by [@lsmith77]) + + +**Fixed** + +* Fix Out-of-scope error when "dest" variable is undefined (#413 by [@theGOTOguy]) +* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2]) +* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf]) + +## [0.21.0] - 2022-09-03 + +**Added** + +* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar]) +* `load_dotenv` function now returns `False`. (#388 by [@larsks]) +* CLI: add --format= option to list command. (#407 by [@sammck]) + +**Fixed** + +* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants]) +* Use `open` instead of `io.open`. (#389 by [@rabinadk1]) +* Improve documentation for variables without a value (#390 by [@bbc2]) +* Add `parse_it` to Related Projects (#410 by [@naorlivne]) +* Update README.md (#415 by [@harveer07]) +* Improve documentation with direct use of MkDocs (#398 by [@bbc2]) + +## [0.20.0] - 2022-03-24 + +**Added** + +- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`. + (#379 by [@bbc2]) + +**Fixed** + +- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by + [@mgorny]). +- Don't build universal wheels (#387 by [@bbc2]). + +## [0.19.2] - 2021-11-11 + +**Fixed** + +- In `set_key`, add missing newline character before new entry if necessary. (#361 by + [@bbc2]) + +## [0.19.1] - 2021-08-09 + +**Added** + +- Add support for Python 3.10. (#359 by [@theskumar]) + +## [0.19.0] - 2021-07-24 + +**Changed** + +- Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341 + by [@bbc2]). + +**Added** + +- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str, + os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]). +- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream + (`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env", + "r")` (#348 by [@bbc2]). + +## [0.18.0] - 2021-06-20 + +**Changed** + +- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in + `set_key` (#330 by [@bbc2]). +- When writing a value to a .env file with `set_key` or `dotenv set ` (#330 + by [@bbc2]): + - Use single quotes instead of double quotes. + - Don't strip surrounding quotes. + - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters + (as determined by `string.isalnum`). + +## [0.17.1] - 2021-04-29 + +**Fixed** + +- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]). + +## [0.17.0] - 2021-04-02 + +**Changed** + +- Make `dotenv get ` only show the value, not `key=value` (#313 by [@bbc2]). + +**Added** + +- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]). + +## [0.16.0] - 2021-03-27 + +**Changed** + +- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is + now `"utf-8"` instead of `None` (#306 by [@bbc2]). +- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]). + +## [0.15.0] - 2020-10-28 + +**Added** + +- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by + [@jadutter]). + +**Changed** + +- Make `set` command create the `.env` file in the current directory if no `.env` file was + found (#270 by [@jadutter]). + +**Fixed** + +- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]). +- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]). +- Fix parsing of unquoted values containing several adjacent space or tab characters + (#277 by [@bbc2], review by [@x-yuri]). + +## [0.14.0] - 2020-07-03 + +**Changed** + +- Privilege definition in file over the environment in variable expansion (#256 by + [@elbehery95]). + +**Fixed** + +- Improve error message for when file isn't found (#245 by [@snobu]). +- Use HTTPS URL in package meta data (#251 by [@ekohl]). + +## [0.13.0] - 2020-04-16 + +**Added** + +- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]). + +## [0.12.0] - 2020-02-28 + +**Changed** + +- Use current working directory to find `.env` when bundled by PyInstaller (#213 by + [@gergelyk]). + +**Fixed** + +- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]). +- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]). +- Remove warning when last line is empty (#238 by [@bbc2]). + +## [0.11.0] - 2020-02-07 + +**Added** + +- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation + (#232 by [@ulyssessouza]). + +**Changed** + +- Use logging instead of warnings (#231 by [@bbc2]). + +**Fixed** + +- Fix installation in non-UTF-8 environments (#225 by [@altendky]). +- Fix PyPI classifiers (#228 by [@bbc2]). + +## [0.10.5] - 2020-01-19 + +**Fixed** + +- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]): + - Don't print warning when key has no value. + - Reject more malformed lines (e.g. "A: B", "a='b',c"). +- Fix handling of lines with just a comment (#224 by [@bbc2]). + +## [0.10.4] - 2020-01-17 + +**Added** + +- Make typing optional (#179 by [@techalchemy]). +- Print a warning on malformed line (#211 by [@bbc2]). +- Support keys without a value (#220 by [@ulyssessouza]). + +## 0.10.3 + +- Improve interactive mode detection ([@andrewsmith])([#183]). +- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]). + - Interpret escapes as control characters only in double-quoted strings. + - Interpret `#` as start of comment only if preceded by whitespace. + +## 0.10.2 + +- Add type hints and expose them to users ([@qnighy])([#172]) +- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None` + ([@theskumar])([@earlbread])([#161]) +- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121]) +- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176]) + +## 0.10.1 +- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158]) + +## 0.10.0 + +- Add support for UTF-8 in unquoted values ([@bbc2])([#148]) +- Add support for trailing comments ([@bbc2])([#148]) +- Add backslashes support in values ([@bbc2])([#148]) +- Add support for newlines in values ([@bbc2])([#148]) +- Force environment variables to str with Python2 on Windows ([@greyli]) +- Drop Python 3.3 support ([@greyli]) +- Fix stderr/-out/-in redirection ([@venthur]) + + +## 0.9.0 + +- Add `--version` parameter to cli ([@venthur]) +- Enable loading from current directory ([@cjauvin]) +- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur]) + +## 0.8.1 + +- Add tests for docs ([@Flimm]) +- Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar]) + +## 0.8.0 + +- `set_key` and `unset_key` only modified the affected file instead of + parsing and re-writing file, this causes comments and other file + entact as it is. +- Add support for `export` prefix in the line. +- Internal refractoring ([@theskumar]) +- Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78]) + +## 0.7.1 + +- Remove hard dependency on iPython ([@theskumar]) + +## 0.7.0 + +- Add support to override system environment variable via .env. + ([@milonimrod](https://github.com/milonimrod)) + ([\#63](https://github.com/theskumar/python-dotenv/issues/63)) +- Disable ".env not found" warning by default + ([@maxkoryukov](https://github.com/maxkoryukov)) + ([\#57](https://github.com/theskumar/python-dotenv/issues/57)) + +## 0.6.5 + +- Add support for special characters `\`. + ([@pjona](https://github.com/pjona)) + ([\#60](https://github.com/theskumar/python-dotenv/issues/60)) + +## 0.6.4 + +- Fix issue with single quotes ([@Flimm]) + ([\#52](https://github.com/theskumar/python-dotenv/issues/52)) + +## 0.6.3 + +- Handle unicode exception in setup.py + ([\#46](https://github.com/theskumar/python-dotenv/issues/46)) + +## 0.6.2 + +- Fix dotenv list command ([@ticosax](https://github.com/ticosax)) +- Add iPython Support + ([@tillahoffmann](https://github.com/tillahoffmann)) + +## 0.6.0 + +- Drop support for Python 2.6 +- Handle escaped characters and newlines in quoted values. (Thanks + [@iameugenejo](https://github.com/iameugenejo)) +- Remove any spaces around unquoted key/value. (Thanks + [@paulochf](https://github.com/paulochf)) +- Added POSIX variable expansion. (Thanks + [@hugochinchilla](https://github.com/hugochinchilla)) + +## 0.5.1 + +- Fix find\_dotenv - it now start search from the file where this + function is called from. + +## 0.5.0 + +- Add `find_dotenv` method that will try to find a `.env` file. + (Thanks [@isms](https://github.com/isms)) + +## 0.4.0 + +- cli: Added `-q/--quote` option to control the behaviour of quotes + around values in `.env`. (Thanks + [@hugochinchilla](https://github.com/hugochinchilla)). +- Improved test coverage. + +[#78]: https://github.com/theskumar/python-dotenv/issues/78 +[#121]: https://github.com/theskumar/python-dotenv/issues/121 +[#148]: https://github.com/theskumar/python-dotenv/issues/148 +[#158]: https://github.com/theskumar/python-dotenv/issues/158 +[#170]: https://github.com/theskumar/python-dotenv/issues/170 +[#172]: https://github.com/theskumar/python-dotenv/issues/172 +[#176]: https://github.com/theskumar/python-dotenv/issues/176 +[#183]: https://github.com/theskumar/python-dotenv/issues/183 +[#359]: https://github.com/theskumar/python-dotenv/issues/359 +[#469]: https://github.com/theskumar/python-dotenv/issues/469 +[#456]: https://github.com/theskumar/python-dotenv/issues/456 +[#466]: https://github.com/theskumar/python-dotenv/issues/466 +[#454]: https://github.com/theskumar/python-dotenv/issues/454 +[#474]: https://github.com/theskumar/python-dotenv/issues/474 + +[@alanjds]: https://github.com/alanjds +[@altendky]: https://github.com/altendky +[@andrewsmith]: https://github.com/andrewsmith +[@asyncee]: https://github.com/asyncee +[@bbc2]: https://github.com/bbc2 +[@befeleme]: https://github.com/befeleme +[@cjauvin]: https://github.com/cjauvin +[@eaf]: https://github.com/eaf +[@earlbread]: https://github.com/earlbread +[@eggplants]: https://github.com/@eggplants +[@ekohl]: https://github.com/ekohl +[@elbehery95]: https://github.com/elbehery95 +[@eumiro]: https://github.com/eumiro +[@Flimm]: https://github.com/Flimm +[@freddyaboulton]: https://github.com/freddyaboulton +[@gergelyk]: https://github.com/gergelyk +[@gongqingkui]: https://github.com/gongqingkui +[@greyli]: https://github.com/greyli +[@harveer07]: https://github.com/@harveer07 +[@jadutter]: https://github.com/jadutter +[@jankislinger]: https://github.com/jankislinger +[@jctanner]: https://github.com/jctanner +[@larsks]: https://github.com/@larsks +[@lsmith77]: https://github.com/lsmith77 +[@mgorny]: https://github.com/mgorny +[@naorlivne]: https://github.com/@naorlivne +[@Nicals]: https://github.com/Nicals +[@Nougat-Waffle]: https://github.com/Nougat-Waffle +[@qnighy]: https://github.com/qnighy +[@Qwerty-133]: https://github.com/Qwerty-133 +[@rabinadk1]: https://github.com/@rabinadk1 +[@sammck]: https://github.com/@sammck +[@samwyma]: https://github.com/samwyma +[@snobu]: https://github.com/snobu +[@techalchemy]: https://github.com/techalchemy +[@theGOTOguy]: https://github.com/theGOTOguy +[@theskumar]: https://github.com/theskumar +[@ulyssessouza]: https://github.com/ulyssessouza +[@venthur]: https://github.com/venthur +[@x-yuri]: https://github.com/x-yuri +[@yannham]: https://github.com/yannham +[@zueve]: https://github.com/zueve + + +[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...HEAD +[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0 +[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1 +[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 +[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 +[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 +[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 +[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0 +[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0 +[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1 +[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0 +[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0 +[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0 +[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0 +[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0 +[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0 +[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0 +[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5 +[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD new file mode 100644 index 0000000..f1086b9 --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/RECORD @@ -0,0 +1,25 @@ +../../../bin/dotenv,sha256=kwzrWsye68sbCgoEeNQVEdnnYLUMg3kLDdOILbUIAh8,259 +dotenv/__init__.py,sha256=WBU5SfSiKAhS3hzu17ykNuuwbuwyDCX91Szv4vUeOuM,1292 +dotenv/__main__.py,sha256=N0RhLG7nHIqtlJHwwepIo-zbJPNx9sewCCRGY528h_4,129 +dotenv/__pycache__/__init__.cpython-312.pyc,, +dotenv/__pycache__/__main__.cpython-312.pyc,, +dotenv/__pycache__/cli.cpython-312.pyc,, +dotenv/__pycache__/ipython.cpython-312.pyc,, +dotenv/__pycache__/main.cpython-312.pyc,, +dotenv/__pycache__/parser.cpython-312.pyc,, +dotenv/__pycache__/variables.cpython-312.pyc,, +dotenv/__pycache__/version.cpython-312.pyc,, +dotenv/cli.py,sha256=_ttQuR9Yl4k1PT53ByISkDjJ3kO_N_LzIDZzZ95uXEk,5809 +dotenv/ipython.py,sha256=avI6aez_RxnBptYgchIquF2TSgKI-GOhY3ppiu3VuWE,1303 +dotenv/main.py,sha256=GV7Ki6JYPDa-xy2ZXHKqER-bRvKa7qqh0G0OwffYJr8,12098 +dotenv/parser.py,sha256=QgU5HwMwM2wMqt0vz6dHTJ4nzPmwqRqvi4MSyeVifgU,5186 +dotenv/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 +dotenv/variables.py,sha256=CD0qXOvvpB3q5RpBQMD9qX6vHX7SyW-SuiwGMFSlt08,2348 +dotenv/version.py,sha256=d4QHYmS_30j0hPN8NmNPnQ_Z0TphDRbu4MtQj9cT9e8,22 +python_dotenv-1.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_dotenv-1.0.1.dist-info/LICENSE,sha256=gGGbcEnwjIFoOtDgHwjyV6hAZS3XHugxRtNmWMfSwrk,1556 +python_dotenv-1.0.1.dist-info/METADATA,sha256=fCkcTEUG3zknbuN1BK8e0PPCIgvPBLk-LneK0mRDM_s,23170 +python_dotenv-1.0.1.dist-info/RECORD,, +python_dotenv-1.0.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +python_dotenv-1.0.1.dist-info/entry_points.txt,sha256=yRl1rCbswb1nQTQ_gZRlCw5QfabztUGnfGWLhlXFNdI,47 +python_dotenv-1.0.1.dist-info/top_level.txt,sha256=eyqUH4SHJNr6ahOYlxIunTr4XinE8Z5ajWLdrK3r0D8,7 diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL new file mode 100644 index 0000000..98c0d20 --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt new file mode 100644 index 0000000..0a86823 --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +dotenv = dotenv.__main__:cli diff --git a/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..fe7c01a --- /dev/null +++ b/env/lib/python3.12/site-packages/python_dotenv-1.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +dotenv diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/INSTALLER b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/LICENSE b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/LICENSE new file mode 100644 index 0000000..67db858 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/LICENSE @@ -0,0 +1,175 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/METADATA b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/METADATA new file mode 100644 index 0000000..72d9dc5 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/METADATA @@ -0,0 +1,119 @@ +Metadata-Version: 2.1 +Name: requests +Version: 2.32.3 +Summary: Python HTTP for Humans. +Home-page: https://requests.readthedocs.io +Author: Kenneth Reitz +Author-email: me@kennethreitz.org +License: Apache-2.0 +Project-URL: Documentation, https://requests.readthedocs.io +Project-URL: Source, https://github.com/psf/requests +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: charset-normalizer <4,>=2 +Requires-Dist: idna <4,>=2.5 +Requires-Dist: urllib3 <3,>=1.21.1 +Requires-Dist: certifi >=2017.4.17 +Provides-Extra: security +Provides-Extra: socks +Requires-Dist: PySocks !=1.5.7,>=1.5.6 ; extra == 'socks' +Provides-Extra: use_chardet_on_py3 +Requires-Dist: chardet <6,>=3.0.2 ; extra == 'use_chardet_on_py3' + +# Requests + +**Requests** is a simple, yet elegant, HTTP library. + +```python +>>> import requests +>>> r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) +>>> r.status_code +200 +>>> r.headers['content-type'] +'application/json; charset=utf8' +>>> r.encoding +'utf-8' +>>> r.text +'{"authenticated": true, ...' +>>> r.json() +{'authenticated': True, ...} +``` + +Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method! + +Requests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code. + +[![Downloads](https://static.pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) +[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests) +[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors) + +## Installing Requests and Supported Versions + +Requests is available on PyPI: + +```console +$ python -m pip install requests +``` + +Requests officially supports Python 3.8+. + +## Supported Features & Best–Practices + +Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today. + +- Keep-Alive & Connection Pooling +- International Domains and URLs +- Sessions with Cookie Persistence +- Browser-style TLS/SSL Verification +- Basic & Digest Authentication +- Familiar `dict`–like Cookies +- Automatic Content Decompression and Decoding +- Multi-part File Uploads +- SOCKS Proxy Support +- Connection Timeouts +- Streaming Downloads +- Automatic honoring of `.netrc` +- Chunked HTTP Requests + +## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io) + +[![Read the Docs](https://raw.githubusercontent.com/psf/requests/main/ext/ss.png)](https://requests.readthedocs.io) + +## Cloning the repository + +When cloning the Requests repository, you may need to add the `-c +fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see +[this issue](https://github.com/psf/requests/issues/2690) for more background): + +```shell +git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git +``` + +You can also apply this setting to your global Git config: + +```shell +git config --global fetch.fsck.badTimezone ignore +``` + +--- + +[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/main/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/main/ext/psf.png)](https://www.python.org/psf) diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/RECORD b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/RECORD new file mode 100644 index 0000000..fede80f --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/RECORD @@ -0,0 +1,42 @@ +requests-2.32.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests-2.32.3.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 +requests-2.32.3.dist-info/METADATA,sha256=ZY7oRUweLnb7jCEnEW9hFWs7IpQbNVnAA4ncpwA4WBo,4610 +requests-2.32.3.dist-info/RECORD,, +requests-2.32.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 +requests-2.32.3.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests/__init__.py,sha256=4xaAERmPDIBPsa2PsjpU9r06yooK-2mZKHTZAhWRWts,5072 +requests/__pycache__/__init__.cpython-312.pyc,, +requests/__pycache__/__version__.cpython-312.pyc,, +requests/__pycache__/_internal_utils.cpython-312.pyc,, +requests/__pycache__/adapters.cpython-312.pyc,, +requests/__pycache__/api.cpython-312.pyc,, +requests/__pycache__/auth.cpython-312.pyc,, +requests/__pycache__/certs.cpython-312.pyc,, +requests/__pycache__/compat.cpython-312.pyc,, +requests/__pycache__/cookies.cpython-312.pyc,, +requests/__pycache__/exceptions.cpython-312.pyc,, +requests/__pycache__/help.cpython-312.pyc,, +requests/__pycache__/hooks.cpython-312.pyc,, +requests/__pycache__/models.cpython-312.pyc,, +requests/__pycache__/packages.cpython-312.pyc,, +requests/__pycache__/sessions.cpython-312.pyc,, +requests/__pycache__/status_codes.cpython-312.pyc,, +requests/__pycache__/structures.cpython-312.pyc,, +requests/__pycache__/utils.cpython-312.pyc,, +requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435 +requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +requests/adapters.py,sha256=KIcecscqam6reOCXRl4DwP4jX8Jcl8sd57ft17KR2cQ,27451 +requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449 +requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186 +requests/certs.py,sha256=Z9Sb410Anv6jUFTyss0jFFhU6xst8ctELqfy8Ev23gw,429 +requests/compat.py,sha256=C5w_DPLSurXPgcdWU78fora0APmbYkX2G89QvH5xzPA,1817 +requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590 +requests/exceptions.py,sha256=jJPS1UWATs86ShVUaLorTiJb1SaGuoNEWgICJep-VkY,4260 +requests/help.py,sha256=gPX5d_H7Xd88aDABejhqGgl9B1VFRTt5BmiYvL3PzIQ,3875 +requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +requests/models.py,sha256=k42roXzC8u_OagAPQi9U4MkfO7i4r2FdaqvMqstPehc,35418 +requests/packages.py,sha256=_g0gZ681UyAlKHRjH6kanbaoxx2eAb6qzcXiODyTIoc,904 +requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495 +requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322 +requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +requests/utils.py,sha256=HiQC6Nq_Da3ktaMiFzQkh-dCk3iQHHKEsYS5kDc-8Cw,33619 diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/WHEEL b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/WHEEL new file mode 100644 index 0000000..bab98d6 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.43.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/top_level.txt b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/top_level.txt new file mode 100644 index 0000000..f229360 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests-2.32.3.dist-info/top_level.txt @@ -0,0 +1 @@ +requests diff --git a/env/lib/python3.12/site-packages/requests/__init__.py b/env/lib/python3.12/site-packages/requests/__init__.py new file mode 100644 index 0000000..051cda1 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/__init__.py @@ -0,0 +1,184 @@ +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. +Basic GET usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> b'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": "value1", + "key2": "value2" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import warnings + +import urllib3 + +from .exceptions import RequestsDependencyWarning + +try: + from charset_normalizer import __version__ as charset_normalizer_version +except ImportError: + charset_normalizer_version = None + +try: + from chardet import __version__ as chardet_version +except ImportError: + chardet_version = None + + +def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): + urllib3_version = urllib3_version.split(".") + assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append("0") + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1 + assert major >= 1 + if major == 1: + assert minor >= 21 + + # Check charset_normalizer for compatibility. + if chardet_version: + major, minor, patch = chardet_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet_version >= 3.0.2, < 6.0.0 + assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) + elif charset_normalizer_version: + major, minor, patch = charset_normalizer_version.split(".")[:3] + major, minor, patch = int(major), int(minor), int(patch) + # charset_normalizer >= 2.0.0 < 4.0.0 + assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) + else: + warnings.warn( + "Unable to find acceptable character detection dependency " + "(chardet or charset_normalizer).", + RequestsDependencyWarning, + ) + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split("."))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = "Old version of cryptography ({}) may cause slowdown.".format( + cryptography_version + ) + warnings.warn(warning, RequestsDependencyWarning) + + +# Check imported dependencies for compatibility. +try: + check_compatibility( + urllib3.__version__, chardet_version, charset_normalizer_version + ) +except (AssertionError, ValueError): + warnings.warn( + "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " + "version!".format( + urllib3.__version__, chardet_version, charset_normalizer_version + ), + RequestsDependencyWarning, + ) + +# Attempt to enable urllib3's fallback for SNI support +# if the standard library doesn't support SNI or the +# 'ssl' library isn't available. +try: + try: + import ssl + except ImportError: + ssl = None + + if not getattr(ssl, "HAS_SNI", False): + from urllib3.contrib import pyopenssl + + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning + +warnings.simplefilter("ignore", DependencyWarning) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +from . import packages, utils +from .__version__ import ( + __author__, + __author_email__, + __build__, + __cake__, + __copyright__, + __description__, + __license__, + __title__, + __url__, + __version__, +) +from .api import delete, get, head, options, patch, post, put, request +from .exceptions import ( + ConnectionError, + ConnectTimeout, + FileModeWarning, + HTTPError, + JSONDecodeError, + ReadTimeout, + RequestException, + Timeout, + TooManyRedirects, + URLRequired, +) +from .models import PreparedRequest, Request, Response +from .sessions import Session, session +from .status_codes import codes + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d961b0c42b74861f5b8ef1b9513d89805f14fd62 GIT binary patch literal 5428 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 D_nLWD literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e5f45832cd02df91f14f3c624a0cc3eccd971ab GIT binary patch literal 592 zcmY*WL2DC16y8nRWV7j}!HNM9+>2nS*-6t|6;WC+AZU@E7Gc=zyk>{&?rdjf3)$25 z2lVVk@Txb#pW(&hlB52CKyRLWX-(0`F!R1|=9_u%o9~We8yHXN`{_5+Fn+DTIuKvS z)e~Gk7|ieuX8Iukf{V4MCXYxoV;^qb7`E!Of|bGzSOSQ5^1P+AqeW)uNj@?rs-Ep1-sq%`4k=B_yAY^^ilMpZ+0TZF}xF{MUZyyJ*k7`EYyoNLd9l7s- z>!R36;Kl5Qkt@Oza$49gvmlIMF!F{)?@(lO$)}Na|5N5$*v!w5pWWrB%dajbZ~FG4 zMXBaG21*y(lrm7EcyM|Er35 z2&r0K?ob-8%R*=&3}(3T#kg8I{hO0WBtVip3X&vXZ{cO zPRqJ!noHYodS$D+vs-Rg_HNm%I`_(UwRIOc=Rs*#JCA=D-KujR$!@=Ns`jG`OLkEH E2i(@dI{*Lx literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/_internal_utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7c820ac142f2faa2f6121f86ebe2c7eaae51202 GIT binary patch literal 2032 zcmah}-)j^{9G~62pL>^FVvUk$bg*gk+U8CpQaFD=G^rY@hD$7X#;kk0libGJ-RsP3 z;)S$G@j;*TpFe1FXM z`a3#loUqPt>Z9ZYOjOuU1M?}|xuFbNVPiFvt{BvBHFze-X>C25khP$~JsBaE}0W;vWtN3Uugx2jD2>aC%wQ`B9uOv13(ws;-Sdyc^^ z*I}4fbdGgOumO^16BD<6RqME1$Hi6*b-7|06>O3kaZKzwnB3)**aT4XWLZdI0=Pn| zH9{Fa#yo)Q4E)+PooCh8qNG<}i^^uDAXWCPDz_Ysamso@H+OTcFw1Ua?E2 zGZhQMG0|3r$EGh_zKlI5Op3czXd;B5%N8TK&@ih6s>LjaaosTp6{QPeVE_VKv1VpL zq8&d_T#qwRT*&>6ov*ky$=hB*zD}3-y{2>y>@B6`-2C{MymVX|;q9uv{T7(x_Yp&O{KETg;14YVv}BP&0R z6SzsXM z6=K}U;VT~FxJ=rB(1T#3V3*@^JQcPFkK)_l@OG0a1uCdmz-8C1h6X`YXNG0Xe433= zalAkQa1aZrLV`Wlo2Qr%%q0_)x)ff3L_0Yq3Xf?@*!8pytXWJ8UDCav9)^z4^bawOW%Mi5UeT*2DHz|KD#`wU78ph zpD1cq$F59h#R={FjhTs{|J{4jGsWP*+gsq{`nKH;pPfx%xUU^43_CV+tvIa-{r-38 z!z7~RIwy?wz=?w1R+ihg;pGS``8}dtfN2&xamIE{uS(9*BcKyqV2@#ff=SY!a!iVB zbt6gr10CKNJi1nVR(e|UkDXl~Jm;f<#=+sW^Uo%qPWneruOB?)qyEOBV{7GSi%%E* z?3wjLXMJ>_v29gYA3P0K8v`f(Q`h|dDIe`?9605FQuGI=eYAfglJrwY8j-l4JiHlI U`eYyVZlzTzvo(;G`ofI=1)B*g!~g&Q literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/adapters.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ea1dc5bcde88812fd958d338ef9f44ef240bd78 GIT binary patch literal 28366 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 c)-HRALC0WY;%?*IS* literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797ff79d798cd93c6db6e08d4a1d5231d24d3c15 GIT binary patch literal 13929 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 dL_zXsKnwY29#N1yvY%1Y?ThDsM`22^{Xa1|NB zd?cJ45+3nU9W|rFQA9B2@zEwB`qGGC;@9YS033U!5E1E;E}4woU04OqF<$!tgvMA&n9uI1_0MmK81*Ou!;GvN2 z1#n@k7BgpslF-*1COsFYD4z+fWP{Rf^`r%pP*hCLv2X4z2q~7h5}pUen-j2VaO^u6 zY?=19>W&Tyc`!Vfq`$(uPNK!Q$1Ya$ykSD-`Tk_QSjls)iacMe3?6mtFNZslHR$W( zRtsrAk<&o(x5z5hVAi;bH4Wq0o+?}rZnAsA-gmQXXM20P$2v28R8Dsl$IQFSYB9^& z&Q?lZPj{|mMp&E zwMadHltX&zU(iFvg+u>=a_tFmARS7JRQ14Zfg%v6zOgrasFwVj-+S}s?aceV@%~mU z8VH_`taB?{GYI{yjLj!GB+ncTp&yZhFmg0U_cW|UqmFea@jb!`9g)PXVK7b-eKpFt znI;}_nxq|VD;Q4l{9c4`=Cz%Q?5vZ#0%a8oy3z7FM3<)6rPHB$=gP^?!|j)9oOkTypQh3`!z%k z;5m2?kOpoLz-1jb$vjzr@gSLB*6^X8UPGiXi&!SgqiJx-<-!Fyqy3%k^B* zGhNOhsnH_h5+T0%bx(8x-#lo-noZ+S!#p8OMyT!j+*}Tr*|OW`FWJoD#=FV7zHmKL zbcpGb%fh7gDg<97jJtu~Fdi$tm)f!FF{WTh!27HN0F9(wLyo?PzTJk9ZQQ5y>EMRq=seQ==#Bp^N(|qMLI{_t4+U?ks+D>yZXm=^`1#cdA#h2Yyb76jd zZqe@Xxl_w?M+1j6iGQ&P37TP~)uG11!6tVFnF~P`dxh}kW}`G?bsAw$PFRfaz`IB+ zwSDXLDOnzNQH7Tu1L&hirE359gYx{1#74e)^V5NzD31RzRl7g6aCd6qcJ1EOhd*Qn z8B|#q6i{Kbzx49o6dId(inQYR@0GDZ0>)Ro0IAl-ck4gp7E-shh16qp)W=HaV`u7` zEPr+S)Y2kp!&&00Xfl5aYRibT=(Yt^GketbJiFx)nK@~Pq3f^6(#ft+o}mqCa_t~E z?~+xUfssBLfG8fY>}kPZ!HH9KL#8ft13{z_4OZxNxy*F^*jX5o*q!S#&mqgqUXh9t zU+oTpnYS9azRUs%mFyAYAzU44fUoOE-g-(JD@24WxD5Rwx4hvNh~=`tSBlDV6l`^b z2rbX$LKf7Dp4IAwHs^BkZR_oY_4j4QvYeo8Su71zlnLJBk#cc66^2*La{c8%CM_^! z+T~W*J2)H<$x_GW7KhgK$SMzfX}rag%EPjdnUz%fd^_;G_!e+hR-W=(o`&6Ovx*8H zQJ|VfCe@kPsG>tz)J-TTFMO?(Oq`9WS=|lTxFQ9p9>g@FlCUk{ViO7`6{tT0Hl+YQ z1c+@{Fs)#Rf*Al=8m=GqIy2SGP6fLZ)D+ADK&=Fm`BvBUgzH<%NVR$bR5DsNhtH{M z7MXBCp474z*g_V4xPQ!TTcQ_2SP`bk3SqJNGkOL|5mWzTGW&6S$3J18fvLVi{5}BO z0!@3OXSC$AD$+(CAmeE%r;R?DMEPC!j9Nc4D4}frerDosW}=@Qq>)j&Vc(os|NQ3m ze)|7rb)sJy=qau8AUXYLd~1K{Nfsrme1_#xW!5Y0S96EBRs zroTY1VKS}h&k?|&g38r?ej}ahCpNOherlsMvi`x1bA4lDWNe+R7y3m-($|YG2j6HY iI||oYt2|7W)qyInxRU#q^pP66Q_CG`Chjye!2bY{F=G7y literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/cookies.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b182309267c59724166d032e6a51eccbcf6224b GIT binary patch literal 25206 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d1608be3524d0f61fd96fba0e7dd9d591faa14f GIT binary patch literal 7593 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/packages.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86ccc969a18b7096154b7f98faf3b14fd8b7da68 GIT binary patch literal 1126 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 z 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 a<3-1dOf9L>4UaiWJbJ0rZK_}Z_P+s8xOHFv literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/status_codes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4fbade443cb0925ba9d16a3a9760ee9f63968f6 GIT binary patch literal 6031 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 ZTYuX)a4z|2s$EZA-LC1W?=`5p^8bJBG3WpQ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb4d1d073bd379f7b73360ac8ba834f3052c47e6 GIT binary patch literal 5631 zcmb_gO>7&-72a8LsTC=ijwKt8lOXHJHYHmkl|*svNO7%7PVC5$lUPj)CdP8b9Z74E zTxND@g^FAVg@9T>Qaeam$#9FPK!MtD3Z$oA+fxs{kfmEY3tx%`Xmd*>2TgnGd$T{H zB-#zq4#3CVoxk_<%{Oo6kFBjy0ZPC6#$+ZY2!F#DzewK0+RN~;BLeY~TlLTaNr(0Df{>Qb z%ydMLfNavixU{UxAe;4OkWoDfGN#8sw&*P&TgzhCHm7Y!v*@XUMGKZ;8y6_5r~L&S zHK=5vrpH*XQZgAGYBQOhoH0!mbNoEb+R12CfpRKe%+Wk8*p{N@a!Q`sQ>G5j1zj*i!DpX!J%tg= z8oKhF(jfYsU3?g?&FhK5Y?c=7#5ri40J!FiERSaDyk!;=8=GoFLnmGy!={beDoTek z#!9ZAarm5J*`1(A7q+jP$Zy97f8JyeObzjcUY(*EEF!F3Lse`?Va{wdm zKt^HB7J`Ug&~hanQVqH%hP-Yk{BF<-7I+chNfmeSZul^%F+E2u*P{T3DRYKH!fl}x zv^-U20IVi6CXE6>z6=mEVR`%O!9@@#>GFdKAp@Y6in?Y~#0OgSW=YE#b{Qg`FKWyH ze{zfK77QYJ5>{ow1vV#`DeVHl8~fsjd?6sptnR?#aSCk=m;oSAD(G~=D4=5K^3kkM zC&((urNFO($E7yX5-&Hs|2aVozRi(&(GV^YQJ53XhrI@Me{*Dl7{Z+ROY&nvgtBmh zjCO?>QmzwGxpSO|YkybB30pKb;e^2(niH9x(b%MAVN+1?-&3h6Gfz|b(v+6ZYkF$f z%$7K{q+T%Wlcn+0lfAt?!&=$uIWy5SWa>0U3l~y3V?0$X1ML)^PCofm3fPSH6t(QM zHc73NPwA<3woVqyj;yLi!LU_z_R$6lA?eq4f?^hmdExG^z3=BQh2M$YiN!As+-ci+ zY50!Zb}4*0wivrIT$MYPpRdUsYtUB6qCI{=f8qPucR(x&b7W4O5W$areck^YIbYw? ztMMZ;0Pkgi;r@6-WEeb0;urv5x8hp}XvUE^=zWi}?N||0Rg2n4IAHJNjqME@B%z1( zD2RFC^N6s&^ZL$}0nf^zrBm;ndVl0kvch&igAIT}#p})d1_nM1L+AwMS=b^+8G4Sj zg8*~UK(-5ng(y~(z_7{xW?0bRY3%J9b|>C;`R&EGm!JOd=+&dw`m6E8byAHVtjGr+ zVA!+JAL927413Ox8@Gn-X<&vp;ZumSZ;bTIO{S3q?Dl?EpS?37>Rndn^YC*VC_HB*mt}V>BV{o1W;Xk z$CbXN{`dN8@y9Fj;}6jF{|Bns-H2+EIHL7RNQ=M0|qgI z9D}{^5MXdyJqG7QT|jD?5Ir<*2Q(5yBZM9Mk1_=$aOqz7b7Vdpf-(XE0I`8l**<79 z`&1)u@_uf5+5n7$(9gmNJTQ(`kDsj`9JqeukV;XFAK1eT;Ld1?hcV5m4Hqe7x0Nl8fZ7M$7`2FkJldsc$8n$eI zVMLs$VfhI=L*X4DZ>4PDF01$jXl}tDaunikdL{;gVu#omN3cXu5 z1S41|U>(JFUZFqx-mTdFyX}eVQms9?c;eHxy_J@|pT^s+4Bu|wS8d-{Yd=tnCqC-? zSi0RiSnVCG^$yhz4OipC6?u5;%0r~`V4Q@94ZBb?pKy$BbcCPQJ5ciAAAp4>1 z7N~{sST?)6k?B}-8v1zPx*LCDrSDh$zv#c+@l3VjnOeuUYVji#`N&p#5ER^==i#B= z9vi>%0ucEcR`^f}tZ_n+@v%M_f~8PwCPmguM+B49XZy%f%Kj>Qye;BO>TT~U3cCQB5SU0mUJCZHKoryhy z;xQBn6bDft5*cpx>yuk!9Y&4s%GJ^ zZ$XBPhAPUu>spM>Y}>lZ!HM8CsIYc|fMnuM`))W8G~bn57n`c`?mx?WwgMbS#oyW! zATa-GoIqX^bn)jQa8zh?wi%Kbbd{2r6%)t02-kEoemNjEY3L$04HIz3#`rqwH`FZliqO_m7#{|Qu(ay7ulqo4xL>BO>TE(bSecu(gY+WEDF?QWLH&@R((F6EOc_$}Ze zM;>sg?ihO+DhT|n9uS|02q9mH5($5~O(6UJE*!cS86qUHoV+LC|Gm@Vc9Oc%{-pqa He7OGr%?lK| literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc b/env/lib/python3.12/site-packages/requests/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d77c1044ab68723ea245d94571a0924f090fecb4 GIT binary patch literal 36362 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 OJAb#z&G+#PH~&8nz5qx7 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/requests/__version__.py b/env/lib/python3.12/site-packages/requests/__version__.py new file mode 100644 index 0000000..2c105ac --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = "requests" +__description__ = "Python HTTP for Humans." +__url__ = "https://requests.readthedocs.io" +__version__ = "2.32.3" +__build__ = 0x023203 +__author__ = "Kenneth Reitz" +__author_email__ = "me@kennethreitz.org" +__license__ = "Apache-2.0" +__copyright__ = "Copyright Kenneth Reitz" +__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/env/lib/python3.12/site-packages/requests/_internal_utils.py b/env/lib/python3.12/site-packages/requests/_internal_utils.py new file mode 100644 index 0000000..f2cf635 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/_internal_utils.py @@ -0,0 +1,50 @@ +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" +import re + +from .compat import builtin_str + +_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") +_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") +_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") +_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") + +_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) +_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) +HEADER_VALIDATORS = { + bytes: _HEADER_VALIDATORS_BYTE, + str: _HEADER_VALIDATORS_STR, +} + + +def to_native_string(string, encoding="ascii"): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode("ascii") + return True + except UnicodeEncodeError: + return False diff --git a/env/lib/python3.12/site-packages/requests/adapters.py b/env/lib/python3.12/site-packages/requests/adapters.py new file mode 100644 index 0000000..9a58b16 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/adapters.py @@ -0,0 +1,719 @@ +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket # noqa: F401 +import typing +import warnings + +from urllib3.exceptions import ClosedPoolError, ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import InvalidHeader as _InvalidHeader +from urllib3.exceptions import ( + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, +) +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ReadTimeoutError, ResponseError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util import parse_url +from urllib3.util.retry import Retry +from urllib3.util.ssl_ import create_urllib3_context + +from .auth import _basic_auth_str +from .compat import basestring, urlparse +from .cookies import extract_cookies_to_jar +from .exceptions import ( + ConnectionError, + ConnectTimeout, + InvalidHeader, + InvalidProxyURL, + InvalidSchema, + InvalidURL, + ProxyError, + ReadTimeout, + RetryError, + SSLError, +) +from .models import Response +from .structures import CaseInsensitiveDict +from .utils import ( + DEFAULT_CA_BUNDLE_PATH, + extract_zipped_paths, + get_auth_from_url, + get_encoding_from_headers, + prepend_scheme_if_needed, + select_proxy, + urldefragauth, +) + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + + +if typing.TYPE_CHECKING: + from .models import PreparedRequest + + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +try: + import ssl # noqa: F401 + + _preloaded_ssl_context = create_urllib3_context() + _preloaded_ssl_context.load_verify_locations( + extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + ) +except ImportError: + # Bypass default SSLContext creation when Python + # interpreter isn't built with the ssl module. + _preloaded_ssl_context = None + + +def _urllib3_request_context( + request: "PreparedRequest", + verify: "bool | str | None", + client_cert: "typing.Tuple[str, str] | str | None", + poolmanager: "PoolManager", +) -> "(typing.Dict[str, typing.Any], typing.Dict[str, typing.Any])": + host_params = {} + pool_kwargs = {} + parsed_request_url = urlparse(request.url) + scheme = parsed_request_url.scheme.lower() + port = parsed_request_url.port + + # Determine if we have and should use our default SSLContext + # to optimize performance on standard requests. + poolmanager_kwargs = getattr(poolmanager, "connection_pool_kw", {}) + has_poolmanager_ssl_context = poolmanager_kwargs.get("ssl_context") + should_use_default_ssl_context = ( + _preloaded_ssl_context is not None and not has_poolmanager_ssl_context + ) + + cert_reqs = "CERT_REQUIRED" + if verify is False: + cert_reqs = "CERT_NONE" + elif verify is True and should_use_default_ssl_context: + pool_kwargs["ssl_context"] = _preloaded_ssl_context + elif isinstance(verify, str): + if not os.path.isdir(verify): + pool_kwargs["ca_certs"] = verify + else: + pool_kwargs["ca_cert_dir"] = verify + pool_kwargs["cert_reqs"] = cert_reqs + if client_cert is not None: + if isinstance(client_cert, tuple) and len(client_cert) == 2: + pool_kwargs["cert_file"] = client_cert[0] + pool_kwargs["key_file"] = client_cert[1] + else: + # According to our docs, we allow users to specify just the client + # cert path + pool_kwargs["cert_file"] = client_cert + host_params = { + "scheme": scheme, + "host": parsed_request_url.hostname, + "port": port, + } + return host_params, pool_kwargs + + +class BaseAdapter: + """The Base Transport Adapter""" + + def __init__(self): + super().__init__() + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + + __attrs__ = [ + "max_retries", + "config", + "_pool_connections", + "_pool_maxsize", + "_pool_block", + ] + + def __init__( + self, + pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, + max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK, + ): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super().__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager( + self._pool_connections, self._pool_maxsize, block=self._pool_block + ) + + def init_poolmanager( + self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs + ): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + **pool_kwargs, + ) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith("socks"): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs, + ) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith("https") and verify: + conn.cert_reqs = "CERT_REQUIRED" + + # Only load the CA certificates if 'verify' is a string indicating the CA bundle to use. + # Otherwise, if verify is a boolean, we don't load anything since + # the connection will be using a context with the default certificates already loaded, + # and this avoids a call to the slow load_verify_locations() + if verify is not True: + # `verify` must be a str with a path then + cert_loc = verify + + if not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = "CERT_NONE" + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise OSError( + f"Could not find the TLS certificate file, " + f"invalid path: {conn.cert_file}" + ) + if conn.key_file and not os.path.exists(conn.key_file): + raise OSError( + f"Could not find the TLS key file, invalid path: {conn.key_file}" + ) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, "status", None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode("utf-8") + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def build_connection_pool_key_attributes(self, request, verify, cert=None): + """Build the PoolKey attributes used by urllib3 to return a connection. + + This looks at the PreparedRequest, the user-specified verify value, + and the value of the cert parameter to determine what PoolKey values + to use to select a connection from a given urllib3 Connection Pool. + + The SSL related pool key arguments are not consistently set. As of + this writing, use the following to determine what keys may be in that + dictionary: + + * If ``verify`` is ``True``, ``"ssl_context"`` will be set and will be the + default Requests SSL Context + * If ``verify`` is ``False``, ``"ssl_context"`` will not be set but + ``"cert_reqs"`` will be set + * If ``verify`` is a string, (i.e., it is a user-specified trust bundle) + ``"ca_certs"`` will be set if the string is not a directory recognized + by :py:func:`os.path.isdir`, otherwise ``"ca_certs_dir"`` will be + set. + * If ``"cert"`` is specified, ``"cert_file"`` will always be set. If + ``"cert"`` is a tuple with a second item, ``"key_file"`` will also + be present + + To override these settings, one may subclass this class, call this + method and use the above logic to change parameters as desired. For + example, if one wishes to use a custom :py:class:`ssl.SSLContext` one + must both set ``"ssl_context"`` and based on what else they require, + alter the other keys to ensure the desired behaviour. + + :param request: + The PreparedReqest being sent over the connection. + :type request: + :class:`~requests.models.PreparedRequest` + :param verify: + Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use. + :param cert: + (optional) Any user-provided SSL certificate for client + authentication (a.k.a., mTLS). This may be a string (i.e., just + the path to a file which holds both certificate and key) or a + tuple of length 2 with the certificate file path and key file + path. + :returns: + A tuple of two dictionaries. The first is the "host parameters" + portion of the Pool Key including scheme, hostname, and port. The + second is a dictionary of SSLContext related parameters. + """ + return _urllib3_request_context(request, verify, cert, self.poolmanager) + + def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): + """Returns a urllib3 connection for the given request and TLS settings. + This should not be called from user code, and is only exposed for use + when subclassing the :class:`HTTPAdapter `. + + :param request: + The :class:`PreparedRequest ` object to be sent + over the connection. + :param verify: + Either a boolean, in which case it controls whether we verify the + server's TLS certificate, or a string, in which case it must be a + path to a CA bundle to use. + :param proxies: + (optional) The proxies dictionary to apply to the request. + :param cert: + (optional) Any user-provided SSL certificate to be used for client + authentication (a.k.a., mTLS). + :rtype: + urllib3.ConnectionPool + """ + proxy = select_proxy(request.url, proxies) + try: + host_params, pool_kwargs = self.build_connection_pool_key_attributes( + request, + verify, + cert, + ) + except ValueError as e: + raise InvalidURL(e, request=request) + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + else: + # Only scheme should be lower case + conn = self.poolmanager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + + return conn + + def get_connection(self, url, proxies=None): + """DEPRECATED: Users should move to `get_connection_with_tls_context` + for all subclasses of HTTPAdapter using Requests>=2.32.2. + + Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + warnings.warn( + ( + "`get_connection` has been deprecated in favor of " + "`get_connection_with_tls_context`. Custom HTTPAdapter subclasses " + "will need to migrate for Requests>=2.32.2. Please see " + "https://github.com/psf/requests/pull/6710 for more details." + ), + DeprecationWarning, + ) + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = proxy and scheme != "https" + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith("socks") + + url = request.path_url + if url.startswith("//"): # Don't confuse urllib3 + url = f"/{url.lstrip('/')}" + + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return headers + + def send( + self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None + ): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection_with_tls_context( + request, verify, proxies=proxies, cert=cert + ) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers( + request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + ) + + chunked = not (request.body is None or "Content-Length" in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError: + raise ValueError( + f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " + f"or a single float to set both timeouts to the same value." + ) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout, + chunked=chunked, + ) + + except (ProtocolError, OSError) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + elif isinstance(e, _InvalidHeader): + raise InvalidHeader(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/env/lib/python3.12/site-packages/requests/api.py b/env/lib/python3.12/site-packages/requests/api.py new file mode 100644 index 0000000..5960744 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/api.py @@ -0,0 +1,157 @@ +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + >>> req + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("get", url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("options", url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. If + `allow_redirects` is not provided, it will be set to `False` (as + opposed to the default :meth:`request` behavior). + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return request("head", url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("post", url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("put", url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("patch", url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request("delete", url, **kwargs) diff --git a/env/lib/python3.12/site-packages/requests/auth.py b/env/lib/python3.12/site-packages/requests/auth.py new file mode 100644 index 0000000..4a7ce6d --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/auth.py @@ -0,0 +1,314 @@ +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import hashlib +import os +import re +import threading +import time +import warnings +from base64 import b64encode + +from ._internal_utils import to_native_string +from .compat import basestring, str, urlparse +from .cookies import extract_cookies_to_jar +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" +CONTENT_TYPE_MULTI_PART = "multipart/form-data" + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(type(password)), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode("latin1") + + if isinstance(password, str): + password = password.encode("latin1") + + authstr = "Basic " + to_native_string( + b64encode(b":".join((username, password))).strip() + ) + + return authstr + + +class AuthBase: + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError("Auth hooks must be callable.") + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers["Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, "init"): + self._thread_local.init = True + self._thread_local.last_nonce = "" + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal["realm"] + nonce = self._thread_local.chal["nonce"] + qop = self._thread_local.chal.get("qop") + algorithm = self._thread_local.chal.get("algorithm") + opaque = self._thread_local.chal.get("opaque") + hash_utf8 = None + + if algorithm is None: + _algorithm = "MD5" + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == "MD5" or _algorithm == "MD5-SESS": + + def md5_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.md5(x).hexdigest() + + hash_utf8 = md5_utf8 + elif _algorithm == "SHA": + + def sha_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha1(x).hexdigest() + + hash_utf8 = sha_utf8 + elif _algorithm == "SHA-256": + + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha256(x).hexdigest() + + hash_utf8 = sha256_utf8 + elif _algorithm == "SHA-512": + + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode("utf-8") + return hashlib.sha512(x).hexdigest() + + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += f"?{p_parsed.query}" + + A1 = f"{self.username}:{realm}:{self.password}" + A2 = f"{method}:{path}" + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = f"{self._thread_local.nonce_count:08x}" + s = str(self._thread_local.nonce_count).encode("utf-8") + s += nonce.encode("utf-8") + s += time.ctime().encode("utf-8") + s += os.urandom(8) + + cnonce = hashlib.sha1(s).hexdigest()[:16] + if _algorithm == "MD5-SESS": + HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") + + if not qop: + respdig = KD(HA1, f"{nonce}:{HA2}") + elif qop == "auth" or "auth" in qop.split(","): + noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = ( + f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' + f'uri="{path}", response="{respdig}"' + ) + if opaque: + base += f', opaque="{opaque}"' + if algorithm: + base += f', algorithm="{algorithm}"' + if entdig: + base += f', digest="{entdig}"' + if qop: + base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' + + return f"Digest {base}" + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/psf/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get("www-authenticate", "") + + if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: + self._thread_local.num_401_calls += 1 + pat = re.compile(r"digest ", flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers["Authorization"] = self.build_digest_header( + prep.method, prep.url + ) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers["Authorization"] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook("response", self.handle_401) + r.register_hook("response", self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all( + [ + self.username == getattr(other, "username", None), + self.password == getattr(other, "password", None), + ] + ) + + def __ne__(self, other): + return not self == other diff --git a/env/lib/python3.12/site-packages/requests/certs.py b/env/lib/python3.12/site-packages/requests/certs.py new file mode 100644 index 0000000..be422c3 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/certs.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from certifi import where + +if __name__ == "__main__": + print(where()) diff --git a/env/lib/python3.12/site-packages/requests/compat.py b/env/lib/python3.12/site-packages/requests/compat.py new file mode 100644 index 0000000..095de1b --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/compat.py @@ -0,0 +1,94 @@ +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module previously handled import compatibility issues +between Python 2 and Python 3. It remains for backwards +compatibility until the next major version. +""" + +import importlib +import sys + +# ------------------- +# Character Detection +# ------------------- + + +def _resolve_char_detection(): + """Find supported character detection libraries.""" + chardet = None + for lib in ("chardet", "charset_normalizer"): + if chardet is None: + try: + chardet = importlib.import_module(lib) + except ImportError: + pass + return chardet + + +chardet = _resolve_char_detection() + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = _ver[0] == 2 + +#: Python 3.x? +is_py3 = _ver[0] == 3 + +# json/simplejson module import resolution +has_simplejson = False +try: + import simplejson as json + + has_simplejson = True +except ImportError: + import json + +if has_simplejson: + from simplejson import JSONDecodeError +else: + from json import JSONDecodeError + +# Keep OrderedDict for backwards compatibility. +from collections import OrderedDict +from collections.abc import Callable, Mapping, MutableMapping +from http import cookiejar as cookielib +from http.cookies import Morsel +from io import StringIO + +# -------------- +# Legacy Imports +# -------------- +from urllib.parse import ( + quote, + quote_plus, + unquote, + unquote_plus, + urldefrag, + urlencode, + urljoin, + urlparse, + urlsplit, + urlunparse, +) +from urllib.request import ( + getproxies, + getproxies_environment, + parse_http_list, + proxy_bypass, + proxy_bypass_environment, +) + +builtin_str = str +str = str +bytes = bytes +basestring = (str, bytes) +numeric_types = (int, float) +integer_types = (int,) diff --git a/env/lib/python3.12/site-packages/requests/cookies.py b/env/lib/python3.12/site-packages/requests/cookies.py new file mode 100644 index 0000000..f69d0cd --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/cookies.py @@ -0,0 +1,561 @@ +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `http.cookiejar.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import calendar +import copy +import time + +from ._internal_utils import to_native_string +from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest: + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `http.cookiejar.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get("Host"): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers["Host"], encoding="utf-8") + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse( + [ + parsed.scheme, + host, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment, + ] + ) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookiejar has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError( + "Cookie headers should be added with add_unredirected_header()" + ) + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse: + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `http.cookiejar` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookiejar` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, "_original_response") and response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get("Cookie") + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name( + self, name, domain=kwargs.get("domain"), path=kwargs.get("path") + ) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if (domain is None or cookie.domain == domain) and ( + path is None or cookie.path == path + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super().__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if ( + hasattr(cookie.value, "startswith") + and cookie.value.startswith('"') + and cookie.value.endswith('"') + ): + cookie.value = cookie.value.replace('\\"', "") + return super().set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super().update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: + # if there are multiple cookies that meet passed in criteria + raise CookieConflictError( + f"There are multiple cookies with name, {name!r}" + ) + # we will eventually return this as long as no cookie conflict + toReturn = cookie.value + + if toReturn: + return toReturn + raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop("_cookies_lock") + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if "_cookies_lock" not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, "copy"): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + "version": 0, + "name": name, + "value": value, + "port": None, + "domain": "", + "path": "/", + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": {"HttpOnly": None}, + "rfc2109": False, + } + + badargs = set(kwargs) - set(result) + if badargs: + raise TypeError( + f"create_cookie() got unexpected keyword arguments: {list(badargs)}" + ) + + result.update(kwargs) + result["port_specified"] = bool(result["port"]) + result["domain_specified"] = bool(result["domain"]) + result["domain_initial_dot"] = result["domain"].startswith(".") + result["path_specified"] = bool(result["path"]) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel["max-age"]: + try: + expires = int(time.time() + int(morsel["max-age"])) + except ValueError: + raise TypeError(f"max-age: {morsel['max-age']} must be integer") + elif morsel["expires"]: + time_template = "%a, %d-%b-%Y %H:%M:%S GMT" + expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) + return create_cookie( + comment=morsel["comment"], + comment_url=bool(morsel["comment"]), + discard=False, + domain=morsel["domain"], + expires=expires, + name=morsel.key, + path=morsel["path"], + port=None, + rest={"HttpOnly": morsel["httponly"]}, + rfc2109=False, + secure=bool(morsel["secure"]), + value=morsel.value, + version=morsel["version"] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError("You can only merge into CookieJar") + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/env/lib/python3.12/site-packages/requests/exceptions.py b/env/lib/python3.12/site-packages/requests/exceptions.py new file mode 100644 index 0000000..83986b4 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/exceptions.py @@ -0,0 +1,151 @@ +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from urllib3.exceptions import HTTPError as BaseHTTPError + +from .compat import JSONDecodeError as CompatJSONDecodeError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop("response", None) + self.response = response + self.request = kwargs.pop("request", None) + if response is not None and not self.request and hasattr(response, "request"): + self.request = self.response.request + super().__init__(*args, **kwargs) + + +class InvalidJSONError(RequestException): + """A JSON error occurred.""" + + +class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): + """Couldn't decode the text into json""" + + def __init__(self, *args, **kwargs): + """ + Construct the JSONDecodeError instance first with all + args. Then use it's args to construct the IOError so that + the json specific args aren't used as IOError specific args + and the error message from JSONDecodeError is preserved. + """ + CompatJSONDecodeError.__init__(self, *args) + InvalidJSONError.__init__(self, *self.args, **kwargs) + + def __reduce__(self): + """ + The __reduce__ method called when pickling the object must + be the one from the JSONDecodeError (be it json/simplejson) + as it expects all the arguments for instantiation, not just + one like the IOError, and the MRO would by default call the + __reduce__ method from the IOError due to the inheritance order. + """ + return CompatJSONDecodeError.__reduce__(self) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL scheme (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """The URL scheme provided is either invalid or unsupported.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content.""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed.""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body.""" + + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" diff --git a/env/lib/python3.12/site-packages/requests/help.py b/env/lib/python3.12/site-packages/requests/help.py new file mode 100644 index 0000000..8fbcd65 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/help.py @@ -0,0 +1,134 @@ +"""Module containing bug report helper(s).""" + +import json +import platform +import ssl +import sys + +import idna +import urllib3 + +from . import __version__ as requests_version + +try: + import charset_normalizer +except ImportError: + charset_normalizer = None + +try: + import chardet +except ImportError: + chardet = None + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import cryptography + import OpenSSL + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 3.10.3 it will return + {'name': 'CPython', 'version': '3.10.3'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == "CPython": + implementation_version = platform.python_version() + elif implementation == "PyPy": + implementation_version = "{}.{}.{}".format( + sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro, + ) + if sys.pypy_version_info.releaselevel != "final": + implementation_version = "".join( + [implementation_version, sys.pypy_version_info.releaselevel] + ) + elif implementation == "Jython": + implementation_version = platform.python_version() # Complete Guess + elif implementation == "IronPython": + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = "Unknown" + + return {"name": implementation, "version": implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + "system": platform.system(), + "release": platform.release(), + } + except OSError: + platform_info = { + "system": "Unknown", + "release": "Unknown", + } + + implementation_info = _implementation() + urllib3_info = {"version": urllib3.__version__} + charset_normalizer_info = {"version": None} + chardet_info = {"version": None} + if charset_normalizer: + charset_normalizer_info = {"version": charset_normalizer.__version__} + if chardet: + chardet_info = {"version": chardet.__version__} + + pyopenssl_info = { + "version": None, + "openssl_version": "", + } + if OpenSSL: + pyopenssl_info = { + "version": OpenSSL.__version__, + "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", + } + cryptography_info = { + "version": getattr(cryptography, "__version__", ""), + } + idna_info = { + "version": getattr(idna, "__version__", ""), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} + + return { + "platform": platform_info, + "implementation": implementation_info, + "system_ssl": system_ssl_info, + "using_pyopenssl": pyopenssl is not None, + "using_charset_normalizer": chardet is None, + "pyOpenSSL": pyopenssl_info, + "urllib3": urllib3_info, + "chardet": chardet_info, + "charset_normalizer": charset_normalizer_info, + "cryptography": cryptography_info, + "idna": idna_info, + "requests": { + "version": requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/env/lib/python3.12/site-packages/requests/hooks.py b/env/lib/python3.12/site-packages/requests/hooks.py new file mode 100644 index 0000000..d181ba2 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/hooks.py @@ -0,0 +1,33 @@ +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ["response"] + + +def default_hooks(): + return {event: [] for event in HOOKS} + + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, "__call__"): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/env/lib/python3.12/site-packages/requests/models.py b/env/lib/python3.12/site-packages/requests/models.py new file mode 100644 index 0000000..8f56ca7 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/models.py @@ -0,0 +1,1037 @@ +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. +import encodings.idna # noqa: F401 +from io import UnsupportedOperation + +from urllib3.exceptions import ( + DecodeError, + LocationParseError, + ProtocolError, + ReadTimeoutError, + SSLError, +) +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url + +from ._internal_utils import to_native_string, unicode_is_ascii +from .auth import HTTPBasicAuth +from .compat import ( + Callable, + JSONDecodeError, + Mapping, + basestring, + builtin_str, + chardet, + cookielib, +) +from .compat import json as complexjson +from .compat import urlencode, urlsplit, urlunparse +from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header +from .exceptions import ( + ChunkedEncodingError, + ConnectionError, + ContentDecodingError, + HTTPError, + InvalidJSONError, + InvalidURL, +) +from .exceptions import JSONDecodeError as RequestsJSONDecodeError +from .exceptions import MissingSchema +from .exceptions import SSLError as RequestsSSLError +from .exceptions import StreamConsumedError +from .hooks import default_hooks +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( + check_header_validity, + get_auth_from_url, + guess_filename, + guess_json_utf, + iter_slices, + parse_header_links, + requote_uri, + stream_decode_response_unicode, + super_len, + to_key_val_list, +) + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin: + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = "/" + + url.append(path) + + query = p.query + if query: + url.append("?") + url.append(query) + + return "".join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, "read"): + return data + elif hasattr(data, "__iter__"): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): + vs = [vs] + for v in vs: + if v is not None: + result.append( + ( + k.encode("utf-8") if isinstance(k, str) else k, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if not files: + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, "__iter__"): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + ( + field.decode("utf-8") + if isinstance(field, bytes) + else field, + v.encode("utf-8") if isinstance(v, str) else v, + ) + ) + + for k, v in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, "read"): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin: + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError(f'Unsupported event specified, with event name "{event}"') + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, "__iter__"): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for k, v in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return f"" + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Instances are generated from a :class:`Request ` object, and + should not be instantiated manually; doing so may produce undesirable + effects. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + >>> r + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare( + self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None, + ): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return f"" + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode("utf-8") + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/psf/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode("utf8") + else: + url = str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ":" in url and not url.lower().startswith("http"): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + raise MissingSchema( + f"Invalid URL {url!r}: No scheme supplied. " + f"Perhaps you meant https://{url}?" + ) + + if not host: + raise InvalidURL(f"Invalid URL {url!r}: No host supplied") + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL("URL has an invalid label.") + elif host.startswith(("*", ".")): + raise InvalidURL("URL has an invalid label.") + + # Carefully reconstruct the network location + netloc = auth or "" + if netloc: + netloc += "@" + netloc += host + if port: + netloc += f":{port}" + + # Bare domains aren't valid URLs. + if not path: + path = "/" + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = f"{query}&{enc_params}" + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = "application/json" + + try: + body = complexjson.dumps(json, allow_nan=False) + except ValueError as ve: + raise InvalidJSONError(ve, request=self) + + if not isinstance(body, bytes): + body = body.encode("utf-8") + + is_stream = all( + [ + hasattr(data, "__iter__"), + not isinstance(data, (basestring, list, tuple, Mapping)), + ] + ) + + if is_stream: + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + body = data + + if getattr(body, "tell", None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except OSError: + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError( + "Streamed bodies and files are mutually exclusive." + ) + + if length: + self.headers["Content-Length"] = builtin_str(length) + else: + self.headers["Transfer-Encoding"] = "chunked" + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, "read"): + content_type = None + else: + content_type = "application/x-www-form-urlencoded" + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ("content-type" not in self.headers): + self.headers["Content-Type"] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers["Content-Length"] = builtin_str(length) + elif ( + self.method not in ("GET", "HEAD") + and self.headers.get("Content-Length") is None + ): + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers["Content-Length"] = "0" + + def prepare_auth(self, auth, url=""): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers["Cookie"] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response: + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + "_content", + "status_code", + "headers", + "url", + "history", + "encoding", + "reason", + "cookies", + "elapsed", + "request", + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + #: This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, "_content_consumed", True) + setattr(self, "raw", None) + + def __repr__(self): + return f"" + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return "location" in self.headers and self.status_code in REDIRECT_STATI + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return "location" in self.headers and self.status_code in ( + codes.moved_permanently, + codes.permanent_redirect, + ) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" + if chardet is not None: + return chardet.detect(self.content)["encoding"] + else: + # If no character detection library is available, we'll fall back + # to a standard Python utf-8 str. + return "utf-8" + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, "stream"): + try: + yield from self.raw.stream(chunk_size, decode_content=True) + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + except SSLError as e: + raise RequestsSSLError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError( + f"chunk_size must be an int, it is instead a {type(chunk_size)}." + ) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines( + self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None + ): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content( + chunk_size=chunk_size, decode_unicode=decode_unicode + ): + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + yield from lines + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError("The content for this response was already consumed") + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``charset_normalizer`` or ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return "" + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors="replace") + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors="replace") + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises requests.exceptions.JSONDecodeError: If the response body does not + contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using charset_normalizer to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + except JSONDecodeError as e: + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + try: + return complexjson.loads(self.text, **kwargs) + except JSONDecodeError as e: + # Catch JSON-related errors and raise as requests.JSONDecodeError + # This aliases json.JSONDecodeError and simplejson.JSONDecodeError + raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get("link") + + resolved_links = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get("rel") or link.get("url") + resolved_links[key] = link + + return resolved_links + + def raise_for_status(self): + """Raises :class:`HTTPError`, if one occurred.""" + + http_error_msg = "" + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode("utf-8") + except UnicodeDecodeError: + reason = self.reason.decode("iso-8859-1") + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = ( + f"{self.status_code} Client Error: {reason} for url: {self.url}" + ) + + elif 500 <= self.status_code < 600: + http_error_msg = ( + f"{self.status_code} Server Error: {reason} for url: {self.url}" + ) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, "release_conn", None) + if release_conn is not None: + release_conn() diff --git a/env/lib/python3.12/site-packages/requests/packages.py b/env/lib/python3.12/site-packages/requests/packages.py new file mode 100644 index 0000000..5ab3d8e --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/packages.py @@ -0,0 +1,23 @@ +import sys + +from .compat import chardet + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ("urllib3", "idna"): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(f"{package}."): + sys.modules[f"requests.packages.{mod}"] = sys.modules[mod] + +if chardet is not None: + target = chardet.__name__ + for mod in list(sys.modules): + if mod == target or mod.startswith(f"{target}."): + imported_mod = sys.modules[mod] + sys.modules[f"requests.packages.{mod}"] = imported_mod + mod = mod.replace(target, "chardet") + sys.modules[f"requests.packages.{mod}"] = imported_mod diff --git a/env/lib/python3.12/site-packages/requests/sessions.py b/env/lib/python3.12/site-packages/requests/sessions.py new file mode 100644 index 0000000..b387bc3 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/sessions.py @@ -0,0 +1,831 @@ +""" +requests.sessions +~~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from collections import OrderedDict +from datetime import timedelta + +from ._internal_utils import to_native_string +from .adapters import HTTPAdapter +from .auth import _basic_auth_str +from .compat import Mapping, cookielib, urljoin, urlparse +from .cookies import ( + RequestsCookieJar, + cookiejar_from_dict, + extract_cookies_to_jar, + merge_cookies, +) +from .exceptions import ( + ChunkedEncodingError, + ContentDecodingError, + InvalidSchema, + TooManyRedirects, +) +from .hooks import default_hooks, dispatch_hook + +# formerly defined here, reexposed here for backward compatibility +from .models import ( # noqa: F401 + DEFAULT_REDIRECT_LIMIT, + REDIRECT_STATI, + PreparedRequest, + Request, +) +from .status_codes import codes +from .structures import CaseInsensitiveDict +from .utils import ( # noqa: F401 + DEFAULT_PORTS, + default_headers, + get_auth_from_url, + get_environ_proxies, + get_netrc_auth, + requote_uri, + resolve_proxies, + rewind_body, + should_bypass_proxies, + to_key_val_list, +) + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == "win32": + preferred_clock = time.perf_counter +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get("response") == []: + return request_hooks + + if request_hooks is None or request_hooks.get("response") == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin: + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers["location"] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + location = location.encode("latin1") + return to_native_string(location, "utf8") + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if ( + old_parsed.scheme == "http" + and old_parsed.port in (80, None) + and new_parsed.scheme == "https" + and new_parsed.port in (443, None) + ): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if ( + not changed_scheme + and old_parsed.port in default_port + and new_parsed.port in default_port + ): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects( + self, + resp, + req, + stream=False, + timeout=None, + verify=True, + cert=None, + proxies=None, + yield_requests=False, + **adapter_kwargs, + ): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects( + f"Exceeded {self.max_redirects} redirects.", response=resp + ) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith("//"): + parsed_rurl = urlparse(resp.url) + url = ":".join([to_native_string(parsed_rurl.scheme), url]) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == "" and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/psf/requests/issues/1084 + if resp.status_code not in ( + codes.temporary_redirect, + codes.permanent_redirect, + ): + # https://github.com/psf/requests/issues/3490 + purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + headers.pop("Cookie", None) + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = prepared_request._body_position is not None and ( + "Content-Length" in headers or "Transfer-Encoding" in headers + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if "Authorization" in headers and self.should_strip_auth( + response.request.url, url + ): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers["Authorization"] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + scheme = urlparse(prepared_request.url).scheme + new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) + + if "Proxy-Authorization" in headers: + del headers["Proxy-Authorization"] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + # urllib3 handles proxy authorization for us in the standard adapter. + # Avoid appending this to TLS tunneled requests where it may be leaked. + if not scheme.startswith("https") and username and password: + headers["Proxy-Authorization"] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != "HEAD": + method = "GET" + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != "HEAD": + method = "GET" + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == "POST": + method = "GET" + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + ... s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + "headers", + "cookies", + "auth", + "proxies", + "hooks", + "params", + "verify", + "cert", + "adapters", + "stream", + "trust_env", + "max_redirects", + ] + + def __init__(self): + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + #: Defaults to `True`, requiring requests to verify the TLS certificate at the + #: remote end. + #: If verify is set to `False`, requests will accept any TLS certificate + #: presented by the server, and will ignore hostname mismatches and/or + #: expired certificates, which will make your application vulnerable to + #: man-in-the-middle (MitM) attacks. + #: Only set this to `False` for testing. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount("https://", HTTPAdapter()) + self.mount("http://", HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies + ) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting( + request.headers, self.headers, dict_class=CaseInsensitiveDict + ), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request( + self, + method, + url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None, + ): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param hooks: (optional) Dictionary mapping hook name to one event or + list of events, event must be callable. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. When set to + ``False``, requests will accept any TLS certificate presented by + the server, and will ignore hostname mismatches and/or expired + certificates, which will make your application vulnerable to + man-in-the-middle (MitM) attacks. Setting verify to ``False`` + may be useful during local development or testing. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + "timeout": timeout, + "allow_redirects": allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("GET", url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", True) + return self.request("OPTIONS", url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault("allow_redirects", False) + return self.request("HEAD", url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("POST", url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PUT", url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("PATCH", url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request("DELETE", url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault("stream", self.stream) + kwargs.setdefault("verify", self.verify) + kwargs.setdefault("cert", self.cert) + if "proxies" not in kwargs: + kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError("You can only send PreparedRequests.") + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop("allow_redirects", True) + stream = kwargs.get("stream") + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook("response", hooks, r, **kwargs) + + # Persist cookies + if r.history: + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Resolve redirects if allowed. + if allow_redirects: + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + history = [resp for resp in gen] + else: + history = [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next( + self.resolve_redirects(r, request, yield_requests=True, **kwargs) + ) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get("no_proxy") if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for k, v in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration + # and be compatible with cURL. + if verify is True or verify is None: + verify = ( + os.environ.get("REQUESTS_CA_BUNDLE") + or os.environ.get("CURL_CA_BUNDLE") + or verify + ) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for prefix, adapter in self.adapters.items(): + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema(f"No connection adapters were found for {url!r}") + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/env/lib/python3.12/site-packages/requests/status_codes.py b/env/lib/python3.12/site-packages/requests/status_codes.py new file mode 100644 index 0000000..c7945a2 --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/status_codes.py @@ -0,0 +1,128 @@ +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +Example:: + + >>> import requests + >>> requests.codes['temporary_redirect'] + 307 + >>> requests.codes.teapot + 418 + >>> requests.codes['\o/'] + 200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + # Informational. + 100: ("continue",), + 101: ("switching_protocols",), + 102: ("processing", "early-hints"), + 103: ("checkpoint",), + 122: ("uri_too_long", "request_uri_too_long"), + 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), + 201: ("created",), + 202: ("accepted",), + 203: ("non_authoritative_info", "non_authoritative_information"), + 204: ("no_content",), + 205: ("reset_content", "reset"), + 206: ("partial_content", "partial"), + 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), + 208: ("already_reported",), + 226: ("im_used",), + # Redirection. + 300: ("multiple_choices",), + 301: ("moved_permanently", "moved", "\\o-"), + 302: ("found",), + 303: ("see_other", "other"), + 304: ("not_modified",), + 305: ("use_proxy",), + 306: ("switch_proxy",), + 307: ("temporary_redirect", "temporary_moved", "temporary"), + 308: ( + "permanent_redirect", + "resume_incomplete", + "resume", + ), # "resume" and "resume_incomplete" to be removed in 3.0 + # Client Error. + 400: ("bad_request", "bad"), + 401: ("unauthorized",), + 402: ("payment_required", "payment"), + 403: ("forbidden",), + 404: ("not_found", "-o-"), + 405: ("method_not_allowed", "not_allowed"), + 406: ("not_acceptable",), + 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), + 408: ("request_timeout", "timeout"), + 409: ("conflict",), + 410: ("gone",), + 411: ("length_required",), + 412: ("precondition_failed", "precondition"), + 413: ("request_entity_too_large", "content_too_large"), + 414: ("request_uri_too_large", "uri_too_long"), + 415: ("unsupported_media_type", "unsupported_media", "media_type"), + 416: ( + "requested_range_not_satisfiable", + "requested_range", + "range_not_satisfiable", + ), + 417: ("expectation_failed",), + 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), + 421: ("misdirected_request",), + 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"), + 423: ("locked",), + 424: ("failed_dependency", "dependency"), + 425: ("unordered_collection", "unordered", "too_early"), + 426: ("upgrade_required", "upgrade"), + 428: ("precondition_required", "precondition"), + 429: ("too_many_requests", "too_many"), + 431: ("header_fields_too_large", "fields_too_large"), + 444: ("no_response", "none"), + 449: ("retry_with", "retry"), + 450: ("blocked_by_windows_parental_controls", "parental_controls"), + 451: ("unavailable_for_legal_reasons", "legal_reasons"), + 499: ("client_closed_request",), + # Server Error. + 500: ("internal_server_error", "server_error", "/o\\", "✗"), + 501: ("not_implemented",), + 502: ("bad_gateway",), + 503: ("service_unavailable", "unavailable"), + 504: ("gateway_timeout",), + 505: ("http_version_not_supported", "http_version"), + 506: ("variant_also_negotiates",), + 507: ("insufficient_storage",), + 509: ("bandwidth_limit_exceeded", "bandwidth"), + 510: ("not_extended",), + 511: ("network_authentication_required", "network_auth", "network_authentication"), +} + +codes = LookupDict(name="status_codes") + + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(("\\", "/")): + setattr(codes, title.upper(), code) + + def doc(code): + names = ", ".join(f"``{n}``" for n in _codes[code]) + return "* %d: %s" % (code, names) + + global __doc__ + __doc__ = ( + __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) + if __doc__ is not None + else None + ) + + +_init() diff --git a/env/lib/python3.12/site-packages/requests/structures.py b/env/lib/python3.12/site-packages/requests/structures.py new file mode 100644 index 0000000..188e13e --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/structures.py @@ -0,0 +1,99 @@ +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from collections import OrderedDict + +from .compat import Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super().__init__() + + def __repr__(self): + return f"" + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/env/lib/python3.12/site-packages/requests/utils.py b/env/lib/python3.12/site-packages/requests/utils.py new file mode 100644 index 0000000..ae6c42f --- /dev/null +++ b/env/lib/python3.12/site-packages/requests/utils.py @@ -0,0 +1,1096 @@ +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile +from collections import OrderedDict + +from urllib3.util import make_headers, parse_url + +from . import certs +from .__version__ import __version__ + +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import ( # noqa: F401 + _HEADER_VALIDATORS_BYTE, + _HEADER_VALIDATORS_STR, + HEADER_VALIDATORS, + to_native_string, +) +from .compat import ( + Mapping, + basestring, + bytes, + getproxies, + getproxies_environment, + integer_types, +) +from .compat import parse_http_list as _parse_list_header +from .compat import ( + proxy_bypass, + proxy_bypass_environment, + quote, + str, + unquote, + urlparse, + urlunparse, +) +from .cookies import cookiejar_from_dict +from .exceptions import ( + FileModeWarning, + InvalidHeader, + InvalidURL, + UnrewindableBodyError, +) +from .structures import CaseInsensitiveDict + +NETRC_FILES = (".netrc", "_netrc") + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {"http": 80, "https": 443} + +# Ensure that ', ' is used to preserve previous delimiter behavior. +DEFAULT_ACCEPT_ENCODING = ", ".join( + re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) +) + + +if sys.platform == "win32": + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + import winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey( + winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", + ) + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] + except (OSError, ValueError): + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(";") + # filter out empty strings to avoid re.match return true in the following code. + proxyOverride = filter(None, proxyOverride) + # now check if we match one of the registry values. + for test in proxyOverride: + if test == "": + if "." not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, "items"): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if isinstance(o, str): + o = o.encode("utf-8") + + if hasattr(o, "__len__"): + total_length = len(o) + + elif hasattr(o, "len"): + total_length = o.len + + elif hasattr(o, "fileno"): + try: + fileno = o.fileno() + except (io.UnsupportedOperation, AttributeError): + # AttributeError is a surprising exception, seeing as how we've just checked + # that `hasattr(o, 'fileno')`. It happens for objects obtained via + # `Tarfile.extractfile()`, per issue 5229. + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if "b" not in o.mode: + warnings.warn( + ( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode." + ), + FileModeWarning, + ) + + if hasattr(o, "tell"): + try: + current_position = o.tell() + except OSError: + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, "seek") and total_length is None: + # StringIO and BytesIO have seek but no usable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except OSError: + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + netrc_file = os.environ.get("NETRC") + if netrc_file is not None: + netrc_locations = (netrc_file,) + else: + netrc_locations = (f"~/{f}" for f in NETRC_FILES) + + try: + from netrc import NetrcParseError, netrc + + netrc_path = None + + for f in netrc_locations: + try: + loc = os.path.expanduser(f) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/psf/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b":" + if isinstance(url, str): + splitstr = splitstr.decode("ascii") + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = 0 if _netrc[0] else 1 + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, OSError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # App Engine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, "name", None) + if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + if not prefix: + # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), + # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users + break + member = "/".join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, member.split("/")[-1]) + if not os.path.exists(extracted_path): + # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition + with atomic_open(extracted_path) as file_handler: + file_handler.write(zip_file.read(member)) + return extracted_path + + +@contextlib.contextmanager +def atomic_open(filename): + """Write a file to the disk in an atomic fashion""" + tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) + try: + with os.fdopen(tmp_descriptor, "wb") as tmp_handler: + yield tmp_handler + os.replace(tmp_name, filename) + except BaseException: + os.remove(tmp_name) + raise + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + Traceback (most recent call last): + ... + ValueError: cannot encode objects that are not 2-tuples + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError("cannot encode objects that are not 2-tuples") + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {cookie.name: cookie.value for cookie in cj} + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn( + ( + "In requests 3.0, get_encodings_from_content will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return ( + charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content) + ) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(";") + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1 :].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get("content-type") + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if "charset" in params: + return params["charset"].strip("'\"") + + if "text" in content_type: + return "ISO-8859-1" + + if "application/json" in content_type: + # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset + return "utf-8" + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes an iterator.""" + + if r.encoding is None: + yield from iterator + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b"", final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos : pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn( + ( + "In requests 3.0, get_unicode_from_response will be removed. For " + "more information, please see the discussion on issue #2266. (This" + " warning should only appear once.)" + ), + DeprecationWarning, + ) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors="replace") + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" +) + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split("%") + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = f"%{parts[i]}" + else: + parts[i] = f"%{parts[i]}" + return "".join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] + netaddr, bits = net.split("/") + netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack(">I", bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except OSError: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count("/") == 1: + try: + mask = int(string_network.split("/")[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split("/")[0]) + except OSError: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + def get_proxy(key): + return os.environ.get(key) or os.environ.get(key.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy("no_proxy") + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += f":{parsed.port}" + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ("no_proxy", no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get("all")) + + proxy_keys = [ + urlparts.scheme + "://" + urlparts.hostname, + urlparts.scheme, + "all://" + urlparts.hostname, + "all", + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def resolve_proxies(request, proxies, trust_env=True): + """This method takes proxy information from a request and configuration + input to resolve a mapping of target proxies. This will consider settings + such as NO_PROXY to strip proxy configurations. + + :param request: Request or PreparedRequest + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + :param trust_env: Boolean declaring whether to trust environment configs + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + url = request.url + scheme = urlparse(url).scheme + no_proxy = proxies.get("no_proxy") + new_proxies = proxies.copy() + + if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get("all")) + + if proxy: + new_proxies.setdefault(scheme, proxy) + return new_proxies + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return f"{name}/{__version__}" + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict( + { + "User-Agent": default_user_agent(), + "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, + "Accept": "*/*", + "Connection": "keep-alive", + } + ) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = " '\"" + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, "" + + link = {"url": url.strip("<> '\"")} + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return "utf-32" # BOM included + if sample[:3] == codecs.BOM_UTF8: + return "utf-8-sig" # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return "utf-16" # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return "utf-8" + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return "utf-16-be" + if sample[1::2] == _null2: # 2nd and 4th are null + return "utf-16-le" + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return "utf-32-be" + if sample[1:] == _null3: + return "utf-32-le" + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + parsed = parse_url(url) + scheme, auth, host, port, path, query, fragment = parsed + + # A defect in urlparse determines that there isn't a netloc present in some + # urls. We previously assumed parsing was overly cautious, and swapped the + # netloc and path. Due to a lack of tests on the original defect, this is + # maintained with parse_url for backwards compatibility. + netloc = parsed.netloc + if not netloc: + netloc, path = path, netloc + + if auth: + # parse_url doesn't provide the netloc with auth + # so we'll add it ourselves. + netloc = "@".join([auth, netloc]) + if scheme is None: + scheme = new_scheme + if path is None: + path = "" + + return urlunparse((scheme, netloc, path, "", query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ("", "") + + return auth + + +def check_header_validity(header): + """Verifies that header parts don't contain leading whitespace + reserved characters, or return characters. + + :param header: tuple, in the format (name, value). + """ + name, value = header + _validate_header_part(header, name, 0) + _validate_header_part(header, value, 1) + + +def _validate_header_part(header, header_part, header_validator_index): + if isinstance(header_part, str): + validator = _HEADER_VALIDATORS_STR[header_validator_index] + elif isinstance(header_part, bytes): + validator = _HEADER_VALIDATORS_BYTE[header_validator_index] + else: + raise InvalidHeader( + f"Header part ({header_part!r}) from {header} " + f"must be of type str or bytes, not {type(header_part)}" + ) + + if not validator.match(header_part): + header_kind = "name" if header_validator_index == 0 else "value" + raise InvalidHeader( + f"Invalid leading whitespace, reserved character(s), or return " + f"character(s) in header {header_kind}: {header_part!r}" + ) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit("@", 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, "")) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, "seek", None) + if body_seek is not None and isinstance( + prepared_request._body_position, integer_types + ): + try: + body_seek(prepared_request._body_position) + except OSError: + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect." + ) + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/INSTALLER b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/LICENSE b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/LICENSE new file mode 100755 index 0000000..2cb588d --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Software Freedom Conservancy (SFC) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/METADATA b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/METADATA new file mode 100755 index 0000000..04d0338 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/METADATA @@ -0,0 +1,181 @@ +Metadata-Version: 2.1 +Name: selenium +Home-page: https://www.selenium.dev +License: Apache 2.0 +Description-Content-Type: text/x-rst +Summary: Official Python bindings for Selenium WebDriver +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: POSIX +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: Libraries +Classifier: Programming Language :: Python +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 +Requires-Python: >=3.8 +Requires-Dist: urllib3[socks]>=1.26,<3 +Requires-Dist: trio~=0.17 +Requires-Dist: trio-websocket~=0.9 +Requires-Dist: certifi>=2021.10.8 +Requires-Dist: typing_extensions~=4.9 +Requires-Dist: websocket-client~=1.8 +Version: 4.27.1 + +====================== +Selenium Client Driver +====================== + +Introduction +============ + +Python language bindings for Selenium WebDriver. + +The `selenium` package is used to automate web browser interaction from Python. + ++-----------------+--------------------------------------------------------------------------------------+ +| **Home**: | https://selenium.dev | ++-----------------+--------------------------------------------------------------------------------------+ +| **GitHub**: | https://github.com/SeleniumHQ/Selenium | ++-----------------+--------------------------------------------------------------------------------------+ +| **PyPI**: | https://pypi.org/project/selenium/ | ++-----------------+--------------------------------------------------------------------------------------+ +| **IRC/Slack**: | `Selenium chat room `_ | ++-----------------+--------------------------------------------------------------------------------------+ + +Several browsers/drivers are supported (Firefox, Chrome, Internet Explorer), as well as the Remote protocol. + +Supported Python Versions +========================= + +* Python 3.8+ + +Installing +========== + +If you have `pip `_ on your system, you can simply install or upgrade the Python bindings:: + + pip install -U selenium + +Alternately, you can download the source distribution from `PyPI `, unarchive it, and run:: + + python setup.py install + +Note: You may want to consider using `virtualenv `_ to create isolated Python environments. + +Drivers +======= + +Selenium requires a driver to interface with the chosen browser. Firefox, +for example, requires `geckodriver `_, which needs to be installed before the below examples can be run. Make sure it's in your `PATH`, e. g., place it in `/usr/bin` or `/usr/local/bin`. + +Failure to observe this step will give you an error `selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.` + +Other supported browsers will have their own drivers available. Links to some of the more popular browser drivers follow. + ++--------------+-----------------------------------------------------------------------+ +| **Chrome**: | https://chromedriver.chromium.org/downloads | ++--------------+-----------------------------------------------------------------------+ +| **Edge**: | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ | ++--------------+-----------------------------------------------------------------------+ +| **Firefox**: | https://github.com/mozilla/geckodriver/releases | ++--------------+-----------------------------------------------------------------------+ +| **Safari**: | https://webkit.org/blog/6900/webdriver-support-in-safari-10/ | ++--------------+-----------------------------------------------------------------------+ + +Example 0: +========== + +* open a new Firefox browser +* load the page at the given URL + +.. code-block:: python + + from selenium import webdriver + + browser = webdriver.Firefox() + browser.get('http://selenium.dev/') + +Example 1: +========== + +* open a new Firefox browser +* load the Yahoo homepage +* search for "seleniumhq" +* close the browser + +.. code-block:: python + + from selenium import webdriver + from selenium.webdriver.common.by import By + from selenium.webdriver.common.keys import Keys + + browser = webdriver.Firefox() + + browser.get('http://www.yahoo.com') + assert 'Yahoo' in browser.title + + elem = browser.find_element(By.NAME, 'p') # Find the search box + elem.send_keys('seleniumhq' + Keys.RETURN) + + browser.quit() + +Example 2: +========== + +Selenium WebDriver is often used as a basis for testing web applications. Here is a simple example using Python's standard `unittest `_ library: + +.. code-block:: python + + import unittest + from selenium import webdriver + + class GoogleTestCase(unittest.TestCase): + + def setUp(self): + self.browser = webdriver.Firefox() + self.addCleanup(self.browser.quit) + + def test_page_title(self): + self.browser.get('http://www.google.com') + self.assertIn('Google', self.browser.title) + + if __name__ == '__main__': + unittest.main(verbosity=2) + +Selenium Grid (optional) +========================== + +For local Selenium scripts, the Java server is not needed. + +To use Selenium remotely, you need to also run the Selenium grid. +For information on running Selenium Grid: https://www.selenium.dev/documentation/grid/getting_started/ + +To use Remote WebDriver see: https://www.selenium.dev/documentation/webdriver/drivers/remote_webdriver/?tab=python + +Use The Source Luke! +==================== + +View source code online: + ++-----------+------------------------------------------------------+ +| Official: | https://github.com/SeleniumHQ/selenium/tree/trunk/py | ++-----------+------------------------------------------------------+ + +Contributing +============= + + - Create a branch for your work + - Ensure `tox` is installed (using a `virtualenv` is recommended) + - `python3.8 -m venv .venv && . .venv/bin/activate && pip install tox` + - After making changes, before committing execute `tox -e linting` + - If tox exits `0`, commit and push otherwise fix the newly introduced breakages. + - `flake8` requires manual fixes + - `black` will often rewrite the breakages automatically, however the files are unstaged and should staged again. + - `isort` will often rewrite the breakages automatically, however the files are unstaged and should staged again. + diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/RECORD b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/RECORD new file mode 100644 index 0000000..22f7d5b --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/RECORD @@ -0,0 +1,663 @@ +selenium-4.27.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +selenium-4.27.1.dist-info/LICENSE,sha256=3mWKfTdh6StHHi9jDqme6zOJsngggJseSFO6q9X7rbc,11365 +selenium-4.27.1.dist-info/METADATA,sha256=e_j2TWI_4C1kNDn6emNKs1fHwmTarcKX5DffGGuvQaw,7099 +selenium-4.27.1.dist-info/RECORD,, +selenium-4.27.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium-4.27.1.dist-info/WHEEL,sha256=sobxWSyDDkdg_rinUth-jxhXHqoNqlmNMJY3aTZn2Us,91 +selenium/__init__.py,sha256=FVs0MXyPquPiVdflucxGjKYEji3usO8DDGIOh2IYIlU,812 +selenium/__pycache__/__init__.cpython-312.pyc,, +selenium/__pycache__/types.cpython-312.pyc,, +selenium/common/__init__.py,sha256=ImcFc_5p778d3uOCFe-ZWBxOioZN0QaPtTfVajcz26c,3627 +selenium/common/__pycache__/__init__.cpython-312.pyc,, +selenium/common/__pycache__/exceptions.cpython-312.pyc,, +selenium/common/exceptions.py,sha256=b8oYxPw9YymgB-CHG6c_9_T7jOUCMV_2bg61BGat0qc,10314 +selenium/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium/types.py,sha256=cgG9KArEyRUVnhB1ECoxoaaJdat1_WUA96COmGz4-bs,1014 +selenium/webdriver/__init__.py,sha256=GTS_R5oexrp2G-JJPuZh4bPJAeTG7wR-Rn0X8Ztv8Tk,3067 +selenium/webdriver/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/chrome/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/chrome/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/chrome/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/chrome/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/chrome/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/chrome/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/chrome/options.py,sha256=vlc8L7uc-wG1f6YwpdCy_0KyRrWYADZYAUijpuaQxaY,1390 +selenium/webdriver/chrome/remote_connection.py,sha256=dstZvGL53I15JaADdrlCxaL23vHAwTyx5O5cGdZrYaY,1647 +selenium/webdriver/chrome/service.py,sha256=jbiDhALLvw6hE6VnYjKCVKl0cbTWWrrn5s42czcuBeg,2091 +selenium/webdriver/chrome/webdriver.py,sha256=QcvDPWePFQNaHPLkgpmiIB8tBTJOxMtrtertIeFdSk0,1996 +selenium/webdriver/chromium/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/chromium/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/chromium/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/chromium/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/chromium/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/chromium/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/chromium/options.py,sha256=XwmPWgKenOFai1rfmTtQdbckKNMyamNEKSptVnOS9yM,5711 +selenium/webdriver/chromium/remote_connection.py,sha256=hLK9ymrKXBEn5dFga1EFb_GQlsu2cgUhalo47HC_AU0,2991 +selenium/webdriver/chromium/service.py,sha256=QKP5sZb9CFIdFYwuWpdEm9SRhKnEcR7uh8BfIK7rWik,2703 +selenium/webdriver/chromium/webdriver.py,sha256=u_wmfnnJ7q3i_H3vPIkkOEBt6uOZ1HGDLuT2ubylB20,7374 +selenium/webdriver/common/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/common/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/action_chains.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/alert.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/by.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/desired_capabilities.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/driver_finder.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/keys.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/log.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/print_page_options.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/proxy.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/selenium_manager.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/timeouts.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/utils.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/virtual_authenticator.cpython-312.pyc,, +selenium/webdriver/common/__pycache__/window.cpython-312.pyc,, +selenium/webdriver/common/action_chains.py,sha256=j2z_vQW9ralNjlNDfOTHErm_YRCLCVb-PkNDmYtMoCc,13643 +selenium/webdriver/common/actions/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/common/actions/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/action_builder.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/input_device.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/interaction.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/key_actions.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/key_input.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/mouse_button.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/pointer_actions.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/pointer_input.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/wheel_actions.cpython-312.pyc,, +selenium/webdriver/common/actions/__pycache__/wheel_input.cpython-312.pyc,, +selenium/webdriver/common/actions/action_builder.py,sha256=BC-D3IF16EBtFw84amxku2vVipFcOue6e0DI3KcjF5c,3689 +selenium/webdriver/common/actions/input_device.py,sha256=pg-6A4FywCqt-TnjUhgy39nenEuwtDvYBW5aVJmE2OY,1325 +selenium/webdriver/common/actions/interaction.py,sha256=Sk_3QFTqNgNnbQyLN9vPLeuSZhFof5z_xxIa1GDnXkY,1464 +selenium/webdriver/common/actions/key_actions.py,sha256=bZYH_3p5xQHZHlbiVglZ-2LYIY_Fw4BctU9wKyoUgTI,2007 +selenium/webdriver/common/actions/key_input.py,sha256=95sbk35MqCJERM-Y5cbET246em-K05U1pSH7EQzAeQo,1809 +selenium/webdriver/common/actions/mouse_button.py,sha256=_WK2Cu0kf_D2XCPeGWph3QDQi583xoV_QIVi3G-YAdc,879 +selenium/webdriver/common/actions/pointer_actions.py,sha256=CjaAdvR5VBnMrP3WyHaOAsPjYamonZuiPbzzeY6zJ4g,6007 +selenium/webdriver/common/actions/pointer_input.py,sha256=sbWoWjp3nzdGzqBEQbkp4-uw3Tpg93KwA0qVfZ5YK-A,3023 +selenium/webdriver/common/actions/wheel_actions.py,sha256=B-pb7Nzo4fFLmyvvabyxiUEgELcJaCjiBzAT6zdVjCA,1331 +selenium/webdriver/common/actions/wheel_input.py,sha256=bXIDdOwY_DgSN0kY67sfjCSCobIJMJ1dSSHfDFUsFZQ,2626 +selenium/webdriver/common/alert.py,sha256=-TUxvlrhqg9hhidKmjlBakVSO-VWmuSvdhVJgta97QE,2581 +selenium/webdriver/common/bidi/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/common/bidi/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/bidi/__pycache__/cdp.cpython-312.pyc,, +selenium/webdriver/common/bidi/__pycache__/console.cpython-312.pyc,, +selenium/webdriver/common/bidi/__pycache__/script.cpython-312.pyc,, +selenium/webdriver/common/bidi/__pycache__/session.cpython-312.pyc,, +selenium/webdriver/common/bidi/cdp.py,sha256=d9AQpqFS74tKQGhTqInJoDY9PL-7M2zvIu8CdgpLDJ4,18618 +selenium/webdriver/common/bidi/console.py,sha256=IEKJdeyGEvZbPzIVToBpNzQi1eUSSnteQbm5rQ7jUds,885 +selenium/webdriver/common/bidi/script.py,sha256=-6Xss6hwtwJyExcd8Khw8TtaIiMC8LFjNdXCmrjLotE,3402 +selenium/webdriver/common/bidi/session.py,sha256=UHS2opP4mFeRrN6VfgQHoFWBSO9fuoPAKuVib50H5fA,1547 +selenium/webdriver/common/by.py,sha256=3cTBcT6rUMbI08qp4CTFZEo-lctmIZG2a8C0k-8zFHQ,1713 +selenium/webdriver/common/desired_capabilities.py,sha256=-zgiJmRhINyhdKEQQKnANHcK5CMS0T2u3ssLZqQr0xg,2824 +selenium/webdriver/common/devtools/v129/__init__.py,sha256=OvoHtEFKpnyCzlIZwF5vA9SGNv6cqObCWd06yMb_ngE,1490 +selenium/webdriver/common/devtools/v129/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/accessibility.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/animation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/audits.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/autofill.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/background_service.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/bluetooth_emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/browser.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/cache_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/cast.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/console.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/css.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/database.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/device_access.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/device_orientation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/dom.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/dom_debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/dom_snapshot.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/dom_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/event_breakpoints.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/extensions.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/fed_cm.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/fetch.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/file_system.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/headless_experimental.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/heap_profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/indexed_db.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/input_.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/inspector.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/io.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/layer_tree.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/log.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/media.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/memory.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/network.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/overlay.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/page.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/performance.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/performance_timeline.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/preload.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/pwa.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/runtime.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/schema.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/security.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/service_worker.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/system_info.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/target.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/tethering.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/tracing.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/util.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/web_audio.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/__pycache__/web_authn.cpython-312.pyc,, +selenium/webdriver/common/devtools/v129/accessibility.py,sha256=BwF6mMlwr7ZVz2oFmW5r0YvHZksflnTg1HyeSIRUHBY,22220 +selenium/webdriver/common/devtools/v129/animation.py,sha256=hyN4onIADXQeaPR13JnIku45JgUKMREDa38kpN1JRHU,14039 +selenium/webdriver/common/devtools/v129/audits.py,sha256=g15987zE0WLjDh43bGPxMVt57LoSSteEn7OG95zv5Tk,58601 +selenium/webdriver/common/devtools/v129/autofill.py,sha256=WAAFEYsPGFbB2BSribpx-fBd9ujqL8-3uuooydcKyGM,7712 +selenium/webdriver/common/devtools/v129/background_service.py,sha256=4Ix-qeZMkqLtIV6aMWKVStpDBifx3SuUz0Lgdpj1C1c,5919 +selenium/webdriver/common/devtools/v129/bluetooth_emulation.py,sha256=wb-lweDxDMErDz1y3iRD3NMdntUrSpGw5W2IlpW0Yww,5559 +selenium/webdriver/common/devtools/v129/browser.py,sha256=R2fpU2hKa3fk9U5j_hnsuMWhEn7PAfbDGe6Nhj0xg2w,21814 +selenium/webdriver/common/devtools/v129/cache_storage.py,sha256=cWETSBf5bBc5LQSTSf0jl-h84r2GUnyRHHrn1BwdSsg,8924 +selenium/webdriver/common/devtools/v129/cast.py,sha256=32wNaJwk_0S5X-UdjazzLauMyXx6JPkyJHUdsxm8scs,4382 +selenium/webdriver/common/devtools/v129/console.py,sha256=_mGKNlgtple6r9rJ_GxEfhkoQsMT7D1V6IeF_lAOBJ4,2765 +selenium/webdriver/common/devtools/v129/css.py,sha256=3m09X-IpjdOQpQKJAnsSd36EMelLda8oYbINthxSx5E,72083 +selenium/webdriver/common/devtools/v129/database.py,sha256=ucK8g37lBtFgYWgzM5go6YJxQcQ2sTqPy9T2wymGxrA,3925 +selenium/webdriver/common/devtools/v129/debugger.py,sha256=txsxG3KOEHK_AFExTfy85Yr-2bLUDOi4nq-vVy-dDCY,49279 +selenium/webdriver/common/devtools/v129/device_access.py,sha256=X_JYLORqfh2iHHv-3OkFjQS9XM25kIcEOPdkxoxoVfk,3322 +selenium/webdriver/common/devtools/v129/device_orientation.py,sha256=iTyh5DWm7zRYzmq6VBe3_XakjFCC8kuuXc_NVIeNb2k,1209 +selenium/webdriver/common/devtools/v129/dom.py,sha256=jIdiOdcO0udNnPoImzIAy3-ixcskEzFXIcVouxnzPEs,65078 +selenium/webdriver/common/devtools/v129/dom_debugger.py,sha256=HgKs0cpnWhtViWsPQt6tBBsHsdkLQbh2hizyFtyqRFc,9459 +selenium/webdriver/common/devtools/v129/dom_snapshot.py,sha256=vQc7m2npPm9mrQqSDZWD0NrQY_NVuUWjxW1y2LI-OjE,36732 +selenium/webdriver/common/devtools/v129/dom_storage.py,sha256=5BqIxbqu_wCmiZ3tX59AxgbGuBKY6TX_RCT7you5lTs,5765 +selenium/webdriver/common/devtools/v129/emulation.py,sha256=0fBYszw1AG8aoG_aot3ccWkh1S_MnOSsoUbmrYVoSc8,35931 +selenium/webdriver/common/devtools/v129/event_breakpoints.py,sha256=BNNI7S2SdeIZ6IU_YpYoQvOwn5IX_XgvmzASFJ0yQqA,1508 +selenium/webdriver/common/devtools/v129/extensions.py,sha256=14vQPro751u2pOUtmwCU4b5ysAQIEcXPeKW3hCnB_yY,4096 +selenium/webdriver/common/devtools/v129/fed_cm.py,sha256=C4cVyuDYV8xlfBii7ln4N5wf7PTZYGJOs6LkoAFwfes,7596 +selenium/webdriver/common/devtools/v129/fetch.py,sha256=15U7tUDKlYHcbUa0wlz-JM_Gm3AnYYNe2oelk5Nk1t4,19735 +selenium/webdriver/common/devtools/v129/file_system.py,sha256=d3mu2bEdJMB56OEYkKGZegLzL_DPPs5MIqR6wx0Mfqw,3301 +selenium/webdriver/common/devtools/v129/headless_experimental.py,sha256=G40hBg9UST-Zam8ElqQIPblYGCEw9mFFovBOz670_3w,4585 +selenium/webdriver/common/devtools/v129/heap_profiler.py,sha256=aIwDFmpOFbqcVZShmArCQ_MDqrsb9j5R6CJJ4XUQPcM,13806 +selenium/webdriver/common/devtools/v129/indexed_db.py,sha256=QiIws7G5Hw4P4vXqB5P-UOFYZ1MR-I_LlPSQUfSOkC4,17177 +selenium/webdriver/common/devtools/v129/input_.py,sha256=CQwpMsWUTbWDHddlRXZY7NxO37B1IijLDbjAvvQqgHY,28055 +selenium/webdriver/common/devtools/v129/inspector.py,sha256=oroH9p3tWRYh5poAM48tUmAU4_V8mJBXCGGjQt9ATOY,1718 +selenium/webdriver/common/devtools/v129/io.py,sha256=BqRrJAvYzyfv49itw58s3ra0C23rTrQxVp3yyFL4S6A,3024 +selenium/webdriver/common/devtools/v129/layer_tree.py,sha256=WxQsHVK6ltBJXK6WDpZovrP8sqPqms3AerK1mPVcsY8,15048 +selenium/webdriver/common/devtools/v129/log.py,sha256=kBm2ACgcTbC5T6nGROJnMfofA9zjLtO9K2hUwFywqS0,5264 +selenium/webdriver/common/devtools/v129/media.py,sha256=Mmj2eFGMZMLcPrv_Mi-MgRJHe6mpFAa-GdMXdILFrd8,7627 +selenium/webdriver/common/devtools/v129/memory.py,sha256=KdyZgvqzFAtKmHRxcDihqpZnRvRTsk0VQK8L5dGKc7A,6808 +selenium/webdriver/common/devtools/v129/network.py,sha256=NPK66RlAMYYM8FVarL2U8Ybk8qoOaUYlLAYD9VdFCvU,138879 +selenium/webdriver/common/devtools/v129/overlay.py,sha256=Daj5yOQpHv7il3JBXntpUtg5d3efX7x9YrZStdq-TcU,51752 +selenium/webdriver/common/devtools/v129/page.py,sha256=iQnolqFIvronmhfyB3v5brdEV_Kbnaj4HcZ6G-ojJeg,122517 +selenium/webdriver/common/devtools/v129/performance.py,sha256=473SXp3oVXk295P4aiYuoB-wkm0VPgOGHrl7ZedfCo0,2927 +selenium/webdriver/common/devtools/v129/performance_timeline.py,sha256=lJ3njDjqjHXSJkfgR0q5HA5C_i1U5hmMjU5MEkgVhMw,6623 +selenium/webdriver/common/devtools/v129/preload.py,sha256=Jfh6bqR4P5vxVy7j5_hLy3VtWXFJgkDapjrPUri-fA0,20458 +selenium/webdriver/common/devtools/v129/profiler.py,sha256=OkKwr7UAy0V23jvsrQTkspNlpHkH4XbzGgyEbDPuV3I,12930 +selenium/webdriver/common/devtools/v129/pwa.py,sha256=9PmOs-JAU0x1HWSV3WxKZqPUJ5G9m-I3FeRRg_Y92pY,8904 +selenium/webdriver/common/devtools/v129/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium/webdriver/common/devtools/v129/runtime.py,sha256=kpyDIK5y20261yJk8vImrv189ANXJGX7zaFQnq_jSnE,60520 +selenium/webdriver/common/devtools/v129/schema.py,sha256=fbNSqooayAk-upeq4OoLeWfgLYudVhFoZPEhQ7OKJdw,1111 +selenium/webdriver/common/devtools/v129/security.py,sha256=dM11pi7OGh_fwq_bVEerC_ocQ6f_jx1luiL9A05i9nM,16839 +selenium/webdriver/common/devtools/v129/service_worker.py,sha256=9VutRa-kch4bfZU2fFmXa8xJqGDdFdBuHzplV_uJ4ts,11293 +selenium/webdriver/common/devtools/v129/storage.py,sha256=2zvkd4lLGJsFtTZONSpBFkGxhy8gP76TDYgEB8_vKEs,63403 +selenium/webdriver/common/devtools/v129/system_info.py,sha256=iW2gZCSxJ1-idEsBWsE0grqJv9YuhyHhuMcXpXYtOV0,11517 +selenium/webdriver/common/devtools/v129/target.py,sha256=4Jh-D17hDZLaHN-hWaBVPHbyKHYe20UxpnBGUFVSRqU,24281 +selenium/webdriver/common/devtools/v129/tethering.py,sha256=brZK0Ex_pp1RZI-6m3BgoruXDOC_wkNpOH-S50-Dbso,1538 +selenium/webdriver/common/devtools/v129/tracing.py,sha256=gY2KfAGpe0CeuKUHDvBWQU0psvuYyawPprOMBL6ihVI,13112 +selenium/webdriver/common/devtools/v129/util.py,sha256=a3Pz9LfPjx8wHoajAidPYus0odra60syc7cOWWC9RTU,488 +selenium/webdriver/common/devtools/v129/web_audio.py,sha256=AZt0TNgQXBWGf5ep4by_o9ChKLxL7Cw9LRu9TP-qn4w,16895 +selenium/webdriver/common/devtools/v129/web_authn.py,sha256=NYcdz_ZHiEYqYhhSVUpvSbtwUcrEBKgRQtvBmWkQQ2k,18353 +selenium/webdriver/common/devtools/v130/__init__.py,sha256=OvoHtEFKpnyCzlIZwF5vA9SGNv6cqObCWd06yMb_ngE,1490 +selenium/webdriver/common/devtools/v130/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/accessibility.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/animation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/audits.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/autofill.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/background_service.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/bluetooth_emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/browser.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/cache_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/cast.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/console.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/css.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/database.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/device_access.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/device_orientation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/dom.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/dom_debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/dom_snapshot.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/dom_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/event_breakpoints.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/extensions.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/fed_cm.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/fetch.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/file_system.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/headless_experimental.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/heap_profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/indexed_db.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/input_.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/inspector.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/io.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/layer_tree.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/log.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/media.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/memory.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/network.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/overlay.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/page.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/performance.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/performance_timeline.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/preload.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/pwa.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/runtime.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/schema.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/security.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/service_worker.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/system_info.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/target.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/tethering.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/tracing.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/util.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/web_audio.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/__pycache__/web_authn.cpython-312.pyc,, +selenium/webdriver/common/devtools/v130/accessibility.py,sha256=BwF6mMlwr7ZVz2oFmW5r0YvHZksflnTg1HyeSIRUHBY,22220 +selenium/webdriver/common/devtools/v130/animation.py,sha256=hyN4onIADXQeaPR13JnIku45JgUKMREDa38kpN1JRHU,14039 +selenium/webdriver/common/devtools/v130/audits.py,sha256=zZlSj0tLxAn6MCAUYCP_cxgxrQaJtdmN9WOlTSnUovw,58702 +selenium/webdriver/common/devtools/v130/autofill.py,sha256=WAAFEYsPGFbB2BSribpx-fBd9ujqL8-3uuooydcKyGM,7712 +selenium/webdriver/common/devtools/v130/background_service.py,sha256=4Ix-qeZMkqLtIV6aMWKVStpDBifx3SuUz0Lgdpj1C1c,5919 +selenium/webdriver/common/devtools/v130/bluetooth_emulation.py,sha256=wb-lweDxDMErDz1y3iRD3NMdntUrSpGw5W2IlpW0Yww,5559 +selenium/webdriver/common/devtools/v130/browser.py,sha256=KnqunBWR4drwQQs8ORgZ3I1oYhp1kJBNWdxv_lFFJUk,21862 +selenium/webdriver/common/devtools/v130/cache_storage.py,sha256=cWETSBf5bBc5LQSTSf0jl-h84r2GUnyRHHrn1BwdSsg,8924 +selenium/webdriver/common/devtools/v130/cast.py,sha256=32wNaJwk_0S5X-UdjazzLauMyXx6JPkyJHUdsxm8scs,4382 +selenium/webdriver/common/devtools/v130/console.py,sha256=_mGKNlgtple6r9rJ_GxEfhkoQsMT7D1V6IeF_lAOBJ4,2765 +selenium/webdriver/common/devtools/v130/css.py,sha256=3m09X-IpjdOQpQKJAnsSd36EMelLda8oYbINthxSx5E,72083 +selenium/webdriver/common/devtools/v130/database.py,sha256=ucK8g37lBtFgYWgzM5go6YJxQcQ2sTqPy9T2wymGxrA,3925 +selenium/webdriver/common/devtools/v130/debugger.py,sha256=txsxG3KOEHK_AFExTfy85Yr-2bLUDOi4nq-vVy-dDCY,49279 +selenium/webdriver/common/devtools/v130/device_access.py,sha256=X_JYLORqfh2iHHv-3OkFjQS9XM25kIcEOPdkxoxoVfk,3322 +selenium/webdriver/common/devtools/v130/device_orientation.py,sha256=iTyh5DWm7zRYzmq6VBe3_XakjFCC8kuuXc_NVIeNb2k,1209 +selenium/webdriver/common/devtools/v130/dom.py,sha256=soL3lASN8WO_beEdlku6EyJzpuOZAciRScQdmrbK0-s,66109 +selenium/webdriver/common/devtools/v130/dom_debugger.py,sha256=HgKs0cpnWhtViWsPQt6tBBsHsdkLQbh2hizyFtyqRFc,9459 +selenium/webdriver/common/devtools/v130/dom_snapshot.py,sha256=vQc7m2npPm9mrQqSDZWD0NrQY_NVuUWjxW1y2LI-OjE,36732 +selenium/webdriver/common/devtools/v130/dom_storage.py,sha256=5BqIxbqu_wCmiZ3tX59AxgbGuBKY6TX_RCT7you5lTs,5765 +selenium/webdriver/common/devtools/v130/emulation.py,sha256=0fBYszw1AG8aoG_aot3ccWkh1S_MnOSsoUbmrYVoSc8,35931 +selenium/webdriver/common/devtools/v130/event_breakpoints.py,sha256=BNNI7S2SdeIZ6IU_YpYoQvOwn5IX_XgvmzASFJ0yQqA,1508 +selenium/webdriver/common/devtools/v130/extensions.py,sha256=14vQPro751u2pOUtmwCU4b5ysAQIEcXPeKW3hCnB_yY,4096 +selenium/webdriver/common/devtools/v130/fed_cm.py,sha256=C4cVyuDYV8xlfBii7ln4N5wf7PTZYGJOs6LkoAFwfes,7596 +selenium/webdriver/common/devtools/v130/fetch.py,sha256=15U7tUDKlYHcbUa0wlz-JM_Gm3AnYYNe2oelk5Nk1t4,19735 +selenium/webdriver/common/devtools/v130/file_system.py,sha256=d3mu2bEdJMB56OEYkKGZegLzL_DPPs5MIqR6wx0Mfqw,3301 +selenium/webdriver/common/devtools/v130/headless_experimental.py,sha256=G40hBg9UST-Zam8ElqQIPblYGCEw9mFFovBOz670_3w,4585 +selenium/webdriver/common/devtools/v130/heap_profiler.py,sha256=aIwDFmpOFbqcVZShmArCQ_MDqrsb9j5R6CJJ4XUQPcM,13806 +selenium/webdriver/common/devtools/v130/indexed_db.py,sha256=QiIws7G5Hw4P4vXqB5P-UOFYZ1MR-I_LlPSQUfSOkC4,17177 +selenium/webdriver/common/devtools/v130/input_.py,sha256=CQwpMsWUTbWDHddlRXZY7NxO37B1IijLDbjAvvQqgHY,28055 +selenium/webdriver/common/devtools/v130/inspector.py,sha256=oroH9p3tWRYh5poAM48tUmAU4_V8mJBXCGGjQt9ATOY,1718 +selenium/webdriver/common/devtools/v130/io.py,sha256=BqRrJAvYzyfv49itw58s3ra0C23rTrQxVp3yyFL4S6A,3024 +selenium/webdriver/common/devtools/v130/layer_tree.py,sha256=WxQsHVK6ltBJXK6WDpZovrP8sqPqms3AerK1mPVcsY8,15048 +selenium/webdriver/common/devtools/v130/log.py,sha256=kBm2ACgcTbC5T6nGROJnMfofA9zjLtO9K2hUwFywqS0,5264 +selenium/webdriver/common/devtools/v130/media.py,sha256=Mmj2eFGMZMLcPrv_Mi-MgRJHe6mpFAa-GdMXdILFrd8,7627 +selenium/webdriver/common/devtools/v130/memory.py,sha256=Z-OTsrcF1zaBw6qiDdxFqK0QSGIw9Qz3KaP9IDgWKIk,8014 +selenium/webdriver/common/devtools/v130/network.py,sha256=ZFvmS-a5do1EGy8yYAYTTkEkFprDpgxc_92ALGU1vc4,138919 +selenium/webdriver/common/devtools/v130/overlay.py,sha256=Daj5yOQpHv7il3JBXntpUtg5d3efX7x9YrZStdq-TcU,51752 +selenium/webdriver/common/devtools/v130/page.py,sha256=blzH1pieNQy-JkzEpNci7rOEvWr7QFr762YvN9Rom2c,123194 +selenium/webdriver/common/devtools/v130/performance.py,sha256=473SXp3oVXk295P4aiYuoB-wkm0VPgOGHrl7ZedfCo0,2927 +selenium/webdriver/common/devtools/v130/performance_timeline.py,sha256=lJ3njDjqjHXSJkfgR0q5HA5C_i1U5hmMjU5MEkgVhMw,6623 +selenium/webdriver/common/devtools/v130/preload.py,sha256=_S_wUIaKFhhPK-qgazKsB6U6eFzxFP6qRoTq2ERHqjE,20375 +selenium/webdriver/common/devtools/v130/profiler.py,sha256=OkKwr7UAy0V23jvsrQTkspNlpHkH4XbzGgyEbDPuV3I,12930 +selenium/webdriver/common/devtools/v130/pwa.py,sha256=9PmOs-JAU0x1HWSV3WxKZqPUJ5G9m-I3FeRRg_Y92pY,8904 +selenium/webdriver/common/devtools/v130/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium/webdriver/common/devtools/v130/runtime.py,sha256=kpyDIK5y20261yJk8vImrv189ANXJGX7zaFQnq_jSnE,60520 +selenium/webdriver/common/devtools/v130/schema.py,sha256=fbNSqooayAk-upeq4OoLeWfgLYudVhFoZPEhQ7OKJdw,1111 +selenium/webdriver/common/devtools/v130/security.py,sha256=dM11pi7OGh_fwq_bVEerC_ocQ6f_jx1luiL9A05i9nM,16839 +selenium/webdriver/common/devtools/v130/service_worker.py,sha256=9VutRa-kch4bfZU2fFmXa8xJqGDdFdBuHzplV_uJ4ts,11293 +selenium/webdriver/common/devtools/v130/storage.py,sha256=eLpHoQ_iv3klNKbGFzdkzPrqVIzDFJRXxHbqDa_tauU,64598 +selenium/webdriver/common/devtools/v130/system_info.py,sha256=iW2gZCSxJ1-idEsBWsE0grqJv9YuhyHhuMcXpXYtOV0,11517 +selenium/webdriver/common/devtools/v130/target.py,sha256=4Jh-D17hDZLaHN-hWaBVPHbyKHYe20UxpnBGUFVSRqU,24281 +selenium/webdriver/common/devtools/v130/tethering.py,sha256=brZK0Ex_pp1RZI-6m3BgoruXDOC_wkNpOH-S50-Dbso,1538 +selenium/webdriver/common/devtools/v130/tracing.py,sha256=gY2KfAGpe0CeuKUHDvBWQU0psvuYyawPprOMBL6ihVI,13112 +selenium/webdriver/common/devtools/v130/util.py,sha256=a3Pz9LfPjx8wHoajAidPYus0odra60syc7cOWWC9RTU,488 +selenium/webdriver/common/devtools/v130/web_audio.py,sha256=AZt0TNgQXBWGf5ep4by_o9ChKLxL7Cw9LRu9TP-qn4w,16895 +selenium/webdriver/common/devtools/v130/web_authn.py,sha256=NYcdz_ZHiEYqYhhSVUpvSbtwUcrEBKgRQtvBmWkQQ2k,18353 +selenium/webdriver/common/devtools/v131/__init__.py,sha256=OvoHtEFKpnyCzlIZwF5vA9SGNv6cqObCWd06yMb_ngE,1490 +selenium/webdriver/common/devtools/v131/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/accessibility.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/animation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/audits.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/autofill.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/background_service.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/bluetooth_emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/browser.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/cache_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/cast.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/console.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/css.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/database.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/device_access.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/device_orientation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/dom.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/dom_debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/dom_snapshot.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/dom_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/event_breakpoints.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/extensions.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/fed_cm.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/fetch.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/file_system.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/headless_experimental.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/heap_profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/indexed_db.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/input_.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/inspector.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/io.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/layer_tree.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/log.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/media.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/memory.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/network.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/overlay.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/page.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/performance.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/performance_timeline.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/preload.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/pwa.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/runtime.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/schema.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/security.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/service_worker.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/system_info.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/target.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/tethering.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/tracing.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/util.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/web_audio.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/__pycache__/web_authn.cpython-312.pyc,, +selenium/webdriver/common/devtools/v131/accessibility.py,sha256=BwF6mMlwr7ZVz2oFmW5r0YvHZksflnTg1HyeSIRUHBY,22220 +selenium/webdriver/common/devtools/v131/animation.py,sha256=hyN4onIADXQeaPR13JnIku45JgUKMREDa38kpN1JRHU,14039 +selenium/webdriver/common/devtools/v131/audits.py,sha256=W8Z5Wo3Wr3QJRC9szEuM6yXMgRHVx3vRu1V3Dj7Olc0,58843 +selenium/webdriver/common/devtools/v131/autofill.py,sha256=WAAFEYsPGFbB2BSribpx-fBd9ujqL8-3uuooydcKyGM,7712 +selenium/webdriver/common/devtools/v131/background_service.py,sha256=4Ix-qeZMkqLtIV6aMWKVStpDBifx3SuUz0Lgdpj1C1c,5919 +selenium/webdriver/common/devtools/v131/bluetooth_emulation.py,sha256=wb-lweDxDMErDz1y3iRD3NMdntUrSpGw5W2IlpW0Yww,5559 +selenium/webdriver/common/devtools/v131/browser.py,sha256=KnqunBWR4drwQQs8ORgZ3I1oYhp1kJBNWdxv_lFFJUk,21862 +selenium/webdriver/common/devtools/v131/cache_storage.py,sha256=cWETSBf5bBc5LQSTSf0jl-h84r2GUnyRHHrn1BwdSsg,8924 +selenium/webdriver/common/devtools/v131/cast.py,sha256=32wNaJwk_0S5X-UdjazzLauMyXx6JPkyJHUdsxm8scs,4382 +selenium/webdriver/common/devtools/v131/console.py,sha256=_mGKNlgtple6r9rJ_GxEfhkoQsMT7D1V6IeF_lAOBJ4,2765 +selenium/webdriver/common/devtools/v131/css.py,sha256=3m09X-IpjdOQpQKJAnsSd36EMelLda8oYbINthxSx5E,72083 +selenium/webdriver/common/devtools/v131/database.py,sha256=ucK8g37lBtFgYWgzM5go6YJxQcQ2sTqPy9T2wymGxrA,3925 +selenium/webdriver/common/devtools/v131/debugger.py,sha256=6Mr-_lAfm1Cq7uaJ82Ao8awSiT0NSsNd1Mk25oxtLk8,50305 +selenium/webdriver/common/devtools/v131/device_access.py,sha256=X_JYLORqfh2iHHv-3OkFjQS9XM25kIcEOPdkxoxoVfk,3322 +selenium/webdriver/common/devtools/v131/device_orientation.py,sha256=iTyh5DWm7zRYzmq6VBe3_XakjFCC8kuuXc_NVIeNb2k,1209 +selenium/webdriver/common/devtools/v131/dom.py,sha256=soL3lASN8WO_beEdlku6EyJzpuOZAciRScQdmrbK0-s,66109 +selenium/webdriver/common/devtools/v131/dom_debugger.py,sha256=HgKs0cpnWhtViWsPQt6tBBsHsdkLQbh2hizyFtyqRFc,9459 +selenium/webdriver/common/devtools/v131/dom_snapshot.py,sha256=vQc7m2npPm9mrQqSDZWD0NrQY_NVuUWjxW1y2LI-OjE,36732 +selenium/webdriver/common/devtools/v131/dom_storage.py,sha256=5BqIxbqu_wCmiZ3tX59AxgbGuBKY6TX_RCT7you5lTs,5765 +selenium/webdriver/common/devtools/v131/emulation.py,sha256=6zIU2fzqOk1JI0TmpLiv7HXwttekmCiZdqOzc83yRos,35903 +selenium/webdriver/common/devtools/v131/event_breakpoints.py,sha256=BNNI7S2SdeIZ6IU_YpYoQvOwn5IX_XgvmzASFJ0yQqA,1508 +selenium/webdriver/common/devtools/v131/extensions.py,sha256=14vQPro751u2pOUtmwCU4b5ysAQIEcXPeKW3hCnB_yY,4096 +selenium/webdriver/common/devtools/v131/fed_cm.py,sha256=C4cVyuDYV8xlfBii7ln4N5wf7PTZYGJOs6LkoAFwfes,7596 +selenium/webdriver/common/devtools/v131/fetch.py,sha256=15U7tUDKlYHcbUa0wlz-JM_Gm3AnYYNe2oelk5Nk1t4,19735 +selenium/webdriver/common/devtools/v131/file_system.py,sha256=d3mu2bEdJMB56OEYkKGZegLzL_DPPs5MIqR6wx0Mfqw,3301 +selenium/webdriver/common/devtools/v131/headless_experimental.py,sha256=G40hBg9UST-Zam8ElqQIPblYGCEw9mFFovBOz670_3w,4585 +selenium/webdriver/common/devtools/v131/heap_profiler.py,sha256=aIwDFmpOFbqcVZShmArCQ_MDqrsb9j5R6CJJ4XUQPcM,13806 +selenium/webdriver/common/devtools/v131/indexed_db.py,sha256=QiIws7G5Hw4P4vXqB5P-UOFYZ1MR-I_LlPSQUfSOkC4,17177 +selenium/webdriver/common/devtools/v131/input_.py,sha256=CQwpMsWUTbWDHddlRXZY7NxO37B1IijLDbjAvvQqgHY,28055 +selenium/webdriver/common/devtools/v131/inspector.py,sha256=oroH9p3tWRYh5poAM48tUmAU4_V8mJBXCGGjQt9ATOY,1718 +selenium/webdriver/common/devtools/v131/io.py,sha256=BqRrJAvYzyfv49itw58s3ra0C23rTrQxVp3yyFL4S6A,3024 +selenium/webdriver/common/devtools/v131/layer_tree.py,sha256=WxQsHVK6ltBJXK6WDpZovrP8sqPqms3AerK1mPVcsY8,15048 +selenium/webdriver/common/devtools/v131/log.py,sha256=kBm2ACgcTbC5T6nGROJnMfofA9zjLtO9K2hUwFywqS0,5264 +selenium/webdriver/common/devtools/v131/media.py,sha256=Mmj2eFGMZMLcPrv_Mi-MgRJHe6mpFAa-GdMXdILFrd8,7627 +selenium/webdriver/common/devtools/v131/memory.py,sha256=Z-OTsrcF1zaBw6qiDdxFqK0QSGIw9Qz3KaP9IDgWKIk,8014 +selenium/webdriver/common/devtools/v131/network.py,sha256=ZFvmS-a5do1EGy8yYAYTTkEkFprDpgxc_92ALGU1vc4,138919 +selenium/webdriver/common/devtools/v131/overlay.py,sha256=y4wD60L0oVcEvoTRI00Zu3FF1UzFcbiw8HoBjeQXQ0Y,51728 +selenium/webdriver/common/devtools/v131/page.py,sha256=QO3PMgguHIQx67Wg73cSM0CkruSq4UET4NHBKJVa-3g,123315 +selenium/webdriver/common/devtools/v131/performance.py,sha256=473SXp3oVXk295P4aiYuoB-wkm0VPgOGHrl7ZedfCo0,2927 +selenium/webdriver/common/devtools/v131/performance_timeline.py,sha256=lJ3njDjqjHXSJkfgR0q5HA5C_i1U5hmMjU5MEkgVhMw,6623 +selenium/webdriver/common/devtools/v131/preload.py,sha256=1PgBn9LaKGL8J-4srD229jWW9ZLmtI-zQ-LRjW0m7NM,20496 +selenium/webdriver/common/devtools/v131/profiler.py,sha256=OkKwr7UAy0V23jvsrQTkspNlpHkH4XbzGgyEbDPuV3I,12930 +selenium/webdriver/common/devtools/v131/pwa.py,sha256=9PmOs-JAU0x1HWSV3WxKZqPUJ5G9m-I3FeRRg_Y92pY,8904 +selenium/webdriver/common/devtools/v131/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium/webdriver/common/devtools/v131/runtime.py,sha256=kpyDIK5y20261yJk8vImrv189ANXJGX7zaFQnq_jSnE,60520 +selenium/webdriver/common/devtools/v131/schema.py,sha256=fbNSqooayAk-upeq4OoLeWfgLYudVhFoZPEhQ7OKJdw,1111 +selenium/webdriver/common/devtools/v131/security.py,sha256=dM11pi7OGh_fwq_bVEerC_ocQ6f_jx1luiL9A05i9nM,16839 +selenium/webdriver/common/devtools/v131/service_worker.py,sha256=9VutRa-kch4bfZU2fFmXa8xJqGDdFdBuHzplV_uJ4ts,11293 +selenium/webdriver/common/devtools/v131/storage.py,sha256=eLpHoQ_iv3klNKbGFzdkzPrqVIzDFJRXxHbqDa_tauU,64598 +selenium/webdriver/common/devtools/v131/system_info.py,sha256=iW2gZCSxJ1-idEsBWsE0grqJv9YuhyHhuMcXpXYtOV0,11517 +selenium/webdriver/common/devtools/v131/target.py,sha256=4Jh-D17hDZLaHN-hWaBVPHbyKHYe20UxpnBGUFVSRqU,24281 +selenium/webdriver/common/devtools/v131/tethering.py,sha256=brZK0Ex_pp1RZI-6m3BgoruXDOC_wkNpOH-S50-Dbso,1538 +selenium/webdriver/common/devtools/v131/tracing.py,sha256=gY2KfAGpe0CeuKUHDvBWQU0psvuYyawPprOMBL6ihVI,13112 +selenium/webdriver/common/devtools/v131/util.py,sha256=a3Pz9LfPjx8wHoajAidPYus0odra60syc7cOWWC9RTU,488 +selenium/webdriver/common/devtools/v131/web_audio.py,sha256=AZt0TNgQXBWGf5ep4by_o9ChKLxL7Cw9LRu9TP-qn4w,16895 +selenium/webdriver/common/devtools/v131/web_authn.py,sha256=7ubPLgdGR5T4Z-mXnC6yjVknLt5zjz5Ncnm6owc_OfU,20182 +selenium/webdriver/common/devtools/v85/__init__.py,sha256=6mggdTvoA7p_XVUR8gaSMKf3YgW9pN589OCWM1sUT9U,1258 +selenium/webdriver/common/devtools/v85/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/accessibility.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/animation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/application_cache.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/audits.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/background_service.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/browser.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/cache_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/cast.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/console.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/css.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/database.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/device_orientation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/dom.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/dom_debugger.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/dom_snapshot.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/dom_storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/emulation.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/fetch.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/headless_experimental.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/heap_profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/indexed_db.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/input_.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/inspector.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/io.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/layer_tree.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/log.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/media.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/memory.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/network.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/overlay.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/page.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/performance.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/profiler.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/runtime.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/schema.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/security.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/service_worker.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/storage.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/system_info.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/target.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/tethering.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/tracing.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/util.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/web_audio.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/__pycache__/web_authn.cpython-312.pyc,, +selenium/webdriver/common/devtools/v85/accessibility.py,sha256=2kYomCXGOMOqbuiRxE22QTyNlwMJ4bVRzYEek2YQv94,15011 +selenium/webdriver/common/devtools/v85/animation.py,sha256=uyeJ8qZu7U6RfPgHaS0d4loPBnyz0lbH9RoTwn8oBSw,11112 +selenium/webdriver/common/devtools/v85/application_cache.py,sha256=RYyqqIVwx-L6Z-FXqPc5tD7S3poMOAHkX9zHECP94aA,5735 +selenium/webdriver/common/devtools/v85/audits.py,sha256=c77RGRFYjtwXAXQMM_Tby979ClMkFSgexU5Wz-ln1hs,17067 +selenium/webdriver/common/devtools/v85/background_service.py,sha256=IrsZjfMaZLbAsSq6yn0vlIpyKIykuJGI_RSgmv4SPsM,5760 +selenium/webdriver/common/devtools/v85/browser.py,sha256=Wa5yoNzjZIB99c5bTscRPCmhpHilBBtIuO4I2zBorDI,17298 +selenium/webdriver/common/devtools/v85/cache_storage.py,sha256=XpnSE40sg1LNifK2kYe51F9ZV3jW8vzE46hbzVi1v8Y,7810 +selenium/webdriver/common/devtools/v85/cast.py,sha256=fqpo07lEYuCNX7NlXI_wMCfcCiL7j0euWXZPaZ44Qm8,3982 +selenium/webdriver/common/devtools/v85/console.py,sha256=_mGKNlgtple6r9rJ_GxEfhkoQsMT7D1V6IeF_lAOBJ4,2765 +selenium/webdriver/common/devtools/v85/css.py,sha256=Ao0AAFMNPwbZZWtz6yYo9cAjNIEjwRF3hrb-6i41ee8,42907 +selenium/webdriver/common/devtools/v85/database.py,sha256=ucK8g37lBtFgYWgzM5go6YJxQcQ2sTqPy9T2wymGxrA,3925 +selenium/webdriver/common/devtools/v85/debugger.py,sha256=Tyxui6Bv1bhdwJ2rsbJNeuW8amk354lEOtWFgLiwnY4,43473 +selenium/webdriver/common/devtools/v85/device_orientation.py,sha256=iTyh5DWm7zRYzmq6VBe3_XakjFCC8kuuXc_NVIeNb2k,1209 +selenium/webdriver/common/devtools/v85/dom.py,sha256=GeHSe0rQBrqWW2KbbJ4na90tjFFzoR8woYpWMgt7efM,54390 +selenium/webdriver/common/devtools/v85/dom_debugger.py,sha256=wv1gMUxBfj9XK6haKFm1PsHH7oUUWxf2U_hL1YzAquI,8592 +selenium/webdriver/common/devtools/v85/dom_snapshot.py,sha256=ZOEOEDYqQrIauzN-4BaQzj2qilCH0UEObd-DAfKCXeg,34069 +selenium/webdriver/common/devtools/v85/dom_storage.py,sha256=35ho_LUl6SiRfVL6HckRpswt0vb7KGmij7A_hiTQy8k,5026 +selenium/webdriver/common/devtools/v85/emulation.py,sha256=Cxj4VY0MqR2oj-asCJ5NAQw8rBK2wRQzAQ3PkLOB05g,20775 +selenium/webdriver/common/devtools/v85/fetch.py,sha256=pjm5WPNwN3WA-WEDvROZd6Dk0maifqt_FP5uNP9upFI,16053 +selenium/webdriver/common/devtools/v85/headless_experimental.py,sha256=FfGXBeUm7sewWPeLtJ9x0bLJrXc1aUV_vE8dguO1iYY,4791 +selenium/webdriver/common/devtools/v85/heap_profiler.py,sha256=GuGWWPrOJOU0lZko-TvjQasogv6lpdghLO9AE_gZECQ,11207 +selenium/webdriver/common/devtools/v85/indexed_db.py,sha256=iA91BkxRAmGC15Oyc54gy690E79f7REqysCSgRxKqdE,12762 +selenium/webdriver/common/devtools/v85/input_.py,sha256=8eF82VtOLYjNI6Kq5NzqdTxgsqkdmBXCU1GrocJNKN0,19701 +selenium/webdriver/common/devtools/v85/inspector.py,sha256=oroH9p3tWRYh5poAM48tUmAU4_V8mJBXCGGjQt9ATOY,1718 +selenium/webdriver/common/devtools/v85/io.py,sha256=Mn76wIWyZF5XyX6I94GU1sPp-fsVC26FIiS6MoD77MI,3034 +selenium/webdriver/common/devtools/v85/layer_tree.py,sha256=EZzeGIvsAMOzqY9BTzx2FWMKcML5MiMvu_wALaG5PiQ,15049 +selenium/webdriver/common/devtools/v85/log.py,sha256=v8YxsMi_UUFTirdCZbwhjBy-QRsruhe8pqGXU6wKffE,5062 +selenium/webdriver/common/devtools/v85/media.py,sha256=jMi5rcJrLvoWDTkUS_KcjkOSm5ezh_u807VEaHSwr9A,6605 +selenium/webdriver/common/devtools/v85/memory.py,sha256=KdyZgvqzFAtKmHRxcDihqpZnRvRTsk0VQK8L5dGKc7A,6808 +selenium/webdriver/common/devtools/v85/network.py,sha256=R3hB7eL_G6GvOlrQV9oVfT30UzzAzusW5qvIjEbBHis,86888 +selenium/webdriver/common/devtools/v85/overlay.py,sha256=A8ZJvmcq5D0AufGfJ7olNrACQ2Qd8eCkACPjnj6GLb8,24823 +selenium/webdriver/common/devtools/v85/page.py,sha256=FRK7Y7gLyDopz6DzkmNiirFlO6i4xkdapmPwxJDC8eE,70797 +selenium/webdriver/common/devtools/v85/performance.py,sha256=473SXp3oVXk295P4aiYuoB-wkm0VPgOGHrl7ZedfCo0,2927 +selenium/webdriver/common/devtools/v85/profiler.py,sha256=K2ZO0DDGg0mmK4soQ6asNhcSYedHXgDtH9MiAV0zYB4,17177 +selenium/webdriver/common/devtools/v85/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +selenium/webdriver/common/devtools/v85/runtime.py,sha256=uX-02-XMVhLNnZjqUkvMxGYhlS7D5PD0fBtbhoeWy9Y,51695 +selenium/webdriver/common/devtools/v85/schema.py,sha256=fbNSqooayAk-upeq4OoLeWfgLYudVhFoZPEhQ7OKJdw,1111 +selenium/webdriver/common/devtools/v85/security.py,sha256=MBXW2msUqqwtP2-tubVIu0kh6Zyqud9TZ8Q8ysIv8D8,16913 +selenium/webdriver/common/devtools/v85/service_worker.py,sha256=LlhRw5Z613K8I96wTUU79VaWEiYURNOSMJBHxkC2KdU,11066 +selenium/webdriver/common/devtools/v85/storage.py,sha256=e07wEq1t5vsy2kxsDyq9Xo50NCfJNtekQK1lBun8q7c,8277 +selenium/webdriver/common/devtools/v85/system_info.py,sha256=2PaY1DGaJVaWDQxBGTon9PuZZ0KgzOrz7dpIaJkEEcg,11049 +selenium/webdriver/common/devtools/v85/target.py,sha256=4sRfceZReSELAuFhnh6_iFfe6H9sP5ZynssrRw3hNG4,18516 +selenium/webdriver/common/devtools/v85/tethering.py,sha256=brZK0Ex_pp1RZI-6m3BgoruXDOC_wkNpOH-S50-Dbso,1538 +selenium/webdriver/common/devtools/v85/tracing.py,sha256=pINJ5eJyMEYwnewjQUQjR185yVUJ_fws2BuBjZHGAh0,10556 +selenium/webdriver/common/devtools/v85/util.py,sha256=a3Pz9LfPjx8wHoajAidPYus0odra60syc7cOWWC9RTU,488 +selenium/webdriver/common/devtools/v85/web_audio.py,sha256=7zP6tg9l4vSQXqnpnOKrm49y2XK8gPsEmpRZshP-rMw,16894 +selenium/webdriver/common/devtools/v85/web_authn.py,sha256=w5vnpzOhvMOYHUszzuBu2IwkseVGbxSuHCsaffgQ-Lc,9424 +selenium/webdriver/common/driver_finder.py,sha256=PtFrgybuAtuFNu97zn2TfmQCddQHU-OHm7odKuXKWw0,3931 +selenium/webdriver/common/fedcm/__pycache__/account.cpython-312.pyc,, +selenium/webdriver/common/fedcm/__pycache__/dialog.cpython-312.pyc,, +selenium/webdriver/common/fedcm/account.py,sha256=oFxKssvenLXEugnfiviroanDUAKsFTrEzHsHHsuX46U,2228 +selenium/webdriver/common/fedcm/dialog.py,sha256=UQUDDry-aOQSCJG2hdx2JpPV7j0Hh0dPiYiaLVG-7Q8,2222 +selenium/webdriver/common/keys.py,sha256=41_qmEex2TPzzNdWZignNPY0Kp5m4rFKghVPn0sqer0,2316 +selenium/webdriver/common/linux/selenium-manager,sha256=j6FKnG423jNIXWmRWGH-bUWfhU9W1LcOfwfxeDxPTwg,5511488 +selenium/webdriver/common/log.py,sha256=YZCiTwzwv-0SKCc_JTpYrpfhYe2S5GV-Q_Fn-5RHfhE,6308 +selenium/webdriver/common/macos/selenium-manager,sha256=w8CN0wuy7eeZZXS-Ca6sLUUr8jK58Nd1aHZa3qwfKvk,8235888 +selenium/webdriver/common/mutation-listener.js,sha256=LCCDyaSfZcUQ1o02IKV9Tf7cjcD8wyUkwcyxHGMp6gc,1944 +selenium/webdriver/common/options.py,sha256=hXvg4QHD7Yh7uigWeZCf0CDH0kOdd7Ee7MgOxUZkPY8,13446 +selenium/webdriver/common/print_page_options.py,sha256=4LiA8Vlsp5GgobFLhbEh_1CsR-KBgKX-UQ7VcktpWQQ,9214 +selenium/webdriver/common/proxy.py,sha256=knTuxuonN3ycZNNkPVAGSXPv0xuoXWM7YYCPHdwmj_c,8654 +selenium/webdriver/common/selenium_manager.py,sha256=AXZre7dHuFNLOEGVarf307ciVUEqtsQ4qP3OFsYxUiI,5335 +selenium/webdriver/common/service.py,sha256=xK2nAWmSjcgw_0gKy3h4TxsB3OQxrDH3UhJj-1It-yM,9482 +selenium/webdriver/common/timeouts.py,sha256=jwOsrXQ39W5WLZ3nMh4nn6-FYkzd78A2PCZx9YhB2XU,4059 +selenium/webdriver/common/utils.py,sha256=8n7Hp8Cdjys_rJ-61tgrDUqYVZsEqGvlTBpgqmjipLY,4360 +selenium/webdriver/common/virtual_authenticator.py,sha256=dHZS0xekAH5rJ817egFbMzdcl8gwHcn77GUEf_eTIdI,7837 +selenium/webdriver/common/window.py,sha256=CuM6gCsktfKZ011FGuYsVy5Id7SCkxbipPd913xloEI,926 +selenium/webdriver/common/windows/selenium-manager.exe,sha256=t_h6Y-sZeo46hdVTdV_seaJZ9XwSFhaeI3fbK4m8a4s,3740160 +selenium/webdriver/edge/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/edge/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/edge/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/edge/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/edge/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/edge/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/edge/options.py,sha256=nytp9TTqQdz1CtJeJE8djo3K7X-byHqyLsyn8bsAMwE,1694 +selenium/webdriver/edge/remote_connection.py,sha256=zf1fh5F1yiIbb7d4fc1bToK8QkvcT7wFhLfsA4cqfoM,1641 +selenium/webdriver/edge/service.py,sha256=0dTXK3kLv7WDYkX2JQ617jcR8GvPqOjYizmkpBWGnEk,2309 +selenium/webdriver/edge/webdriver.py,sha256=m2xz9WmXDZoIKQkVd3HsSjPHCzXiEtZfKX8okURL3dk,1984 +selenium/webdriver/firefox/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/firefox/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/firefox_binary.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/firefox_profile.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/firefox/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/firefox/firefox_binary.py,sha256=U4KW85vwLl3LzpBIXNCzSXfpX2GquSwBOamXpUOnTdc,9124 +selenium/webdriver/firefox/firefox_profile.py,sha256=4f04OesqDhI8qioOaMD0Jnm4YR4TnvYIZ8l8ymq3AK4,13744 +selenium/webdriver/firefox/options.py,sha256=ZPPaD8oPNOlXOLlGrGHbRYfDbXpPKH-kFiw9WZUHLOM,4991 +selenium/webdriver/firefox/remote_connection.py,sha256=3GXt15t7AwSZZIToDVjKTM7JdZXPmZjRQYwAa6J9iCk,2084 +selenium/webdriver/firefox/service.py,sha256=0Q_1Qja1CNQYMTr41N8Wv8zImIDrio5zhQBjSZ6ggp0,2641 +selenium/webdriver/firefox/webdriver.py,sha256=ls2ke8n-lSNowetCSJ7iPwlxZB6o9Ydkw4a7envXOLo,7801 +selenium/webdriver/firefox/webdriver_prefs.json,sha256=lGrdKYpeI0bj1T0cvorXwz5JlBMFEfbYt5JovlC3o0w,2826 +selenium/webdriver/ie/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/ie/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/ie/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/ie/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/ie/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/ie/options.py,sha256=e7LHhedQ1qdXMLf4y17yhHCkWhw7YtNqAg0hXfzmKhE,10787 +selenium/webdriver/ie/service.py,sha256=KXT0-o7aGNkwzCeOSe91Bw-44BHYWymJEWKyEZTmnU0,2507 +selenium/webdriver/ie/webdriver.py,sha256=dXZs2nNGsjg_m8gBOxyADVwpXGevQ4jVJbIR6XJNPdQ,2836 +selenium/webdriver/remote/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/remote/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/bidi_connection.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/client_config.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/command.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/errorhandler.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/fedcm.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/file_detector.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/locator_converter.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/mobile.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/script_key.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/shadowroot.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/switch_to.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/utils.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/webelement.cpython-312.pyc,, +selenium/webdriver/remote/__pycache__/websocket_connection.cpython-312.pyc,, +selenium/webdriver/remote/bidi_connection.py,sha256=vVDBqgkzlbvFV_u_Cj3D5nvEBsUFd_MauFYNyuQlmik,968 +selenium/webdriver/remote/client_config.py,sha256=DPPnJNgyaQ3aLf8bQeDXgjPOqqbG3jJKwHsngXTW4Lk,10492 +selenium/webdriver/remote/command.py,sha256=vlJCf6xSAOImqoJqkdHfshnzdm0TzUHBFA_gwbxC93Y,5555 +selenium/webdriver/remote/errorhandler.py,sha256=e4gCLJFP19jHRViNpGhYv43qx6cXZDGH0ve28wyWsKs,10664 +selenium/webdriver/remote/fedcm.py,sha256=6CnbeoCb_HIZ-4LmrdiVCeeGxAACgPAmowxIyo2jfhg,2762 +selenium/webdriver/remote/file_detector.py,sha256=PxzhEc2YfaSX9jyn5WNuggSz7fS7fmd2BmJ1lr5PPnQ,1775 +selenium/webdriver/remote/findElements.js,sha256=jApUkXMrna5zp8xaBwV_f_fRhK2zmx9cO0ZfnnQXbr0,53749 +selenium/webdriver/remote/getAttribute.js,sha256=a-nPtQTJ4CdbEKd34TKrqVkp9FljcKKG0D1bqdXJszI,6033 +selenium/webdriver/remote/isDisplayed.js,sha256=uvmZlvzT4fRqcAuLafw3FODoP5Y1Brgi145iq1-0hHA,17005 +selenium/webdriver/remote/locator_converter.py,sha256=yoBvrvVw6iOSG10huHDt8Bpd3paMiVHbUNfXo1sFnsw,1145 +selenium/webdriver/remote/mobile.py,sha256=xBZfPl64sL0vF9J4WuVIcDQ07ggRlaljHXiD-odOgnk,2616 +selenium/webdriver/remote/remote_connection.py,sha256=ZrnichtOE1qKhnOFEXS3ftCGOaHeA6dtVD9sNV2zqCk,22467 +selenium/webdriver/remote/script_key.py,sha256=DYWxjdbpcPVqEaevv0B1zwLJyrdGbR8XJmYAZooQAEE,1084 +selenium/webdriver/remote/shadowroot.py,sha256=2MQZBxXrMkAv-22nwI26ZuT_qDObMtY-TRAuUpV2IZE,2949 +selenium/webdriver/remote/switch_to.py,sha256=XEfu62emqxPAKeft_XgQQz_lz0qhxKBucpCTsaJbT0w,5157 +selenium/webdriver/remote/utils.py,sha256=0umjJeFQeXbML4XuWBb5eqpqx7_DsoMV7kOfGKMSE3s,996 +selenium/webdriver/remote/webdriver.py,sha256=hG_7sH7_atitCwUpZYtF1pu4FbImEhevXdBUwpTnBIw,46206 +selenium/webdriver/remote/webelement.py,sha256=pcWmHZLVuGEoYT2qpqf_eiUx_oONSQjz0UJpf30MDa8,16115 +selenium/webdriver/remote/websocket_connection.py,sha256=gLGjPMVKPEuj97XIJTo2fgl_YcsK61yB1N8TtufU_9k,4649 +selenium/webdriver/safari/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/safari/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/safari/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/safari/__pycache__/permissions.cpython-312.pyc,, +selenium/webdriver/safari/__pycache__/remote_connection.cpython-312.pyc,, +selenium/webdriver/safari/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/safari/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/safari/options.py,sha256=6K3x6UDcncP9YKAzxGDnANxPMdPepw9vR9nF050grGI,3806 +selenium/webdriver/safari/permissions.py,sha256=HcYoGO05rjuz3cB0nll_KRSFSJBQng3HMTWasYm_NHg,921 +selenium/webdriver/safari/remote_connection.py,sha256=TYs4QTPZ4u91jLoV-v5rtwLTzCpsx1OeQI7xe1vDu7o,1912 +selenium/webdriver/safari/service.py,sha256=94il3ezrGMgHQf0B4bbU0ggwnt4PA9JgTmwfOyYEJvM,2945 +selenium/webdriver/safari/webdriver.py,sha256=yIEiUvoX4N6YC2N4fusl1V-8NyOtnTNOOHjEEHH1CeQ,4033 +selenium/webdriver/support/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/support/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/abstract_event_listener.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/color.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/event_firing_webdriver.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/events.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/expected_conditions.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/relative_locator.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/select.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/ui.cpython-312.pyc,, +selenium/webdriver/support/__pycache__/wait.cpython-312.pyc,, +selenium/webdriver/support/abstract_event_listener.py,sha256=0AJ7c-d9VBHMALBUm4Z1m1ygICZRZ5MGFMAaIo71TIE,2178 +selenium/webdriver/support/color.py,sha256=diUL7p3gKSbw1_iskDwMX9fkqfkS9QFHhuCqm-GsqPE,12195 +selenium/webdriver/support/event_firing_webdriver.py,sha256=39GHAituqJklp7amU60it9Dp6GLKcNKGeu8TVyYu_ns,9193 +selenium/webdriver/support/events.py,sha256=amakwBWfJ37pInruIx1Jzev3-ocb6jCl9lc82TaD5Vw,920 +selenium/webdriver/support/expected_conditions.py,sha256=Vt7LZmE7NbZ2MLBXlXoF8RTvd02_vKOb_IYCA-kc5Ic,17624 +selenium/webdriver/support/relative_locator.py,sha256=go28ZIGNO5yFs6GbJ1PAL0_9-zyAAymoLhYaSsMk5_E,7213 +selenium/webdriver/support/select.py,sha256=yRST6NFoViMNWpGMu7iA4a0hA1yDdGzRElEP_DKtR2g,9505 +selenium/webdriver/support/ui.py,sha256=i8jmdjmGb5V5gxr9iXb5ISzHPEDnlqKw8E_6gjDmA_k,886 +selenium/webdriver/support/wait.py,sha256=neJan6Rum8c802NvncFFMlqBmMS8LY1jb4kup0rdxtA,5313 +selenium/webdriver/webkitgtk/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/webkitgtk/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/webkitgtk/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/webkitgtk/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/webkitgtk/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/webkitgtk/options.py,sha256=wjtIf16wOlczf757oZ09J5aJA9lqd_5qy9P40ykcEFs,2653 +selenium/webdriver/webkitgtk/service.py,sha256=tCHCqEqFLWuo391cR7mCSdgBsBsrGKiNKuNyeDztGEA,2579 +selenium/webdriver/webkitgtk/webdriver.py,sha256=SqPDZbAV_KSieWBe5qOBK_neuMT5pfRW8SRozYCl6gU,2198 +selenium/webdriver/wpewebkit/__init__.py,sha256=3TKaBBK08eiCsGGFFcZlZwwjHHcmj2YO0xImghpJk38,787 +selenium/webdriver/wpewebkit/__pycache__/__init__.cpython-312.pyc,, +selenium/webdriver/wpewebkit/__pycache__/options.cpython-312.pyc,, +selenium/webdriver/wpewebkit/__pycache__/service.cpython-312.pyc,, +selenium/webdriver/wpewebkit/__pycache__/webdriver.cpython-312.pyc,, +selenium/webdriver/wpewebkit/options.py,sha256=R8i2O1P6fOtC0cMU_sAlndsN46EqEprzMJiP_GwmuZ0,2204 +selenium/webdriver/wpewebkit/service.py,sha256=GuhrslWALui_IFz6BIJzFoOt4RmMlPPbvq5tV6uEyEE,2276 +selenium/webdriver/wpewebkit/webdriver.py,sha256=vzIUAqNF9Hkw5Fu6k2ukoXwPv7SHjFjBlT8D0kDdfLI,2202 diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/REQUESTED b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/WHEEL b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/WHEEL new file mode 100755 index 0000000..9bd3da7 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium-4.27.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: bazel-wheelmaker 1.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/env/lib/python3.12/site-packages/selenium/__init__.py b/env/lib/python3.12/site-packages/selenium/__init__.py new file mode 100755 index 0000000..2a9f1e1 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/__init__.py @@ -0,0 +1,19 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +__version__ = "4.27.1" diff --git a/env/lib/python3.12/site-packages/selenium/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39625138f628e6eec60141ae4999ea8754db34f GIT binary patch literal 228 zcmX@j%ge<81dZ`A={n2|439w^7+{1lK63yW(-~42q8KU}HJPf|O!SP*^$h(q8E#mBE?_zcqUD@{KmKQ~oBw=^R$H#adw-z7h}G&eP`q*&iQv&5q`N#D@G zK-VR)vRKzYP1iX;B~?E)uS`EDGfBUovLquv&sfjUNWVCDn2qCg;cHbrwcW0NK+2Yzm z>#?WSQ|rkb+mm|o=0D)Yy~&(}p1f5G9y~cKS#s*Y%=_Lq@B7|+-^%4Fq|RHj+yA2> zbd)9e(Z}HAs{(t-K^^2^r{LiZ20Se0Ws?XR6hU{ji;C(Ps%B>Lmm|fV%kd;aDbxJd zO`YOhRPJ~H{Zyyfevm z=8aHIe8&%**n_*#dDRoE%U`PJSi>0qUO@QD5i0*IRd#CIwOxCEWu)&0Y3bUQ@uM=k zv$?&wzy4w4{l>xV^zzNLa%*e)*g$i&z3#j2=<0|cJp9-?Y<+US3_lOk>&@>A&2;u& KimFjnb@&IOilEB? literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/common/__init__.py b/env/lib/python3.12/site-packages/selenium/common/__init__.py new file mode 100755 index 0000000..8826994 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/common/__init__.py @@ -0,0 +1,88 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from .exceptions import DetachedShadowRootException +from .exceptions import ElementClickInterceptedException +from .exceptions import ElementNotInteractableException +from .exceptions import ElementNotSelectableException +from .exceptions import ElementNotVisibleException +from .exceptions import ImeActivationFailedException +from .exceptions import ImeNotAvailableException +from .exceptions import InsecureCertificateException +from .exceptions import InvalidArgumentException +from .exceptions import InvalidCookieDomainException +from .exceptions import InvalidCoordinatesException +from .exceptions import InvalidElementStateException +from .exceptions import InvalidSelectorException +from .exceptions import InvalidSessionIdException +from .exceptions import InvalidSwitchToTargetException +from .exceptions import JavascriptException +from .exceptions import MoveTargetOutOfBoundsException +from .exceptions import NoAlertPresentException +from .exceptions import NoSuchAttributeException +from .exceptions import NoSuchCookieException +from .exceptions import NoSuchDriverException +from .exceptions import NoSuchElementException +from .exceptions import NoSuchFrameException +from .exceptions import NoSuchShadowRootException +from .exceptions import NoSuchWindowException +from .exceptions import ScreenshotException +from .exceptions import SessionNotCreatedException +from .exceptions import StaleElementReferenceException +from .exceptions import TimeoutException +from .exceptions import UnableToSetCookieException +from .exceptions import UnexpectedAlertPresentException +from .exceptions import UnexpectedTagNameException +from .exceptions import UnknownMethodException +from .exceptions import WebDriverException + +__all__ = [ + "WebDriverException", + "InvalidSwitchToTargetException", + "NoSuchFrameException", + "NoSuchWindowException", + "NoSuchElementException", + "NoSuchAttributeException", + "NoSuchDriverException", + "NoSuchShadowRootException", + "StaleElementReferenceException", + "InvalidElementStateException", + "UnexpectedAlertPresentException", + "NoAlertPresentException", + "ElementNotVisibleException", + "ElementNotInteractableException", + "ElementNotSelectableException", + "InvalidCookieDomainException", + "UnableToSetCookieException", + "TimeoutException", + "MoveTargetOutOfBoundsException", + "UnexpectedTagNameException", + "InvalidSelectorException", + "ImeNotAvailableException", + "ImeActivationFailedException", + "InvalidArgumentException", + "JavascriptException", + "NoSuchCookieException", + "ScreenshotException", + "ElementClickInterceptedException", + "InsecureCertificateException", + "InvalidCoordinatesException", + "InvalidSessionIdException", + "SessionNotCreatedException", + "UnknownMethodException", + "DetachedShadowRootException", +] diff --git a/env/lib/python3.12/site-packages/selenium/common/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/common/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82e64eeca113086014e65ef483a13d795453c66d GIT binary patch literal 2085 zcmZ{lOK;mo5XYB(Nq)#L*|Oe}9|hv1HtnRZLs3Arl2ipE7m?fmivj{ouBC;^U17PD z<6}NW??o^DEd2%sbn2Pf6?;s0ts9qaD z)>3HEjt~@Sa z=WseaSw5bvr9V=7WQkPMYjfkRTPzG==0?o%@+5e}wcBgUwxhZ%)_MASXW)dc;{Dj| z@+&!DqwMoYpI?0|BjLq*-f7C34^I7{Sopw=Y*V%(w^!3z@yjUg;`S&uGHQB`aiFgF zfW-#Pj8=@jnO?Frio8%x5PMR&(f$8FsN*_sxPVhUy<58FD#k?Eiy!R#*jP9=XNtjt zi5m>h3Qq9o?7wDLOflicnpto2fXOK4ZvH};)7O?QrayF|av|8;KAe5#eavClV3N{y zy3GgkXD-CGkT>EL(>)n$ck>OqeCY6=I)Goe+AxwcQZSM=vTbC?NZv@<2)xpX+BLFe zBw=LU$byj-BUK|6BWWXhM%Iih8c7;iHnM3XW29(g&WQQ%P$?tpMoLEZjm&~H4-f8^ z*yODf;=R$b`wp-ntbx^VKdgqW;m$Y$HiR{Ba_j}$#j$X5Yz@apH_#k30v*Dhu|M<$ z=dGGf(HtBa8#nIWB|06)_dA{6$a}aX{|0tX2Fwnko)ZL)XV;~RFO|@K$@O>9rG0vG za#VM2!=v-7qciC-n~8z#^Gmyb3lCL1J3f7Chg`FxzT;jyT^8CQ^O@jLV7oF1q_8_3 zF1YS=j{CQF$*%+HMLzpRJ%;M$jUH-{zh*7V`saXHpAE@ZL-OU2d_E*khXgK9ru5l_ xPlx1-A$fvoW6sf#!1s7aJ{=N>0z(vbfV4*luqRwX!sEZ^_LpbgCDbD*{2vRIR8#-} literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/common/__pycache__/exceptions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/common/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53b4da1605a5da4191c66ce5680dc2a06fce5b3f GIT binary patch literal 14580 zcmd5@U2NRgbtXp|X(UUw*Z-0%n=9FCX(Ny9-Rz&%$y%1YyLQ&{){^t1Y%rl_C=Kly zazb(>OYj0NYNXyEK^ve&6r@3%B4}(RC=j3piazwAFD;OlStJ2e0RaLec?gOEc0Fl= zJoWp|B{>|eWUo@B?Z~_&&m}LmPP^cWU_kaqgXki$j|BbKXS1ba?S-UyG)F zO)F@#T0t+QN_sgpo6>pRg6o#q7F@T^wieQ}>6G?{R%pAe722(~@8K=}X4?gt0kp$v zkD(cXb^^M?%EZtPfp!7foq%=6 zwvzIfSwTOn}A+OK!=tu4u4|h zh4VM^Rwb}q$2Wqa85m`A*(jQoiscx#W0<89z?QLO%@sU*(ejMETd=afqFxN^>zT{) zs#)UowDpCm<>alE?CY*)6x@8ZY&n6+u?_qSinec9p67ZaMx|t#zGW=hz8#FMyip8- zia$0wy0o;E^{tZS*wu2jU@eX|4Kf-dF&cPob*^OjMb`~%XJJ%^_4C9k`gMdCkKVz> zpF;gDZB~Z~NEP(imJX|JN>}S zUk^MpZ>_g^R#5evd}~An&a^^29=(O;FZHi!0nY08Uh7TmE3k6k3-5L9rhZe)rK0|u zDcprtOw(?*;4U6{S-Y=K4X4-BezjtG>zQ26cI+UR^V;#YmtjK|;)zyF$@~WJdPgpo zFPXld%lS0327b4G=Z+TLvNc++7R_?mER0TuGT@KCVFzzk=SEMTI(2f=T=q|1ojQz+s$rto0td)B2TNkMN+D z*V%@@nE8JL09**zdoAiqoWG$JQr~QOm%TCb8{J;|CS1)*x2DMx@f0MU7%Zf&k?|XT z7;lrOzZYWoZVKbJ-b{T%`(`Q}U57lTr&c;HS-ubcjT!5D=gQO5B5BZ;V9YQVO}k`5 zd7yo!p=7XgrE5AC!m-Zb){V2>dd;<+;TCTf@LTVW=O70;7Af(`Cy0Re6d!1ZPy}8s zx6-@m%t#;S#Q!9kTiROh;N8jZzWMDp?~dKOQag0&PWRf5U4QoKmtI}#>Z$dQzuz@} z=Mo{Wed)Eep8jw3e7)!HN5A{pw_p2F&+~UK;+fTV@6FzOtJeR@`(3Z#$z6wQnZw>5 z41K?4YHI3!CuQ3)%T_M8-kHml-9oj*>#khx3stie_5f!X8;CzCS#JT39yu=(<{c!g zJCyjmRVw9j_jPYKpgyPKtdQ-s@p(4A?6`vFx3{%_YaM*hra8K&KWu4BA79(sw>t6F zk3Ep<)35x);1BxM_4H?J?-XiQ@%?w~_ouH3>}MU_zfR+w2fN$T{i}O_qv0fU$w%@S zKmJ7``-nI-o4V!HaLf9U3(lfhvJ2Boc91X5xHG1=Uh_y_WIZyW<%AxuPKBn7T!SA zjN;-Et;TI_z4fAcf}PtUY2TDPUCkF?C$bGfUi=^-9}0bMkjNclL&;GSdV*JMp2s0( zjtHMsPY}K>g!e0iKP60UVEpqW#@pa{XD4m$jBCteK=IM}s^`Js8om`6?z~~<132tx z5{sr&fWsUymffn6Hys1>Z~a)IK4v1BffjVTO>Ma8r6 zT@@f?6%D!YgEIKkrtBRid)d5%;}NajZS6l(ZRw0+FngL9On1cJqqos);?Xm|k4G0T zo`KcuSU;d9=zPgy+!D`_`5kCia*`0B@Bu_Z)l$K5+<sF2+>RhUd2El z=La@I!;)(jAP>X93qt}oiQM9#CyUsk;(9@L$+UxP>)vdM(j{G6)`nZBewTU`?$%i89dz82K5Wy;5YdxX zH1+pe*LO@`ef#apS7vgTrr%iaIDh5JxP-*q>-Nkz=Kgocw$-N6?>eoJVBgJ6|oCo@mM(9JCKzp#3&I zsH_DQgef)`OxuA6HjHV+-bVPCFW)PgZ~z5+e%_*EkYOqwRXbQV829+1QKZMG%a8gn z*3gCXFQ4#@tnE0KH)Guhj72|dyl#8eyn90i$_9W=xUg?dpmce2EB`Vk!ecYdi)Y!0 zhb3rR6V#(7Xu4=3D7k{fFSgJtrKEWdyk+u*#vz|a7%T?Pm$wWLuZeGL7!e71U|Sf^ z2w}99!Z_1NzGVi8kc(C!yE&O-B#h1HaQKlk)6+wWTJ|(i`-gUBM-b4LtnvzrI_R)T3}s+K`{0XZ1Vup)RHw2x;Po#C|jnK4XjuN92Y*pS%91> z%j`$~X7ci-$idKsU>ITc+ph21Oh)o1JQ|*!Hy)2Tv?E`t7OW8iN-EB`WS8MG5CXYL zpGlRYnluoK9G^%!P#9r|OW7Bfrpg{r7qG!YVF3gB_!O9dCqe}mjK$!>9r++MZ{ovA zpF7idxS@b^$nr64*Ai$}r_((i3HIusl}#XwhLa^@_`x@Ua= z7lekaw=mKRt2x1P#m=LigRldh#4wF(NCgoF*cCWdM$t>IcU@%w$Q7!X4Dzp9DUe9P z8>~pMz(M}bNWin^s&*+zvLO_^4J?3}vhfNqvf~uPgtiqSEqNLeSed1w4H`**JP-dr zoV%B$g41uV3=E1Y#NIttoQ9wGPVs3;8#Z;)Cmt{4v9tCt%wwJPXKM%Fd91VcULYn0 z$Ds!dQ`IvBvYBH??1H=Df(=b2t8}$dvdZi2yI_vrWb>Znf)9sTYA8P7QNj(c{A;th zVm*k;)Z}ylL}`)oI%kPRNvbb})pkUJDT68_Mj(r?gjOw98N|u*I>uQ>j2u{H)H#(? z$)j}H9EGxKYD+FW2Vs`+t%4m$jYX+DGBUZ1M0t?x-;iv+Mi`qF9C0?3jaO(D~tVqPYIqj(TUO)H^d$?`&tiQ|>!%cO`0`JJye0b*vi|BqLT~ zyo8A2ZCK4@+O+burulM=YWzH^%6I{G2_{D3cN$UQ+f^SG8CWRKw3*+CZ>GUWyo>sc zS>jaA!RB3;NrBOgQw|ws-gC<+Oj!A<%vvZae#Cxy=SGEdy;IQ1(f+8Efu)J)$Lkgx zk6uKxq58^X0R5=BHYEc{4iYukWzFltt0}K=ImB z{i}skSf4Bb!2Y+z%N2kx#PEFKyP1Z7#LN`)2{5;nAKVTrw5y<9GaQI9R zB}Zw6f!wVf8CWxpt!1BEJ2v!iM<#vzXWje%JpbP39;9)NlFM)2%X~aPlvc%#L?e$Q{yoW# z9-MMFSINIls-&vqg;ot=Qbj2+eLdClu_lpm1mA>e#+8C7(vwdQ4I8pNASxW0Tp5?D z8g#fgXO#C9rBoG(| zf5bavQA8UXw4`C>J4m^(+%{FXJY}&8Bi~5xTON2ds)VLQNKRVGAe3%9@d5HoVT)39xLSuea zk&nt%b=0-UPDo8CEnH)@ZkUXBkU7ZUqLIc471N)H1ov?h&N`UK=5LeqwnTcxo^8<^ zMQ{_Yd)>As-7+}dAonv#a+{+n!+*a;z4mE?0xg^XFJi_Z!@8Rusg0;i3*IR*T3fnfyzn z|M_t&dSENVM3F_Y&l}9S;fl%@R+mvOR|TFh@*gqmtd%vuBU;aBr@v>#GY-QsIcT4`qP4~mKjSX6O(a zr1-{=m0eJleLz;3hDJwir&0}u2ZkeqPbqDrIseHGv_KDI_OQ#*L|_o$J~l6`D`$P1=_N?!ca(P9#1Gf?aHTo|*kJ8Rj%C?`=4l$u>=_9%`hxv@)xZmW+(VQm?8 zZredkgr&~SZ3&Cq9-E)?;!QSUO9kIgS}#J(zA(IR|XC`aaN+*^FjA$y(-;KX@_6Mnr|6ZJ{0RpV%09eQ^rw z=PGV2o7mhERfHC>`N6>)z;1J?OKQrpNN<=(uojSN5phhBo42VgBJFA*S%zS56k^Jv z8V3%`)L0p#o#*0OxWjFWuwkC$vU!NZ=cYOpHk{KH6WFyaChWxoU^#(Xxf*kKd^}pt z&zlwOA5_F*10FKXawS}0*#g5NF!0#?7miprMiqL5ZwoymbhQ)AP$l!@=F+4}{}pv4 ze9Dl=V%_-gm0X!C&&pf&Vl>^beolb;F6M5|$GpYxaI=P_!)jdtyHtIq-ja)}X(zf{ zYTq@oh|TZFqA2!DrFSbPv1eOMLXza8H0fCrD6`n}2p5uN?mJWFqP?JY&4xATNW-w! z3nGcPB)LYu@jk@cb3pS*93}~2)v%t*5fHjmOY!RGjSALs3k*6UJ2dmwbaKQk?Hv&5^?_or3FeE^>B$g4)_t5C5i&j$wn!PW;Ud2 z3pyOq!6r>QB9nSaO)25qBBCcGVp@fV7ZN_~%a>_SA(?8mUzsH=bux@J5X^_JKCE_d zKb918lz9oC^VKdKF1JQ<9gPq=lPLCuxt0;QvdLwM0Bm8kO_{4Lcu^rQ*mN|{>BVqP z*|jZp^oD#u)H8t^Rg(c295)Ca3JAnli$-h2w#%&ULJ7 zJC`IkY#37%DX1%vk%-b{@hwmo(~!3eR2`%&73E{nk5pkfOg2@j$+%1=V(TIWYs(&+ zJ)|nKE_!;uqKiFEbp4^Tv(U|M+|E9BC9xzE{#SrdbbYJ>!HkhPT#qvy3LL7O(VF!C z^}eh`CbD}}p`H`mpn*?Xs6C=KoowJnoO|?g&K|d!>O$?{#or_MSfo&}Imi!i%a&{< zo{YB=|Ib%vIeL>|;Y;${Y7cSWq@{MiY_y}#DNlO zNiZQ!R6LNFUNLN92V~xb;0>!F>zOlZ^ZLiVo4}9r<^Ma{2Q9j;KOE5XGr!dOeya8T zZ0E;s?O5x&daI+}wny(@?Wx1I^w*!&^-t)v<1f`UUeq(XKCajLUg7OHZrk-t?eJJ# z!@0h1m;P$4f3&XQTtCL1qo>23ls;55o~vs(*E{#)F%F1x{Ztzs8+@Uz;auOdM?bIE zo_U#HKCjoGO{4F~sXCl(roNjGKK-%q!IXZc_RKkscc$Liik@R<>l)7Wohf~vjE8f* zQ`cXtJ^eg!eUX@-(`yHZd3O$&r}Sq83!M2Nh*VFKND@Nag%D!F8^JZ!%WFA p7xj>L7o|5FBAVqV_6x&tu6JgD8b60~{eZ4t<{-buAeWUt{%=Ssf;#{J literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/common/exceptions.py b/env/lib/python3.12/site-packages/selenium/common/exceptions.py new file mode 100755 index 0000000..d1d7efd --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/common/exceptions.py @@ -0,0 +1,291 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Exceptions that may happen in all the webdriver code.""" + +from typing import Optional +from typing import Sequence + +SUPPORT_MSG = "For documentation on this error, please visit:" +ERROR_URL = "https://www.selenium.dev/documentation/webdriver/troubleshooting/errors" + + +class WebDriverException(Exception): + """Base webdriver exception.""" + + def __init__( + self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None + ) -> None: + super().__init__() + self.msg = msg + self.screen = screen + self.stacktrace = stacktrace + + def __str__(self) -> str: + exception_msg = f"Message: {self.msg}\n" + if self.screen: + exception_msg += "Screenshot: available via screen\n" + if self.stacktrace: + stacktrace = "\n".join(self.stacktrace) + exception_msg += f"Stacktrace:\n{stacktrace}" + return exception_msg + + +class InvalidSwitchToTargetException(WebDriverException): + """Thrown when frame or window target to be switched doesn't exist.""" + + +class NoSuchFrameException(InvalidSwitchToTargetException): + """Thrown when frame target to be switched doesn't exist.""" + + +class NoSuchWindowException(InvalidSwitchToTargetException): + """Thrown when window target to be switched doesn't exist. + + To find the current set of active window handles, you can get a list + of the active window handles in the following way:: + + print driver.window_handles + """ + + +class NoSuchElementException(WebDriverException): + """Thrown when element could not be found. + + If you encounter this exception, you may want to check the following: + * Check your selector used in your find_by... + * Element may not yet be on the screen at the time of the find operation, + (webpage is still loading) see selenium.webdriver.support.wait.WebDriverWait() + for how to write a wait wrapper to wait for an element to appear. + """ + + def __init__( + self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None + ) -> None: + with_support = f"{msg}; {SUPPORT_MSG} {ERROR_URL}#no-such-element-exception" + + super().__init__(with_support, screen, stacktrace) + + +class NoSuchAttributeException(WebDriverException): + """Thrown when the attribute of element could not be found. + + You may want to check if the attribute exists in the particular + browser you are testing against. Some browsers may have different + property names for the same property. (IE8's .innerText vs. Firefox + .textContent) + """ + + +class NoSuchShadowRootException(WebDriverException): + """Thrown when trying to access the shadow root of an element when it does + not have a shadow root attached.""" + + +class StaleElementReferenceException(WebDriverException): + """Thrown when a reference to an element is now "stale". + + Stale means the element no longer appears on the DOM of the page. + + + Possible causes of StaleElementReferenceException include, but not limited to: + * You are no longer on the same page, or the page may have refreshed since the element + was located. + * The element may have been removed and re-added to the screen, since it was located. + Such as an element being relocated. + This can happen typically with a javascript framework when values are updated and the + node is rebuilt. + * Element may have been inside an iframe or another context which was refreshed. + """ + + def __init__( + self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None + ) -> None: + with_support = f"{msg}; {SUPPORT_MSG} {ERROR_URL}#stale-element-reference-exception" + + super().__init__(with_support, screen, stacktrace) + + +class InvalidElementStateException(WebDriverException): + """Thrown when a command could not be completed because the element is in + an invalid state. + + This can be caused by attempting to clear an element that isn't both + editable and resettable. + """ + + +class UnexpectedAlertPresentException(WebDriverException): + """Thrown when an unexpected alert has appeared. + + Usually raised when an unexpected modal is blocking the webdriver + from executing commands. + """ + + def __init__( + self, + msg: Optional[str] = None, + screen: Optional[str] = None, + stacktrace: Optional[Sequence[str]] = None, + alert_text: Optional[str] = None, + ) -> None: + super().__init__(msg, screen, stacktrace) + self.alert_text = alert_text + + def __str__(self) -> str: + return f"Alert Text: {self.alert_text}\n{super().__str__()}" + + +class NoAlertPresentException(WebDriverException): + """Thrown when switching to no presented alert. + + This can be caused by calling an operation on the Alert() class when + an alert is not yet on the screen. + """ + + +class ElementNotVisibleException(InvalidElementStateException): + """Thrown when an element is present on the DOM, but it is not visible, and + so is not able to be interacted with. + + Most commonly encountered when trying to click or read text of an + element that is hidden from view. + """ + + +class ElementNotInteractableException(InvalidElementStateException): + """Thrown when an element is present in the DOM but interactions with that + element will hit another element due to paint order.""" + + +class ElementNotSelectableException(InvalidElementStateException): + """Thrown when trying to select an unselectable element. + + For example, selecting a 'script' element. + """ + + +class InvalidCookieDomainException(WebDriverException): + """Thrown when attempting to add a cookie under a different domain than the + current URL.""" + + +class UnableToSetCookieException(WebDriverException): + """Thrown when a driver fails to set a cookie.""" + + +class TimeoutException(WebDriverException): + """Thrown when a command does not complete in enough time.""" + + +class MoveTargetOutOfBoundsException(WebDriverException): + """Thrown when the target provided to the `ActionsChains` move() method is + invalid, i.e. out of document.""" + + +class UnexpectedTagNameException(WebDriverException): + """Thrown when a support class did not get an expected web element.""" + + +class InvalidSelectorException(WebDriverException): + """Thrown when the selector which is used to find an element does not + return a WebElement. + + Currently this only happens when the selector is an xpath expression + and it is either syntactically invalid (i.e. it is not a xpath + expression) or the expression does not select WebElements (e.g. + "count(//input)"). + """ + + def __init__( + self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None + ) -> None: + with_support = f"{msg}; {SUPPORT_MSG} {ERROR_URL}#invalid-selector-exception" + + super().__init__(with_support, screen, stacktrace) + + +class ImeNotAvailableException(WebDriverException): + """Thrown when IME support is not available. + + This exception is thrown for every IME-related method call if IME + support is not available on the machine. + """ + + +class ImeActivationFailedException(WebDriverException): + """Thrown when activating an IME engine has failed.""" + + +class InvalidArgumentException(WebDriverException): + """The arguments passed to a command are either invalid or malformed.""" + + +class JavascriptException(WebDriverException): + """An error occurred while executing JavaScript supplied by the user.""" + + +class NoSuchCookieException(WebDriverException): + """No cookie matching the given path name was found amongst the associated + cookies of the current browsing context's active document.""" + + +class ScreenshotException(WebDriverException): + """A screen capture was made impossible.""" + + +class ElementClickInterceptedException(WebDriverException): + """The Element Click command could not be completed because the element + receiving the events is obscuring the element that was requested to be + clicked.""" + + +class InsecureCertificateException(WebDriverException): + """Navigation caused the user agent to hit a certificate warning, which is + usually the result of an expired or invalid TLS certificate.""" + + +class InvalidCoordinatesException(WebDriverException): + """The coordinates provided to an interaction's operation are invalid.""" + + +class InvalidSessionIdException(WebDriverException): + """Occurs if the given session id is not in the list of active sessions, + meaning the session either does not exist or that it's not active.""" + + +class SessionNotCreatedException(WebDriverException): + """A new session could not be created.""" + + +class UnknownMethodException(WebDriverException): + """The requested command matched a known URL but did not match any methods + for that URL.""" + + +class NoSuchDriverException(WebDriverException): + """Raised when driver is not specified and cannot be located.""" + + def __init__( + self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None + ) -> None: + with_support = f"{msg}; {SUPPORT_MSG} {ERROR_URL}/driver_location" + + super().__init__(with_support, screen, stacktrace) + + +class DetachedShadowRootException(WebDriverException): + """Raised when referenced shadow root is no longer attached to the DOM.""" diff --git a/env/lib/python3.12/site-packages/selenium/py.typed b/env/lib/python3.12/site-packages/selenium/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/selenium/types.py b/env/lib/python3.12/site-packages/selenium/types.py new file mode 100755 index 0000000..a776904 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/types.py @@ -0,0 +1,25 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Selenium type definitions.""" + +import typing + +AnyKey = typing.Union[str, int, float] +WaitExcTypes = typing.Iterable[typing.Type[Exception]] + +# Service Types +SubprocessStdAlias = typing.Union[int, str, typing.IO[typing.Any]] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/__init__.py new file mode 100755 index 0000000..8880c5a --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/__init__.py @@ -0,0 +1,79 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from .chrome.options import Options as ChromeOptions # noqa +from .chrome.service import Service as ChromeService # noqa +from .chrome.webdriver import WebDriver as Chrome # noqa +from .common.action_chains import ActionChains # noqa +from .common.desired_capabilities import DesiredCapabilities # noqa +from .common.keys import Keys # noqa +from .common.proxy import Proxy # noqa +from .edge.options import Options as EdgeOptions # noqa +from .edge.service import Service as EdgeService # noqa +from .edge.webdriver import WebDriver as ChromiumEdge # noqa +from .edge.webdriver import WebDriver as Edge # noqa +from .firefox.firefox_profile import FirefoxProfile # noqa +from .firefox.options import Options as FirefoxOptions # noqa +from .firefox.service import Service as FirefoxService # noqa +from .firefox.webdriver import WebDriver as Firefox # noqa +from .ie.options import Options as IeOptions # noqa +from .ie.service import Service as IeService # noqa +from .ie.webdriver import WebDriver as Ie # noqa +from .remote.webdriver import WebDriver as Remote # noqa +from .safari.options import Options as SafariOptions +from .safari.service import Service as SafariService # noqa +from .safari.webdriver import WebDriver as Safari # noqa +from .webkitgtk.options import Options as WebKitGTKOptions # noqa +from .webkitgtk.service import Service as WebKitGTKService # noqa +from .webkitgtk.webdriver import WebDriver as WebKitGTK # noqa +from .wpewebkit.options import Options as WPEWebKitOptions # noqa +from .wpewebkit.service import Service as WPEWebKitService # noqa +from .wpewebkit.webdriver import WebDriver as WPEWebKit # noqa + +__version__ = "4.27.1" + +# We need an explicit __all__ because the above won't otherwise be exported. +__all__ = [ + "Firefox", + "FirefoxProfile", + "FirefoxOptions", + "FirefoxService", + "Chrome", + "ChromeOptions", + "ChromeService", + "Ie", + "IeOptions", + "IeService", + "Edge", + "ChromiumEdge", + "EdgeOptions", + "EdgeService", + "Safari", + "SafariOptions", + "SafariService", + "WebKitGTK", + "WebKitGTKOptions", + "WebKitGTKService", + "WPEWebKit", + "WPEWebKitOptions", + "WPEWebKitService", + "Remote", + "DesiredCapabilities", + "ActionChains", + "Proxy", + "Keys", +] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a6b4726ec09348f87f1195ec62b927098ad142d GIT binary patch literal 1743 zcmZ9M-EPxJ6vxL&nly=%rr(sdw0!Kc0b)08p)6Dgwq;9I3DB|!*&)5}_HS?cye&@`|oU#9@)hY;n@9jVOU#kfH z%NOdGlj74W4WU1gi(HK&rdc_S>m1Fqf;A;{o)%fjnijf1%dBEmgr1^RrdztuMOtHZ zt1fhj&aj5n5L%tRN z0&`n3cYxWG%w1r923@x9^^sfoOSA4zs!jbrIAzq-qSCWbNW5Xdh#AaUh15w9e0S=L`&~CrCQ!7r3XvJq;Q28h2dLSbvK9 z>fE=`^%(Pph9mlHcSWPczR{|5xk=0I?zx_e@}jCFPNDmv!bq2v5x)nb@<_*U+-bc_ zeAC3F3SH)=x}dTO7kPyX+_T(Eu96{V8*=kIm0X}1NBb+$XOdH?XRi@1(Q_5$VE^$xQw&8OSz=y!Lqmpeql-l;+ z=o9$RmytPuH`HX~fy0>NnulI@%iA#nFOt8z1D%}ViOO~OiDWD zXc7**;f~SXHUkpk*2w9eI(;0N0j78eudA8XVcIqslF+t|(IlGQXP!Hz_<{cm6u>`b zK_7Hd`5S0YpixE6~ XV&vjOed%5GV{yHjdtdS&!d~A1=qMTc literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__init__.py new file mode 100755 index 0000000..a5b1e6f --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afcc59358d16f361e069b2554033c8f2696e5e0c GIT binary patch literal 216 zcmX@j%ge<81dZ`A>B7tm439w^bnux4C^DU)l0lQvZzV$!6Oi{Aq~=$-enx(7s(x;1 zMq+MmVv4>?esXDUYFHesV?;$d>r{%)HE! m_;|g7%3B;Zx%nxjIjMF>_G1{efOD z53Gshw*FF%i>19jD&jl~6R@4tO`fN5nbt7@p;K#2#GKL9a1;*WBrakmqI#cNw;Sj1 z1{mK!Squf3qCjIh#mpFLRNFNkG?N0ejnqSJYA}nn&OjVWn_1S8g{eNYZ=)fmt=(<_ z)|WVFUq^0Rwwl_c#aU7EEW*v+YS7?Sw`>q9RIHMlD)T?NIm7dX_^i)t2*#L7~kW&=y?zB z7~AMu$Zz9qZTpCg7)=mYoOd;8igLub?6NEzB#fjvFpjw?qU;c6a7kizbfC;X? zbu!9Ruer8YgWvDF9cdGig()LMb_kS5OQ@2_h~IxxFa4V%k*^lt>ip^mJ%DlqM! z3o8c~yo2{HK5kp)HT>I|b9;;T=BK7|rWSg8aqrT--n3P@Hafkqr+@d=w3-TQJ9GaW zQ<=v|=?a7D?7rKQRxugH*+zYV#ThldBWl*@09(C=oLsR%das(9r)i!6HLD-WOT?|d zv+B(Is6JnHQraKZ7_aa}aMcGV-T^h$F~(2NBYgHxbop1*e_|cO*YNH9DN}io}F#?hnZcc zG4dfuk)Q_-98fuO1eO1U3qI8vQ3(lg;N~igs5te_u8kn=tn}uac{97;`@XloRI3)j z@g@6g5F3R2p%%-bFTnXn2p$klI1NZh9ZD501cgv@v;$mt&4gP4h3cXi{k&3{yXj+yHTH9}-^x@3=#^=Ldf3LxS5Iog)#4{wO?z zFixQpM-h1H66PwMz=tTsy}m#2@(<*3WwAK#Blrrr192!PP64z#=6?_7nA17}M=ulg z@G{rH;6*5L9ZV>x9M)h$IYT90=v!ZtKIP_F)j@PZos~~W(~?&*u5g*DT7LTN54DpWBvi&9TULlDwr%#Zw(F`Lzmn8u{R3Q{KUTLr?*Budv|B2weOCT z)pMKbFR+M5&QO2ajSQztBpm2q;&qr>MXM{3S8l78* z2OocsX)3iO6|&fi<3Olx5K6p^w5%=^^&kisYf^CqQwhazL#(S)nK3G;22WfJ&(6rK z_SU0XYg%jl7*1<@r?=-8*=)?V-=6Kf`($NRw|?K;n(H{v4f0xjUQ);;>s#Na-$wJY zT3KYH@k3?0-kPi9^9r$6|E?l>LNJJp<%he?vNY21(2oWgak;iMrv0xmdAY3@6Yb0~ zG_n1HXF~lWa{DEB@}uql{aLwON`s$B&P^#J&AnXz_r*0_D#?-thPg&5y?B$*%|FTY X$K>!ax$)F^g<8M9{@w+_IeWu%p*U_y literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/service.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..361cc78cdd023b60f158d90c632a20d05fe771f9 GIT binary patch literal 1920 zcmZ`)&2Jk;6rWvxJGPUi3277}4TS(!Yi|mohzKgG1hq)PL2}!Jg}T}7j_qysi<#M^ zMn)=9B$5Ll4k#cY0TL3exa9xf3pK=Bwj^6_$daHFR>Dp;k`j{94P+$ukdY$E zd!f~lq3Hc{B6>H{9jToDQ!ur%6inCsEswf7VXV%L>z1i8kY*U6JEl(bNGIA0F*7^@ z;!_BTpoV0ihHOZUL=KI9M$Sl(q>&`4dn1i8DB2(6Fnk7-=S25D-(#UVELKVF3A*oo&-zJlL}{WRbxQK3kE2fNN$ zW6OBAO(+SyyB?uhm>lacPHenuLVO0%O@ma&bBQ}b)o6>Y;FmW%Zn}^tLFWI6bY=8F!Z3QeB^WKIAs$%yc+F=;SjeA z*)?(f*4oDHTguuycWSrS*DnK39sKS_RBcBm7;vm}Dm;dThq#)ibv8ZX?3{7*o;E@m z!;wi{#|DphN28{|lbzJsA-gypptDupbXhf4g|-lY)qgegQUe5tN0ncz5wy&f^#HG>cL8gm7OTy&HU8yT~6WwGtWk}zqy6GRK&m{?UP&rX6 zr-I4TN{8J@Ghl(jt%InrPQ{(^2$kg^#e8UrAgijTV{%n3XM-doR+ARRXHU@z(%ZWN z{UE2R;WVi#6Lv+;upa!gqqJc}6x(lWwyhb;nydSwoJ_f4@|*saa%FkBvZi%dWusYH zbq%6G9TdylQoIgtyUwfCE3YWbsacUh1El?awdu=br0Noj;xc*`RgG;6UzcDBzhjcVFLZPskjZPXp?Z869*r| z_GAwo%h^d&o`3H4Q!W&F)HeLPp}vn_u6)_q}iCmvXs; zpnXlh=>BRT^rs$7T0V77J_F|oVu)c6`M8C#_A_3_&$hDQXIak6`T15p_VZrBH(CZp z8MKO6VGl8bwfI60syLc!^rZ0JfxjZ%Z7yNvtrf0Z$yvkh+ill#Lzk-; zIN5Ei_d{0%3bq*=TyDD#cM{aZ7SqAWZE(JUfH`VmhFTehTiGJgKW4Hl&#@fOvpg@b z0?TyFebm9s*ekb;eYA^P<_4-3qvCzuPJ()Pry+t+3Qv)+$4MM9PnL)sFk*Y2*imFC z1|$@O=|tj$LMBpo4152E$lpnJZeX>!Ev#6=G{XS(uzTPebKLunJnL)-P#`LCQ69HPA6 zpcU-$=c@T=R||lV%5~A*wIWXw5ILzDAyID zTg^wa=_C#GYBV<;sF@^8j88YlpYv zizcl^Bxe)#{!m_m7#?1nUf}v9mqnOYt6*L}LdT2f-D^Kwe|r6(x^Fyt=jz1$%Pc=O z4$Xz%Dbib4_Vf zqSO~`;AwxB(k}$PzSmFE7P z0q+=rks2z-Y(fs#CIr`~1lMDNf%CH|so$BX{-(Xc_eD@=$rDbUb8mR8qeM4x^0EA4 z+3Bo)LP;Px&B(l+(050E07IR>B4EZ@jPdDJgqQJi)chMQK1YlH6fWb^_j9KRx)|Yq DyhGm* literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/options.py b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/options.py new file mode 100755 index 0000000..c036510 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/options.py @@ -0,0 +1,35 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Optional + +from selenium.webdriver.chromium.options import ChromiumOptions +from selenium.webdriver.common.desired_capabilities import DesiredCapabilities + + +class Options(ChromiumOptions): + @property + def default_capabilities(self) -> dict: + return DesiredCapabilities.CHROME.copy() + + def enable_mobile( + self, + android_package: Optional[str] = "com.android.chrome", + android_activity: Optional[str] = None, + device_serial: Optional[str] = None, + ) -> None: + super().enable_mobile(android_package, android_activity, device_serial) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/remote_connection.py b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/remote_connection.py new file mode 100755 index 0000000..1aa34db --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/remote_connection.py @@ -0,0 +1,42 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import Optional + +from selenium.webdriver import DesiredCapabilities +from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection +from selenium.webdriver.remote.client_config import ClientConfig + + +class ChromeRemoteConnection(ChromiumRemoteConnection): + browser_name = DesiredCapabilities.CHROME["browserName"] + + def __init__( + self, + remote_server_addr: str, + keep_alive: bool = True, + ignore_proxy: Optional[bool] = False, + client_config: Optional[ClientConfig] = None, + ) -> None: + super().__init__( + remote_server_addr=remote_server_addr, + vendor_prefix="goog", + browser_name=ChromeRemoteConnection.browser_name, + keep_alive=keep_alive, + ignore_proxy=ignore_proxy, + client_config=client_config, + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/service.py b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/service.py new file mode 100755 index 0000000..e151f76 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/service.py @@ -0,0 +1,50 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import typing + +from selenium.types import SubprocessStdAlias +from selenium.webdriver.chromium import service + + +class Service(service.ChromiumService): + """A Service class that is responsible for the starting and stopping of + `chromedriver`. + + :param executable_path: install path of the chromedriver executable, defaults to `chromedriver`. + :param port: Port for the service to run on, defaults to 0 where the operating system will decide. + :param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. + :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. + :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. + """ + + def __init__( + self, + executable_path=None, + port: int = 0, + service_args: typing.Optional[typing.List[str]] = None, + log_output: SubprocessStdAlias = None, + env: typing.Optional[typing.Mapping[str, str]] = None, + **kwargs, + ) -> None: + super().__init__( + executable_path=executable_path, + port=port, + service_args=service_args, + log_output=log_output, + env=env, + **kwargs, + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py new file mode 100755 index 0000000..5fb9583 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py @@ -0,0 +1,51 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from selenium.webdriver.chromium.webdriver import ChromiumDriver +from selenium.webdriver.common.desired_capabilities import DesiredCapabilities + +from .options import Options +from .service import Service + + +class WebDriver(ChromiumDriver): + """Controls the ChromeDriver and allows you to drive the browser.""" + + def __init__( + self, + options: Options = None, + service: Service = None, + keep_alive: bool = True, + ) -> None: + """Creates a new instance of the chrome driver. Starts the service and + then creates new instance of chrome driver. + + :Args: + - options - this takes an instance of ChromeOptions + - service - Service object for handling the browser driver if you need to pass extra details + - keep_alive - Whether to configure ChromeRemoteConnection to use HTTP keep-alive. + """ + service = service if service else Service() + options = options if options else Options() + + super().__init__( + browser_name=DesiredCapabilities.CHROME["browserName"], + vendor_prefix="goog", + options=options, + service=service, + keep_alive=keep_alive, + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__init__.py new file mode 100755 index 0000000..a5b1e6f --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45af7ea7aea09b34a51b2f84ea5dd30cb3e2ae01 GIT binary patch literal 218 zcmZ8cI|>3Z6iobp2v(lLVtuZ*VxypyUO))h-KQJeBuhR@N>AY#Jc~E5^#o#PWwv!- zU}l(N<}n!bNyL@ykHa=0ug3i2(}~HA1Tv!AJ29>3K27HvpwtpU`jSh@3s~vgOH|In zTDXnRAe~H-6%RJq9g?Lk5Kx_=5*gINm0Hcl=@hJRnAAK!@grKWSfLVL!UeO!h%*|< lOQU5IF(#C7jE(E??9HVve1!|sjZ0{xZN$4xDK+s3`2mB-JI(+A literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/options.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b469acb1e2401051e27de5433dbbcaee0e34dde GIT binary patch literal 7229 zcmb_hZA@F&89vv(HpUoizLJpeaUl@mG}xqpd^O8LfVSCEGZES*w3T)7y@09h>z#WY zVvn?0lxaljl>V8LN|Q>aNllb$>(Bn|{&ku(*@4dJE|n^+`>}ssXw@pe_P*zSV2rb5 z(++UXd%oU#&U>Es;~f56U+*Q5eja^uZej-^f5(cITqd#c4iLA9L?kXjrj3%D=AiCK zIFin3Cx>lLp!sQ@(LB(uX&0kiK)a{ijCKQEGhM^znuI4=J6+3YPr{q5o37)CgSUAEFROaJQr87^h~6+xRMeRK)YT| z0SQF&n5@RBERBk3aVDOKYjIhHX731{Glr`%<3mPXYgRTQ93j7ieai&*I_;3SX{Xe@ zOlCQWzwVpnWtZfT-LnqKb)CO&PMWTfYZe0K>gQ7gOKU>I=n zl=XRK?^8I{ZW)c7>TFKlvOb>#?dI2g*ZJxCvU)w#8`w_#@co9eSpmrpv)po{?3SBk zzs;M+wK8sQDFCyZ;k!7u5$G11Q&SnI)@5>;o8EDr1Y30f=sZ=D@l4VbeXeOvQRYs> zuvIqObT^f?3{6F1Z~}HhG~nOHJY>J-ZV}Dyy1^}xUjbUJQvggsOVnWvm?Ka#(L@NV z@m60P`z)jbj-lqZ`m!YGi0C9(qr22hTBf=u8jYvoS~RK$qB9JJ(S#Bc5p&QYU)JQ5 z3UqWfo{&|&ZnH(zTcH9h;z>EBiHWGffU4?^QAwW3%+1L(DoPTSRW<0)c~wr#>b22m zEFr3DG^*lGgsYD)hvz{`;bdlBOeRGsJf_4l$WINw6xUwP%!CgO4i1coS#@Ayc3@PI z7GrOVbFvzSFUcu5j_{&9BhmOJnTFX}V3WDV zP&!Ky(z#s~XBV=h(G9)o5y-y3N*;RZZ`2e#yVg9r*ZcaH`87|+`f~$DxohFFAH=Rz-f zL~Z%^N^R9_ zoPtDbl)_Xq-8bi7$V^VwnVSL=5`Y9X zIswK~Jz-ac0fBAigpd}sd1Qyew!~vHu}4ROF5Mef<0(}WQ!!b0g6Q?yscc#v zr&OVO>zT8Wk;#kEa}%Q@Q)ee4(ecU2iAm#F9PC(V2kg+$0^@LKJ2X7?KtedHAF`|D zn+6iteY@{>&1?R?hfRBKj}_aG6xxrhHXY6Tj;;%R2*eI{PX8kik8A~^smvA*shm_a zS&-yQnxZ6B!IA~SuN4+Z_ux{?z!#`A3prc7rj-m;jyR4iw!p8i;P1a+*{HD*C66(?WXnugj3*L;Mze^! zn377#F%3y6g9?obF2*##udpb_wP(R_+47!rPC|SZ7-xn3^NOma#H9SjiL^qsw}SR^ zbKPU6As0prLoOsUswT|9_Dx$83G%cH1WpCax-nyCzZa-2;O>Klr=RyJoYn&wpgXVy z-TC$(t~Q;{`%bTS?_(BrJFshD9NVu z%rr*c0yVqh)Q}@fOHPTmY}PQj!Y?@%teDCg0;Pk1jp8jdStWRG7yelDIr82hPnPi8 zEKV(B0AvpS&Xc|55U9?ggCiFS2S4wfz3jY57P+81_rj)9j(|;r;{d-Pr()n5CBb&r zDg&MYD>$x%B0_gauSG8&l|)UXKKRfUyMTgdhQEzj$jTLHpo{;c`A#N?v`ZS9hjBo5%CMal_L&=u9N&rid>C>rFuEyponvx?4;`AyJfG&}CS6w9|T%c`oHa zQ?0!;otsrrh|C`u{@H7Hs=3`y-qVj@mP#Q5uk7J#U*vvsxkRx1cyxo6B_HV&@(`}H zbrjn|Yi*(Bvkx0v-;b}ftTpbt+r1v>DF%XtK=5AwC*AiCtObU@bCRb1eB-{7lk5(c zJS5PwGFI#zD!{LQDDN5iuEywptk%J2f4^&_%k{@D*U0`_dKl_k0s!0+Q$qo4KLk1) zy|$@{)v#0zNl%$k1y@V98Mn}P#qks_RaAJ%Va=xP)fIH19`;v}HfM1p>(u;K_a@e_ zaTn$F1r$;*81&fPGp_Nw6iVyBQ0WqJGgskm)rO=Z&Ds`x-`@j1D>t zHAD320ec-$O~E^diueP;7)n(SEt?vc>!{SLE!}UxOmz;jtK?q|#Mk<;tNX*n4;DXs z_k(vorhizxw^$616v88)1y{r8R=Zxw``RD+8*eV&SiJepjd${$p*4Sa9m3>5Um?&} z3>+*34(11b@I~O%*E>4$oujKe#`1x&ubbNQ9YL@R?=E=&Op1%3*IKH^YB0gsl4lMPGZt z*IxAPE%?BZeBldiKVkD419J)ZbMu6sdKElb?(8La7{Zqzh!WA|mtDOD^I9v+DpZJ> zuMr`*|FyuEw#DHs7>Cc(C9P<~>2fN%9y*#>!!7gBgQ505e8C zKvkwC?j$s^JKb*?H1SHieS>hji^t}LxC*9HHSFK!cAtE+6L49^Wx5(u>GJo~ptzqX`j4YylW&R5_L{j4t73g%dpT;*m?_f(I9;R{tp-!~P2!_cux z+`9yCk%$54#mKZGQGfMznB_2MHB?N2D)c(d-YV~xjAxa0n8mYM4t#M~KtEKGST6_R zt1Fipg%DMfRY3$-xA_)p7*P@LbT*32kbGW*Yut=1r|`MLM%@$i+_1&)f(36~__9NX zVJQ$Pvv)e32REzge(TZEp6A`nKT%7nek%} z54tyMIc=5p;Y8<;$1j=~2PVKzZ(ydyX0p}G`oZ;>%Av2$rZsu;} zmU$MjK3`~izSwrO&~|jS?f7!TdY!*m*ZH8XbKSSQ=<6={x>tIOJ;Q~b;Wgip_5SBR zdiTz|%MI@@6+FFcXxD?fE@&?HzfkCZVL5X9Si#r3-re_6*PSjHcB$a$WW$69bppKC z6$i%)gX7DQ{GNja-@sRG@W8h`b@RfF3pX0R@;5KnZC5qC523nkppz+owEb^Y3!nSY zZFzu??jC)4a^jV7iuaT4Hd~Ts#Y{rmD&lQ6yV|H*z)#%?*;Vqjzo+O&i(T}G3jWZl ze=zSEWcveGiE0-K?!*USw21H^?2Sf~ij)D^M0H;@`qPYDJItu#L(P;5A@ z2Ds$7TZ^te1=pUE!{gewa=t{MxI6U-3mn(Z+Dk3wjD0Kn?;gH0fNWSd?pe0 z3oaO5>*`;Ll?W7frAJsGn-11q+QHZ~xQ1_!tu%jd_7MTnTn$hqp}}>0MJ++=@w?gv z7A3(8G&Di+2{b`b+GVcgzzXnpxDMFcIZ*P{xDMSNEfFX_b$uH9?C|IO=TiRsYk!L8 zPrY6^c7gTe-x4=)M5!s@YFTO7AW)Qg8B@-62$@2`n115`ia~>kH&{;(ps0^Qrn|Ll z8my6V8RoH>oi96Xc9bFO2|i>$!G~f>GO48Cg^&H?Y734H{C7Wjk{RAmys)w5+#|-) z*rT@Rq=C{?REB=^GwL8@B`3#m8@+^U_#3JHlI;1C>}0<{?D_|Zd`XUd7%Q6rT0^XYJT=+O#BYk~$4dQ-{Xe0s@KOqNJ3fHmTZ_gJ~HyJCkG^@2;6$ zr-|iA1yv%IK)?YN1PCN9pjLuojyWQ@YyrV)BqSunftyQPggEhLcb$;Xj^)|+H}l^6 z=FOY$a=8qG@j5;~_f-c%zX_&25)pCx86d79f{0W_rc{w6LC2~wQ?AGXEmz}aqLPqM z3>`-#eg%;POgM)XCizYlgoho<7AeCTA&lo1sYPst zYmCksOFTQn>`S1>mS$3(S)jCrwW_g5dDfV-Y(~M*URvfkJ;)sELFzoos9R^2o{CZw zAA!C=@bNDz*!-vNvv}I>(YIbbg zCRC-?qFOa()Y`H;Z(EO)k36h85ban^(-*Wk>ZlMVwV>wIOLT@XC>N&cQ5mWmdA2V_ zxwg!@A*RN@`;}_Bja4t0Idz!+zKmKsQQ^R!C|1ba==Y09)-HNy&fSq?qnXv*og_+k zUQOLpdi}z%zh|VCK?t?eG4}LN5L-*sWioa**)AEPq zpZ1JieQ|aC-QE7s$m+y9lUFA{c;x$R@s^DG9=Z*Vk-kxpz=$gx)U>Do=qM725xA}- zL6RiZls-a4`9z+Lk#xjmws0K**S5@V;c{EJ&MjO%;JQA}uEd%#xa2z~OEDflJ#}`v zF#^y#4s;rIe?*)ho6uLax~0!!tyY7=EJDbQ;=SylJWV6m#fj|xQSW89aikV?FWGEC z+=Fm{nA&Sq{YP=JCo!$hC?*e`@!~%ML1O?v(vHxG%L*S0M^#6(- zQTpSgHXh!5uD}jwMe;lk)CrOGsW54t1(!lKZJ%=}-|dJjC&DC8wR7Y<0`asqvnlFu z0EY1}sV_zI>H)BsXevCvaYMttM3A9JlDBb_2Zd*JC=FaCZT}HnaPWpRK z`1`TH{}q3P_(KQ1Lr2#K*7M&qz0vdDz6*X~uQ&AA*DGJ!>)0DS=k>ni4-R{!r`OCi z?48uT5#kl8Kk%S8^5oj7wP(E-u{Zpx*RS~p4ta+s)-SA2d1q^0`898tZEo&O&3mJU zx9_6gKja;FV(sZQ)jRRBxBtA?ci~nc*Oyt%xB5|6(Np%a0f@6CPd`6d%833f-aL$X z24mAE^{Sw=7{6B6s*y%^T*l)wwq0ccqoBVBtt>!^=c1mg(`pstlEnH17~&;58e%D) zMzgY=&gKr;^43S#a05ott9I0Yo!FGpq@Rgw4gF*ccIlG zs4VI!e&D`mwQ_>%M7@KbWpDP3wZs;!E|lrKy921dM)QeckZ0g`vXtUUcew_Y9b~{q z+MT<+(YedviI%s#@ZnST(EY79%AnolnRx#Lr%V-;z&b#ID^G>+KEs{>nSjR;%9boi c(%m5>_5Y5J{(@e(lN^?cUQxY^;2SLe7xdljy#N3J literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/service.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe8dce2ec3aea96a724146754988f8a3e5d28a00 GIT binary patch literal 2689 zcmaJ@?{5=j9DlC8w%4xR2HS+mhKED+l(rxNVh1QNekHIO2ADL)^VWO19lPGu=eaUE zYrup=NL1j30i#ARB+T%J|HC({A)&cQLL$EKUCA^WU-|vsUAtD%XWMh%=lMR*_w)Vz z?1xk;L128WzB_vrsGo7s8j*ll$pdkN=tLJxlE-hz6iT6dNI*JlhD%~z^k~tHl%n~l zKtkjQ(Ic0L9;MNLQKkk!Py~yZxP_ zeVU5HK;R#k6W3$^d3W$xcd1wmweL%SAJ;?0-piyY=!r|Ie2*UgKh$DK@3|!Alb6YP zA)lHiO3Lj!ILGXgQ7KLP&d`b>LiWqSN-mfh=dv@WIkLfJMtRw`xG`f=xo9)kr!sdm z<`~wjtXVoN>~a|wz)8q3-k~!S%s5AxY*=v8Dp1)jdiPqmK0A}}j_1l6(@HWuPYV@C z0~oceIdeJxvT4e=Y6)09l$Ipi5hv{8#rai0L6{lPQ+d9Au%YmSjAuiN%KyMqYE6UTS zCZ@vRVhS_Z%wa#?`ozVQaf^=XR%(hB^ zD4)}qfnnlpUt4rR4oa=t%kSGf6I^}YH*M1GTaBR?XjjDOxyerFx`|cW-7rXS2Xrr^ zyc;TPsPnYyMj3S~%qqk>swNI}5B#n43xs?j+#t2^d4WTtnI$!%whz{#{;n>36m^1D zLP$+?#MY5}P!l-VmKr(hlU?)KPSk*-hic+i^dLoUOOo~jpK?`BcF{xKM`v}EmVtuj*`#moNG}%{B@)jyCZxq2&77s2>5^ckb3aw z$*B{ECQcqZbLiw^PdW|WPGef^RU!<U%zB!(Kh34^x^+YNJvxlu?I zYU%!2bfz2O6(}lKQdPq;9931~uE?ob?2wM4{2Lw)Lb%cS1uP*quBu)WQdN$cU{k?y z@vrmQIlDx&rOKREDrtIl!Y))WDS7sY;T)~ZWVdhImY&e6JUvxRAGCFvg?hqM`ru$S#CHK%q`4ovy^8+Eown8%r4LwKgqI%pgjW5dn_{LDtiv}SX|#~U_q&eZxKD?j1zjgVgHyv zzTC2uV;kU<5}jnI>m&@N7jw_jN>o+dgsPToy#f!5>Lyk7gNkMboS3TWc0pCy0NiuK z&{^H6Q^m*3m0I216|uWBtYJ46v_vl(*eGtLf>bR~(}X-17{1h=>2GqAX z!Sv@P@-!qxq~>}eZ*B|@HFEnJO1kmJ-p1I=Py0q9iO0hu%?Ny(QPQ`z8AD1U>qc+b z*X>)yyYsi_?~m2D?5aPvyBSAbf(*Uf>_I9?dIztnSJazlzJ2e@_m&RcA6PnCAKh6` z?P{iw-%B=bY9c~&ElKqLK7iC7Au@hz*WK~k<4e3gw&M>1YtNsa(n_3RZo47FW?p6Y zw(2DVj-uT6%W!+MT|^lSr)@F(7toCb_2N5Y4Q%-cUT#Qx{OIgsTY-T|!x6F>76f7C eMI!V*B16BB^dpk~E&8f3er*>0@H+w06Y@9WSG#Zk literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/webdriver.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/__pycache__/webdriver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9285ff179157865a1d043cb46da344d502b6a88 GIT binary patch literal 9034 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 Zc>ZJI^vA-)=aGCsB!4Y^Az;nX{4Yr None: + super().__init__() + self._binary_location: str = "" + self._extension_files: List[str] = [] + self._extensions: List[str] = [] + self._experimental_options: Dict[str, Union[str, int, dict, List[str]]] = {} + self._debugger_address: Optional[str] = None + + @property + def binary_location(self) -> str: + """:Returns: The location of the binary, otherwise an empty string.""" + return self._binary_location + + @binary_location.setter + def binary_location(self, value: str) -> None: + """Allows you to set where the chromium binary lives. + + :Args: + - value: path to the Chromium binary + """ + if not isinstance(value, str): + raise TypeError(self.BINARY_LOCATION_ERROR) + self._binary_location = value + + @property + def debugger_address(self) -> Optional[str]: + """:Returns: The address of the remote devtools instance.""" + return self._debugger_address + + @debugger_address.setter + def debugger_address(self, value: str) -> None: + """Allows you to set the address of the remote devtools instance that + the ChromeDriver instance will try to connect to during an active wait. + + :Args: + - value: address of remote devtools instance if any (hostname[:port]) + """ + if not isinstance(value, str): + raise TypeError("Debugger Address must be a string") + self._debugger_address = value + + @property + def extensions(self) -> List[str]: + """:Returns: A list of encoded extensions that will be loaded.""" + + def _decode(file_data: BinaryIO) -> str: + # Should not use base64.encodestring() which inserts newlines every + # 76 characters (per RFC 1521). Chromedriver has to remove those + # unnecessary newlines before decoding, causing performance hit. + return base64.b64encode(file_data.read()).decode("utf-8") + + encoded_extensions = [] + for extension in self._extension_files: + with open(extension, "rb") as f: + encoded_extensions.append(_decode(f)) + + return encoded_extensions + self._extensions + + def add_extension(self, extension: str) -> None: + """Adds the path to the extension to a list that will be used to + extract it to the ChromeDriver. + + :Args: + - extension: path to the \\*.crx file + """ + if extension: + extension_to_add = os.path.abspath(os.path.expanduser(extension)) + if os.path.exists(extension_to_add): + self._extension_files.append(extension_to_add) + else: + raise OSError("Path to the extension doesn't exist") + else: + raise ValueError("argument can not be null") + + def add_encoded_extension(self, extension: str) -> None: + """Adds Base64 encoded string with extension data to a list that will + be used to extract it to the ChromeDriver. + + :Args: + - extension: Base64 encoded string with extension data + """ + if extension: + self._extensions.append(extension) + else: + raise ValueError("argument can not be null") + + @property + def experimental_options(self) -> dict: + """:Returns: A dictionary of experimental options for chromium.""" + return self._experimental_options + + def add_experimental_option(self, name: str, value: Union[str, int, dict, List[str]]) -> None: + """Adds an experimental option which is passed to chromium. + + :Args: + name: The experimental option name. + value: The option value. + """ + self._experimental_options[name] = value + + def to_capabilities(self) -> dict: + """Creates a capabilities with all the options that have been set + :Returns: A dictionary with everything.""" + caps = self._caps + chrome_options = self.experimental_options.copy() + if self.mobile_options: + chrome_options.update(self.mobile_options) + chrome_options["extensions"] = self.extensions + if self.binary_location: + chrome_options["binary"] = self.binary_location + chrome_options["args"] = self._arguments + if self.debugger_address: + chrome_options["debuggerAddress"] = self.debugger_address + + caps[self.KEY] = chrome_options + + return caps + + @property + def default_capabilities(self) -> dict: + return DesiredCapabilities.CHROME.copy() diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/remote_connection.py b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/remote_connection.py new file mode 100755 index 0000000..ea532cb --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/remote_connection.py @@ -0,0 +1,60 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Optional + +from selenium.webdriver.remote.client_config import ClientConfig +from selenium.webdriver.remote.remote_connection import RemoteConnection + + +class ChromiumRemoteConnection(RemoteConnection): + def __init__( + self, + remote_server_addr: str, + vendor_prefix: str, + browser_name: str, + keep_alive: bool = True, + ignore_proxy: Optional[bool] = False, + client_config: Optional[ClientConfig] = None, + ) -> None: + client_config = client_config or ClientConfig( + remote_server_addr=remote_server_addr, keep_alive=keep_alive, timeout=120 + ) + super().__init__( + ignore_proxy=ignore_proxy, + client_config=client_config, + ) + self.browser_name = browser_name + commands = self._remote_commands(vendor_prefix) + for key, value in commands.items(): + self._commands[key] = value + + def _remote_commands(self, vendor_prefix): + remote_commands = { + "launchApp": ("POST", "/session/$sessionId/chromium/launch_app"), + "setPermissions": ("POST", "/session/$sessionId/permissions"), + "setNetworkConditions": ("POST", "/session/$sessionId/chromium/network_conditions"), + "getNetworkConditions": ("GET", "/session/$sessionId/chromium/network_conditions"), + "deleteNetworkConditions": ("DELETE", "/session/$sessionId/chromium/network_conditions"), + "executeCdpCommand": ("POST", f"/session/$sessionId/{vendor_prefix}/cdp/execute"), + "getSinks": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_sinks"), + "getIssueMessage": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_issue_message"), + "setSinkToUse": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/set_sink_to_use"), + "startDesktopMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_desktop_mirroring"), + "startTabMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_tab_mirroring"), + "stopCasting": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/stop_casting"), + } + return remote_commands diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/service.py b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/service.py new file mode 100755 index 0000000..aebedec --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/service.py @@ -0,0 +1,66 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import typing +from io import IOBase + +from selenium.types import SubprocessStdAlias +from selenium.webdriver.common import service + + +class ChromiumService(service.Service): + """A Service class that is responsible for the starting and stopping the + WebDriver instance of the ChromiumDriver. + + :param executable_path: install path of the executable. + :param port: Port for the service to run on, defaults to 0 where the operating system will decide. + :param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. + :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. + :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. + """ + + def __init__( + self, + executable_path: str = None, + port: int = 0, + service_args: typing.Optional[typing.List[str]] = None, + log_output: SubprocessStdAlias = None, + env: typing.Optional[typing.Mapping[str, str]] = None, + driver_path_env_key: str = None, + **kwargs, + ) -> None: + self.service_args = service_args or [] + driver_path_env_key = driver_path_env_key or "SE_CHROMEDRIVER" + + if isinstance(log_output, str): + self.service_args.append(f"--log-path={log_output}") + self.log_output: typing.Optional[IOBase] = None + elif isinstance(log_output, IOBase): + self.log_output = log_output + else: + self.log_output = log_output + + super().__init__( + executable_path=executable_path, + port=port, + env=env, + log_output=self.log_output, + driver_path_env_key=driver_path_env_key, + **kwargs, + ) + + def command_line_args(self) -> typing.List[str]: + return [f"--port={self.port}"] + self.service_args diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py new file mode 100755 index 0000000..af563f4 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py @@ -0,0 +1,193 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection +from selenium.webdriver.common.driver_finder import DriverFinder +from selenium.webdriver.common.options import ArgOptions +from selenium.webdriver.common.service import Service +from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver + + +class ChromiumDriver(RemoteWebDriver): + """Controls the WebDriver instance of ChromiumDriver and allows you to + drive the browser.""" + + def __init__( + self, + browser_name: str = None, + vendor_prefix: str = None, + options: ArgOptions = ArgOptions(), + service: Service = None, + keep_alive: bool = True, + ) -> None: + """Creates a new WebDriver instance of the ChromiumDriver. Starts the + service and then creates new WebDriver instance of ChromiumDriver. + + :Args: + - browser_name - Browser name used when matching capabilities. + - vendor_prefix - Company prefix to apply to vendor-specific WebDriver extension commands. + - options - this takes an instance of ChromiumOptions + - service - Service object for handling the browser driver if you need to pass extra details + - keep_alive - Whether to configure ChromiumRemoteConnection to use HTTP keep-alive. + """ + self.service = service + + finder = DriverFinder(self.service, options) + if finder.get_browser_path(): + options.binary_location = finder.get_browser_path() + options.browser_version = None + + self.service.path = self.service.env_path() or finder.get_driver_path() + self.service.start() + + executor = ChromiumRemoteConnection( + remote_server_addr=self.service.service_url, + browser_name=browser_name, + vendor_prefix=vendor_prefix, + keep_alive=keep_alive, + ignore_proxy=options._ignore_local_proxy, + ) + + try: + super().__init__(command_executor=executor, options=options) + except Exception: + self.quit() + raise + + self._is_remote = False + + def launch_app(self, id): + """Launches Chromium app specified by id.""" + return self.execute("launchApp", {"id": id}) + + def get_network_conditions(self): + """Gets Chromium network emulation settings. + + :Returns: + A dict. + For example: {'latency': 4, 'download_throughput': 2, 'upload_throughput': 2, 'offline': False} + """ + return self.execute("getNetworkConditions")["value"] + + def set_network_conditions(self, **network_conditions) -> None: + """Sets Chromium network emulation settings. + + :Args: + - network_conditions: A dict with conditions specification. + + :Usage: + :: + + driver.set_network_conditions( + offline=False, + latency=5, # additional latency (ms) + download_throughput=500 * 1024, # maximal throughput + upload_throughput=500 * 1024) # maximal throughput + + Note: 'throughput' can be used to set both (for download and upload). + """ + self.execute("setNetworkConditions", {"network_conditions": network_conditions}) + + def delete_network_conditions(self) -> None: + """Resets Chromium network emulation settings.""" + self.execute("deleteNetworkConditions") + + def set_permissions(self, name: str, value: str) -> None: + """Sets Applicable Permission. + + :Args: + - name: The item to set the permission on. + - value: The value to set on the item + + :Usage: + :: + + driver.set_permissions('clipboard-read', 'denied') + """ + self.execute("setPermissions", {"descriptor": {"name": name}, "state": value}) + + def execute_cdp_cmd(self, cmd: str, cmd_args: dict): + """Execute Chrome Devtools Protocol command and get returned result The + command and command args should follow chrome devtools protocol + domains/commands, refer to link + https://chromedevtools.github.io/devtools-protocol/ + + :Args: + - cmd: A str, command name + - cmd_args: A dict, command args. empty dict {} if there is no command args + :Usage: + :: + + driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) + :Returns: + A dict, empty dict {} if there is no result to return. + For example to getResponseBody: + {'base64Encoded': False, 'body': 'response body string'} + """ + return self.execute("executeCdpCommand", {"cmd": cmd, "params": cmd_args})["value"] + + def get_sinks(self) -> list: + """:Returns: A list of sinks available for Cast.""" + return self.execute("getSinks")["value"] + + def get_issue_message(self): + """:Returns: An error message when there is any issue in a Cast + session.""" + return self.execute("getIssueMessage")["value"] + + def set_sink_to_use(self, sink_name: str) -> dict: + """Sets a specific sink, using its name, as a Cast session receiver + target. + + :Args: + - sink_name: Name of the sink to use as the target. + """ + return self.execute("setSinkToUse", {"sinkName": sink_name}) + + def start_desktop_mirroring(self, sink_name: str) -> dict: + """Starts a desktop mirroring session on a specific receiver target. + + :Args: + - sink_name: Name of the sink to use as the target. + """ + return self.execute("startDesktopMirroring", {"sinkName": sink_name}) + + def start_tab_mirroring(self, sink_name: str) -> dict: + """Starts a tab mirroring session on a specific receiver target. + + :Args: + - sink_name: Name of the sink to use as the target. + """ + return self.execute("startTabMirroring", {"sinkName": sink_name}) + + def stop_casting(self, sink_name: str) -> dict: + """Stops the existing Cast session on a specific receiver target. + + :Args: + - sink_name: Name of the sink to stop the Cast session. + """ + return self.execute("stopCasting", {"sinkName": sink_name}) + + def quit(self) -> None: + """Closes the browser and shuts down the ChromiumDriver executable.""" + try: + super().quit() + except Exception: + # We don't care about the message because something probably has gone wrong + pass + finally: + self.service.stop() diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/__init__.py new file mode 100755 index 0000000..a5b1e6f --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..964cf7f4d6226aed22bdaf09d991241748210a60 GIT binary patch literal 216 zcmZ8cJIVqv7)*SC2v(lLV*PxyVxyqd?*)XA-Ticf`z1>r%9j5rJcDQP2DY9+?5xbT z4h+l;Q_S24gFcJ+7yIL|&DgUszj$|Ia%D9e@xL3ht?1rO=W~I=5CVll63HCaCJThx zJJ=|{4Jk|~lVmMxm+TJ7%H#;B&rqrqs@fMu&&SglIOQ>^WOkBAbl|W=tpdRX)7+{v mTF4BM(IAA<$_p{B>PK%uCJ!YpZ8z@Vk**Q1Hs{>N8|(}Db~^C@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/action_chains.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/action_chains.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d218ea0b01c37b204574dc6ad02ba5a4fb492c1d GIT binary patch literal 16512 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/alert.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/alert.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7723b9fe1fce97137fc85c3d76f2021a410442ca GIT binary patch literal 2966 zcmc&$&2JM&6yIHcZJdOpd=ybaJA_J&E8>Mhh=_nTa-xuyrWFZLSyZdd?$}a2tLk~s#1N{Sf>jev;NGnyURQ1qXAeAch)c0oAj+1b#)R8nwC0DUMQB9M#c0)z`|Jiv5(A^3&zCs%Xlb z;-v2@PUfj5ca<~EY$4Y=vQ(pF+M|pU*ROljrvbOP8wSNcaa}=;_pQ)oWb)AD&AJ;@ z;Y+R*`o0x7wmeDJT`&tUexy*PtO6j-QOhYO52gVI%{Us(Rx~GbKm9b>Th7637G`y5 zbI|rVI?Xzold7bhJ{aelsX~985fH5^fS>lfa4jM{Bx@mCA!{zL5eprNiupW&axJ2S z*W8HMo)w9OZonzCY~Hh&)LH1)VGkkmoY*0F?FJF?DX)c2L@FU8jvM)I6oJnt#krPk z(>li?af5n;%P#Ohs#FXJr*}B1z`+tw*M`J3-PunJGSfYK=hCSuxfcBpE{{3PU8Ss0 zl-9=z0?OX$1T4&p1@j$%#3HMf*Ps9y7_)*M=6bCKmQPJd3c0w`cGqOjnqou)$HdSW z8@=Iro(o4W)~pp8)oYZ|(QTZ)o4QU&lvk5t6-d z#f_U{%PzD<{MdyYQLj>jFo5`&z1^_9vC)~3G{XjjLR7;by4`U3hodJYFXBK6J^wigaXjwfPSfUL|Wk)p+E zbei=6q6qO4@((v^p-&CJQL`X(9b+c68<^>lG3WBjjb-EXsZ--KRx=v^tTJ8-9cs{E z)$rV9quzvs2+kBwe_%u|r{i_YUa_h)GQb86+=g$g(Pe4but65Wzz|nctT$ubG~K}E zrrFvjV!7BE8wjl*s(Z@jfO7cQH|cNtw_vE)D%MFso(0!s=m6Kst7%eJrXGiBK2chVRLF`M+aYp1%AuR}vbMy|i8z3iWBi?`GOv#*^ zT{5Sy%wAnGmuA0MdZIE^>3EqW3gva(mNFiWurxA%xTIYCNcP;nW& z90}8oYk6U{H^pTH_V7K7d{383v!5pcxQFhn6x`N;WLu6tLb68$*_*>k-{4NV&$dU- zzR)KG-EkfTekoi8t=}Pom{uY+>(Ke{B9NnIiL$PC(sW&Q)W=%qUkk*hR!FrdA|jsv zIF#`1WbL_+JvzJXiqu;1cEIjsO5iQyc#veNtEvT!4FMW<0IG#TMhHL;{Rfc##cuLn zpT2T!mLV&!4<&$MKqm?;g`ltdXtsu=t?q}9aqat12}#_2DUC0!; z+wJr0g&v730$VxQwE+K-KyJlbYsPug^h2lNQPYeEOcUR|WF}{tPH3AZ8-Pu*4i7E7 zEW8<~BF==L>`j!Lagod^-%S6*s|GWu3An>hxtl-;+fX_?FF zclIj<+pSdh)0VDfCbx7wb8hosHpA8LOPdO|KhFFmT4@F?EEKZrIJEIQohPQ)ePW98 zi77U?>qUa=`1os9G3tk$ipB8vOo)>NkD9yfP^@2&G+kov!2~L{$cxRCs;VzX6_xy< TO#P}%{GC0oa`lyhwb=bH0W!^T literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/by.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/by.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f9863dd5c3c4fb73b988538ee4017dfac1bab87 GIT binary patch literal 1878 zcmb7FO=#Rk6dwJoR=eKydTr;gCLlY;WZQViQ?%LJ*-s){Jc>`q|8A z)5!R+ffRadPcc2EheCo+g&tCRXpe)Vl z@4YwD@8xn4!MJT+UHw5p=r6uF9C8NsF9EoVFftGpu;>b&Xov#G5@5-Y5-bCj4Ou`U zx`1%*4#LWom_{&iM8f$KurQQJtrgafHr9wX5owOsbcsj&&;O9TZ&0zpjPkR(MctS~PSlS9_s~W#971ff`z?T7rtUYcZDMk`0Ivm)HTfrV@DulfXrtZXGhazN>cF--usQWu9oz>kva^2X80Fwe zl0*SOlHQu4Yuw|Fu_0^;sp^)%1_TuHNXghh8^X22o<3B33&szwY4j*eaS{BoPFOEPE?zF*1v4830sJeyJC&jB z%Fs?_WV*$7*Bzf|;P=+C8Bp>N?RohdY%8B;HPW5E_Qm1dQJ-a({x;_7OWAoG| z+dTcv=TGF*ySbh{QOJ$nKedNodf1mtzxF@pt9=P6)x^A~WN1;?w7JWoaBuBC`_AKj zi^2=XMIrHg4k3pVOA80J_Bqo(7p zCOM=sHzx_=(PCvHYD92L#<-g2B)uEz`Lxg<({rHXea85u*pmc7cs7KDlYgUQPtiM1 c(ZIjTabfrw02`tLR+3o%0j!V5ssI20 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/desired_capabilities.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/desired_capabilities.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a8eed827a34c42b375a34ddc60a38ce637f0661 GIT binary patch literal 2064 zcmah~Pj4GV6kmItwc|KxLej{UT9~GS#DaK}!T}gbUfQmovNkG*-EQVQH6R;P=dCw zi#yC>l2H#a+qI}o9f>95PT3rK5BrHkdHpR2KPpsdryxq2q}nP;6BVA!E47^=6GS7~ zSLyZy$&pExYHQHvq0f>jQix`9WSY#78)O#jCqYhwtdhA`nRcGM0W*bYW{S*@41M7_LLW->ZspKqcZ`L}(ZLmPDTKx?D&AOA^rLHPGdJ9zlEJQ6&4! zLl|Dk*LcBG6jXKzz`nm2Jy}_YDT7!KS7`S)Qc7fYI8}^G3^k+j;Qcr zf823kLFiF(|uuvNt@z%rbcLfjECQhJ^0Qf56 zmEF+92%Q?fu+Rgv)R)rT(Dn6?J}j@nv%c{GH2s+9eZRAGwe}v`3UfgJCj(;=SdLN> z?(=%)A@rCEmbYuo>h}KAvdP`kmD1RipD()>mQWRY`O6T%VXa=-KRj6a592WBz~|U@ zeeEBRY7W%eku1XHAQq`64f)fI>vl*xm8fp$n8`kngpMV^6~?&Au&+_Y%dxAKgn!2M zEIhcbyf;D+CTn~%xou;I81#gizU1P;ziL{FYgPx=ZJ?JASW6#U>$wdfwR_96~A_IM(#U zwYZ=n$R0C?fUia|udGn5W%t=&%#0v#0^ zwYAj>5NdV5ySl{*)v0r&TdbqIrxKvQUtYhjdrZ<*7n@(fW##EZdg`O&pobLZjy~=< zl-*MSSGW>=7C`WRfzM0jGQBvF8{AilcQ4+$2k&Jzb3;4d8O$ifcQ1-}FDKNZ_FHCQ zP*5fpfB0sgrVHA6WsncG6VPU~^KHDd3`V&t{R#}3&HHo(MS|$CXDkn#F^91YjM;47~=6Cl1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/driver_finder.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/driver_finder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7134b504ee59323d30cf9d5339254edfd28de891 GIT binary patch literal 4659 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 E1)TCatpET3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/print_page_options.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/print_page_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5b18ca601b697c48cac9e49048341a9eb74b7eb GIT binary patch literal 9845 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/selenium_manager.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/selenium_manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39db12bcf93535c4fb1ca3c38a3ba8572a34f020 GIT binary patch literal 6419 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 JJ`?!@{0}5A`Vs&D literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/virtual_authenticator.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/virtual_authenticator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fe6a844b13a97fc9f11bcb40028a43dd1787e4d GIT binary patch literal 10296 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 F{{n9)gsuPp literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/window.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/__pycache__/window.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc29c1b30466fc301e59ece459025344a735dd16 GIT binary patch literal 523 zcmYk3%}yIJ5XbG^CD1_NLMsjxtT-TYNF3mbkP1i_o(TX68*{^x428 z;wV54Iz}8nAnyEdCe;8JZr!`x=nlZ|MG2R~ZjplWBay}+Akj=mGHHf0QM=-4Fj_P4 zhyVrHh&vnyE_VWtyTM%H)#u8^cY?R;XP|v~;j27NWu}4q!*M%b+kVZ`)vRAuCb>?% zQZ7)MFaea7RZ4~Ad2D%!((9bX)5<)hT!tp?cE22!mEN~b`?U9jMs~i}oD8G@BJu$f zf^pK8VQw#^$Z@1k@;=#VwHj?!sK)6<<4AHKklc_s>XWq41DWhKcXo-2G&E8cUa?D1 zL_rKmlnXM1KF^{X$Ve!KkO`U0-As$j`~n)gRRe0pxCivx+x}BsxjXt*`*{B~tIc+F v>Q44y7Gz77# None: + """Creates a new ActionChains. + + :Args: + - driver: The WebDriver instance which performs user actions. + - duration: override the default 250 msecs of DEFAULT_MOVE_DURATION in PointerInput + """ + self._driver = driver + mouse = None + keyboard = None + wheel = None + if devices is not None and isinstance(devices, list): + for device in devices: + if isinstance(device, PointerInput): + mouse = device + if isinstance(device, KeyInput): + keyboard = device + if isinstance(device, WheelInput): + wheel = device + self.w3c_actions = ActionBuilder(driver, mouse=mouse, keyboard=keyboard, wheel=wheel, duration=duration) + + def perform(self) -> None: + """Performs all stored actions.""" + self.w3c_actions.perform() + + def reset_actions(self) -> None: + """Clears actions that are already stored locally and on the remote + end.""" + self.w3c_actions.clear_actions() + for device in self.w3c_actions.devices: + device.clear_actions() + + def click(self, on_element: WebElement | None = None) -> ActionChains: + """Clicks an element. + + :Args: + - on_element: The element to click. + If None, clicks on current mouse position. + """ + if on_element: + self.move_to_element(on_element) + + self.w3c_actions.pointer_action.click() + self.w3c_actions.key_action.pause() + self.w3c_actions.key_action.pause() + + return self + + def click_and_hold(self, on_element: WebElement | None = None) -> ActionChains: + """Holds down the left mouse button on an element. + + :Args: + - on_element: The element to mouse down. + If None, clicks on current mouse position. + """ + if on_element: + self.move_to_element(on_element) + + self.w3c_actions.pointer_action.click_and_hold() + self.w3c_actions.key_action.pause() + + return self + + def context_click(self, on_element: WebElement | None = None) -> ActionChains: + """Performs a context-click (right click) on an element. + + :Args: + - on_element: The element to context-click. + If None, clicks on current mouse position. + """ + if on_element: + self.move_to_element(on_element) + + self.w3c_actions.pointer_action.context_click() + self.w3c_actions.key_action.pause() + self.w3c_actions.key_action.pause() + + return self + + def double_click(self, on_element: WebElement | None = None) -> ActionChains: + """Double-clicks an element. + + :Args: + - on_element: The element to double-click. + If None, clicks on current mouse position. + """ + if on_element: + self.move_to_element(on_element) + + self.w3c_actions.pointer_action.double_click() + for _ in range(4): + self.w3c_actions.key_action.pause() + + return self + + def drag_and_drop(self, source: WebElement, target: WebElement) -> ActionChains: + """Holds down the left mouse button on the source element, then moves + to the target element and releases the mouse button. + + :Args: + - source: The element to mouse down. + - target: The element to mouse up. + """ + self.click_and_hold(source) + self.release(target) + return self + + def drag_and_drop_by_offset(self, source: WebElement, xoffset: int, yoffset: int) -> ActionChains: + """Holds down the left mouse button on the source element, then moves + to the target offset and releases the mouse button. + + :Args: + - source: The element to mouse down. + - xoffset: X offset to move to. + - yoffset: Y offset to move to. + """ + self.click_and_hold(source) + self.move_by_offset(xoffset, yoffset) + self.release() + return self + + def key_down(self, value: str, element: WebElement | None = None) -> ActionChains: + """Sends a key press only, without releasing it. Should only be used + with modifier keys (Control, Alt and Shift). + + :Args: + - value: The modifier key to send. Values are defined in `Keys` class. + - element: The element to send keys. + If None, sends a key to current focused element. + + Example, pressing ctrl+c:: + + ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() + """ + if element: + self.click(element) + + self.w3c_actions.key_action.key_down(value) + self.w3c_actions.pointer_action.pause() + + return self + + def key_up(self, value: str, element: WebElement | None = None) -> ActionChains: + """Releases a modifier key. + + :Args: + - value: The modifier key to send. Values are defined in Keys class. + - element: The element to send keys. + If None, sends a key to current focused element. + + Example, pressing ctrl+c:: + + ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() + """ + if element: + self.click(element) + + self.w3c_actions.key_action.key_up(value) + self.w3c_actions.pointer_action.pause() + + return self + + def move_by_offset(self, xoffset: int, yoffset: int) -> ActionChains: + """Moving the mouse to an offset from current mouse position. + + :Args: + - xoffset: X offset to move to, as a positive or negative integer. + - yoffset: Y offset to move to, as a positive or negative integer. + """ + + self.w3c_actions.pointer_action.move_by(xoffset, yoffset) + self.w3c_actions.key_action.pause() + + return self + + def move_to_element(self, to_element: WebElement) -> ActionChains: + """Moving the mouse to the middle of an element. + + :Args: + - to_element: The WebElement to move to. + """ + + self.w3c_actions.pointer_action.move_to(to_element) + self.w3c_actions.key_action.pause() + + return self + + def move_to_element_with_offset(self, to_element: WebElement, xoffset: int, yoffset: int) -> ActionChains: + """Move the mouse by an offset of the specified element. Offsets are + relative to the in-view center point of the element. + + :Args: + - to_element: The WebElement to move to. + - xoffset: X offset to move to, as a positive or negative integer. + - yoffset: Y offset to move to, as a positive or negative integer. + """ + + self.w3c_actions.pointer_action.move_to(to_element, int(xoffset), int(yoffset)) + self.w3c_actions.key_action.pause() + + return self + + def pause(self, seconds: float | int) -> ActionChains: + """Pause all inputs for the specified duration in seconds.""" + + self.w3c_actions.pointer_action.pause(seconds) + self.w3c_actions.key_action.pause(seconds) + + return self + + def release(self, on_element: WebElement | None = None) -> ActionChains: + """Releasing a held mouse button on an element. + + :Args: + - on_element: The element to mouse up. + If None, releases on current mouse position. + """ + if on_element: + self.move_to_element(on_element) + + self.w3c_actions.pointer_action.release() + self.w3c_actions.key_action.pause() + + return self + + def send_keys(self, *keys_to_send: str) -> ActionChains: + """Sends keys to current focused element. + + :Args: + - keys_to_send: The keys to send. Modifier keys constants can be found in the + 'Keys' class. + """ + typing = keys_to_typing(keys_to_send) + + for key in typing: + self.key_down(key) + self.key_up(key) + + return self + + def send_keys_to_element(self, element: WebElement, *keys_to_send: str) -> ActionChains: + """Sends keys to an element. + + :Args: + - element: The element to send keys. + - keys_to_send: The keys to send. Modifier keys constants can be found in the + 'Keys' class. + """ + self.click(element) + self.send_keys(*keys_to_send) + return self + + def scroll_to_element(self, element: WebElement) -> ActionChains: + """If the element is outside the viewport, scrolls the bottom of the + element to the bottom of the viewport. + + :Args: + - element: Which element to scroll into the viewport. + """ + + self.w3c_actions.wheel_action.scroll(origin=element) + return self + + def scroll_by_amount(self, delta_x: int, delta_y: int) -> ActionChains: + """Scrolls by provided amounts with the origin in the top left corner + of the viewport. + + :Args: + - delta_x: Distance along X axis to scroll using the wheel. A negative value scrolls left. + - delta_y: Distance along Y axis to scroll using the wheel. A negative value scrolls up. + """ + + self.w3c_actions.wheel_action.scroll(delta_x=delta_x, delta_y=delta_y) + return self + + def scroll_from_origin(self, scroll_origin: ScrollOrigin, delta_x: int, delta_y: int) -> ActionChains: + """Scrolls by provided amount based on a provided origin. The scroll + origin is either the center of an element or the upper left of the + viewport plus any offsets. If the origin is an element, and the element + is not in the viewport, the bottom of the element will first be + scrolled to the bottom of the viewport. + + :Args: + - origin: Where scroll originates (viewport or element center) plus provided offsets. + - delta_x: Distance along X axis to scroll using the wheel. A negative value scrolls left. + - delta_y: Distance along Y axis to scroll using the wheel. A negative value scrolls up. + + :Raises: If the origin with offset is outside the viewport. + - MoveTargetOutOfBoundsException - If the origin with offset is outside the viewport. + """ + + if not isinstance(scroll_origin, ScrollOrigin): + raise TypeError(f"Expected object of type ScrollOrigin, got: {type(scroll_origin)}") + + self.w3c_actions.wheel_action.scroll( + origin=scroll_origin.origin, + x=scroll_origin.x_offset, + y=scroll_origin.y_offset, + delta_x=delta_x, + delta_y=delta_y, + ) + return self + + # Context manager so ActionChains can be used in a 'with .. as' statements. + + def __enter__(self) -> ActionChains: + return self # Return created instance of self. + + def __exit__(self, _type, _value, _traceback) -> None: + pass # Do nothing, does not require additional cleanup. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__init__.py new file mode 100755 index 0000000..a5b1e6f --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cafbe225339fb88dfa57824fcf2e0c9ff3e0ea9 GIT binary patch literal 224 zcmZ8cJ8Hu~6x@wt2nJU7msHbVF#YSue5`cpXr5sywI~J$P)<=t%H| vMdfsl4oXX84X83`YdlD)jSf;Sy5ah?AzQ^3U)?nA;fa0}zZ1^6OLy2m9Z)_Q literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/action_builder.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/action_builder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8dc81a02e2139305c8a2a467f3470399c525943 GIT binary patch literal 5673 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/input_device.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/input_device.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30ef852ff5a0eb0c5c7a1a8f37ec2e9dc101d3b0 GIT binary patch literal 1494 zcmZ8h&u`pB6rQoiUT3r00$nvp17bzDh&^oFLb)Ks53!<9Md=9%Sw$nSXEt$I+soJv zc$GsDITQ)Raa(~zj#Rnue{cc`Q7lD5;>0awk&rm`J=;ll8OiT`^WOaU=9@SEsoAU( zXrJ@j+dYGjKe2P#SOsQ%08=7}pd;d-*G4qZ9E~E@0qc%lU=>;u}wctz+1P*i64dT$SX&e76=t>wgqlVByp%9jwYz1i)Eop zCXF@73^l2GV*|Kby?2R)EBvd_PVklmDfr#aaYS( zEJwp48sjqU_J3d4J5eC*Al-3;z!i2s^3p(tNo?QnllRhreeLSiUf<2)-mPKpok&Pq zhI{tNAK2q8*@?neHm<#F$9^JvW7qrG-IlQpd&tmF1N&1s5X#?^%J!llh(fy}Vi)T1 zQoW6FmRp?rp`UO*Y0YWAaT;9*sxg{7}nZeBBj-mz*XS=a2Rz{yffUfw@Eeuo~YqzHIzvt^aJT-+T90>#}+p z65d&5KS_WWBDjE;SsVNyNNiw5tYkWbYRp;?75ehbV2`JKJ_h-t=^dmkQp_dl8ufG3t_ zbPg|^0Pg(I!cb>sQRC7hlN!y#4^9ZUAFuy|u3Q|K?3!vBTy7@W7=9-uE7Y@~TW-Bb sC%0ZNPx^+s0^{(SV`P1zQ%YwYLL0~A;xSn{ChPy2=V|kA0;bsTF~IInlK=n! literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/interaction.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/interaction.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0f00709b4efdb7390e024b0b726b198ff07ace2 GIT binary patch literal 1707 zcmZ8gOKclO7@paOy?$&GNShi+id!hchh&o!aRDJvVl{~yJE{{^T_G)--EnMc@0xw2 zIQU>tB+^4AE+|1lBHU8tQY0iea_5o=4%P^yNL=8SDverk;-6VN1XkMbf6VLu{>RU% znndt@YP`Spqm0lW%;$JFY9Xq9^Qxo+JuMkR*6h0=j|h{+>Kvb$rx8+sNg_Gy`18v+!247&%LJx521GNuVK=EG$*hJm*a3_B(VR>xFKSm&SgC|Tx$JmMg)HenW_MI#Me15*dF&h)8 zu`O1lEmXm_w5dYZ3PdI`5{F-@2rs~yKJp$&Y@v^_o-CtWoXShQ_=+8RChG=o2zD2( zUb})G)t%RV8jLUTHVU|#!F{of9>7So@ji~67_|lHjkDfqA&<38PNcFQHc6Bo?`7ta zykQW$QMiL948y9MzHb;lYv^n?+leyBQo1p~BRwlv4t)M4fM*@_o1)&2A1axhkzbW; zH2Md-uGfjM8Fg_PyIXbi>}x_u)ZQH!i`Sohft(21GRZ<1dnzZW0P z{;>Gn;!m@OZ_NENIe$2~aG)%3f-rR~)wz_%QsHG7uzFLuQg_XOH>1ZWc`q?wguH7E zUIUnK_#3uP)__|E?A0i?iiu z3OS!qcrglyjVD#!j)wXj?>d;QI{pU$$0Ek~^eV!c-%;i$mg_sPM~TOIXjOu}Q25x|py7%t$g!YN{s GNAM4ar;Aqr literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_actions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_actions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3629e49533c0171bc64e044c591d7fe25d4b1bb3 GIT binary patch literal 2411 zcmb_e&2JM&6rb^aWc`Ih6Wl_eaY%q#G+8K81@ya3p(rJ-MAfQR(aLxx$-;iPGrNF| zkz|ym@ctH}7Mf zf6Hc52l@@9nxY3w>)5$5J3bx$i*d$5lIlmNw`W$0bV7VqqH~Rp`VrA;XFNMVkFQBYk5hgG-rfBViR}BN;GoSjl zSnSMGU(8YJ$XP|4*C91#aO-1WzJt3{RKf(65~Pn9O*DfEUdWadk|c=*wWPvVfv-kV zBu&%>t)!C-(LmBivP6e3*j&V=l;m9(siQ|8>VxIkDa%>VPPIp@37bi=u_>z0W*=~qIRdI2|& z+rdZS8S~(Q1LKqB8Xx~;X8Z%6P?LJ+O~*cCR%^kW?;V;r_?pS>fR0zom2>4;%1t? zyMC!$JKa2XFTb;?UP-ST*~PwF#!JijJ4T@eYUrsTh``Gr>;(owfX;3PKwroh8-3wJ0sKRP}>(pij zPsE}9z&a8Fr^lYw|TXg{321t^Mj5}h7H=rR=NSy6z`P$SVT zR?rZ2`V94IT-mEacAi2k2TDaPO4;1@cu@ABpjF4_0TUqDE-@5@iV~-w8qkXYlSLAj zb2|-_oO(p0EUyptxNB3oANJtyz%Y;2bK954epPSh_N)(#TpwE-*w>u=J--7=EYttv z$;Fe)dv9k(1V6PnwXEOC3_sM+i$f1})IZov$IcZ;cSr?BmfZWmJmp+;w(Zi6s`z$G z@3N9W4W-v9U56y1zF7)gBVh6sE2`}RjO$U}KT=&9%yDsi0Z3LO+X1tBzQ+MQReT86 z_{%T|7v!%7OP7ASbp6;`Zhup~Z)BREU&%m;wr?1RMU{uw_rrd&#}pcc-UbBIZvTPF zwC~YKXEX?z7pY(sjfMZ!0ikJz^%R)Eo-!4>mMVJ{ z7TEzYbfqcr_@EY~NYBlwJEeI1sactt+B-GpLeVvnL2gwvvIyH8Z8<3JC= zY!IYeyq@pIt`*27eEF`7!0gEa`YWMoBdrY9-e~DqJMsvIqb*(62LJ9?v_Y9H(q>vT zPRp7J!8d@6i3EzYFt8mi6Fo}HzTOV6s4iv*l_X>|v^D7dvhhXPYWxSFEffEJqVxsv zC!j4!3sV7g1;wYwkMx_dPu^y4!IHQX7fybtV2mH{MtJm3w0i^X+(2U+Xm|td+d!j_ P^dUTWb?7mIkKE~Bql_Yh literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_input.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/key_input.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6097f62248a4fd0953b250a4fcd43038be0c260 GIT binary patch literal 2688 zcmcImPiz!b7=Lg6?9Ohtl*$4NL0Gk*tF{9|NmQhuH9$y;5hQVF8`c42pReKS+s zx+FDeVo4x`gK0@fN?|ZYm-4+gd@Fn}+_rCYN zH{ajix4(9GCkc$N%}+*qQrvluEK83tBGHl42-= zR)AIwl@f^@A&xploEVdD$xXM zsHqq+C+Wmsjl&v;Rdc#P$wYL+Nld9ma+-Wejjoda8Y+k{YcMvwho-wM5TqEox;2$(EUEM;|WRL5aD(rynW!M}sr^p543qhpnpDe1aJqog?pJP=}8p1qKsq%H8 z$wY6o^F|AxqG(d*fm`tq! zi5-RE5)d<_M$WcQI#%Geoxj2cuClUgQN!d4wWU#FOP@YR$OT%XXYm_rMk};erAuiA zWG_&MUYAb-MaAws$w?zQnXiX?p;U0fc+(#_Mew2kZpPCXb8YZ-PU5||RY1`5P~B{n zZ-9lPcP4t;PK(5!2d4KXOp|0Wv+cXYwZzTz?Je~!bH-=C8Tq?Leqm^I-pJ2=c=|`> zm#&|>e(s(#^7Fv!8Jp9_{<=Ff>S30BzxgoLR^@fup$FhtIJDE*-THq6X;czrJ9xrohCM}HB7K~;iZi*wL^1Vopo-E zEM)fH*Y*jcAOWyjjpXPfSOf~2CZexthDp;bm7So7bjmcp2&`iBMD~0xKqXY1g6)e^ z;V-~_-Um~t=8I*^=Px7O-NZwi6^o`>ryQ!Ac$lw;qB27$<~U(hdhf#YWQr_Fvf4L$ za*4ol8U{0k>JGV&gG69z_mCP|3oWjGQU}f9q4_ z-bVh{K-@!*P_nBIcezqnx&;Jy}>Zc}}b?l5>CZ2lYW15!)iO2B6+!e@2d zDh3F^h}OcE92I7Y^yoz4%+r=caJ(CCwlcg4$HTXe){oBj49;oIGlrF8j4LbpC7J0Ft1hh+QX Z*m^oR{ncXv%i~>fx_`E7nZP0*`v>u1GXnqs literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/mouse_button.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/mouse_button.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3df4a38bd931a4b3f1880c8646740fbb95099b3 GIT binary patch literal 504 zcmXv~%SyvQ6upzA4{GasA-HiRbWz90Rs=O|6<<&UAqYd78EvqWshLE{uA=|YZxBDl zA1K+n%1-P;aOF%NcX8&N` zATg?@H_O*Anu^heA_HLHAPSB_kz-QBv8d_fsO98o&M74MY9XDw5V2%OaTJLl)3urI zkm(OHH4kKZh|6j*EfNyAoDq_i2;qXpUCqmcJjQN!8nMpnjq5ajacbM=^)%NyZJu1G z*3sedSz2gZwQdeu_B)JJL->2e9l;sqamVG{rPvl;%vlgg-1MW9xQ%zVw`;bW$lBFi z?O0HTS@49rejE3as3U^Ct({#g{fO0iuJ_>HGl?bZvcQiyer9bN`cEvxp5R;r*!3b` z1QK(-D`}6H-RdQwUT_R6ipX^ZZ!nxI_w8Y2zTX&@EB*RJ&M&+)!{u4_Wfe_Im$YZ> h)(z6){^TwP;i{7Qj&ec4w}}w?-OQoIA5btZ_y+*if9U`K literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_actions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_actions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a39e7b8ce5ed38e04fc678a82f25d4d07a27fc94 GIT binary patch literal 6134 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_input.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/pointer_input.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68ef12d75cae19c3fd0a7f94bc501bf24857c4d7 GIT binary patch literal 4224 zcmaJEZEO_Bb>{ZtzHIz$&c=-mg*XTG9X8-Z2_?7~FeTW4`O*cnI&Rly&E4K*cF$nz ztP*6YM?_SkwlQs}N`6!Up(?IasqoMF6{J?`T>)`g!LKS(_~+nMP4lbo&E6h17{=$f zZ)V=SnfEd8z4?1}b$~$oP&qmJ&mbZH#*W*hGO{=Z$ShHbN|PjpUr&;xXpB3zQH5A4+C0VMwR{h2K$E-&aMvhl{<_70OXe-uts83B{7dmV?v&cP}MW- zi;0?`;-5Gos*(m`!oOFO$5t(6<=~pH1&|S0^-W7LKZ+U)r~!aMH3+autyinGYHgJ! zjd+k!t>#=;0d%Z^&W!HWt%2<6X!qvLUH$P1vukLiYgby; zqM9)tP3otknF;Gm+Sn55?unYZrFCWEiL>!h&5XjXnxSV?(R12qmFeReizd>kRN9Ef z6X?ZeG~?I@L;=T*WF}ZG9A~m=sqhh3&~}(IcLMnS0(s=CzT_?XLic^GrC`l(ri#J! zkLouTx(4nx-j(mh3!4t!t3OnzI`pV-c$8wrh}Vr-AD+JU&LDvl-XY9*02z`&MrR+})xUe<{F{0Kp1N6yTa&z_63QPY;o zK7bN~17c&%$hslHw78`yu5YA3j>%>BA+iERCoDBj0=PgHYRQ^6=1$D_-R&#ZohTeS zUZ^{fmmdY2W=5`!-4BLK9lPhpznb`RqR@UQzh~yHe^s@Wsv8Q`?WOh&*e^ogSM{r! zOEp);hoOzd(8e3R_d-1nd|TLR*dS4{J9H{uau_=3C8|diu6c44JOr-y*iu@czy_mB zgOD=_!N9en`{ni&pV_lNea_%sd(*>>%C#HzunyqB)&d9%j@H)!Zi{N%ikrC6OBJgE z!&fU7DSCm0`38Usq!ijP*Ilf6_qJT9c{eXUucWQ_LYp7>x*a7|E(EN^h{xk>1dv%& zzzS+X)#WHCuM$OF1^COJa5Tfk2Qks7x%jqxI%`>J<0j>50Bvx;`w7gOcmmg_>YnqM zY-aMcWkKeJ`L~fp695p~afa(_Zm*pmFNOvm_=a9|1ia{6#*KiyN=BV7Gq5n|+|cT> zkh}1XC0Q460ijSD6O~oI8%@uhGr_4R*S$&>hvuiq34?z{o~zB*+Y6!Y2fiLIjlC)p z&zhRzMhaVInw4cnVyPwZvT`Z=0eQKU7Siwr7WGWRC2?iO%i-d#eI>rJ{tYZ*c#X?G zZ3~dQU5jpk@nsgRay5a6o@`lB0XVf27h)W$$bEhFUlX?@cefVb9=g|iuoyb@z<2mX zd*a3BlB$4kN#Xl^gQP&lmg=WW03n{N6#8MblKr3Y!juB#ity~JAAuC^hVDQn&LE3J z6=O0?fws3CILidj(mKPO!ny%0bs1SR5|FJY8q}1>ZQ=72j)_Yhdxg6?PwxS)vn&e{`jb?v_;j zEigqPcL!Wf$8xu#YeYf8#Vs=#YY zaixr^O49@=WR=o}A40J0e1K1_OBq!5b^t%%%ztNA~iBfCoos zUBspP3FW?X3hwa~6cDdc$0u}_QgXRjgf#wV;T#Q9{uHouE2)J&wkNXLrsK=5fPed_ zW@zU#Y{z8RGUG1G#gXmFbRwQKcSI`WLvS<`Q`t9IOBKQccVf5cjkRBN-t7D$d?)rl zUKCzzZKDjm73xO`%DR-v-h>|1pP8g?+2R4OS#2SmwQPEpVQ8>rPG#C&Lp#Sy z0*oAxiLmiB&okC!>&wr*2NsxU3-HZVwRxe`xMudil>?s)UFy&G0#<*on|b#v7S~GJD@13 zw3WaG*5OjG~vJ$*;tJE9yII<{NsKYF4|c2j zoQOD&h=}IChE4wbvDa4!D({U5(^6?mi@-p++I7m;D*oV5RQ^ z!wQdalQ>7><*9GGWBMKJ6ii`m=GD=HKq*~ZN9d}@B=j|T_c3|rYqH@n>3B?D|4!aU N8)n}54}lNo^nW{s;D-PJ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/wheel_actions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/__pycache__/wheel_actions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e98b8d48691bfe055de84974986d64663456de4 GIT binary patch literal 1387 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 CrZ4*d literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/action_builder.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/action_builder.py new file mode 100755 index 0000000..63bfe6d --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/action_builder.py @@ -0,0 +1,103 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from typing import List +from typing import Optional +from typing import Union + +from selenium.webdriver.remote.command import Command + +from . import interaction +from .key_actions import KeyActions +from .key_input import KeyInput +from .pointer_actions import PointerActions +from .pointer_input import PointerInput +from .wheel_actions import WheelActions +from .wheel_input import WheelInput + + +class ActionBuilder: + def __init__( + self, + driver, + mouse: Optional[PointerInput] = None, + wheel: Optional[WheelInput] = None, + keyboard: Optional[KeyInput] = None, + duration: int = 250, + ) -> None: + mouse = mouse or PointerInput(interaction.POINTER_MOUSE, "mouse") + keyboard = keyboard or KeyInput(interaction.KEY) + wheel = wheel or WheelInput(interaction.WHEEL) + self.devices = [mouse, keyboard, wheel] + self._key_action = KeyActions(keyboard) + self._pointer_action = PointerActions(mouse, duration=duration) + self._wheel_action = WheelActions(wheel) + self.driver = driver + + def get_device_with(self, name: str) -> Optional[Union["WheelInput", "PointerInput", "KeyInput"]]: + return next(filter(lambda x: x == name, self.devices), None) + + @property + def pointer_inputs(self) -> List[PointerInput]: + return [device for device in self.devices if device.type == interaction.POINTER] + + @property + def key_inputs(self) -> List[KeyInput]: + return [device for device in self.devices if device.type == interaction.KEY] + + @property + def key_action(self) -> KeyActions: + return self._key_action + + @property + def pointer_action(self) -> PointerActions: + return self._pointer_action + + @property + def wheel_action(self) -> WheelActions: + return self._wheel_action + + def add_key_input(self, name: str) -> KeyInput: + new_input = KeyInput(name) + self._add_input(new_input) + return new_input + + def add_pointer_input(self, kind: str, name: str) -> PointerInput: + new_input = PointerInput(kind, name) + self._add_input(new_input) + return new_input + + def add_wheel_input(self, name: str) -> WheelInput: + new_input = WheelInput(name) + self._add_input(new_input) + return new_input + + def perform(self) -> None: + enc = {"actions": []} + for device in self.devices: + encoded = device.encode() + if encoded["actions"]: + enc["actions"].append(encoded) + device.actions = [] + self.driver.execute(Command.W3C_ACTIONS, enc) + + def clear_actions(self) -> None: + """Clears actions that are already stored on the remote end.""" + self.driver.execute(Command.W3C_CLEAR_ACTIONS) + + def _add_input(self, new_input: Union[KeyInput, PointerInput, WheelInput]) -> None: + self.devices.append(new_input) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/input_device.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/input_device.py new file mode 100755 index 0000000..d9b2eee --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/input_device.py @@ -0,0 +1,39 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import uuid +from typing import Any +from typing import List +from typing import Optional + + +class InputDevice: + """Describes the input device being used for the action.""" + + def __init__(self, name: Optional[str] = None): + self.name = name or uuid.uuid4() + self.actions: List[Any] = [] + + def add_action(self, action: Any) -> None: + """""" + self.actions.append(action) + + def clear_actions(self) -> None: + self.actions = [] + + def create_pause(self, duration: float = 0) -> None: + pass diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/interaction.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/interaction.py new file mode 100755 index 0000000..05b6627 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/interaction.py @@ -0,0 +1,46 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Dict +from typing import Union + +KEY = "key" +POINTER = "pointer" +NONE = "none" +WHEEL = "wheel" +SOURCE_TYPES = {KEY, POINTER, NONE} + +POINTER_MOUSE = "mouse" +POINTER_TOUCH = "touch" +POINTER_PEN = "pen" + +POINTER_KINDS = {POINTER_MOUSE, POINTER_TOUCH, POINTER_PEN} + + +class Interaction: + PAUSE = "pause" + + def __init__(self, source: str) -> None: + self.source = source + + +class Pause(Interaction): + def __init__(self, source, duration: float = 0) -> None: + super().__init__(source) + self.duration = duration + + def encode(self) -> Dict[str, Union[str, int]]: + return {"type": self.PAUSE, "duration": int(self.duration * 1000)} diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_actions.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_actions.py new file mode 100755 index 0000000..5f29d72 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_actions.py @@ -0,0 +1,54 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from __future__ import annotations + +from ..utils import keys_to_typing +from .interaction import KEY +from .interaction import Interaction +from .key_input import KeyInput +from .pointer_input import PointerInput +from .wheel_input import WheelInput + + +class KeyActions(Interaction): + def __init__(self, source: KeyInput | PointerInput | WheelInput | None = None) -> None: + if not source: + source = KeyInput(KEY) + self.source = source + super().__init__(source) + + def key_down(self, letter: str) -> KeyActions: + return self._key_action("create_key_down", letter) + + def key_up(self, letter: str) -> KeyActions: + return self._key_action("create_key_up", letter) + + def pause(self, duration: int = 0) -> KeyActions: + return self._key_action("create_pause", duration) + + def send_keys(self, text: str | list) -> KeyActions: + if not isinstance(text, list): + text = keys_to_typing(text) + for letter in text: + self.key_down(letter) + self.key_up(letter) + return self + + def _key_action(self, action: str, letter) -> KeyActions: + meth = getattr(self.source, action) + meth(letter) + return self diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_input.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_input.py new file mode 100755 index 0000000..b578eeb --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/key_input.py @@ -0,0 +1,49 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from . import interaction +from .input_device import InputDevice +from .interaction import Interaction +from .interaction import Pause + + +class KeyInput(InputDevice): + def __init__(self, name: str) -> None: + super().__init__() + self.name = name + self.type = interaction.KEY + + def encode(self) -> dict: + return {"type": self.type, "id": self.name, "actions": [acts.encode() for acts in self.actions]} + + def create_key_down(self, key) -> None: + self.add_action(TypingInteraction(self, "keyDown", key)) + + def create_key_up(self, key) -> None: + self.add_action(TypingInteraction(self, "keyUp", key)) + + def create_pause(self, pause_duration: float = 0) -> None: + self.add_action(Pause(self, pause_duration)) + + +class TypingInteraction(Interaction): + def __init__(self, source, type_, key) -> None: + super().__init__(source) + self.type = type_ + self.key = key + + def encode(self) -> dict: + return {"type": self.type, "value": self.key} diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/mouse_button.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/mouse_button.py new file mode 100755 index 0000000..f5ba469 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/mouse_button.py @@ -0,0 +1,24 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +class MouseButton: + LEFT = 0 + MIDDLE = 1 + RIGHT = 2 + BACK = 3 + FORWARD = 4 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_actions.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_actions.py new file mode 100755 index 0000000..7a231fe --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_actions.py @@ -0,0 +1,205 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Optional + +from selenium.webdriver.remote.webelement import WebElement + +from . import interaction +from .interaction import Interaction +from .mouse_button import MouseButton +from .pointer_input import PointerInput + + +class PointerActions(Interaction): + def __init__(self, source: Optional[PointerInput] = None, duration: int = 250): + """ + Args: + - source: PointerInput instance + - duration: override the default 250 msecs of DEFAULT_MOVE_DURATION in source + """ + if not source: + source = PointerInput(interaction.POINTER_MOUSE, "mouse") + self.source = source + self._duration = duration + super().__init__(source) + + def pointer_down( + self, + button=MouseButton.LEFT, + width=None, + height=None, + pressure=None, + tangential_pressure=None, + tilt_x=None, + tilt_y=None, + twist=None, + altitude_angle=None, + azimuth_angle=None, + ): + self._button_action( + "create_pointer_down", + button=button, + width=width, + height=height, + pressure=pressure, + tangential_pressure=tangential_pressure, + tilt_x=tilt_x, + tilt_y=tilt_y, + twist=twist, + altitude_angle=altitude_angle, + azimuth_angle=azimuth_angle, + ) + return self + + def pointer_up(self, button=MouseButton.LEFT): + self._button_action("create_pointer_up", button=button) + return self + + def move_to( + self, + element, + x=0, + y=0, + width=None, + height=None, + pressure=None, + tangential_pressure=None, + tilt_x=None, + tilt_y=None, + twist=None, + altitude_angle=None, + azimuth_angle=None, + ): + if not isinstance(element, WebElement): + raise AttributeError("move_to requires a WebElement") + + self.source.create_pointer_move( + origin=element, + duration=self._duration, + x=int(x), + y=int(y), + width=width, + height=height, + pressure=pressure, + tangential_pressure=tangential_pressure, + tilt_x=tilt_x, + tilt_y=tilt_y, + twist=twist, + altitude_angle=altitude_angle, + azimuth_angle=azimuth_angle, + ) + return self + + def move_by( + self, + x, + y, + width=None, + height=None, + pressure=None, + tangential_pressure=None, + tilt_x=None, + tilt_y=None, + twist=None, + altitude_angle=None, + azimuth_angle=None, + ): + self.source.create_pointer_move( + origin=interaction.POINTER, + duration=self._duration, + x=int(x), + y=int(y), + width=width, + height=height, + pressure=pressure, + tangential_pressure=tangential_pressure, + tilt_x=tilt_x, + tilt_y=tilt_y, + twist=twist, + altitude_angle=altitude_angle, + azimuth_angle=azimuth_angle, + ) + return self + + def move_to_location( + self, + x, + y, + width=None, + height=None, + pressure=None, + tangential_pressure=None, + tilt_x=None, + tilt_y=None, + twist=None, + altitude_angle=None, + azimuth_angle=None, + ): + self.source.create_pointer_move( + origin="viewport", + duration=self._duration, + x=int(x), + y=int(y), + width=width, + height=height, + pressure=pressure, + tangential_pressure=tangential_pressure, + tilt_x=tilt_x, + tilt_y=tilt_y, + twist=twist, + altitude_angle=altitude_angle, + azimuth_angle=azimuth_angle, + ) + return self + + def click(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): + if element: + self.move_to(element) + self.pointer_down(button) + self.pointer_up(button) + return self + + def context_click(self, element: Optional[WebElement] = None): + return self.click(element=element, button=MouseButton.RIGHT) + + def click_and_hold(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): + if element: + self.move_to(element) + self.pointer_down(button=button) + return self + + def release(self, button=MouseButton.LEFT): + self.pointer_up(button=button) + return self + + def double_click(self, element: Optional[WebElement] = None): + if element: + self.move_to(element) + self.pointer_down(MouseButton.LEFT) + self.pointer_up(MouseButton.LEFT) + self.pointer_down(MouseButton.LEFT) + self.pointer_up(MouseButton.LEFT) + return self + + def pause(self, duration: float = 0): + self.source.create_pause(duration) + return self + + def _button_action(self, action, **kwargs): + meth = getattr(self.source, action) + meth(**kwargs) + return self diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_input.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_input.py new file mode 100755 index 0000000..ce5e1c5 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/pointer_input.py @@ -0,0 +1,81 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +import typing +from typing import Union + +from selenium.common.exceptions import InvalidArgumentException +from selenium.webdriver.remote.webelement import WebElement + +from .input_device import InputDevice +from .interaction import POINTER +from .interaction import POINTER_KINDS + + +class PointerInput(InputDevice): + DEFAULT_MOVE_DURATION = 250 + + def __init__(self, kind, name): + super().__init__() + if kind not in POINTER_KINDS: + raise InvalidArgumentException(f"Invalid PointerInput kind '{kind}'") + self.type = POINTER + self.kind = kind + self.name = name + + def create_pointer_move( + self, + duration=DEFAULT_MOVE_DURATION, + x: float = 0, + y: float = 0, + origin: typing.Optional[WebElement] = None, + **kwargs, + ): + action = {"type": "pointerMove", "duration": duration, "x": x, "y": y, **kwargs} + if isinstance(origin, WebElement): + action["origin"] = {"element-6066-11e4-a52e-4f735466cecf": origin.id} + elif origin is not None: + action["origin"] = origin + self.add_action(self._convert_keys(action)) + + def create_pointer_down(self, **kwargs): + data = {"type": "pointerDown", "duration": 0, **kwargs} + self.add_action(self._convert_keys(data)) + + def create_pointer_up(self, button): + self.add_action({"type": "pointerUp", "duration": 0, "button": button}) + + def create_pointer_cancel(self): + self.add_action({"type": "pointerCancel"}) + + def create_pause(self, pause_duration: Union[int, float] = 0) -> None: + self.add_action({"type": "pause", "duration": int(pause_duration * 1000)}) + + def encode(self): + return {"type": self.type, "parameters": {"pointerType": self.kind}, "id": self.name, "actions": self.actions} + + def _convert_keys(self, actions: typing.Dict[str, typing.Any]): + out = {} + for k, v in actions.items(): + if v is None: + continue + if k in ("x", "y"): + out[k] = int(v) + continue + splits = k.split("_") + new_key = splits[0] + "".join(v.title() for v in splits[1:]) + out[new_key] = v + return out diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_actions.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_actions.py new file mode 100755 index 0000000..43c080d --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_actions.py @@ -0,0 +1,33 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from .interaction import Interaction +from .wheel_input import WheelInput + + +class WheelActions(Interaction): + def __init__(self, source: WheelInput = None): + if not source: + source = WheelInput("wheel") + super().__init__(source) + + def pause(self, duration: float = 0): + self.source.create_pause(duration) + return self + + def scroll(self, x=0, y=0, delta_x=0, delta_y=0, duration=0, origin="viewport"): + self.source.create_scroll(x, y, delta_x, delta_y, duration, origin) + return self diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_input.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_input.py new file mode 100755 index 0000000..a072e82 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/actions/wheel_input.py @@ -0,0 +1,77 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from typing import Union + +from selenium.webdriver.remote.webelement import WebElement + +from . import interaction +from .input_device import InputDevice + + +class ScrollOrigin: + def __init__(self, origin: Union[str, WebElement], x_offset: int, y_offset: int) -> None: + self._origin = origin + self._x_offset = x_offset + self._y_offset = y_offset + + @classmethod + def from_element(cls, element: WebElement, x_offset: int = 0, y_offset: int = 0): + return cls(element, x_offset, y_offset) + + @classmethod + def from_viewport(cls, x_offset: int = 0, y_offset: int = 0): + return cls("viewport", x_offset, y_offset) + + @property + def origin(self) -> Union[str, WebElement]: + return self._origin + + @property + def x_offset(self) -> int: + return self._x_offset + + @property + def y_offset(self) -> int: + return self._y_offset + + +class WheelInput(InputDevice): + def __init__(self, name) -> None: + super().__init__(name=name) + self.name = name + self.type = interaction.WHEEL + + def encode(self) -> dict: + return {"type": self.type, "id": self.name, "actions": self.actions} + + def create_scroll(self, x: int, y: int, delta_x: int, delta_y: int, duration: int, origin) -> None: + if isinstance(origin, WebElement): + origin = {"element-6066-11e4-a52e-4f735466cecf": origin.id} + self.add_action( + { + "type": "scroll", + "x": x, + "y": y, + "deltaX": delta_x, + "deltaY": delta_y, + "duration": duration, + "origin": origin, + } + ) + + def create_pause(self, pause_duration: Union[int, float] = 0) -> None: + self.add_action({"type": "pause", "duration": int(pause_duration * 1000)}) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/alert.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/alert.py new file mode 100755 index 0000000..e7fd64b --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/alert.py @@ -0,0 +1,80 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""The Alert implementation.""" + +from selenium.webdriver.common.utils import keys_to_typing +from selenium.webdriver.remote.command import Command + + +class Alert: + """Allows to work with alerts. + + Use this class to interact with alert prompts. It contains methods for dismissing, + accepting, inputting, and getting text from alert prompts. + + Accepting / Dismissing alert prompts:: + + Alert(driver).accept() + Alert(driver).dismiss() + + Inputting a value into an alert prompt:: + + name_prompt = Alert(driver) + name_prompt.send_keys("Willian Shakesphere") + name_prompt.accept() + + + Reading a the text of a prompt for verification:: + + alert_text = Alert(driver).text + self.assertEqual("Do you wish to quit?", alert_text) + """ + + def __init__(self, driver) -> None: + """Creates a new Alert. + + :Args: + - driver: The WebDriver instance which performs user actions. + """ + self.driver = driver + + @property + def text(self) -> str: + """Gets the text of the Alert.""" + return self.driver.execute(Command.W3C_GET_ALERT_TEXT)["value"] + + def dismiss(self) -> None: + """Dismisses the alert available.""" + self.driver.execute(Command.W3C_DISMISS_ALERT) + + def accept(self) -> None: + """Accepts the alert available. + + :Usage: + :: + + Alert(driver).accept() # Confirm a alert dialog. + """ + self.driver.execute(Command.W3C_ACCEPT_ALERT) + + def send_keys(self, keysToSend: str) -> None: + """Send Keys to the Alert. + + :Args: + - keysToSend: The text to be sent to Alert. + """ + self.driver.execute(Command.W3C_SET_ALERT_VALUE, {"value": keys_to_typing(keysToSend), "text": keysToSend}) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__init__.py new file mode 100755 index 0000000..a5b1e6f --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3716e6ed4e15187e12a18fc653a96c37f60c4461 GIT binary patch literal 221 zcmX@j%ge<81dZ`A>B7tm439w^bnux4C^DU)l0lQvZzV$!6Oi{Aq~=$Renx(7s(x;1 zMq+MmVv4>?esXDUYFHesX?pZhoGAQf5k~ tetdjpUS>&ryk0@&Ee@O9{FKt1RJ$Tppko+;xERFv$jr#dSOoM70{}#UJiPz_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/cdp.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/cdp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4579b3eb87c5d0e3aa572db389522b5f5ba7e07 GIT binary patch literal 26242 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38e6b402314f8b63a706e4227932c47471d8cc24 GIT binary patch literal 492 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 P;s6jf@QeqJy~=+9CqEg> literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/session.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/__pycache__/session.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..828e1d469aa8bc202030f4d4e101c417d056a5f7 GIT binary patch literal 871 zcmcIiL2DC16rR~lHfx)tNh8wOT8f}0hh&;6;-M6@6$?VWi?HnOOq0RPZkX9kjBX%` z2fg)VFZ}~K_)EN`x45T*7mtxBs3&LIZtY$A;61*XH+=KH_ul7RZU#tuV?A%o8UTD% zhs3lqFkO=10APUOA;j7{?OB3#iD3^^Qo9ux7ai_*1@#)1>w5ut83;FFf)eP`SEWxk zWq1OhVw7wVq!8SjgSpVz4AGlE#yv>CH8+VO?0g^^F5s|7=xWj7MSHxW@WszJTl8)G7IDS!}sR? z!jXA>v{*edYvcU25Bb4^@$B61snYs(@dmuiag`EPq4!UV`k1FxPy^zo3RhH6J9$0= zo|C6IA+RnI6lLb7dV8T6tN+yuJ}2oa+DV(aqCY8UDgijH!`xs#4qIfCt0}0(7HUl= aI)rd?8?4{^0kW_#Sq69S|5S+2%j{psi{k {self.detail}" + + +class CdpConnectionClosed(WsConnectionClosed): + """Raised when a public method is called on a closed CDP connection.""" + + def __init__(self, reason): + """Constructor. + + :param reason: + :type reason: wsproto.frame_protocol.CloseReason + """ + self.reason = reason + + def __repr__(self): + """Return representation.""" + return f"{self.__class__.__name__}<{self.reason}>" + + +class InternalError(Exception): + """This exception is only raised when there is faulty logic in TrioCDP or + the integration with PyCDP.""" + + +@dataclass +class CmEventProxy: + """A proxy object returned by :meth:`CdpBase.wait_for()``. + + After the context manager executes, this proxy object will have a + value set that contains the returned event. + """ + + value: typing.Any = None + + +class CdpBase: + def __init__(self, ws, session_id, target_id): + self.ws = ws + self.session_id = session_id + self.target_id = target_id + self.channels = defaultdict(set) + self.id_iter = itertools.count() + self.inflight_cmd = {} + self.inflight_result = {} + + async def execute(self, cmd: typing.Generator[dict, T, typing.Any]) -> T: + """Execute a command on the server and wait for the result. + + :param cmd: any CDP command + :returns: a CDP result + """ + cmd_id = next(self.id_iter) + cmd_event = trio.Event() + self.inflight_cmd[cmd_id] = cmd, cmd_event + request = next(cmd) + request["id"] = cmd_id + if self.session_id: + request["sessionId"] = self.session_id + request_str = json.dumps(request) + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"Sending CDP message: {cmd_id} {cmd_event}: {request_str}") + try: + await self.ws.send_message(request_str) + except WsConnectionClosed as wcc: + raise CdpConnectionClosed(wcc.reason) from None + await cmd_event.wait() + response = self.inflight_result.pop(cmd_id) + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"Received CDP message: {response}") + if isinstance(response, Exception): + if logger.isEnabledFor(logging.DEBUG): + logger.debug(f"Exception raised by {cmd_event} message: {type(response).__name__}") + raise response + return response + + def listen(self, *event_types, buffer_size=10): + """Return an async iterator that iterates over events matching the + indicated types.""" + sender, receiver = trio.open_memory_channel(buffer_size) + for event_type in event_types: + self.channels[event_type].add(sender) + return receiver + + @asynccontextmanager + async def wait_for(self, event_type: typing.Type[T], buffer_size=10) -> typing.AsyncGenerator[CmEventProxy, None]: + """Wait for an event of the given type and return it. + + This is an async context manager, so you should open it inside + an async with block. The block will not exit until the indicated + event is received. + """ + sender: trio.MemorySendChannel + receiver: trio.MemoryReceiveChannel + sender, receiver = trio.open_memory_channel(buffer_size) + self.channels[event_type].add(sender) + proxy = CmEventProxy() + yield proxy + async with receiver: + event = await receiver.receive() + proxy.value = event + + def _handle_data(self, data): + """Handle incoming WebSocket data. + + :param dict data: a JSON dictionary + """ + if "id" in data: + self._handle_cmd_response(data) + else: + self._handle_event(data) + + def _handle_cmd_response(self, data): + """Handle a response to a command. This will set an event flag that + will return control to the task that called the command. + + :param dict data: response as a JSON dictionary + """ + cmd_id = data["id"] + try: + cmd, event = self.inflight_cmd.pop(cmd_id) + except KeyError: + logger.warning("Got a message with a command ID that does not exist: %s", data) + return + if "error" in data: + # If the server reported an error, convert it to an exception and do + # not process the response any further. + self.inflight_result[cmd_id] = BrowserError(data["error"]) + else: + # Otherwise, continue the generator to parse the JSON result + # into a CDP object. + try: + _ = cmd.send(data["result"]) + raise InternalError("The command's generator function did not exit when expected!") + except StopIteration as exit: + return_ = exit.value + self.inflight_result[cmd_id] = return_ + event.set() + + def _handle_event(self, data): + """Handle an event. + + :param dict data: event as a JSON dictionary + """ + global devtools + event = devtools.util.parse_json_event(data) + logger.debug("Received event: %s", event) + to_remove = set() + for sender in self.channels[type(event)]: + try: + sender.send_nowait(event) + except trio.WouldBlock: + logger.error('Unable to send event "%r" due to full channel %s', event, sender) + except trio.BrokenResourceError: + to_remove.add(sender) + if to_remove: + self.channels[type(event)] -= to_remove + + +class CdpSession(CdpBase): + """Contains the state for a CDP session. + + Generally you should not instantiate this object yourself; you should call + :meth:`CdpConnection.open_session`. + """ + + def __init__(self, ws, session_id, target_id): + """Constructor. + + :param trio_websocket.WebSocketConnection ws: + :param devtools.target.SessionID session_id: + :param devtools.target.TargetID target_id: + """ + super().__init__(ws, session_id, target_id) + + self._dom_enable_count = 0 + self._dom_enable_lock = trio.Lock() + self._page_enable_count = 0 + self._page_enable_lock = trio.Lock() + + @asynccontextmanager + async def dom_enable(self): + """A context manager that executes ``dom.enable()`` when it enters and + then calls ``dom.disable()``. + + This keeps track of concurrent callers and only disables DOM + events when all callers have exited. + """ + global devtools + async with self._dom_enable_lock: + self._dom_enable_count += 1 + if self._dom_enable_count == 1: + await self.execute(devtools.dom.enable()) + + yield + + async with self._dom_enable_lock: + self._dom_enable_count -= 1 + if self._dom_enable_count == 0: + await self.execute(devtools.dom.disable()) + + @asynccontextmanager + async def page_enable(self): + """A context manager that executes ``page.enable()`` when it enters and + then calls ``page.disable()`` when it exits. + + This keeps track of concurrent callers and only disables page + events when all callers have exited. + """ + global devtools + async with self._page_enable_lock: + self._page_enable_count += 1 + if self._page_enable_count == 1: + await self.execute(devtools.page.enable()) + + yield + + async with self._page_enable_lock: + self._page_enable_count -= 1 + if self._page_enable_count == 0: + await self.execute(devtools.page.disable()) + + +class CdpConnection(CdpBase, trio.abc.AsyncResource): + """Contains the connection state for a Chrome DevTools Protocol server. + + CDP can multiplex multiple "sessions" over a single connection. This + class corresponds to the "root" session, i.e. the implicitly created + session that has no session ID. This class is responsible for + reading incoming WebSocket messages and forwarding them to the + corresponding session, as well as handling messages targeted at the + root session itself. You should generally call the + :func:`open_cdp()` instead of instantiating this class directly. + """ + + def __init__(self, ws): + """Constructor. + + :param trio_websocket.WebSocketConnection ws: + """ + super().__init__(ws, session_id=None, target_id=None) + self.sessions = {} + + async def aclose(self): + """Close the underlying WebSocket connection. + + This will cause the reader task to gracefully exit when it tries + to read the next message from the WebSocket. All of the public + APIs (``execute()``, ``listen()``, etc.) will raise + ``CdpConnectionClosed`` after the CDP connection is closed. It + is safe to call this multiple times. + """ + await self.ws.aclose() + + @asynccontextmanager + async def open_session(self, target_id) -> typing.AsyncIterator[CdpSession]: + """This context manager opens a session and enables the "simple" style + of calling CDP APIs. + + For example, inside a session context, you can call ``await + dom.get_document()`` and it will execute on the current session + automatically. + """ + session = await self.connect_session(target_id) + with session_context(session): + yield session + + async def connect_session(self, target_id) -> "CdpSession": + """Returns a new :class:`CdpSession` connected to the specified + target.""" + global devtools + session_id = await self.execute(devtools.target.attach_to_target(target_id, True)) + session = CdpSession(self.ws, session_id, target_id) + self.sessions[session_id] = session + return session + + async def _reader_task(self): + """Runs in the background and handles incoming messages: dispatching + responses to commands and events to listeners.""" + global devtools + while True: + try: + message = await self.ws.get_message() + except WsConnectionClosed: + # If the WebSocket is closed, we don't want to throw an + # exception from the reader task. Instead we will throw + # exceptions from the public API methods, and we can quietly + # exit the reader task here. + break + try: + data = json.loads(message) + except json.JSONDecodeError: + raise BrowserError({"code": -32700, "message": "Client received invalid JSON", "data": message}) + logger.debug("Received message %r", data) + if "sessionId" in data: + session_id = devtools.target.SessionID(data["sessionId"]) + try: + session = self.sessions[session_id] + except KeyError: + raise BrowserError( + { + "code": -32700, + "message": "Browser sent a message for an invalid session", + "data": f"{session_id!r}", + } + ) + session._handle_data(data) + else: + self._handle_data(data) + + for _, session in self.sessions.items(): + for _, senders in session.channels.items(): + for sender in senders: + sender.close() + + +@asynccontextmanager +async def open_cdp(url) -> typing.AsyncIterator[CdpConnection]: + """This async context manager opens a connection to the browser specified + by ``url`` before entering the block, then closes the connection when the + block exits. + + The context manager also sets the connection as the default + connection for the current task, so that commands like ``await + target.get_targets()`` will run on this connection automatically. If + you want to use multiple connections concurrently, it is recommended + to open each on in a separate task. + """ + + async with trio.open_nursery() as nursery: + conn = await connect_cdp(nursery, url) + try: + with connection_context(conn): + yield conn + finally: + await conn.aclose() + + +async def connect_cdp(nursery, url) -> CdpConnection: + """Connect to the browser specified by ``url`` and spawn a background task + in the specified nursery. + + The ``open_cdp()`` context manager is preferred in most situations. + You should only use this function if you need to specify a custom + nursery. This connection is not automatically closed! You can either + use the connection object as a context manager (``async with + conn:``) or else call ``await conn.aclose()`` on it when you are + done with it. If ``set_context`` is True, then the returned + connection will be installed as the default connection for the + current task. This argument is for unusual use cases, such as + running inside of a notebook. + """ + ws = await connect_websocket_url(nursery, url, max_message_size=MAX_WS_MESSAGE_SIZE) + cdp_conn = CdpConnection(ws) + nursery.start_soon(cdp_conn._reader_task) + return cdp_conn diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/console.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/console.py new file mode 100755 index 0000000..93fe7d8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/console.py @@ -0,0 +1,24 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from enum import Enum + + +class Console(Enum): + ALL = "all" + LOG = "log" + ERROR = "error" diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/script.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/script.py new file mode 100755 index 0000000..6819a5c --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/script.py @@ -0,0 +1,110 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import typing +from dataclasses import dataclass + +from .session import session_subscribe +from .session import session_unsubscribe + + +class Script: + def __init__(self, conn): + self.conn = conn + self.log_entry_subscribed = False + + def add_console_message_handler(self, handler): + self._subscribe_to_log_entries() + return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("console", handler)) + + def add_javascript_error_handler(self, handler): + self._subscribe_to_log_entries() + return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("javascript", handler)) + + def remove_console_message_handler(self, id): + self.conn.remove_callback(LogEntryAdded, id) + self._unsubscribe_from_log_entries() + + remove_javascript_error_handler = remove_console_message_handler + + def _subscribe_to_log_entries(self): + if not self.log_entry_subscribed: + self.conn.execute(session_subscribe(LogEntryAdded.event_class)) + self.log_entry_subscribed = True + + def _unsubscribe_from_log_entries(self): + if self.log_entry_subscribed and LogEntryAdded.event_class not in self.conn.callbacks: + self.conn.execute(session_unsubscribe(LogEntryAdded.event_class)) + self.log_entry_subscribed = False + + def _handle_log_entry(self, type, handler): + def _handle_log_entry(log_entry): + if log_entry.type_ == type: + handler(log_entry) + + return _handle_log_entry + + +class LogEntryAdded: + event_class = "log.entryAdded" + + @classmethod + def from_json(cls, json): + if json["type"] == "console": + return ConsoleLogEntry.from_json(json) + elif json["type"] == "javascript": + return JavaScriptLogEntry.from_json(json) + + +@dataclass +class ConsoleLogEntry: + level: str + text: str + timestamp: str + method: str + args: typing.List[dict] + type_: str + + @classmethod + def from_json(cls, json): + return cls( + level=json["level"], + text=json["text"], + timestamp=json["timestamp"], + method=json["method"], + args=json["args"], + type_=json["type"], + ) + + +@dataclass +class JavaScriptLogEntry: + level: str + text: str + timestamp: str + stacktrace: dict + type_: str + + @classmethod + def from_json(cls, json): + return cls( + level=json["level"], + text=json["text"], + timestamp=json["timestamp"], + stacktrace=json["stackTrace"], + type_=json["type"], + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/session.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/session.py new file mode 100755 index 0000000..dbe5d26 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/bidi/session.py @@ -0,0 +1,46 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +def session_subscribe(*events, browsing_contexts=None): + cmd_dict = { + "method": "session.subscribe", + "params": { + "events": events, + }, + } + if browsing_contexts is None: + browsing_contexts = [] + if browsing_contexts: + cmd_dict["params"]["browsingContexts"] = browsing_contexts + _ = yield cmd_dict + return None + + +def session_unsubscribe(*events, browsing_contexts=None): + cmd_dict = { + "method": "session.unsubscribe", + "params": { + "events": events, + }, + } + if browsing_contexts is None: + browsing_contexts = [] + if browsing_contexts: + cmd_dict["params"]["browsingContexts"] = browsing_contexts + _ = yield cmd_dict + return None diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/by.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/by.py new file mode 100755 index 0000000..65a7464 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/by.py @@ -0,0 +1,51 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""The By implementation.""" + +from typing import Dict +from typing import Literal +from typing import Optional + + +class By: + """Set of supported locator strategies.""" + + ID = "id" + XPATH = "xpath" + LINK_TEXT = "link text" + PARTIAL_LINK_TEXT = "partial link text" + NAME = "name" + TAG_NAME = "tag name" + CLASS_NAME = "class name" + CSS_SELECTOR = "css selector" + + _custom_finders: Dict[str, str] = {} + + @classmethod + def register_custom_finder(cls, name: str, strategy: str) -> None: + cls._custom_finders[name] = strategy + + @classmethod + def get_finder(cls, name: str) -> Optional[str]: + return cls._custom_finders.get(name) or getattr(cls, name.upper(), None) + + @classmethod + def clear_custom_finders(cls) -> None: + cls._custom_finders.clear() + + +ByType = Literal["id", "xpath", "link text", "partial link text", "name", "tag name", "class name", "css selector"] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/desired_capabilities.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/desired_capabilities.py new file mode 100755 index 0000000..1d78019 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/desired_capabilities.py @@ -0,0 +1,100 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""The Desired Capabilities implementation.""" + + +class DesiredCapabilities: + """Set of default supported desired capabilities. + + Use this as a starting point for creating a desired capabilities object for + requesting remote webdrivers for connecting to selenium server or selenium grid. + + Usage Example:: + + from selenium import webdriver + + selenium_grid_url = "http://198.0.0.1:4444/wd/hub" + + # Create a desired capabilities object as a starting point. + capabilities = DesiredCapabilities.FIREFOX.copy() + capabilities['platform'] = "WINDOWS" + capabilities['version'] = "10" + + # Instantiate an instance of Remote WebDriver with the desired capabilities. + driver = webdriver.Remote(desired_capabilities=capabilities, + command_executor=selenium_grid_url) + + Note: Always use '.copy()' on the DesiredCapabilities object to avoid the side + effects of altering the Global class instance. + """ + + FIREFOX = { + "browserName": "firefox", + "acceptInsecureCerts": True, + "moz:debuggerAddress": True, + } + + INTERNETEXPLORER = { + "browserName": "internet explorer", + "platformName": "windows", + } + + EDGE = { + "browserName": "MicrosoftEdge", + } + + CHROME = { + "browserName": "chrome", + } + + SAFARI = { + "browserName": "safari", + "platformName": "mac", + } + + HTMLUNIT = { + "browserName": "htmlunit", + "version": "", + "platform": "ANY", + } + + HTMLUNITWITHJS = { + "browserName": "htmlunit", + "version": "firefox", + "platform": "ANY", + "javascriptEnabled": True, + } + + IPHONE = { + "browserName": "iPhone", + "version": "", + "platform": "mac", + } + + IPAD = { + "browserName": "iPad", + "version": "", + "platform": "mac", + } + + WEBKITGTK = { + "browserName": "MiniBrowser", + } + + WPEWEBKIT = { + "browserName": "MiniBrowser", + } diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__init__.py new file mode 100755 index 0000000..e825da8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__init__.py @@ -0,0 +1,60 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +from . import accessibility +from . import animation +from . import audits +from . import autofill +from . import background_service +from . import bluetooth_emulation +from . import browser +from . import css +from . import cache_storage +from . import cast +from . import console +from . import dom +from . import dom_debugger +from . import dom_snapshot +from . import dom_storage +from . import database +from . import debugger +from . import device_access +from . import device_orientation +from . import emulation +from . import event_breakpoints +from . import extensions +from . import fed_cm +from . import fetch +from . import file_system +from . import headless_experimental +from . import heap_profiler +from . import io +from . import indexed_db +from . import input_ +from . import inspector +from . import layer_tree +from . import log +from . import media +from . import memory +from . import network +from . import overlay +from . import pwa +from . import page +from . import performance +from . import performance_timeline +from . import preload +from . import profiler +from . import runtime +from . import schema +from . import security +from . import service_worker +from . import storage +from . import system_info +from . import target +from . import tethering +from . import tracing +from . import web_audio +from . import web_authn +from . import util + diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c19a43db559d9543a0d18ae65599f94c2558752 GIT binary patch literal 2055 zcmYk+Id9`e7zSX_sPauFkU@#YB)3I@6Bf2!skclhyEXvmh~4GUOp4g`1}j> zv*lZUA+(|b6$saS1L_NjwQp(xkWym#HkSz!j>9t8kU7;u>6|nz#% zya+GSqId~jq9yS%yiCjD6?lbK#H;Wst%}#+HChv|!|Svz-hek~L%a!Z(x!L|-l8q> zHoQ&S;vIO0cEr2zF71l<;62(C@5B4FFFt?|=s==~CQ?hDrNP5bTN1>Dni;ZxJ~Je6fZF9-uOL`BVwgUB_3 zj!`JPxgVGes=B$+4?!5ht)AfuFz?qV)L@p+Us@CsYf(9y;Qj$5*@^{3w8C; zs5rys@Pm{el<#=F&dCR5yaCX_7U9u`nNeK7I8d%1Vt*a=F;Qs{@vrd~HqnqcNy=L) zPc{)~RM&&pS06E}-$SV!#7S-(s20RoqCD&vcM9F1N*$9b*{M+XQ8^hYKX7?aq#~X2 zNmgQIo^<+wsUKB}VPG+N;%=p6y!Q<(>p`cH8_OXsyec{d>kWgLf2ES7D%7qIR$r~U zlIAh@LUlRAp+-D)HB(-mj&IZS^ZjsmA@ZP=FUQpw?~@b65B%_D zKUu}3t~X}wN%b7QlHC2dUt`1+!IWoLm= zodhoc+@H+ORH))0k8GTbp9Z*Pwx^>=$2R`M@G=N9`>}iV)^>2nfpMIRWcaE2F4BG; zs`u%8tcu@5*>8w{iiJYq-?~-U7+K3BYhh$9jjWxKwL7vFN7mfPS|3@h7q5*h{H;nK zbVCz*V$}A?T9L8y(z-8AvoDqCfL2U}R?LrS$1`JEOtmLP%!bPGuVW=Jnoz`87`gnX K)k@!C!T$r)x*=)+ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/accessibility.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/accessibility.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6169807df43030a044aee90098630d55fba7b28 GIT binary patch literal 27449 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/animation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/animation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e4ba05e577affa9f5ed88a8331f6a4bf82ea5e9 GIT binary patch literal 16614 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 J#)lGH^}i2^Qg8qO literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/audits.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/audits.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52550087d6d1af0ee99cf5d38326d11ea97950ea GIT binary patch literal 78098 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­KtF`RaDf`#W8l?)76)wlNI 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/autofill.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/autofill.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbd977afa657428122acd6683238665e06db38ec GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/background_service.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/background_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7fc5a951199553be18543c3feee237b56575154 GIT binary patch literal 8048 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 Su&%7oy*8Nt0|H}I^nU?r%NG&= literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cache_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cache_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c44febbb54aa1a86bb6f270540584104866c4679 GIT binary patch literal 12126 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 Dz9imO literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cast.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/cast.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b354f6b35a5d5becaf08f7649edd89bf9d0eeb8 GIT binary patch literal 5469 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdc149d0003d2e5d38e3392aa39ec4569db68417 GIT binary patch literal 3603 zcmbUk*=`%jvFG6M7*f_a5Lh^!}JUxGEX0sNSM2m)xK1wza!$Od`IzRAlCay+HFXGoK>3h=ATlj1cL9Oe)Grg97%gFwY`Y8f@%NtBgrhu?7l9B@o>mAI~PhgA9# z8hjy9vjXY_C;F1>QD1SL5-kuvVuH7(FMH(Y-gG77l^2Tkor!A;EFy+^14M86Qi+-` zvx>HN%a_ffO?;)`m?g_DgvY>R!6E`bq2347b>ua94a*-0_tD+(pt(i}?h9C8-U3%{ zr3Z81iXk^lyjB_D@;HNTtd$;PmfO-Wq17A-1r3tlN_-Zb7pZiw@~)x9sAtG znX@^!=#lXSqwrJ6DK`h35W85ia`(tAro}}uxHJwYcz`Un{7Rsbxa-E_|fiz{;Njls=8YW+tyPi~xCnOg0wUSZ_P>g2Yn)dr4jPHs#Bxv%;? zMt-yU=C(Ri8$7;wW8(&p4_Bva>7Es}4!fg5Ya+5U;iA zc52VO+UVFb`9u40PaySa*U%qFYNyUV!=Ie`_TzKSCBI5VI}>{-8c*yc(YwNX!V3aD z1U6(5f z!5w)7kfG6~sqMtk9r*+xBPW->yPec_fpv2zw?*Lr+<@N+>%s$}Ed4>cCuHTyA>K=-9O7!wK<8Q02)c_BxLD~8 zk9wkD5`%_)$(^RK0fJPC6)ddt+V)bubZ`wlY+5co2^w$1&pis@pXfhJXfJ`{UEAH+ zJxLr?mM($Q-Tl>f9!~wY&N{}g5=r4}`*kPqtLPfDCioVXG7USHQMAXj1t~OVq z-aMgAfrhmjOKEMEKtMD~798pkta*+G!dk&BLIDoqL{EUFm2@LWIM^@<4;^LR26a5R zLeY>s@;#{%7pJT0IYP@bH2)E}|QBndn9S6t1-yWnS zPne;DgH*{hj-l0_w$Mqi9DG830^qCPcO-%pEHBHAH%?xG$7a+|UJV{#+|SB6?)+uf zEkUsE%@bR*$-VuFq!nGwU||X4z%HvF4ee{|R;;#zc|!d=+%(>;U>1CLL&F<58~1mx zkHxL! zqnT&fr}|Fj?XM(})nGB6;KgVj~)(m@y~OL%&W0gVB+G#z4q z+cwN*tab=<#hNMzDR6B z4bP!BTK)@+X>G`~W0PC(4u@_rR|4CiTTm8yUoLq?lSY_5+%>iN2ZFdX$|ZJpKROXKGy7|IGKlWD8mENJ}L71JNivjFOf*|~>0|~=_L#O_Vj(>*K&rs@f zA@Ofwl$;T>V5#xzu>0f1{TaN@ZPD7WJO DDS$An literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/css.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/css.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..230ca9f16badd3f00435455bca4089c9127b2d7d GIT binary patch literal 87986 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 z zM|m_L9>+v{nr$c@{=%W-t0G2chCTXGn9yZaMwzKe&Xi~G7{10~!aN}ZwQCHkVtx}NM2w$$1593=6B@v@#CYoe@jjc zsGgP1szVco0Xs!vQiIhaO-LT~*W0{2}5rk_ig%{E2ja3v*;!;Z9sv*nh zrW{@#iciEzU7g1Ko-{LR)B2$*nx&J6NjYm`ch{7KqrPA`4s#@A#dh+@8rD-qn*_eYXn`}#PPwAy?X;kU zOP6=bINM^UOkG|@3v5`=uIO#m6}=O0s-wtRuA@cG-&|cCmL}dTORsWpM8~RJ(W2(! zjC(cjnWa|4cf$Ri6^+J@Dn>&mb?r4+IEAaJRXSF^h5XhWaxUE61+o0FlD{stw?!90 zD%C!~Cc0Nw-wA1^E#Y$L_bt^I<=U+jl?!{DxPxLsNRcqI@8`S37g@dXw`3YdMvj~! z$7*E61XshC@#E&4<0h3;gyEP8;p}x>-?L*va)uP6W2a7J>QqZJK6NHC$P7_B-1}$z zyO74bl;KTu_RtZlZbS4PqH{N$Bpu;-+)Cd|bVRHo#OE~z-=rg^;{HmXsPMl}-@oaI zX0#}yzR2J&>4-UsPQb#vf{w6mZ=p}D$sMBaC>@i|X*zOC^#k-hO6R+Dc;}ehwI%mO z$(1~E9fX+KH-EucnvoOhPbTg1h~XCVcl6O7fE)%kdFIpPc|17}CFfL3o*gi$nQc-h z)}&&hXorcqk4XDP25nMWDdHj#B`EH#aNvX=BcI>$>E-6uWa|5&wSaxeb~6gJqYPj2 z3}!A@YZ%6R3w_3#w|$qrV|~*;Jf>U1#?r?os7)~K zgE!aVs|med(`tZ24JTiVU`~Sl5)okp938=6uSA3y0Y^tLsES(52sk=|!EVX1oDpzz z1cTcvN0cqcZrYBW(QpHP=fdT^&j9^pToIbiDnE&c{2aeemYiN#ZCAf}@i% zxZ9AJHpalwF$@l=m=?ys(J>5ek}OS(fTJTAyi6k2F#?W`VDM&D)(&YbT^%QX?5>e) zJ1VelFivw|^jbPR)d-`Ifi zF=eN@{D8Kz8aTQd2KTFK1{ecJ$1pgg#-?mFYncU(&cfjJs<5(yR<^8FEDMe& ze29PchmCH@gJ(9lGatY+*AX^wymw`;7SC*OfPZeucg!=EmgOQ%#NAYFeHMWZ17f=i<@aWmgw|&W`n2l z0X%b;$Mm0gvXEoJd;s43okoMPHMgwM*r|%5CmXyWAD}0Z^Ve{gfX2khJ=_w zB#hY!V@%kk6L#r@T}Zg7i3z)yu%9J%<$7C;0ZE9bB*arEqz?&q8TlZ+n_7%Mow84- z?6Xt$G35Xg_A#NV8&93ksvH04y6M{#0eFZ)Jar?t*uB}pgga0-B6GdX#$H2`(vw}- zm$Q5}j2!KY|xlO0vt+c$b(g#AI;nWU-td!3)bJ s+3K{h#yeSiVY2qLu~w2burxS!X&pH~f)|!aX?C)bN;@vFQsLMB5Bw-O-~a#s literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10bebaa85a6b8c6e4fd4ebdf8029351f761229ab GIT binary patch literal 6176 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 OCqT0Mz5qq)o&N)ZJV-+T literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0087a6fddb18bd999322de167b77df6d14b37ad GIT binary patch literal 54917 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 z

    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 Q3YAgyqn8yxTzx)o0C;bQ8UO$Q literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e38e5064d187442d80965f997a965fb4f8c88c50 GIT binary patch literal 77475 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 pJW&;wB(yu0N7o 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 A1poj5 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24f3eca897b49b916722a72ab83c40f1f189958b GIT binary patch literal 11056 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_snapshot.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_snapshot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f10936dcbde1e936e4ebefaa9a72beaad96c50d9 GIT binary patch literal 41463 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/dom_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28c3723a226e3392f9676e105b9e8869e140678a GIT binary patch literal 8711 zcmcIpS#VS56~3!h+wzKyv5f>6BEXgn2D2m-iV`3sqOD2Nh`NfbdjSzG?tf)dt7c*n zGIb_tlRPvq(>##2524VRba`msnzwfPB30>Fb3>F@Em z|Gu2_o#p@am)2GX2kC0)I~QKwz;XY=LMd5{3}5^W&vDl|g;V$#7w3aK&nbc;#)P;S z6ys7*f-#d3{Ptg8LCXv`UOs1~ZXLB0L9VAS3= zR}MO<%>ivrwWU0!)y^4z%8=4>O$xRto0V4hy5QRe-}Z95TX8|Tqg2MP;!)b6uCuz1 z>bEEzP~RnRs;G3{hLd74ch?0w=&s*gd6(TZrl)Sq1{l-ZbW9J8>8l&F5ytd49kYSP zY^obG0AmK5j_F;Hy<0!Rqj-7U8BQdUscp4_&!3FU#o<_*??g0pa&E>qJ~lSu4=-pV zXU>ltPb#WUP0agZ(HYKrThAwHzM0%jn*+$LQHrRF13S^1P zySkR0MaXgy6aARSLmLP0gv@nLfTJ(+CCN{5%n8-31;{Ny7b7uEmvB`Lr*ONO3qHF2 zJcGT_W`-JWrrh2E-HSNc68BG6=Nl8RE@W(d3|FoZh71)Xj3bcw2@jTlzf>(OsKt~j zpW_vNk^7OI<4Q27?B6Q{(tV9K_0SKlcyEci<$RLG!zo?X=4Mr<+d?6x&azPGmcWpA zx;sm#SN-x3OaZ!R1& zT39=D)t#hDaTO4!uwI-2_p7&>XNjn>7@Ux2o1vC~ebhJ=u0xBpV#7l~KE1{j1zzqh zSU5|^$B^4t6d_l@+$R=Zev~h8Na-9jGydP|N7~ zsLDpEO_ydsm-P0i7K$Y!;aEwR0_pD5!fZ5gVf4%_+N*Hv9LQi=cWG*5jzv=op(Kl5 zh$hm*_1zjte_D5%IvRSu&cc)x?T^HZR2k5vQ(XZNUn)ZyI+|Gf?m>oX2?9X&~vMpPvaZ}d0DdXHh zBgeCz@fFX(tmk0Pb9mYR#z3}Zh>WFSn5rdWgJsDuy#*P=SXShSa@q*>CF7$Ai~Kyt z+ES(#fCND%)jbm6%M_7%4W`Pny@d9D!;}+y7qb_fKRePv!a^U$aW> zjshpy9bjjoe4MXT7zWb8w!ms^E0S$MbZaQ2BqLz`T%k}^tO2&S7F=u?htToR?HFbX zofh+!2(nfCI*^ySRY{O-1sm79DJS*ARz}8`&SZMLIcW?EhmI_r&UEb0NsoLiS-~Q9 zf*o8HWZ6L$k#ffLICBL4%gK~KUqpSZiDJ+SQv4E>R9Ue=+){~TAbx>JMuJGjN|B5W zw9cwar&4M>y=lF)UjE2?~Joc&pFfM|3ZtAx8q1WDLz!j&c!3+v^ zD`Mu`kU7oqVCX7FuH+2JSz*t*RBA_Kh;To0f^W3z;eVnuT=Iu zFdsV#^|~z*S3=~1Ft*ar*kZ(B1h6vA%23KDu@!F{|3+D_wQ!p@|8)D(WBLAVEB(8( z{kwDhqf3u1AI?g>_d2)bJNs5;anQ1K5{yP?|0_qX`ah$oUwmjMAAw2A37rV>6hUP0 zQ~_rY<*$HSC%*6tBJo8^pEHy@s)c7_s#fBRJH_C}0CCE0_bj8URHex*qAs~-ROsW@ zAoy{olJ3++)g6gNp=1~b_BB{P-C4y@#aJg`#`x?wbXez$b*tHpoq*qS1DC# z&V`ODE~vDI!36dgo)0Bf!iU9ZW{*Q%7#r&kKfLbn41rXmRv2v&1nxlQt5>Tw#AS zH^%?gGI;ZataCCWO@8)Q=j3M^n(G%wk9G6!4IFbx@3+_>yY7-rvY&yTO=T}YOfEu) zx>Po)f_V?%7X>4>hu9HbLcq9+iy|2jX+b85S<<_|P-2G7g&T@tY)NFg2<7zVilj!F z8c)uvl?oIcNiM*S!5&Kj`Ud3dq*O1WUSq0tQexkPv5WAp;e>{e+M5e0-`xwwci+_~ z?{)57C#|yW9r5vzYBpk?m>+{oQ|62JVZK;qK3rVUvn>jsa_03Fax#cPT9il(@`8oL zU`-$SGGZ|GYd##CQ>z5Skioi4)#-tXI7YR4y{Ze#vHyRz;kdVvX&RDUc27qU%#AjD~{o$cS5+pw$dG8ZUC!iYd45`G$Tw=DIM@IGvB zdVj+)49U;oU)v7kWe#p>9sN0JW8U8K(#gE5^QFK&x&7ltcQhQB#`mI9Tv>~~Z;|C| zg1!kDdq4C6=B$cbgES~~d4*~#wz8IvXze=dx5lb)n^r%w-6gAU)hXB#;pu0%}sGu`v=aAIh=cxh7Z{c47Qg3qu8+j6FE^Onz0c_h*Fx?SKC;@DU1~$Ar;Q$N}z0r}|YV5JxjW=5XKpwWGZ2{5@0BfRvq7|Bp zR)x_GMN17xa=6F&5`F$CJus`YG!me#dTVW+yDefT@o z`8oJu3x20!fD=xa=2FoZld&^mM|YNg_*FHAZcdlf#9Umr7#pj4qQ>=fDF)AJ#ud?z zbKq+P-O3r>_UJaj&SH+D19Az^VUc82>o9cN!^Tf&M_2;7@bIsNffhub=l|2j@mv4F z?fg6E`H*vd$hEFXcK%WR#@;m!zlA=4HQy6OD z`}5s{1rfgY?2|LUVgp!HPK>cC4I_{u!^ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/emulation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/emulation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24cd6b696880baa653d3c801c181267610da66da GIT binary patch literal 42915 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/extensions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b021b9e967e2f84805dec145f4eee2656fa62d05 GIT binary patch literal 5059 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 +X@F*gL>>Mf^eckqUf7?Eh> z!ZoiIh~G$B;dFw=+kzF`IlRJ)7X__VJZ^Fac>jf!@T~yd-d!);yP3w}S1w+Hc5Aw! zaJ!?5TZC1}5hyM`sE6QT_s};f4}HPQVDr9(lo9r_LCOerv5+!?T~0{RXaa<^yrTO) zSGXubwv@+Lqk9ab(V-1T1yvq>)u4M!?SqOWT?ijtimKWNQ%1PzhVC>KgR0vgzy+o! zO1bV-lgl()W>laj1`A^MeoYs1h%bxVOrI+LVwrynmNfNhrKn8+4Gc5u)NT9_p?R8{5=i=ZXICoT6j%lzUm?axf#mU^2dxrl|Oy{|Jq zN6@%Q-Nxpk5+-+HisXAp?g26HO0t0k6)es;qa(=bLJ|Ptvl4WAsXeH(Q58`G%Gh{) zhPBcyC8xaqo`Hq6s(%W6!@+Fr*c#eOXFEr7t#2IU6i&YV^Ui;qoX)k(WGAP;_~f(I z?bhLJ>+l!sKevu#Ca1G4Go@~6e*Ep9PiM!^eYUvOymd3%;mfs*y!6=7QM7}j=w@cw z_t^b{-+X0fTFaPo44xeH>j7!6Ve|M1s(#O#TEia5Gi7lOI57^>=63hBo{k zNT`!QzR!R;46b1?PaVO0?LdwjfFf_*y^BU>$5#K9#Zh$qAZ56I*jKu-RA>V+crhwQ zpuG6t{=-xGwL@jVTC$0D`08O_BJJ?$g`@By&FD8RQMI;Y+$*58;FAUTvZ0{mz&(r5 z@kezAQ=;1R%kCL3`21(oW%r4sdYf!+Z;7EO;NCEr?EZlU_yV zOREKOWN{g%QU(=*ej9m+gF7m5!XxYTV8Mp8wHJrS1`u1Y8?WyXF%%fqA}}Cj0E4!x zf$9L;W%&8J1+->axP2LJ`Wtk1UmrJlvyv>4u%?g?NLYW@=Kf7A76jTKytU2v3P!Ed5Z;H z0)dc`#j{JZATejo?pkZu&V2t{^moT~YR?AwJ>JH4?$*}S+<3covTox3*p1zqHR zd(VNXp)&U1E9^$IHT=@n@C&WGe7g=zIk6uXrpB3*r*>`iW^MT0>GadQITn=c9d)vu zFIpK(O{Rv=vHf}0{VPiYt_TQS5t4yj4ze$f(Q5rUc7Rs%U^O7cYJ)F0$Wr0>KNejd A82|tP literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/fetch.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be653d2c7c4a5ba1c6dcf9555db2b6da714dc304 GIT binary patch literal 21616 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/file_system.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/file_system.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..965510ad5f0ae765195b91d9111730b21c5e0954 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/headless_experimental.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/headless_experimental.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6125d44532cc0bfc187656f7189a55e10d21e30d GIT binary patch literal 5041 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 a?7*sm&-;BGEK-n%s?Y7A`!qMM9{(4CUr5vd literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/indexed_db.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/indexed_db.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd561100e827ff67ebecb0576519eac2c741078 GIT binary patch literal 19962 zcmeHPTW}lKdENyUckl+@NkCjtG$qg^c#$RBlxUkat&1&FktI7Z6$S;dO9?Uw(7T{) zqI4tK?nIinjnr`?Dow_6r=3bslFEK)oTf9iGo4N*eIX2ch}kGpb=rsKjgj1G<-YX) z|FgSTfB-40a;FboTL=HybHDuGe>rFQPgPZ34xZD|uODlDg5&-bBgW%k1b=JF#&H)o ziIeylZkC_mc}}uP_8Hr(eZoE~Ob8I?Bw@xe>zr^B?U->*xZs^*#y#PNyv`ZVtarjo z#f0Q@xPtTa#L)r}`naYE5djo>~p5HEU99 z^we5Nty_~?tEUDawSG-%ou1kNsf}w=10K%!PwFtJ;$KOWn%;0s)EjT5%?4HYl{%$n z$kR}GttubxAFdzfrnRYJEePXoBB1_-!uEg)ymn?YnYsq^(jr)Ywu;t2mx* zQV?>s8ad03CoF{^PaDf4^%!~e`2Er*NNrzmgnNIBs~_eyUo4qSrDN$tDyjaK$9Fc( zC!ds)>1cc=rmC9nNc5@02gjph`=2-h`8`rB9ix0&G?#uO#CAf~3p6lE5%tFjuQ z%$i+IE1Hmu&B~f%dL|W1Yp#>BqQZn^TG9)1iR7`!frOeqYH4Uvt70`pSxs@AIO9Q9 zhH>+^{sxE(T-r=C817YmkvpL?p-~8b7kP=tkwdCrea~n}wdtwOwW(v=cWiOnF)nVK z3~=15wnf_s&)Qr@56;`(Y!DzXxv(&%ER?9c=$ z5lCy8;dQdeFvxeo=8b@znnbTKa-g1pIb;DPbIfU28a69L|X2f zi^X4rou>9fLvk`PKimJZJS8a!ShoInYIZi2?3d(|=~QY)?LRp<^l*P7Dao(MQdF9X z%q=Jl(4maENlN!nL?1{8)b^<$7W5zRmHevS2W|U zNSpiWgbR{Oo<*BcGwhF6wm*I(T-94C+8++f{!n1UabbJOh6oFaAKoj~5NJLN?`WQB zB{gg86?=R}RiJO2(gK08R}}2L5`-YrX)yDebuz2z#*&91IK}--P2hT6!?`0%-RHla ztLwbp(7M#Mv~aOM*U*z68T}yg(a51(+q2n`L+|t7-?h>{kZm8hR`*H!_T`a7*|ujt zbqTfJRZj4DZ{Kus?T6Va{Y7xp?H|A5*4)u3qC_;Rd85(Ulr%qsv_BesX+Acir?{d~ zDHVs;HPNUAS))9?DGZRK)SVFgA@@7M=5VjNIbZeb z`{Ad${`K)yC)d!M6Yjq$I2;YD)ts~LcQ%K^d&_Q6%2uPII1uKeFC>5KEAZ;`f-%6d zhhQ1B1cGH>5iI+|RZ2Tln`tIcW$VpwmccCB4G1cl>uGu6E3x!(&HbXh5S>Fxm;z?i zs$=uOe2HXSkr5a&p$hQ3AK7_Qb1}A7%cJiq4YI&J2KL<@`j+DtqecrdyP?sN$3$4} z1gU?;$rcVZaJvj=8Z8y!wm{OL7`Ju4)LbyLG{sdorTdK;Rr;Xyuv4jrAI7geNFg99 zy%=D+(g;B@ClX@TTbS4Y$;UA3aR@4dWZ%WUmA3wDTYs)?P)AF#Yen3i6}Lk)nstZr z0}uSv|DHeBHuA3j^5D|o+YeuS_y@bL`Lk^!dI1AC+aFO;_I=pUJi5IYIFV~$fAhC~ z3B-oLX+rJ^UGIiM=7Y;=1=F;-AO@@&FbQ#?EXjTiC%^ER5L@I+gn&&}uEKMtq}$;C1ox63{kUGDb{n-G`Z{AXtm7jlq@1 z?rdZCrS#?f?|d`Y_~7;Sj!VL&Xja^jYu}mQ{n!Vse|s?3aNuVLuf6nf<9#cQ{n^I; zYy2mTL+>BVHXQiW<3O-=AlSOO#%CDV{yaF^Q9Z7p@Kq4k8I+MYKzJdH!P!tBg`fl- zom@>*PG|&pY;4U5E$~}?e@^JRDL4TpYY7~kCQJgw>c(pC8BC(~>L!>3t(9OB;L_mU z3D<%z>{o`M!AxikOp1hNrC_PhauS!)aysXeiI?VO%{MzglTJhdC6$FD{6ml@M)(O3 z_fGr#qVNw{$iT6%p;gd!e*pTgd1;tW;wUS?7G_g+KybyTG$D=3go+FU?PPN~kXz>VxRlv+g!h^Js4ssdlK2)582Q z5dT*QRfJuHRR(tb$bvZGBAlTaeGobcDjdpdg?67g&xT@Gj59F%n=tR1*(YpiTQmD6 zz`O{h)IAW~3Bc4hF9}OuyI7s8-+H|zxOC)FZ#LAQYZ)kD3C(+X{6M}V=6e>Kd<24u z_)%5&`T>BC0K&-z@PW1B9x@+TV|@5qCm>u;%bIXV4uA_M!G$p4lw2lw2;kAdG^TM0 z;Meg&%ttxF4>RGBy;7A0SbPgYxLUJ=UX`gPU;)a4B$@*hDLFcxY0?#{gL7!_$7YU_ zy*sHnlk>AvvhrC&X*!t3kP0DK!C?2r(sE{VX&yaJHZrt3IjK3w-Y$YA(r`@I0RuAQ}{;kMVWM_|5ecXe7Kc#llUxDpq_`I2rDz^ zGk|<(68mbtv+L}xWnU*i;@d|r9z8R5uI23bI^o zlt9-_+irb(S^{s#Nw8Qe+to?%UP*R6mu`iV^-b2c0j-ovC{tGv08=gp<+>lXkfW?3 zDM0_}DJOr++Uw4%x=MQ(9K}Df#4O$&*SInUwU*lpphZ^NCI;}MMXw;6FfFr!I$4GL z#zgt=LU#2n2pGx-8qY~fJI~ML0$cLE54kBj-mh)qPUG`UuP3KGX(^ZHXDV!C@y?OFDB=7car zy0&3N%n4grWNg{1M+P1^_2jY-jQ;I61s`a$ZKTb*Ol=k@rp;n&<;Bt0AY~nKguYnP z#3Tm@rh*sN0fMPmt98jBjx55*1MXy>=7#ltHkLdlXBrF%Bq|u!C{^mt~C;6Xv6IVij4pqxeG1cfZ|^=CAydu8PVAFktLJskolFC#YA^R!w- zN*N(QHI{k5L5)_8S@X~&9mFa1&_p4rJO%TjJPm=NHlrb@?8ktTP${N#dUpp zavIqG9%efMK>_=N;@bx=9t7+^nsvA4i(>^8hxboid}<{a$p$02;D8R@8>OSgzm5+5 z573bfb!aO<7g_W=gtw&8OrWQ%ovu4k%fNbQ!;(c%Z`HK{luI=4XP^fPS|FB16O@wm zqNTKxNpHd4VJKC!c8EfmfVp-i{{9_iJPrZF-{$tEu}kgQU|+5|a@`uq4?X<;k$3yw z+H#@qd>Eu_)F^Yo#SD-jc+KOfL+FUR5{es^$cjxd@Lmm9Ce$CCb2=AOa%wOCZ0l} zt)_YP(Zjx0j=&30QpkgeiER5EMhcTEz*(I+`39bS44G9dR=~5SwhPD4A75$e&Ng-D znzjM3J$Ke;TK6lV9of*1TvkOr$N4?ZXn)&U=39rpqH9@lDVLfA*% z#7w=ZpyAnz#ZN%0|G0v#RWc#hxAoCCFi8ex5flkfnzs6{XaIK(MHaZhI!d0qwDc>e zY!>Sq+QQ>23s~^K8d|T=Cqz1qXPh<@Ixe0mINeBw~1INpE zVoU4R@wVQ-_WsbD3vR#Sy)^i}LzlhT;Pz6x_yK0x)Obe4V!PN24bviB24W*c%Cw6s zDpVG`cr$9eCAKU$HsI{JP}+I`QnU7)8C0Z-r_LoyU}x6qV=xNl>fqTSNCl&`&R7H! zOa2>5s?!jxHB8IepgVSdAiNvB^uT4;pO54MgYS$i#lT2?=}&iF8p#F*3lIYA|1^J) zFTB7L<@zBy_Wwy>w8p=lZe$K;1Ko&Ruo(Osj$#yo0vPG`Wsyl~wIW@h5(SI{(hJd)k~o$~4vRh84DV>TM;uLyP^p@R zIwUcc7H3mHr;;+>B{E7Lq=LP4*bTQ*V2kyNDaD9BJ|BNkhJy1@a7q@{IXRw~PRLS3 zJgm12nXzSt!$z;zT`E-fN_vF1aG(_tQp%Q?qV_5jVu=xP|Fj5~z6zb`6%%Q3UWExu zAD2Z*o{quklBnml&X%NKyrPQ`!{!|t5pO>fb%#wjyB?)yX8J76i)<+{u2mP$q~^s- zRct1;DxGH2sQHZ!jN^5!8rBM3Ou`qLHagmorLo5&aoh~7NlL$B)12(yh32G{SK-Kl zw8#e7j&Qr9#^{B<6EvURH0j*cMubg@R%LXA2B+1n8LuKiwVFFV3%8E&x)dFZpzZ@# zq3EH*DJ?+#j9QB;vycn!d2%YMXaCOq*D3B(k!$bxv+h%S@~)<3S7(09&>81)O-I%( z=3Rkh*QR_&&l%^LMZ9C=YFu`0&UX&1bUu{rd??pB3<=-Nx;yeA@HCxyBrCM##X)d0 z`GQ#?bR!VS2U>pTu!o$d_JIu-XgmAJ>9N}+HC`LFjS75RfIb+Hi2|>|n~EqP=qMl* zp@4qVZ*gN3(EU)0_C?dE0?Gxv?^tvY?>lwgcgN-p-XDXTU}@ODG0|9K=aZEY(&0W6m#gIs3c0i zl%)4al3Hb~RTePOX-x&WAEmV!7RlXiEYSjL1R%dtAifa_sZ3ceRbsFg=~e-$i#fqlcCvh4dJR_QVOR?5yENY>d|zm=i2>kM5qT79o6DELN^xxWPjWA3hd z$lMkQm~ZV|Y3<3j_T*Z7K|T&=g{B*Uon=`cIsUcL#?fXz4wU)WfZBqpaS#Z`{1O}^ zB=}e1@-DF%zhEa-Rmg0mRT)dDv8fplR&>o?S5l|oPP3epbZZ=2$kbUDh7}p76DCkx z3P_2~8*}QCST^Nlcq!rhZ32SkZ`I3r>Xrldt=erQ>%mLGWc@8dG_U{e2h~l3dNO%O zW2!BTNv0BPNXkj*sMV9LIa#ujfrMnap>(Yoit-BNjpJT39$Ye7n=z=NA~1V&VD{+l zPG+`vbeP^)Ve#k?ZeR515G?@33>XJc45FPt5ezT7fTBxci*7K9-0MQO$GCM1WqbhL z-bF9%Dc_<`^6O@{U%&VdlJiyn23NfOS79dbF|T<0)8>ppomEx`B(HDq>%xBBmRRMKFri*s#c8e2u-O7oerl zEi>XtGRb;Hd3G+n0EO_zk2no$ShS|7eu;{{@I?ln`eI@(8c)IJK*QoV-6lfGq{#7< zB9U0a3`Hg8z{HEHi41hLY=LPx9oM~+dY?`CQexgdEiYKlnuirRJ+CCyVR2MU&(F=s z>^mSdZKqQ+a9oN*gYQUY)nTT^Vyq;;K6(+k_UpyQhNp-EM{Gc_LJ^1Yk z!=3+fx;!ZZ-oge0gWlX6n#WvrMa3G66@T^>2wsH3c{CqpEBp1nlM$f20hwMw!SGuk zn2zw!7o;P!b%AQID=ReT3sh^Tt}f(VwaczxKGeMuiey8PTxb9+?hM=my%7kn(IZZc z-3a$BNA`Ra-kWpp%ZB$}8hx{M#S_eWf=h=!@pLSQ_h#MuuDktbj+_ghjpp2;Rfpa0 zT;=Qz=WWfs@3tC%(Y`j?`?$z|7zsY!F8spV1ay(J4jp$S^?m_FMX6VC*0DoA!&%1; z?lzWshFcGvb-6&PeAT$yRsf+*__=WVyaO zTfH^s-e$o&-3=KU?I?CbqQye^b`6M%_*QU3TJg}Jp6O`jj{OQ|o_24M294h{Gew0-e^la7A7HU*IIDo2M8%9Vf-g@lWa(a>T$pMj zDo2Io*x>u|a;jOTwXDL0buzwgLHSkg3wF3~E%RrGQe`I7Mr%3K3QQZOHct zGWIDT7-Mg`hm3tA&{syKx$fJt;_J)$`Yub$+n>os#&f=d%fdn97@=XbiI0QPXg;P@ z{yw~_$iH^oDz_I|VE(wcv$pKs|EDB^f!y$s?M81SO08ZU<#sg}n zMH6veg*n6rtYmgT?KCZ6r)~+mVsBOEV`N@%?11^i*w;8)GSB+HWaQ6(1i6+!3)5^p zLoMOR%%+OWh-MRWZWa#o=v|Rq#g7Q!8;TNBr<~!khC`c5Ig~7JRl#q-K1Du#4G6}k zZU1XNy%88H!<}$3_fp44!NHtwC>tC+_tKkBoa6s!&vI}u>l<1YhHii48@jF5K{sA| zWVDU{kPD193LggCK*N15eBe$z4V|t9(XkCt2`KVecj?DK`Y~xl*Gk#3?Ib(n!Fg2B zIHWronv<>PX9Id2rv7%+@)t*X#iGbKoV`!Ny+G`iw_>-H?_eWzu0(B~!{~Vk;6pch z!qsMrgH%?^5}@;biz6AaK+&a{@!HaI@W zhd)W($UOf!W>U|31pOmN^$2~!g~IPi{NQr3SH!RKCnwk00Hrfsm@S;6%$~dL5Pg@{ zE3(hiCO_v=XU0B9vxclM{qqu&VLPs*dxMpvVebAM?OCUqZqS8;_~#_1=fPzKe@;R{ zL8%Gz>BNkJHnW1lQuCp@Kz}*{;0i%T6J+>gPjj-`G>&dnD(J|izaK%LNz=EE?6NrR zTD)q=J}1Tt26TW*2Q743Kz?@esgQA?pdvviMJEn)A(A;^+`HLdzIa4I+X2O-+5&xE zwevjxAJrVc<)68p-*B6M&G~-KRsDu*g#Y0#l+E{_wss!A!hrxT8`*rT6x~e;9hd-t zo`6yC*JF{&Dci6N1bP{aKF`W*#uNzj6pZd;DQ%bnfu4fVVQMCb2@vQB7=4WA26yCp z2lAs&!VTd3=KEHCA-*l&+P7+l-y4nLRR{dS$XXv=bs^>ETH04VNO`$n2jyP%bKZw; zRpGnGi>h1owCQ!hFVzLVdR<7dx{&f>4L+oHm-HvUsdKeT)T@DCss?`bYLH^pAjP_b zl%Hz|QaSj$Ay9P@!D{Y(L58dQjL;3#gtMx;?lV$*ZsX6%7n?s5< zhZJiLDL>cPvRZ{yHBvQ5)p8BZt93{PxQ0Heb+v)>euKZ&h%aY~riy0%KD}M|rFP+0 zZx<=nE>f&rq+sU9`CC;;!Uw08m0a}%`LFOa3M8mHB=q`-WEBz#^M8Q9HlJ7rS_a1V94d5F|k?2;xCf6iJbkK!TJgiJ&ZikpzidEq8{*lKX&X z79;^fHuZ2z+DR?dvPq_PMb~L6TJnk9G>J~yb85RM=k%mKEl?=dX6&3W&gp5BKYCUo zdmQPn{_g!|W@i=)QexyJO}Zk!x!?PBzx&U&%_+pHsy81qI-_ zHSLq6E0Q89o{W_BOnN+$;#GVZZ`L>I%laq%h)aq;6UYW9gA4~Up~(=^0-5k+SPgom zhb1NWill_z@`^U!GW(c}a9$XB5jAwC#p=5Jd<%WkZ!*dyYfv(Jmy$6q8AHihwbrg* zXO5!|>GjLTQE%opAh&T@ZbL*;x+7Ax|C9|%(<_0=#%g(1nzGS??(L~;Qkv06lT};k zQCeQ{Pc~Cr*=(h{pGvQ?3UylCsm_=ZcgF4wR{E6H=w%hvt~L^7i_(hx)k?q8h7q@x zdr`KQ;X6UffYOc@+N?6lpt1%nwcGI_Wi8@sC|+#@oIb2{ppCUw9p_Wo=8SzZSlO<0 zqP-4LTG>&(mU5rcg;JefN%bk~-tq`MHt|dbo~^IMGy7C@%?9E-|AH#SJw`N{%jFBn zLOP$*|AJbHdyS}iPR$h(sZ3JWjp#(;(eYzriP0kmCs013BnwH-8B2*iMQ9!*&#m7@ z{EDPXlO9Ey^d85t#sIy0k;;&dAslNZfb^gl3veuC#)2FRo3RkbB4#Yiu^KZL;aJp+ z)o?6k#-cc&KBdl##W=5?V>pJBwQ8Nx_=;pNO8u-q-elBFNImj6Up4^jEa`>T1qvV z3y5N2)5%O?T2pm>MpKPoA)P6pws_8d+)~*OhH}CP6washg5gUmiIln3yzI2<`19P_ z3(|K*D%g3}yk79kOJ_{7$TiGh-lKSEEs*PXrVALkykp2U$+WY~i}lshQHysMxnXB{ z0duV?>8Ry5N5YqdyC&DFl8#ydvsTPqgJN8(N;+yW#$kkYE7Yozj#`YFsMWAStt#oL z#TblQO)J!@l8#!8>8MrZy5f0NNk=U{5va9#g}$n!qZXf>dC#~MkBw_BEQ-=SH4l+gPEXyCiJUErls)N~?sbn^rR0c=$shKQ} zmp=G#y70)%$-&{Fp{=9IS$*rVQ(F(_6?IU}og2)gPYzDc7N+vK?E}Nx2K977-8!92 zolTxr^+9x^=F&6S!Sm`#MN6MkwZT+Ao6YA274=*ppU>!n=Z3fK9!%$^X9|gd=~*LG z$R}t}b4_K+F<_<*W1PAdNAjZdv-;+*p1b5PwzOS2{MzA5{!8PRBkoAF{%iX#?^}p& zEOvFjk-e6^H2P}$6|7P!xU5vDN~zGY zQsFA4!pllUs+5W>D^+8bGH+tgc2I?7rJ`J_*|lC#XQ{ViZxJEDZyb!bGZwFP&?t%HJ23c4tuMoww@ ztT=@&j#Fr-9-#^!BDg61S$)&b>Y862z1sZRk)^sWCtMud_3r56;6tw;zq;dkH=t>-oj?JKtM-|H9MH75j$YnYc0d`lhS?t5034eXptK z-9quuGYcn@i-(fG5xA}_Ym7V&$Bp{eH@vD`z5liBdrcePohWXKzd7-p=UxvWZO3b8mKxUIZjCk6l%!asrnFkx zwYMDAdNA#HgAq<7a>=ZkNEkJVL^iL?WC)HW5}%(*X3U)W1lSdu7fd8R6^Yh1(N08} zG0dtUuZp$>DK{h@0q>I*K>`Q00Q5Hyd|4_5rEu-bkCejV5tMrSFFvwRw{gk81zE1h zz_yEH3oU(1{$b>7ieEeg61U{4sA2c{){<#SYLW&9yHZfOTOdkbR37 zfQu5S_Sfbv&n<-8c@bQsn+Ob#h3;!Xy5~I>sUDZKT}amG^3&o7oJW;$Vs7p70oZ5t zBx;yLz*&8D$5&?;!fiZ+v3Nx5r$)C@Kud3gMh_hxIsW*B5tul3{NN)-;OMdA6Qh^RFR6ccZu2K^?Zvypg>5j{#fe_*Ci$ma}yE}v5k ze?~o3FoM~%qL3(|rB6>44F5^6EJg@&#rdSB+zY0NUD}PVwFeL^!;)slNG$xwQ)%M5 zKYN^5%NfhUhV{K$miKQMCe zF(Y*N*pp9!D)mocfk>A%Y`F8B;W^0 z4dFkj#FBvGg_^;y29%)Ud&O^KMevez3i8n_;mOb?>4Il63{E{{)J>$b>UcVrQV&h% zQ&V$$Yh?V6PaKpB$dJ=H8Pp@6Q}lj0m7mEKR7IvGl^;#!W|G>hJlro2@4kO%fU8wU z9uoVA%(#woRYY0s9*l)6UqAzT2m#ZQOVQ6BW!fq_wz1}m=(UVBuK5L!g`M!+BBc6; z2Wm&p8KRFBzkH0{YCfs?pu6 zsnc2_0cM5>vJpuL)k-2EXyZjen4Ur2T&ugq0jusy$kd6w`YT$`4e!_YE!OwFecz4y z7q>jHv}NB?{r-jUeqLkfZ-SbN8z#rBQ{2xC6T{lGXh0iBP=%Hz5=uUW?&ywiP){0_ zQEQGkrDigiheu=DNelOo7(2De4W9>~6WRT%SELWT-azbc#CFylZrltpe!)2UH8WR zYx^NEPcDYrimhv}%)T~@*solUtt{tO6{JZDT~33Dx8r^K7J$DYDby`{xunpy18?~; z5d2v7a>U}nF^%pf$LdZYiqlRWfthAi8F(5@=IFhM1i!GjYVJY83oq{OJb~uqe^c{PGz3i`Kn-L~!^PyB{X0 z0CELM1t0puphzvu-34uSACRC!)M^TU_7C_$KhLeh2v?v(K4_X*iwPdjuLKbjx@@96 z0X3*NDNhLM_ZlN??ZRBUsquXr8s2BERH8?qG0;wBb*&d28!ZY*RU(h`CzSPxY*Ifv z_VIeNwyl?Twnl^st(;0{RNY0N0%(!({x;9)lhdbB>1*DU_cU}lC&2x`;GOrLp|&c1 z7L|L=`>QQ}ltsC+zL{8yiXU<+_p0GZ>x3ZSzZ@b~gSCwo zW&5`%qJJJinX(OR`>iwIJG0cb`^K3!8?QFL(SEJ{+iTxEv)Hy9^zEt3wUF}P-?V>m z6NukJ?fS)Vw}asI_WxGR_iC0pw%@3^KK$#Sd$VS-W4o!cBRcodhY_iL&qp5yrOq9C z6un++9U1cfXkBFFKEF$nBi#z4!A}5KlAKVzITjZx*cZG7ln}o&=7F%{^qluvj1jh= zU2H+YMhx2Cc9gQpm`c0#NM}`@qc5li&=>KI{ByNiFWPGJ3z`QgcFb!26K!Qkk z0g1!ytA>kjp+)+klrSv$UkuFq5fjG75TNk4ye|ajgWvRA@w@On?z2gV zc&E^Tx>=XcrPcG(d96TV-@);5c{+VT&FHSiXZOg@e5Q@dL$aoxQZ?NgQ6WEVP0$`s zGN+(hNU53%E)h$q%jtqVt>sgys!&Z*UEqoJJeh~WBU{;mYYxPU@8K0UR}5Or^rt5m&d2lrwaRa$-SnAZjU?^7sE3Aw7CwoHnF{9kRGgI&9xpOE75>r zA`_8{Lu6Nn9y=&hq(+d@M8Dw`>@%Inco>oep-n~8+Bsxuvj~iEDyt;eoQ4x5>2x#V z`r#knK}NIHXM(UT!APXNfMS0@<%z-hUnED~-YBhI_s@Hv+E}&b;^9j>UmPnoH3QiG z;$vlCRr{6aUVHBA|Hv#5YFG$$6uUNG3SRocVtDP%rY*&$whscn&frB-;x?_hy#K|~ zk90cfFYO)(^L|IP?b~I<9!=VO^fDw+=myt_Lx3+`TV0gWn+1QSq~ne7$+( zeW>R{Jz*mj1fbru{RWU1K%TJa1`!J)CTz7K#6pM(8*CV{Fk-^C8bK_An6R1FAXbAI zdmGG05sM;LyB8yyk0BOAjC~L0YZ0qOjC~L0>oA8pTzCy87lk!>p<%wk=3E+3vVmGr z8UZzdP&LjsGNEdk1?R<_Ov8DJNmg@m3pRf_$pUJd6l*!XTA4E0wOr@U#^=ACV`dE( zvZr21W~VDgLD~{IS&+|9rBhQ(N(9Bsr&2STrYf$f6x0ia%KAtm!UVSr;;TU)PRGj~8qtTg_@6sA$7U#v8!UQw4W@TE5skk-(LrA0*BFIFzE4JczF8%o#9;RF_BloHUrw97w z&BwP44ec1-9KS>Bv^&+?96fea1_4j!us0BiXpn3n;VG#}V9xZ^te#Gp+idlTZ5p{_ zkC@M=>`;Lmrln8P2xw2TYBEQ#$s3?Oy2U96>RZ}w%1Ng9?zazOe|akf?)A%RA!V-= zZnTHBI}ZDNI;Z5%>j@LJ6SOT=7VjxhZ21W&Z?JV4nx_<;3%HcKwL2zwnPmrS#b%Q; zaHzm#t|lvw?^9DSHL9B9;GcILX4ZOBb>an3-GM!)k{Mlfqi0&DrI=1C6`T5rdNGd} zYTvaJeO8B9Pknu&j*_ydz^6=*xAIa|nMNj`VhzD3YMfVy#!gly8Hb+jOR|n5=)g** zbOZA6zQ<9jU*5LwNwPvYCR%|As*qTPO31H$+)om*%KgD6X4l#A%LJU&y4eq_D+Ic!LBWr^`KpKa`gOt}I&VNN}4V}Ly`S=;(w2s0! zBSti>kMl7=+z4AJ3)a@eoVnF*?it0HdDh6lpv@tOH)~{L5`6KO2)c;Cs4vfgFHEEE ztn1d%UZ$cXbsB9e5kjMN1xf~Q*)lCMA~wM=Y5|sywe}V2+LzbDp3L2=rzI zCco}{2;RNP=G|%Bf_48oD*O+sxdnW)VBH__EaTlPSo5M4f4^&Rv1@RtYuM!3i=pU3 zs1-h1h@ZP$R}8IQ2z3`XY`YX(s9(1jmW!cP3!(MJ?jhuVX)(NRS^1iaUn;h(MeYo= zRH1bXp)JL}15~?bF}%4L>RJf(72^+4!luP=PchWA5b7$f>qCY4#c+o?uFf9B=N7|j zilLT;kX)3vBL2c+xU(3lUkI%&c5brsDgMXt;ib-PH`=a`{Ce`uw#812mTTW^>Z>Mz zd>ECwwtu8UMJc^B^5B7Wo*#Q62iEw1T(b(WOB3ot5$uYv%dRMszzS$-Fcs2e`oNb% z-^hHqZ`RM;cwp}LnQ@z#O6$1U$p=POvojFgL1WT6UDcS<@wLt@o03=c+~xuuR8<&g znXMGOSUfsaVB5BgmU$GAYAFtixP` zICNsLLS`m>;H|h@cU2ofBJ)8F^t_43;-? z*h~=TG?W$QGSdd~2GI(Ek(NPp4}!*}3kaw4a6g4NIbBjj_@KF<8xM>s-BVb8u{UP5 zan)6a?p zSrSoaIWT9LWJ)FHU8_}>O2?7Eyc0)eg1cFM$|++;gQHzh zpw5wkB9?v!8|vN}aYcOt2ny}%MLdjpyJ;~!qqdxYK^cvXmdz6N&LotnJako*J{U*> z=tvxawdvY-&^;+zbQOR&fW4Imu()mj4s+49i~f#cCw%8F?O*hRDz`0!HWoMSBr?v{ zhstYWCDjj~+ig2MDe~~Oem0fekHM^XZW};l8!XKaAWPlbV5xig+&0+fwt3!vM{Q7p zt?_A|58S1sQybLa(groSv_TCnZBTkr1k%=lD>;d+Lp*GB(1+84fJQJ z8iR-gkHd<2uuC3EPsnn}dfnufSfSYwg(_9?BXVvgdlK?F$x0-YLe(KOb!K^%)GXB# z-GjLO1UjCdf(|QbMugA{t_r%F)2AU5DFZS|qNKTJNt9Lh>>x=>`vdTe+_$S=J}kT= z_YLpthjuQf?lV2!%!Ny3(y6ncmT-`(nE03&HECr?Msf_xTny4OaCHcdWm&vJ2*%Z) zB8AjlBw*sma^x_UNzb7qAd|L}>G`z*haW4~ecsYg(5 zV?_N4A$lX@PedsuFuha66O{4w5DS3Ox2oLz-PDa9_rscbfOs4xQ?lh^V|C*C}`d%jm;~Pz?Y-WR^L%Rd+&?|2(=g2t|v#urL|j7{sQ?bhUykV zYlh%g>GJ3DXI1(D3+)H956zi-}2a|FxjW<=y37GsDF>E@N>?(8*ak_hK zt12v1tO%nEoEaPdgW3E!dO%T+d2kM|15Jpmu$A-r`@n58DL10L@=x$=9n`#%^iD7; zk;jNb=^bXJw-Mte%w2Yn-)idS<*I@*p%l&V{%JqJ;eLk*C8_oVq3p1A1*U_@A8*^g z)bZdC`rrKA)z7{0%(Z8}{p>saiyaR_X|Qk64;tt84zc5vD(DsH&xg%Y=R=;4bn+Q_ zsb!?g^Uc0i}>+|8RT-J?a1;=#c^!!?foGys^SMS&GNwTO#QXwt}ehYFAJ+hll=gVsoB^Jy@a^0Qu)X15zE zuKhML{|jF}0C-JHHBzK;p{cjz^RmxO(Ds>O#Ys)flOm^d>*oW&q_+rQMbaAq>5W*V z7m%emiCBu0I}u-$xBTSprcjC43KeppiMU*7A}*y##HBQe2&IVeF;U*BLzc#zQPU(zwv|$FbS9l57dsW46`b9;>Zf(Zb2R3nperaoL~*8uEYixO zN1kxi1NT_X&F-%C1oO5>K1%QYnesLf46@ocgP%_gN#n;MVn57xr4prPQF=13Kv-Z@sXqp^>HS)9*P2V7h z@0&6$j3JFEsPz*jp)RxMgt%?!FykF`;JV47{|;*Xgoq^dATFLAl^0LhA<^d4TRX3O z@wG25wQk1kvun}cvf^!Hvf>VIxRP70ytdpH%bQI*R_2yRdPn+xc^1W&n6Mo=4FwS! z5#dlONFqGOuz=*2CAh}qjOj>0*BA~h*E1DeX|BFUuG$Ry;|gat*15rgz={xU#$+pv zpr}8$MxYT2h=w@I_@fImp~f~3zxI1oFoP~P!U};Atz@SV%_h?PEfpr|y7n%L;e&3H zK4_ytgM|vMo#sa0Y#OMxAKDev`K8%*|0l2L6JUJ7km=-3MsMs3?{HE-DH>d$PpWXh zOS4&)JWAl^19u=5c0C==C1UxA?KndE0CKZa725+)+$6+jFx&5L4r~S5mX)*y#}`}+ zBn4>sOa|QexpcDJcBQNF^Ur^ht5MA*PogQ|U2TNSsAb=x{kFzS!>icr-^Zd?k^%Q- zH}hs&O)zhyYyS?_THPCMTZY@#VWW31`d6)BViFroLaFrw^B}mSO8{2nl0L0j_-@?L z-A%@6%#iVBd^QLDqz(-)cu=_L=OFgsgG2Nk2pO^+1TOLFHe|0f+y)^2r15z$;!cy( zIHA*8nk~vKE(#3%BpbT|BLnt8W6wfTnOdW8Y0o|hTk|Pf(cxXGCQiYbF%QqrC#^Rc zI9V3Sa`F_;g*=ys%M@nbyMK6Kh-2hF(J${UN8xbmW=z=Ii+m6DX}I84+_rXS7VpM| zi0>EgN-oXX!8mdqcnk$tMu3gpCc~1#1WK!lq?aYMDqSoYwMvHB^8JCrP zn@v)(+0yt!fY#Ec)d7m~0_+G`W~ykrAU)%~3lhUc^Q1X6m!hm9G@`t$hk3Eb@a-;h zwa003j7D=J_KYm`93*{P z_hNX%&8DGhmx@q{jYuP2Pl~u3>t|D(|BaLtDNYP>SM*K$NNct8wJfdG znL>3#G7aKeg|5N38JChxQvP8OwhMR_2ec46uL`n5HX$pESSoXMl9@b+8=Ylg*pYk7 zmMFUriFC6cp=Y^C>s zyMt^xlYzk!oHO1zE);ry0OYG+~7BM0&doZxPe zY+0TiwO|FMT5M^ySOK6Ty^jO2j$Qf6e1ZM)O!;2N>xCCa&C_B;W^FKf;h24Fjp(c+ z5;L*)Fd;8KNJ9*O_8)N37*R1{HWdIXG3wcyGRyoFel!rWq3C(p@atY&1@0YU) z_2nTOHD&r})Rc*s5p&WSBR1AsBt0GS?ubC!A)2X zE8}j1TrpG`XQ$}(1E~MS#c)?KRAKL1iH%v_5PNrblk>N5=4SWoz7gVk$Y1+r)9@Ym zp6w&|t>A$Bt5}8=`JNRdE#`Zyx3a}6nq?>4dzZF^sy|XT>$#<^LUP(BCI2v35@kkw zBcy^djhe|e;bVOqUIl~UjvQ!6x}2G|Bo>HAS?7C+mDCW+T9vLZ({1KSzG5MUh&t^C zzsMtRW1&XL&p`P=$^Dj6Wsf}UzC5eQ5*1VXyCQkvGfCFs8)3{zcw!L2wbf^~j5U#* zUQRm0WzwmU$p^3LSnJFru#%K5m!VcWXc*Ns7f<^sTKftSF!~V2T_vbxFJZ8X)bY~B zN(5*H<(w%;c}M)7xmDsGsnCR_Ff98=;uU_CpV*{tf6+%aReWTV#3lY-p5OVsJbYUx zWYm+M>WHOrQkA*iWnrbdedrL>bM)eGp6o5G0<~0i%QRn5*1@W6>c{xKSn%;kp>Gq2 z7uKw*;A!~_5;TxQ#6F^GAA zVE-PW*LqYJpO9*7f4_0VV&jJEqi?SM&f`ms!?%52`hbZyBEAYTW__EECM3R1_a`)j zP~|sEo}+xy2s^$@H%!qU3N}(e6*+jD#vmj1W$A-pAP_Faq$s`$bu-ZLq1R`Bm;{ih z%=LDmIKC~(uai9wSe(Hcf=K2U-_E1e5o^Pil~ojd7Qx3u(7}Ma8hBVJck*3zCsYU@l}Fy6wqR5e~Q3*Pw07f zs&|Y&;CYb}Ip^C1^-}OJZ0HSwxZUeERBpG{y=>i%Wn;Zm#g4g`QoBhleiy-9N99D> z6n21p=uWWrnivC{xOg;;R2SbSlEgRa86saak=9~Es|n&7-?P)+vZ1#L;=L-*sm3vh zcaT5VY7UM+2gb%a_7piGtZv*kVTPDaxgD=#{R6yC@fJtZygt0xjL{6yTJT3tg?;ZP zMXL?FypH7sDR(UFJ@_Imki{_uzs8nxWc`H}6LT@f?2)=;Q9njWRFH zvg-1Lqw$(Ddc@aM?dZQ!^SpWg&4w0iXwioLJ3)-{e@Ku$Anng7x@4!lXG4EPP{r2z zFdkrhHPoc5T{LUh5Y1S0P+qTf^u6v=Gh`>gr#XEnVfbg@fvl1BLnFFrMCtb7?{2HQ zMjy^H{3_&X{0~K#Eb#}o4gVn|@mG(NQyU2i&QkCK1z)G&n-qM9g6~uC0}6hd zg5RNlY;(n0;Z+I1le@i2=9e09$y>Zul*%5JowYMVeBQJ$K&}wb&_Yp zpGtjyBCY?a6#c1Gd(%_%3-1w+2X_R8w|tT}TH=J;PkU=T?N|M8M6N|{O8{@Lsr9tK zy75ZM1bliIhIY8kAf0`&|wNOj$%Mh2Ut4fmIt8Elcdca~N$xLR7hrPRt`o7567wKKRz zYTH^`%V39uF?2H6B{lC511!ljyY-yppnqG3 zOY0x8mW=@3A_B}kVlYfw6JZd$w7nE%FeWu(*%+*ontDq03^qus`$~-rHc1UVrDg_O zq^=#MRSd3{8aJ0(8Ehl4oxwFy!^YBD20J8pa&`~QHl^GR)U}yjk1;?tV3_9o}dQmx{;tJS`ca#pT|Vks|b4DQ-@v} zT1q}VdE@acbrUu;uByZaApU{FrDzv2aejPw@+RSlakX}oLIi~gha&{lNL>$kxVVW9 zl!#Z`2e#3H0Xm3(K!F2?DFw~%+FNRWz-%5*ZXQoGziLY()|~pcp~5 z1l1AF*Avu0+t^4@6Az=Az!uuNRRpc3L)S`B8=WKSw6um+Wi3Gmypq@nn(jJtJb3bW z@WgmE>x2t_krGzO=^%P&NtG-s(U{9FlWqiG^%XP-f z*0XSy@pAPX8)N#KR?owng}I;*uCm-Fm6sE)E95F+`8C1{n@W1NnNFlP*Nal8xKC#Y zbV>*63`w2geL5qcGkTy-X*E+RKgQQ9G%4Ca5XN@whC%cgt*t0Yk+1L|wj9rnqNI4s zdi~~&nl*QA_7=$JnH}4bQ**iw$O)Y~iD5hri|d49C@E81dY9ZGU($7Ym#(VcsJCfF zYt0l47;|o9H#{C0ZV)YVCk}`+0}OH(TqiZEDuol>=kZd=T4UFG(p8pTP}?9I zN|JMYW--@^6Ybpyd_j8*_Pd(wyK=a@6ES$ zQXc>G%Kf>&I~s_5SQw)JJJ8cIcCQ9cA7_z=H(R6qAaki)6Iei^2&5ZXF%0WOPuZdj zo1@6w@71X%yb_}z*DCj4U>pFo#MvG%RS<$fJ5`|Tgp)dDq^`UPpsK4(;Tlsf1BYjr z&a^dcr-pREb~ee)b?Muy!8 zo3RmxMuQtM7rqx6Gwnop}pxD*a6H{$BTr-PYUof4fzET`WE88 zRqnZ7-8nl4s?l>m?vY%@V{O2ER9XkEHs*D!eM9CLAz$UedChrz#H#!tI zMIa8t24iYjf$ek4N(z?chpg%0ddRZgZ`xj$leH`sI&eHiEOQX2i}`p=os-xM`d=%_>=+s2iU%4l8dXdg|nEf#q^ zE9~e%NKJxDA5sV?fRo0QT`_$4T}y2eXX0B0;FPKQc$Hexj!jya4)nOXRjdZpk%<|Yrav7f|wyy6TJ4DNuey@b58 zNaREPqLB19Y}JQ(@t_l z%)lks2%|56v{g#!AH#&6{E3|VkxV=!#fPNS(Xw>Ba~R0>VWN~ClqR<5M)Swl&ypAD3dMx9AxuRzNWzJ7Q@6rP%Zqof#~4aT~>CX#WMR<7vLxv;o|Q)&s;3n+ zm=mVCx@Qy&Io92DAq{J~YZgqPHQbEXRp?Skid-cuy-1kJvrpB8f1x`=l7Fn5WfrwU z56+lu+dDAtWnGJUp|`!l`dAid`)Ycw|5Id?Q{t@U`$1$yPT+^1D!7)4vwV*GQPFm- zFpRS|i{GBUF;$$re)%TQXP6aPa%T!=X;Jkf$K!S)R?@a)R5mZb{3q}VoD>vB3Mr-( zRHm~O$e?kZ8BAT&p0-XFj3rW5n6_vZ(o5vNQZT1UE**DIM}k}4HOpr%uP<~__-@WR zA%*|kiDtQ=K`F8vpEFt(fk!RS23I{E%?6AHf`%1tJ7ot5tdP#kl-!^+aiLmu*u|L{ zIuEp5a-EskS_IyfPv3p_`Xmj?)S};nBjb|D#usXTI0jvnO#=pxNrOz2C(6_ld{r&v zZaG8(`sI)Evw_F+UUk;;Jd5Qg1H0*Ht6=0hjqV-?H3XWijp9=LPgse1W&USh(T<05Ydo)`Fe#^<6SaKrrE znX_-@onX9Di_=k1yc-67eNX3Oj<;6#fRJGtngz1n_v%u16Nbc2VcYu9o>I>N7(51l zY>4b%hr+1dpo1kJT^|IZdE>1fCVh zMIiFzGANX9dAwMRyNX3GU{x2#-NoX2Rm*Mdq>Dus*dRkcoQbnCW|OE8dyy3i9QU-8 zvAOGlii$W0tI~15k*I|i%3INn;a8yfe35*XQgw6FRP;SfgBY*;Bc;niAqqHEv}MG$p&o$Y?jq%`uf5+;n1TSqQZQ0~lX{S9 zq<*P9RvxG|?f2@ulGE!|8MBw&AmkK4fx?RdmW)#7gtjFB5BwU9xK{~;C2F(;(dGDe zfC}b!_;{B*JyEfQ<t0pfW8j z$%QNH`wu^U|L5md(!cq|;mHc4W?A+aPF4MVFR;P*dh%W2LfD6*B?{Ew3Pwm;Ne{ZKX zU&`#@Pb{%|%TI!GIpom<9T~n+!JKNjxe+?e`8{+J=`vf{C?TaK4tT>UazgJLcFGh| z*ml+$r4U@_D-?Q#JUe%+1)hl7rEz?phf;&Jh6rB#cyd2SL zCGe$05I}w;0}bE|-hu8`E7!U(LA!8*UZPR8;_^gGRBBsA$bDWokr)PJ;q*8i87WyI zKljGBd>b+*8yTTvyWc#*JCPAqELbljC&qYkM7jZTJA>SiMlzX1;%L^2=sZ*gQny4> zBt46yJSa=bX)r_U2JW-5pgdM~Kz=*$nIlyWY`ZE18g3RhS{6>Y$$+1Vjl`T#FTjh} z(*PJqB~E~c$2~hV1h@dnVij%&xEKb41lP3^q7JGJ;QFB>OUBauRrA1lI=hnIzdm>v=5x!v8v}>_ z18No~H%^`V!|~Nq7k{QL-F%c^?K%2q^VlCJpPAXE$w&K^zq@7*J~O*v>%{Uc7&p^e zx6ve;ZhR4$ohhkXaLKY*LZ0Wr zB-8K2T_pOe&N1-Tm>hE;!vn?L9A6H#}$}i1qN4~MNpBIArA$n)>z|!@UfBH z6%%11?GQHdxv=sO2pQ7Svg%KYJXz+O7m`}^qWC(HU`ZE#08LX>6y=}2L^<{sGV%#I z@-fMNOnN>cd!HLU%G-}#e@>ul(q84@djC*Ug?=M*ep83Od6Eo|uAj&?(^N6!CiENq q$D2CzPbd{9N3@%<#`jx}$ujZO6^c$IT&vodfjQ<8oUlL^i literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/layer_tree.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/layer_tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad021dca98c5d0473f046c2e93c6dbc6ae24b844 GIT binary patch literal 19212 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 s>s0#Rn;Lq@1 zF+DU5M~ETh{tUllbev`gu>#Wom?Yflw9z%o9s=xi&62m6uE~@_NQL)P$Lq@$crP~r h`I(1eic&@OX?jzJc7Db1m=yrR3WJ7c9H8XL{s(tm38DZ1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/media.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/media.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a87d0e8da5ff7ddaee9265866d8adda70ec20bdd GIT binary patch literal 11890 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 M*!nxfjf>s?08_2JT>t<8 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/memory.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/memory.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2861271cff63bb2bbcbe37ff7fe2983cd2efeb68 GIT binary patch literal 8938 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 DV-Hm9 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/network.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/network.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad5b149b70004ce5ff887c0b4dfdd114a357cdd2 GIT binary patch literal 160410 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/overlay.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/overlay.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caf2ce7bf8ef8b34705a2a348dc7ad64489c04ea GIT binary patch literal 56902 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 yDWA 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/performance_timeline.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/performance_timeline.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53ff13c8d512b6e1444860e2d7688a14d6f0d7c9 GIT binary patch literal 9363 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/preload.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/preload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5261d17d64b11f32a7d920539b5c55feb9f6e3b GIT binary patch literal 26908 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 DezWp2 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/profiler.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/profiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fb78289706a868d53739079d5ca5ac00ae39c46 GIT binary patch literal 16808 zcmd5@X>c3Im7W0xH*bPBNDf7cBq$O*beWXIn1`&x7A0A9EKz1)5Hl1ZQfGtIhsN{?Vehvht6ueXr-h z00d>(akh3??CGAqyWjiX>(>vzD=c(U@Vw-I=FH1|6!o8&&>pK2q1T-zin>a16i0`t z2t7g56ldbhVN=9BVU92p45TTJ30or82`h-_w`>Pb^xCuSrb5nUy69sCn6LMV}atqbm0>~}gkXxkY7C~Y0pd1cE*cL-_@FXnB{VB9dOZ%2s}xU7 z&>S^kdJ5=p!pxa?hBNPl9FBpQg~Y5A7S0AKyPC3c4oErGl#O#isz6QIxk5-4kyP=k z)P#d~azGRMin`{l-cs3hOo&Z~!u(i_;}fTxEIjHLHVU77?7>)=6WL%O92P@yo()B( zV?u;1NhiyHoe$38>aZfNk{AyKMK%!S*x*bk%#j8}A8AuIhoW%^IDev4T?*d_wE372 zi14x#oA*y+d@SLP&(DUUXM9IzvE@McG}N4w9Wx(^}ai2HDytXmf6yjtD zQlvthcA&fwBs`%M#wWW7={!j&M=sPT0jWdu+GU0d1>-^?6clhavMnC-p9LBdit!UR zAe3X^hTw)-W<)+bEi+g`rb8kE0x;mG-|C);MfmQ>+)N-632@z`vEW<;P)F=O5Q-n1 zo9gcE>FF8`%!^$|r@KagO}qK%x$bais(W@mJ`;;>_x1L5BfECZ27=E8&hTP4bi_wP zbCK@z{1hjI&hbKbFcyi#qTL*SE*^`8#qM*xef{0D3LFT&*?GYO!%37I0K%uvrX4cG z-$AfI-6<~r-nolRx}xUl$tx!>G8e}$Iny5Y`q67gS3TP$&-RpOCwx6E*=y3S;_nY$ z8ce#jrW>2Df8*LWE{hNmomHTld@h-rSdJ?7y*ZDewz=d7sqSpDDHK z@<=XE($${c(z?23yR>CH*Bew^Rq*}(Lfg>x&myZAA zsh^+vhttV{BT~y4)M%6nn$pGP7hU)7xhQtv{yjUj^(ZYOZNA^>7%65x=&2fUGeIMh z;*Juwo+WH;0yfRCHjpq~0|hie6W41#EGt6`CSwbn`2u|oNGPihv#~@JLt>1-T>_?14qi!LTSaVr>=zjYWkf{L%tJqQb}^dV{;L@V`N@K>bH?*`1Q| z%cG0#D~Eqre5a~mwW?jJYG1ADldAewcHDAF+ecGX`_tY1x5lOJq1S_pEsF`Mw&TOf zZSTd?d-ngGaOw_c&?i;h&W+ zjxTjd^*tZf^d^surzgY7*|;A(HxjA{eFW^<@e{?ErL6;i|A1i9`KAK3w?uH zhvlS{m3LtbgA(``c?iBmeax6F_BA`@EPUnQnw2Wul46?R-L`GvP_no=#dJVo`|gE< z$)fHQvkMA#_!gc>mbIpsF35R|K1?r+CEdd*=FmN+z~Wx>P}b6qO?HcO-K@og9!H36L3jon;3}9 zhM}wrv;7<&jt4f;bfTYA(=ou5Cc9B<%6YU2XUT3&LsG%RSOp^e@&ZOO^ajV=>&CjO6$Ay?yr0v#IL-8)uhG7fY|#T&sDbZuzWK z-4AmA=}U#GHlQg1wGG$1u604`)TLsS{Ch9$O}d)X9lp0a-|S2^?7q>tbo?jJFLz1} zyFpghTslgGd!6K}OS;<9UA?Pa`)+sbOEnEjUHg{lUo<7V_DM~HP}Cz8G^k>|n5rRS zy%9jGX;4IAajj~&oq6Bq817;|sB#SVWs7&*DI(tY>f#;fi3oMWjw!+piYm`pmF=}O zzVivYxK7$_T|!#%D1gdN@XK=syrYjw@LNBR8{w#irU2; zOO9(_NmXo1_oEo?KfE-)?EQs5<=**o{}TQBiN(?%eRauy+r1M->Z4CUC_Os9>|PGv z_U=hl@0GlJmWDv`9)F`U>D?n$@BPGOMNw)6QR<{l(|$Vh;l5lpa{r!{s@Qd3uHH*1 z^ShqmV*C4rWy9{G_kCr

    oB;Ke2Az+f8&ofvdsKo*lQEV8HI!vNPr=*ECZC!(2v zsf!XY7>0lGI0PB_SkRJUno&SjrkDzN7rS3M3a`Fh3kQ;gz7(?)MB}c3g~yYneJQ5@ z9^(L6SV<(HO_zlbQ+mTb^2RWfMkL&c zSw0w=4)I`LV54)9DPCY>)2u3_*g!lkgr?@=JjcdkP$I|+@jwX760tcU$g|ohO_7g; zwqzz8it@5$;|U(Q8vg0^uaXI5lxR&NeX$d~E}sD1z2-6DE6}>|CjnK;q=-Klhs-N z8&FF`fKU|dQupQY#nvm&q)NBkDXX~5E$+S&NtLyHVlg8tnjH$cj@__t&RY-WD5OO~ zkP++{885?8uA)~C0S6TnzjF81UpmK7XRTzBvH~DF#eRkS#Ei){Zd(@TXWBCAz|fH7Hr}0Gg`ly;Fsf)g{$+rmDKKn9{}|Q!*M;3P}6866_#;!{FQS zFQT@Z;kR;Ca+NBQOW`{U@Ldt%JB!YD5L5UL8w$d|{;2EnnS5uky#wFbP^jUJ4iQ+6 zEWUGkU2@4|bI~ALi?!8C^li#|hXdyVCxSv~HqK6~wNwt=3Z2M>+DCG_PShIDbXx0# zLMLS_VP8>ZrofITmxe_DR5%uV4$S2W2xKuUs&$0u{uv@)o`Kq+UTTLrUBQHo)JGGc zS%g5y zN}Rk@M2wb?NLwDc$RrCJBzvQJSg}yGdqv!p<*K2|>|+VqtH@sc1R|dW5SkP=?1XY) zL4+gES?nd}$vQr$*15R8a}NTPjQWqz@-(!oEb>W+fliZIbzE>jV5Dlo(2Bx3j!Bf? zc@+HG4cnmO&9AWrLYRU#we^eK(xBAPm#W>Keq`^hlfNlSl^^(Z(Ms>@M^@e2B=@%E zp^x0YTSZd&fjbRbmUblD`=#cARKuQ6bP&4#$MOSY1Fm|8?9Q>gXoMQHfWa@Ze^kIT zXymR+F_j?x3)@mmE4-^cDW>io^FTbprv4A`s7L`AjUy604}(S`0VUOzRHEJ1DJ>m> zs}UvNAL7WC%H}yCoTxX#Q||7;?VZN0o0yPp!*YBcEXqg88nytj*h1Ntr1PYc_)~{B!N|mjvl|52r&x(8HtkgS{svK4>4=S!ao+@F} zgTwFbxjlF^Re4MrJbJ72!>YE`s$Qw8cctm0svXI}qf+HD1G0goq3SqI!0nc2$WxFX z+>n9<3~(#O-4JBJt%OZ6jR0z@QN5%q#dLlKwqZ+I*oFeA8P5ku?2l74kP8Qvun_$s zT%-M%zDmDH&r|KR_Ps<~(3+n+EqcZAIwMkvfcxvbG4OOgehg-HGd-IQOThVneD z`Oa7)P6L{ zJbM4O>(Tq<^6ll4UGxt;z09xdyXY*v-VEIkn%D~wg(flwLrr3#=}ME296D^6e};}5 zCc=c~d4}w-CGksTe`nAtAhILJo?>TJw*bZB2JShqYjIvU7YO^7|y@#i;o0r_ks6cl12G!x}Cmm<41goH=m zSFl!`z>6#B>X14>urMKm%2v{s2%cHwSO6L+a*rTjpl`8=XaFu4ip5Q?fcE^v$OsMk zwf+PV3jGiKiwH?%Z$Bxa>KcFAy6{-KrfK1^ivtoJKgtE>-WK+sAU!Y#H z0CkyF?TdyK4JqYxXM&UoQbbFF%MCMU0m@@8Fog0falO9_7RATlrfOY0p$G+H)`Y6fPi6aKyScz;?82?r+`>n3Dpu zfgpe?U@74==mHuMf!*eTCs;9r5X!cZf%9A&3+BBxa9)IB0B-O>(dX5!I3CR7z^t2e zM9c?WQvs38L;=UF`oQV2^M0_oqkALI`R8WArpN;%XN`LZOR*>nroaseOmb+P7xAr@ zXTftY1apX;hj$d*?7)fe9Ivd2j`BxhFpXF=gv&Dz#e(RyhpUZOoNPN<`4w33vgc>` zDCtk%KBXh}d_ZL50T=>8iD5v>q!e#2;^T!*o66G26=ag*+8m!!rkJSD=DTAG8IGtT zM0g%}M0ViNfb$}=AWG`s3%S$sT2)6!vU393>*cCVRx%fsP~syjX~0xT_}Z`1ZAR+6 z2<57f(Gk%UWNOfm$yS=Q)u$WUFIq3Yfc8pTane?ouHOpjgk-Nx+ZvL#j&#S+MQgIS zRkF9;E$iI?U<;#nTqT#?m!Ffsy~5R;WSZ|QfVR6o8_;ynKyzz;6(tTi%9B?W$+2as zK)@v0oVj|ylSH}zt*TN=*;Pg47aF!JHY?lIBCs!g&^HnB86OZ)ZZ+OQn(t_ zBOj||BR>e>;s-1%vVcZ>kQc>(FrNV)1us-dta#}X+7n49Dn4z%Fym4hq%15?4&je& zB7iDzDL2yT%dn)w*#fD6Xh%KSi>nJHD6c=r3`8Kk29f-<_2sF*S$Fir&F-cunx;(~ zRAWm(fK0NY8ffcKq~E&a(T+Qb*L1F|P__)^1o&iUq#bEqZ#K&F;GYe^Iukg@=c-pa zhz_ywIg}6QL-82`fYTsTV&{=;z)dtF4k$c@0Mp}RJ316axTAyZ$|F(pOhBO%tlo>& zb^IeO{Ou83;q?rGBG%^+s1OEX5fTu9agv;PTkr#MHXv7esDi-w$yKXdfh}w#+gG8? z5hUAF5K$nZG9TG4jNbM2tvvE(G-cm+Bf4DrTEnWNNpdtTHGSl0S&mBfeRu4I7rD!O zq@u=@on5n-3#@QUX|djy?fdSFMbP@oB|{8o`d?vwRSA(qqmE;s0>hCCrbqnt9|O55 z&hT6is_2iZP0{Ok?U8*44?nyh8X0GXn0o&XG1V6hV&tanj#W@13lZM3+(fwt5Am8Yq|jrl621!;F(7Mj z31V;v!DY++YEf1cM`exr)QbAm zidLzjb+w{Ls?beO6~lMjb*t{Jl6xz-pZ5PemU8b(w|B4XxKaFibLNWOVZqxx3wXQO zslj3T6Fp6?-o{{#Xs8howef_Fhj-!IkN~e-FJ^RLunmJQ415?6-pui7!8)X30Ox^a zzlCNUv`pOvHewpnh3*vNzU#vHT}#P5lU2V6gqU&>h>avNc7SYVI)Nvt&3I`TYG(7& zWR7F9dJnq7tF?eQaepNNpSrH+DwQZ8-=5=s;wB#&mmF6cy^9x z!RicrYSDHtIUT5Sdn+y(p|I~@j1V94o`A%c#d%0;02}oB-$UeY&v~kYdp0j^dUp*j z;s&EFUN>cUiLjB`z(y)xk*VXXgzsTM2r56{H0Irp4BNbfFC&h^4R_-4;|S*Ha_%3M~9-yJju_3X%Bw6 zrkfnm8y3#V(ID6u;YX#ozBwbNvrxOXW*nd#lu0B9Pq$U26j{6 zd1XjJ7#y^soV&r&HcuwPgEt(%@1vleDZJ(qSDmJ1RQP>HQI{G!%*O z92~xR7-b;N26X?q*%;Wo$e9@qv?`_$jS2NA<@(Pa3kKml4nL!-Gu{Da-+4?D?JEm# z^!uZSx!X3_hjLtKH6gv>UWkDalINj+lVX6F?0X?H*&jk~j6Rrm+0@(&dHL7QBEG5KgvWg%EM zLvoEIr)ZMXhB*+ZIhY(*aw;$f0yPJdJ)}x4Wib=-TxX61eCgdd*Wr z*QU!V*39s}>)5?+f%p0r$Om5R>V@A?04A*2>gblV+q-6l_uaC#H4D69hFf-%9MIF9 z{p$|+w!YU%`_^mi&_rb^ZT+~NG8Li^INhD5oqsVE;{+fe6TqNnje+FHEu>giiuRFW lC0Gmsy;%1e1IdqDNwK~Zy`2=R#9|QW#ddtmK$0jx{|n5sL6iUh literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/pwa.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/pwa.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a61ee73464d07fef9ade1f402d6f5f7a7615bff1 GIT binary patch literal 10851 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 n!$R*)&jWW^&S1(f}@_=6Ax-o$E5vlSi)Bn literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/runtime.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/runtime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d077a3b5ed50c83e31478f6d3ccd3087ed7ed48 GIT binary patch literal 66310 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 SP(j%c7}7{khkk`gUqSZF5Gxwq}$e607* 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 A{r~^~ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea1716b9924e37fcd3692b7f815dc4c682682d3a GIT binary patch literal 83223 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/system_info.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/system_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dacc8af3b5c0c6e1c7e933802b1fd6f8316c2d0 GIT binary patch literal 14957 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 AKL7v# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/target.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/target.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef3827ecfd03ffcb7fb7ad738b2fda27b09ec7a3 GIT binary patch literal 28922 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 ImW9Xv3o}#hYXATM literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tethering.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tethering.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a524ffb217b76b08636e69ef94fd0a60279f8d6 GIT binary patch literal 1983 zcmcIlOK%)S5bmDWzPxLD6RgA`$=F5~i?GLbBpy~|3B|HwB5hFOT$Z5G>~z~6n8&7j z#@4QE$%cU77A`mv9JpGBU&00Ci!}+thzq%`*&rS#s%O>@q=2~4tEsN4uBqy(ny>bo zVlj_kZJBqMB@LmUgmAP#77KSC0Nq9e5$qxl*DyvzBC;!aa!vM>ngTK+imQ5BO-p#y z&D1iWQ{8MWn?vc36o__TspU?|8Ibc5qB6-E>1od#%t^ zD?Lwywu0k=<@-Tsg-+n}C&EibiVJj=`k`sN7Uywc(R}mv&8j)OaBUInbHoa*;|-c(qkp zq~Qu>;%(t&M~XEMGy#dV#0{_R;8-D!9quSB2RCFrK;o?J5mRVm!AO2S1tF zn*F0AQhI;zdHlaM^wvK&H1hv@OHhdd5RnSXzyoRF z&Kxk?NJ8tU5H3)C9`w6i%!l0qAc1%3^vPH9(O|lbDoQnt-E$IlfmEaveiy(W@Zx1Q znDDV|yPWj{&&ADjJ?(04i3Of1(Ag><)oc7%H!aLx1hR>K>@7d;Kl@?s2WYTqxCqUJj?()tetm%2zU*d1R<;fBCLYa(nm#N3;wK4n%I zu(wYQ^_TU(3Dv--?^Jq3W=jzy4Vf{~%vgy+$7L$8X-x{p{{)mX@o~foh4C9}X|QA> zF#)tRCDDPCG~?{mv~Dv@Ku~-&d>Kev#u)!vLU`l{^wRfe=n*PBLdCXH!h`#z{5M<;Ke5J+u3-mGZng9R* literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tracing.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/tracing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d13286c2cd9ce60a3a49d1000dd964d3ad6685a GIT binary patch literal 15578 zcmcILTW}QDmEAKv@6l@{9>Nl8Ng!!tX$A=}ATS^_5^q6}h+{d*Fif|^;CYDd8L$*N z5eccqiId>0v)~Qc5SMos7H_RT^S4>&$5r{rG((l9I!P^?-H*+mu-J<6*Pe53&r>6` zWaFl|x{q_ueVzBc^XsZACkNlv;8&-2Z|AuG#6s?~vJAgGVB)x&oWx0dl#B5bJkLoc z$s9Gs%oFCAFd;yhlZ2=xW}UE7-V(J<*r3i5wNKaq)*5xhoD)u-GjWGG$##vC?6T{= znc<&s%T}s)K)v%mjD_EQ_J^COqBa+_xnY9U2FC zhZIVNsAUvNrbr^pR>)F=eE8*kQ2r|*P??+HC2qnb@e^jrBAH;*1=%85CG#~Qzi{hy zZi<(LYxW7-b?yy*!al}%ZF=oVIhIgn1F6`|P$E7RnVx&iDZ>OUMw9!Z_| z_ifwO8wky+y{D#nhZ2(Pm*bcH(a3rK%xv;PBEH?%*Y8&&Nx63>6n;H4EvtUOF2^IO znE#4=UQ!~LWyK#(#A1oKUy?5;6N#wmzuecq$DdR};YfViH#4i-l8N9&H4&fNSiWIC zqop2ZtJ)x0;IcLK*Imny<-!J2V;&dF7VLq{O%Mt5+&rHnsxeM+L$y)`$vu;94o6j8 zz!6nMA&N>Z{Lvj#N+QN4vT4Oc@@?w@bQ!TNaQ{)`xv}GWvuXQA1xGD801H&m0qlp& zk9iPu{Ket}f?E8N`8B-7&vV~*6hu^E?q1XATtoSUy1xFV*K5|TKs~WgQn#q78ClWo z!Js0~D8ZoDq|^X<-4SF=5Dc=VF3?gH6nJxukk$;mW>w^5N{Q=&6bUE2f`S{Qv|zFs6VwD=2hJ=WipjyC?hFQF z2`LrDygL}YlnO5ERU}9?RI0rO%1o}7K$+yFQOzvx^?=v|4wIRz8U4H=IXi>wc4`I% zWhnZZnp7rrmm-G~ii8Iuf4;sPWGb2nB`5U_$f|Pid}?Y+R)T6|P7X%m!Pn1!zOKB( zd0_8Jy@rXUpc;zJL}AQA#Via8sPy#)L`az?aTA=1M3b^I*IJIyD4&R^Nt*DaULT2v zqbW(2f`%ZB$f{m1zp=8iR-KI}FUZMAI4H?ckYOv)movbm?un5k4x%IuhDm6bu(beZ zOlN*a=OrEw5?T>=*+;!9)I%?m(aW%>iaS!T z3iZ&7h!n=M7sInW^{P-0y#!+{vg%5EQm+d2(2H0A#zJ9P_FZkRTp!?mXbPLAL9|c8 zs^2uto8B?KZ55yld0w&_^QbOE2SvhIp?(dF#F#J_Q~+fkVXRQU21a6Tz=#^5>?4d7 z>MyP<1B7CZo?z7^Am;fo*ae<;;!4Gw*Ey;?89$!{cGl~O*A5ZajsepijUPX+S2NBV z%duvzoa4*});?%3<_Phn?#VIT5HmiI=R7%{E2^u>vs{2UPOoL`RIq@&E~Xm1uteoW zOi(~8K1}?WY{R4vlYUIVd*DbNc+I5HNW18KL`8WFrW6zTs4wQ~i{xF-Za{ibCxA&8 zxZl;(fA8{jA?vDHbiJUtUP!w-v#nbfTl=)uzUzS-O`3Z%wRLK)&a`WLw%fPZJ)(7w zTo0t{Iy84DHMVH3mbB}|>{jpM);-$RJ=oZ)x!cxm?9f~tX;**tMgQW9Bif6Ewo`L= zQO|bG)t+|wvpe@J?mYQm=gEwBRNHy-BmSRS(>qUU-ccN8tLE-_eqd2^iD_3)w*RHY z{=*OY4`(`#X#I!pe(C*7>Hfo7#}UNbrn%b*bDQRBOS^p8&KDOu_iLT|7duC^&XG(f zLA7h{Eo6H={j`SbKE*%%gLm}lA3BbxNYEemI0CzcU#)WlUKW0}-!W_wN{lnq#3VI8 zgQH-^nZ(cYmpP@nAVGoB`9=WD89s3^yCvXyf-=-E$VrfVE1=8<6dGOh0hD-Z!Aez(X%Cts$RWqsmS|uDpcFE=+b~vImm^O!i`eEUUZ> ziPxb#kCgCQbTgP2x`nJ3T|ire%s8?g@0k@8vdlO|le|=bpm{mBu2_KN?fo+dyq`n} z*!$V-2Y$Ij+kW`A`Bvaglh)*WxY7T~c=lK@9iG;XO@Ap@;)%3!`Tq=e?6q_-tQ`yAmD1Y-4}8O! z<`K;|e7Ej)_)hCjr_#RR2hAhtNG$tG1V-0hx%9Bbzu2-zYuWRQE$IVa(gx0CTE?E# zJ8PXwoYUc4@_^qv&lf75e(L60Px4Q7@x)WTd4$Bozx8^CdOaUkdxrWOKK6TtcCGi; zDk5yK(uzqNCV1w0O)yyG)q_XyJgP$3f_TVdK!=YR^r*;{&Rl|?iTWNS-{HU?@b)eo z2LYQAdY0_muDxmDg>>`wj4%LAzW#+%>2=*1p|8BKb5B~>ly2(F2)m(a{~NqWE$d2Di7oaB;Fj?Ee;9ESh- z&#)}{Wz?7jH-tGM6X1lP`vES2Rklf%BA38EYlVP>dn~EQq1XudjB~f0pg_d{L_;tJ z0bZn-m=Z%GnGHU1C=?gZ%c2|s8(I+|5u@^SC_F1-EG6H8S_sdKl1L`PiKxi@1Ovh+ zjwX^abO-E+qqy^xNED!DQ38)uMr&RY)kGrBq8UulTNqa0zWj%I(k1AmVr1iDzNwHg z9Day)ST2X6DOo|wki|TTEQW^S?Z}x75r8!Odr)^joO^37ZEvL0C{byskZ2mH{+<m69qVBBPNJ<6l9=?g#vrDLs1uS8+FU+GpEK+k#)2>$&X-n zOhWKq?STZHVY9^!r0(`C1hVe>h2c*H-m(cO6R9xg7*mc>A$AYL|NQs=qry72^r1uy z&Rtc(9i2NwBve!*g69WhlMqv?Oc64oN>yaB2B4J7k&vhoHLHwZbRnLI%epW<7nvz> z*`9}Bl%uf5%EZ#RV%9l|c?0_##{|#pFG?jZtQ<5?DqqJD*Cv(GQ=`MWaCqYA=`|?j zG~&bL68z6o3WQC7Fo;rIbqj$tCHp%^E!Z7E~R8OiEYtHIFf{jsw6{HNy&vw zkIV9m2wuJl@db!_idR6`8L?Ov0WdHGAyA?EE{LJHM1vYZf=C=FkOCMK$@Rq&7ZWi8 z(4FTY9y+ZgQgKPQL?hD|lDb`@smjt9L7gqD>{50Wi>S)VqY&hzZXm6x6GUxEKOuI};5hQPr!6 zTm_$BjsbFj#M=g%R7n>$n0RW85a#D_T2`jyB*B8G0>%b`FM`zX zH71G|J77Yjl(4*4OrYIzB?9V$CSKUgoVvjI=~lMIx|OXZjLIVS{e=|A`ceYOapd2@ zFkcWyZY&!y&xk+AG1p{7VestuDcw4Bt$VzLGYB90Xt*p7ksCTKa%@t{Q{hyg_SH^KJ%8~!H$CO>QbXY&=_E6jBg zp^POHGt7z==^9W45g(1pVGMj5hi_%q3Ud@AM`i=g9Hr|axX`eNV^R<=Gsp%lHr;eH zz$tN<$UopR@#f*b@s0$WnY+X14`qH!Mt^HR6PgMwFa^G^g`H~e`p^{eg zRmfCcQ7(S*d~t>12%)hfjH?gJ$zo}c6BmUDy3a{F*WEq*mD9s#j-DJI9UnZ=-OXwT zn9-#Uh=XDjG$pzT1vya(8Tu6pnzGEN#toj9lSP3-XJKf#!8r(!5Z{ZzpH&=my&C!# zMf?@CQ9gqI>L4WS3_NfKX^*$`5Wv7~67MuUX!2!TesI@sTzY%x2LJt$bdyhW`O|{` z=>wPlsfr=$Z`JnjKk{@6AJ}{N5;_y?kh|uZOYoT7>$gslIBcKgZ7q&d*4QT#X_^)EHm(J};1NTD9PdY$4 zY}mXoa(%ZZG(7V3Wjz}oTg=2w_EK)z)WnyV*ckJp)42ngRZqt>&t0{^3Bff!p5i=z zwSJzzh$mb2<<1iz>4rrzLr#FRG|!vqEQMqt$_Uqd#gVZj-cZvwFR-}aeM6s2nZ`Jx z09)wSP-PGSvra?ebTn~36fJoK@JxPWClBVNti&R5;K)dLK>$XgQN9T<58%IwLX`2KnBzfPL)s>0+x*w9*T1RR zTe7zGX;H7Qx(jQPQIJwW_~5%0@Ku0a;c)@TD+t@Ijr%AVB66~a zSQT)P2M=yeL{))@8TPY?JZA?|5E7JQZiF6DHN+SAOCYTvAPEiw1Oz0tc%Gn)<0`&= zz-JO=^6wRRVL$=W1PB~lLFq|^!0wV2bXrg_f`2l^Oi^%h4BHf5f1xWCx(wkiRQgy7 z8KEt)ODd9?=gyrwLqiPX<2DtF=e&mWG;9HihXq+Mw``tx44?{%g1s;fct$=j91I6g z49!5C1g1*_dSCui$!4#&Xjfp6pSRVnB_TqT7_^Grw6aWa&f=4Pq;WF zXauRhz*`?`tbUNy#*=V)MBWdD_a0ugTD@iRQaVHy>dJZTL_VFppsA&uIZ(` zSL~zUx9X##E4awX1W-0;R+T6l=r3NNV#W$Y4XE_d>juX+e`$}U9uZT68!^i&i1yeZ zSSdn~OpHv&!G16lonZ|i95N}!x4;=%`vgnE9Od+E1PRW0X)8yS8IXCp&6u3tRK&uJ z@?qqohIG)~IU=Oj4sHm=<*zpMI#w#89^F;6LcKb7Tx`X9wXrN?vU64AY?&fUiZOS&aLwQ!S zH)d@eXI~G^TA^vmLt^I}U0c z2QwXq5Jj72Z_nE5)3%nZ*t00^(8L`X@g?Z;re<$8Opo?{gly65V!mRreL!m;$h7av zwLJ2)t}sT>`zA}{ko!s}QJO@xBjV`jL4-Z~n-% zfY-nnxGs7P41sHh?m9$IZ%6^nH4%ZY^slK}>4q_NHym>q1bc8Q6^-U!Fhc}6sT_m$ z5~l~BX~B&7m4PT1)@K#_j1dU(W6v{N=c|^XP5ME$PlaZS%H=8~Z*?D**)Bf=Q(-XzZw9vISRw zUhsFg$5sqgS9A5=jL`L{t}`Qa;+;!dMreIxsr}Ss$zKdZj$O$ihC*?A!0WJPz89yI5Mt?XI9tA zDdU)wp8>F8WwH%dz5_MDUUbugt;)|a!9Dd_>9`eKO72w-J4~iDMiB5cCY6<9F07Oz z<$^Q_A#1(`JxLn;uBH7>Ano0&ZP}M;c{zLV$R`2q;OTe!ZytE(z+!!mR^M}X{G+aW zUwc@;Fa70-?2)tSS0}Y2lee1|8~s|N|0Cg}Np0KE!^QwSZ_BI`98<h^sQ5`iB#?N|N<5C8#l>c@~SnR%Z7 zpK6Y8|97tY_gw35IoEHws^4?9Ppoc!kiU_9!r|Yg&78^gC({8QcnK1C4rp>MVev`8 zRK+*m*l}~uJA0mRkbNS$`Nmtq&m8YLuxsO!%{5S#einHz@`QuzlPz@sKYsJocV2zM zL3X*z#&23~aP!-iHrMi-vULqhX88Nav1{1^f0w$rZ9B4oBTJTM-kROevt)+9j~WN5 z492MQIKOOzs-;6b*Rw6#)ssCmlJ)gxckRs%4#T_kEcD)cV5!~@s2jSL%<%V7-PR=w z{Dt1#2l*u%X6@X@o+St7oZQBpOD@d0x#j~)RhX;hHf&$2!CWo3$+uL8IS;pK520OZ z;GDac*FoK534Zchm9A>b@aa?-Ew9WGqQp* zXH1F8ru?7(WHY)VXJTa>SAL5BrVPM$Bm#j1YrhB7b3nI>7O;s|V$X0D&!Tvwa*Iq7 zlNuh=eUA}8ult12oW*_0IMIn=>l}9YTtZ9K^_!j~Ih97F=oM+MfqIQMP!;)LHDwKt zgRzFID0>90iXb_jibsO3Z1`-ppfe6B1GRY!^FmlMY#t~M_4A&|MKz@MXIaa84%M7u zUUwYb)Y6_&bO0LH?pgl*;=DFIG?Yl|WuBN`NTfWIYSb-hwl%L6%J7amnj9X{xaHGC zK{uB49OW9PHg&C{qdlSXCbLSEX@=)Go~xO( z^D$v17)S`;__5r~JR+-^+`CMH#GkQp&3V8+AQ=_z7bhHrVU&dS7ceGlBJ^h}c|NfK5R zC@@*w;ZR@{5(I4v%yY5=Z5*>s@Nn^bv)JHl$bvB1qy-ba6^j#4HS}E_s1MekZYFos z_*ZpwM;(2i{&?ZT)E71NSx$wmh_?lbUoKc~E|AjzFOay;0%_7M2kKl_pw6Zrq~-!y zU=J}hdn~fB4xvOt!{!IEamO=@Hl1LiNdhRp3#uVujQ3DyLqXmBFP7Gp>R0QfHwk5=*7ZwKa9^V*g44Kur-8)&_U5~>t+9j94)gp4ivR}a literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/web_audio.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/__pycache__/web_audio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..031a47d2239690eea896c3d37ded21aee17a3a90 GIT binary patch literal 24977 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 a0^b?~*@r-CXx5vew-#>J_Yj*A{rrCggDDjN literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/accessibility.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/accessibility.py new file mode 100755 index 0000000..7977f09 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/accessibility.py @@ -0,0 +1,647 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Accessibility (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import dom +from . import page +from . import runtime + + +class AXNodeId(str): + ''' + Unique accessibility node identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AXNodeId: + return cls(json) + + def __repr__(self): + return 'AXNodeId({})'.format(super().__repr__()) + + +class AXValueType(enum.Enum): + ''' + Enum of possible property types. + ''' + BOOLEAN = "boolean" + TRISTATE = "tristate" + BOOLEAN_OR_UNDEFINED = "booleanOrUndefined" + IDREF = "idref" + IDREF_LIST = "idrefList" + INTEGER = "integer" + NODE = "node" + NODE_LIST = "nodeList" + NUMBER = "number" + STRING = "string" + COMPUTED_STRING = "computedString" + TOKEN = "token" + TOKEN_LIST = "tokenList" + DOM_RELATION = "domRelation" + ROLE = "role" + INTERNAL_ROLE = "internalRole" + VALUE_UNDEFINED = "valueUndefined" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueSourceType(enum.Enum): + ''' + Enum of possible property sources. + ''' + ATTRIBUTE = "attribute" + IMPLICIT = "implicit" + STYLE = "style" + CONTENTS = "contents" + PLACEHOLDER = "placeholder" + RELATED_ELEMENT = "relatedElement" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueNativeSourceType(enum.Enum): + ''' + Enum of possible native property sources (as a subtype of a particular AXValueSourceType). + ''' + DESCRIPTION = "description" + FIGCAPTION = "figcaption" + LABEL = "label" + LABELFOR = "labelfor" + LABELWRAPPED = "labelwrapped" + LEGEND = "legend" + RUBYANNOTATION = "rubyannotation" + TABLECAPTION = "tablecaption" + TITLE = "title" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AXValueSource: + ''' + A single source for a computed AX property. + ''' + #: What type of source this is. + type_: AXValueSourceType + + #: The value of this property source. + value: typing.Optional[AXValue] = None + + #: The name of the relevant attribute, if any. + attribute: typing.Optional[str] = None + + #: The value of the relevant attribute, if any. + attribute_value: typing.Optional[AXValue] = None + + #: Whether this source is superseded by a higher priority source. + superseded: typing.Optional[bool] = None + + #: The native markup source for this value, e.g. a `` or elements that triggered the + attempt (in the case of attempts triggered by a document rule). It is + possible for multiple rule sets and links to trigger a single attempt. + ''' + key: PreloadingAttemptKey + + rule_set_ids: typing.List[RuleSetId] + + node_ids: typing.List[dom.BackendNodeId] + + def to_json(self): + json = dict() + json['key'] = self.key.to_json() + json['ruleSetIds'] = [i.to_json() for i in self.rule_set_ids] + json['nodeIds'] = [i.to_json() for i in self.node_ids] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + rule_set_ids=[RuleSetId.from_json(i) for i in json['ruleSetIds']], + node_ids=[dom.BackendNodeId.from_json(i) for i in json['nodeIds']], + ) + + +class PrerenderFinalStatus(enum.Enum): + ''' + List of FinalStatus reasons for Prerender2. + ''' + ACTIVATED = "Activated" + DESTROYED = "Destroyed" + LOW_END_DEVICE = "LowEndDevice" + INVALID_SCHEME_REDIRECT = "InvalidSchemeRedirect" + INVALID_SCHEME_NAVIGATION = "InvalidSchemeNavigation" + NAVIGATION_REQUEST_BLOCKED_BY_CSP = "NavigationRequestBlockedByCsp" + MAIN_FRAME_NAVIGATION = "MainFrameNavigation" + MOJO_BINDER_POLICY = "MojoBinderPolicy" + RENDERER_PROCESS_CRASHED = "RendererProcessCrashed" + RENDERER_PROCESS_KILLED = "RendererProcessKilled" + DOWNLOAD = "Download" + TRIGGER_DESTROYED = "TriggerDestroyed" + NAVIGATION_NOT_COMMITTED = "NavigationNotCommitted" + NAVIGATION_BAD_HTTP_STATUS = "NavigationBadHttpStatus" + CLIENT_CERT_REQUESTED = "ClientCertRequested" + NAVIGATION_REQUEST_NETWORK_ERROR = "NavigationRequestNetworkError" + CANCEL_ALL_HOSTS_FOR_TESTING = "CancelAllHostsForTesting" + DID_FAIL_LOAD = "DidFailLoad" + STOP = "Stop" + SSL_CERTIFICATE_ERROR = "SslCertificateError" + LOGIN_AUTH_REQUESTED = "LoginAuthRequested" + UA_CHANGE_REQUIRES_RELOAD = "UaChangeRequiresReload" + BLOCKED_BY_CLIENT = "BlockedByClient" + AUDIO_OUTPUT_DEVICE_REQUESTED = "AudioOutputDeviceRequested" + MIXED_CONTENT = "MixedContent" + TRIGGER_BACKGROUNDED = "TriggerBackgrounded" + MEMORY_LIMIT_EXCEEDED = "MemoryLimitExceeded" + DATA_SAVER_ENABLED = "DataSaverEnabled" + TRIGGER_URL_HAS_EFFECTIVE_URL = "TriggerUrlHasEffectiveUrl" + ACTIVATED_BEFORE_STARTED = "ActivatedBeforeStarted" + INACTIVE_PAGE_RESTRICTION = "InactivePageRestriction" + START_FAILED = "StartFailed" + TIMEOUT_BACKGROUNDED = "TimeoutBackgrounded" + CROSS_SITE_REDIRECT_IN_INITIAL_NAVIGATION = "CrossSiteRedirectInInitialNavigation" + CROSS_SITE_NAVIGATION_IN_INITIAL_NAVIGATION = "CrossSiteNavigationInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInInitialNavigation" + ACTIVATION_NAVIGATION_PARAMETER_MISMATCH = "ActivationNavigationParameterMismatch" + ACTIVATED_IN_BACKGROUND = "ActivatedInBackground" + EMBEDDER_HOST_DISALLOWED = "EmbedderHostDisallowed" + ACTIVATION_NAVIGATION_DESTROYED_BEFORE_SUCCESS = "ActivationNavigationDestroyedBeforeSuccess" + TAB_CLOSED_BY_USER_GESTURE = "TabClosedByUserGesture" + TAB_CLOSED_WITHOUT_USER_GESTURE = "TabClosedWithoutUserGesture" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_CRASHED = "PrimaryMainFrameRendererProcessCrashed" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_KILLED = "PrimaryMainFrameRendererProcessKilled" + ACTIVATION_FRAME_POLICY_NOT_COMPATIBLE = "ActivationFramePolicyNotCompatible" + PRELOADING_DISABLED = "PreloadingDisabled" + BATTERY_SAVER_ENABLED = "BatterySaverEnabled" + ACTIVATED_DURING_MAIN_FRAME_NAVIGATION = "ActivatedDuringMainFrameNavigation" + PRELOADING_UNSUPPORTED_BY_WEB_CONTENTS = "PreloadingUnsupportedByWebContents" + CROSS_SITE_REDIRECT_IN_MAIN_FRAME_NAVIGATION = "CrossSiteRedirectInMainFrameNavigation" + CROSS_SITE_NAVIGATION_IN_MAIN_FRAME_NAVIGATION = "CrossSiteNavigationInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation" + MEMORY_PRESSURE_ON_TRIGGER = "MemoryPressureOnTrigger" + MEMORY_PRESSURE_AFTER_TRIGGERED = "MemoryPressureAfterTriggered" + PRERENDERING_DISABLED_BY_DEV_TOOLS = "PrerenderingDisabledByDevTools" + SPECULATION_RULE_REMOVED = "SpeculationRuleRemoved" + ACTIVATED_WITH_AUXILIARY_BROWSING_CONTEXTS = "ActivatedWithAuxiliaryBrowsingContexts" + MAX_NUM_OF_RUNNING_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_NON_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningNonEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_EMBEDDER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEmbedderPrerendersExceeded" + PRERENDERING_URL_HAS_EFFECTIVE_URL = "PrerenderingUrlHasEffectiveUrl" + REDIRECTED_PRERENDERING_URL_HAS_EFFECTIVE_URL = "RedirectedPrerenderingUrlHasEffectiveUrl" + ACTIVATION_URL_HAS_EFFECTIVE_URL = "ActivationUrlHasEffectiveUrl" + JAVA_SCRIPT_INTERFACE_ADDED = "JavaScriptInterfaceAdded" + JAVA_SCRIPT_INTERFACE_REMOVED = "JavaScriptInterfaceRemoved" + ALL_PRERENDERING_CANCELED = "AllPrerenderingCanceled" + WINDOW_CLOSED = "WindowClosed" + SLOW_NETWORK = "SlowNetwork" + OTHER_PRERENDERED_PAGE_ACTIVATED = "OtherPrerenderedPageActivated" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PreloadingStatus(enum.Enum): + ''' + Preloading status values, see also PreloadingTriggeringOutcome. This + status is shared by prefetchStatusUpdated and prerenderStatusUpdated. + ''' + PENDING = "Pending" + RUNNING = "Running" + READY = "Ready" + SUCCESS = "Success" + FAILURE = "Failure" + NOT_SUPPORTED = "NotSupported" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PrefetchStatus(enum.Enum): + ''' + TODO(https://crbug.com/1384419): revisit the list of PrefetchStatus and + filter out the ones that aren't necessary to the developers. + ''' + PREFETCH_ALLOWED = "PrefetchAllowed" + PREFETCH_FAILED_INELIGIBLE_REDIRECT = "PrefetchFailedIneligibleRedirect" + PREFETCH_FAILED_INVALID_REDIRECT = "PrefetchFailedInvalidRedirect" + PREFETCH_FAILED_MIME_NOT_SUPPORTED = "PrefetchFailedMIMENotSupported" + PREFETCH_FAILED_NET_ERROR = "PrefetchFailedNetError" + PREFETCH_FAILED_NON2_XX = "PrefetchFailedNon2XX" + PREFETCH_FAILED_PER_PAGE_LIMIT_EXCEEDED = "PrefetchFailedPerPageLimitExceeded" + PREFETCH_EVICTED_AFTER_CANDIDATE_REMOVED = "PrefetchEvictedAfterCandidateRemoved" + PREFETCH_EVICTED_FOR_NEWER_PREFETCH = "PrefetchEvictedForNewerPrefetch" + PREFETCH_HELDBACK = "PrefetchHeldback" + PREFETCH_INELIGIBLE_RETRY_AFTER = "PrefetchIneligibleRetryAfter" + PREFETCH_IS_PRIVACY_DECOY = "PrefetchIsPrivacyDecoy" + PREFETCH_IS_STALE = "PrefetchIsStale" + PREFETCH_NOT_ELIGIBLE_BROWSER_CONTEXT_OFF_THE_RECORD = "PrefetchNotEligibleBrowserContextOffTheRecord" + PREFETCH_NOT_ELIGIBLE_DATA_SAVER_ENABLED = "PrefetchNotEligibleDataSaverEnabled" + PREFETCH_NOT_ELIGIBLE_EXISTING_PROXY = "PrefetchNotEligibleExistingProxy" + PREFETCH_NOT_ELIGIBLE_HOST_IS_NON_UNIQUE = "PrefetchNotEligibleHostIsNonUnique" + PREFETCH_NOT_ELIGIBLE_NON_DEFAULT_STORAGE_PARTITION = "PrefetchNotEligibleNonDefaultStoragePartition" + PREFETCH_NOT_ELIGIBLE_SAME_SITE_CROSS_ORIGIN_PREFETCH_REQUIRED_PROXY = "PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy" + PREFETCH_NOT_ELIGIBLE_SCHEME_IS_NOT_HTTPS = "PrefetchNotEligibleSchemeIsNotHttps" + PREFETCH_NOT_ELIGIBLE_USER_HAS_COOKIES = "PrefetchNotEligibleUserHasCookies" + PREFETCH_NOT_ELIGIBLE_USER_HAS_SERVICE_WORKER = "PrefetchNotEligibleUserHasServiceWorker" + PREFETCH_NOT_ELIGIBLE_BATTERY_SAVER_ENABLED = "PrefetchNotEligibleBatterySaverEnabled" + PREFETCH_NOT_ELIGIBLE_PRELOADING_DISABLED = "PrefetchNotEligiblePreloadingDisabled" + PREFETCH_NOT_FINISHED_IN_TIME = "PrefetchNotFinishedInTime" + PREFETCH_NOT_STARTED = "PrefetchNotStarted" + PREFETCH_NOT_USED_COOKIES_CHANGED = "PrefetchNotUsedCookiesChanged" + PREFETCH_PROXY_NOT_AVAILABLE = "PrefetchProxyNotAvailable" + PREFETCH_RESPONSE_USED = "PrefetchResponseUsed" + PREFETCH_SUCCESSFUL_BUT_NOT_USED = "PrefetchSuccessfulButNotUsed" + PREFETCH_NOT_USED_PROBE_FAILED = "PrefetchNotUsedProbeFailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class PrerenderMismatchedHeaders: + ''' + Information of headers to be displayed when the header mismatch occurred. + ''' + header_name: str + + initial_value: typing.Optional[str] = None + + activation_value: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['headerName'] = self.header_name + if self.initial_value is not None: + json['initialValue'] = self.initial_value + if self.activation_value is not None: + json['activationValue'] = self.activation_value + return json + + @classmethod + def from_json(cls, json): + return cls( + header_name=str(json['headerName']), + initial_value=str(json['initialValue']) if 'initialValue' in json else None, + activation_value=str(json['activationValue']) if 'activationValue' in json else None, + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.disable', + } + json = yield cmd_dict + + +@event_class('Preload.ruleSetUpdated') +@dataclass +class RuleSetUpdated: + ''' + Upsert. Currently, it is only emitted when a rule set added. + ''' + rule_set: RuleSet + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetUpdated: + return cls( + rule_set=RuleSet.from_json(json['ruleSet']) + ) + + +@event_class('Preload.ruleSetRemoved') +@dataclass +class RuleSetRemoved: + id_: RuleSetId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetRemoved: + return cls( + id_=RuleSetId.from_json(json['id']) + ) + + +@event_class('Preload.preloadEnabledStateUpdated') +@dataclass +class PreloadEnabledStateUpdated: + ''' + Fired when a preload enabled state is updated. + ''' + disabled_by_preference: bool + disabled_by_data_saver: bool + disabled_by_battery_saver: bool + disabled_by_holdback_prefetch_speculation_rules: bool + disabled_by_holdback_prerender_speculation_rules: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadEnabledStateUpdated: + return cls( + disabled_by_preference=bool(json['disabledByPreference']), + disabled_by_data_saver=bool(json['disabledByDataSaver']), + disabled_by_battery_saver=bool(json['disabledByBatterySaver']), + disabled_by_holdback_prefetch_speculation_rules=bool(json['disabledByHoldbackPrefetchSpeculationRules']), + disabled_by_holdback_prerender_speculation_rules=bool(json['disabledByHoldbackPrerenderSpeculationRules']) + ) + + +@event_class('Preload.prefetchStatusUpdated') +@dataclass +class PrefetchStatusUpdated: + ''' + Fired when a prefetch attempt is updated. + ''' + key: PreloadingAttemptKey + #: The frame id of the frame initiating prefetch. + initiating_frame_id: page.FrameId + prefetch_url: str + status: PreloadingStatus + prefetch_status: PrefetchStatus + request_id: network.RequestId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrefetchStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + initiating_frame_id=page.FrameId.from_json(json['initiatingFrameId']), + prefetch_url=str(json['prefetchUrl']), + status=PreloadingStatus.from_json(json['status']), + prefetch_status=PrefetchStatus.from_json(json['prefetchStatus']), + request_id=network.RequestId.from_json(json['requestId']) + ) + + +@event_class('Preload.prerenderStatusUpdated') +@dataclass +class PrerenderStatusUpdated: + ''' + Fired when a prerender attempt is updated. + ''' + key: PreloadingAttemptKey + status: PreloadingStatus + prerender_status: typing.Optional[PrerenderFinalStatus] + #: This is used to give users more information about the name of Mojo interface + #: that is incompatible with prerender and has caused the cancellation of the attempt. + disallowed_mojo_interface: typing.Optional[str] + mismatched_headers: typing.Optional[typing.List[PrerenderMismatchedHeaders]] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrerenderStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + status=PreloadingStatus.from_json(json['status']), + prerender_status=PrerenderFinalStatus.from_json(json['prerenderStatus']) if 'prerenderStatus' in json else None, + disallowed_mojo_interface=str(json['disallowedMojoInterface']) if 'disallowedMojoInterface' in json else None, + mismatched_headers=[PrerenderMismatchedHeaders.from_json(i) for i in json['mismatchedHeaders']] if 'mismatchedHeaders' in json else None + ) + + +@event_class('Preload.preloadingAttemptSourcesUpdated') +@dataclass +class PreloadingAttemptSourcesUpdated: + ''' + Send a list of sources for all preloading attempts in a document. + ''' + loader_id: network.LoaderId + preloading_attempt_sources: typing.List[PreloadingAttemptSource] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadingAttemptSourcesUpdated: + return cls( + loader_id=network.LoaderId.from_json(json['loaderId']), + preloading_attempt_sources=[PreloadingAttemptSource.from_json(i) for i in json['preloadingAttemptSources']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/profiler.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/profiler.py new file mode 100755 index 0000000..ab2ff07 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/profiler.py @@ -0,0 +1,418 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Profiler +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import debugger +from . import runtime + + +@dataclass +class ProfileNode: + ''' + Profile node. Holds callsite information, execution statistics and child nodes. + ''' + #: Unique id of the node. + id_: int + + #: Function location. + call_frame: runtime.CallFrame + + #: Number of samples where this node was on top of the call stack. + hit_count: typing.Optional[int] = None + + #: Child node ids. + children: typing.Optional[typing.List[int]] = None + + #: The reason of being not optimized. The function may be deoptimized or marked as don't + #: optimize. + deopt_reason: typing.Optional[str] = None + + #: An array of source position ticks. + position_ticks: typing.Optional[typing.List[PositionTickInfo]] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + json['callFrame'] = self.call_frame.to_json() + if self.hit_count is not None: + json['hitCount'] = self.hit_count + if self.children is not None: + json['children'] = [i for i in self.children] + if self.deopt_reason is not None: + json['deoptReason'] = self.deopt_reason + if self.position_ticks is not None: + json['positionTicks'] = [i.to_json() for i in self.position_ticks] + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=int(json['id']), + call_frame=runtime.CallFrame.from_json(json['callFrame']), + hit_count=int(json['hitCount']) if 'hitCount' in json else None, + children=[int(i) for i in json['children']] if 'children' in json else None, + deopt_reason=str(json['deoptReason']) if 'deoptReason' in json else None, + position_ticks=[PositionTickInfo.from_json(i) for i in json['positionTicks']] if 'positionTicks' in json else None, + ) + + +@dataclass +class Profile: + ''' + Profile. + ''' + #: The list of profile nodes. First item is the root node. + nodes: typing.List[ProfileNode] + + #: Profiling start timestamp in microseconds. + start_time: float + + #: Profiling end timestamp in microseconds. + end_time: float + + #: Ids of samples top nodes. + samples: typing.Optional[typing.List[int]] = None + + #: Time intervals between adjacent samples in microseconds. The first delta is relative to the + #: profile startTime. + time_deltas: typing.Optional[typing.List[int]] = None + + def to_json(self): + json = dict() + json['nodes'] = [i.to_json() for i in self.nodes] + json['startTime'] = self.start_time + json['endTime'] = self.end_time + if self.samples is not None: + json['samples'] = [i for i in self.samples] + if self.time_deltas is not None: + json['timeDeltas'] = [i for i in self.time_deltas] + return json + + @classmethod + def from_json(cls, json): + return cls( + nodes=[ProfileNode.from_json(i) for i in json['nodes']], + start_time=float(json['startTime']), + end_time=float(json['endTime']), + samples=[int(i) for i in json['samples']] if 'samples' in json else None, + time_deltas=[int(i) for i in json['timeDeltas']] if 'timeDeltas' in json else None, + ) + + +@dataclass +class PositionTickInfo: + ''' + Specifies a number of samples attributed to a certain source position. + ''' + #: Source line number (1-based). + line: int + + #: Number of samples attributed to the source line. + ticks: int + + def to_json(self): + json = dict() + json['line'] = self.line + json['ticks'] = self.ticks + return json + + @classmethod + def from_json(cls, json): + return cls( + line=int(json['line']), + ticks=int(json['ticks']), + ) + + +@dataclass +class CoverageRange: + ''' + Coverage data for a source range. + ''' + #: JavaScript script source offset for the range start. + start_offset: int + + #: JavaScript script source offset for the range end. + end_offset: int + + #: Collected execution count of the source range. + count: int + + def to_json(self): + json = dict() + json['startOffset'] = self.start_offset + json['endOffset'] = self.end_offset + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + start_offset=int(json['startOffset']), + end_offset=int(json['endOffset']), + count=int(json['count']), + ) + + +@dataclass +class FunctionCoverage: + ''' + Coverage data for a JavaScript function. + ''' + #: JavaScript function name. + function_name: str + + #: Source ranges inside the function with coverage data. + ranges: typing.List[CoverageRange] + + #: Whether coverage data for this function has block granularity. + is_block_coverage: bool + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['ranges'] = [i.to_json() for i in self.ranges] + json['isBlockCoverage'] = self.is_block_coverage + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + ranges=[CoverageRange.from_json(i) for i in json['ranges']], + is_block_coverage=bool(json['isBlockCoverage']), + ) + + +@dataclass +class ScriptCoverage: + ''' + Coverage data for a JavaScript script. + ''' + #: JavaScript script id. + script_id: runtime.ScriptId + + #: JavaScript script name or url. + url: str + + #: Functions contained in the script that has coverage data. + functions: typing.List[FunctionCoverage] + + def to_json(self): + json = dict() + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['functions'] = [i.to_json() for i in self.functions] + return json + + @classmethod + def from_json(cls, json): + return cls( + script_id=runtime.ScriptId.from_json(json['scriptId']), + url=str(json['url']), + functions=[FunctionCoverage.from_json(i) for i in json['functions']], + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.enable', + } + json = yield cmd_dict + + +def get_best_effort_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ScriptCoverage]]: + ''' + Collect coverage data for the current isolate. The coverage data may be incomplete due to + garbage collection. + + :returns: Coverage data for the current isolate. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.getBestEffortCoverage', + } + json = yield cmd_dict + return [ScriptCoverage.from_json(i) for i in json['result']] + + +def set_sampling_interval( + interval: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. + + :param interval: New sampling interval in microseconds. + ''' + params: T_JSON_DICT = dict() + params['interval'] = interval + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.setSamplingInterval', + 'params': params, + } + json = yield cmd_dict + + +def start() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.start', + } + json = yield cmd_dict + + +def start_precise_coverage( + call_count: typing.Optional[bool] = None, + detailed: typing.Optional[bool] = None, + allow_triggered_updates: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,float]: + ''' + Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code + coverage may be incomplete. Enabling prevents running optimized code and resets execution + counters. + + :param call_count: *(Optional)* Collect accurate call counts beyond simple 'covered' or 'not covered'. + :param detailed: *(Optional)* Collect block-based coverage. + :param allow_triggered_updates: *(Optional)* Allow the backend to send updates on its own initiative + :returns: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + params: T_JSON_DICT = dict() + if call_count is not None: + params['callCount'] = call_count + if detailed is not None: + params['detailed'] = detailed + if allow_triggered_updates is not None: + params['allowTriggeredUpdates'] = allow_triggered_updates + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.startPreciseCoverage', + 'params': params, + } + json = yield cmd_dict + return float(json['timestamp']) + + +def stop() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Profile]: + ''' + + + :returns: Recorded profile. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stop', + } + json = yield cmd_dict + return Profile.from_json(json['profile']) + + +def stop_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable precise code coverage. Disabling releases unnecessary execution count records and allows + executing optimized code. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stopPreciseCoverage', + } + json = yield cmd_dict + + +def take_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[ScriptCoverage], float]]: + ''' + Collect coverage data for the current isolate, and resets execution counters. Precise code + coverage needs to have started. + + :returns: A tuple with the following items: + + 0. **result** - Coverage data for the current isolate. + 1. **timestamp** - Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.takePreciseCoverage', + } + json = yield cmd_dict + return ( + [ScriptCoverage.from_json(i) for i in json['result']], + float(json['timestamp']) + ) + + +@event_class('Profiler.consoleProfileFinished') +@dataclass +class ConsoleProfileFinished: + id_: str + #: Location of console.profileEnd(). + location: debugger.Location + profile: Profile + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileFinished: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + profile=Profile.from_json(json['profile']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.consoleProfileStarted') +@dataclass +class ConsoleProfileStarted: + ''' + Sent when new profile recording is started using console.profile() call. + ''' + id_: str + #: Location of console.profile(). + location: debugger.Location + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileStarted: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.preciseCoverageDeltaUpdate') +@dataclass +class PreciseCoverageDeltaUpdate: + ''' + **EXPERIMENTAL** + + Reports coverage delta since the last poll (either from an event like this, or from + ``takePreciseCoverage`` for the current isolate. May only be sent if precise code + coverage has been started. This event can be trigged by the embedder to, for example, + trigger collection of coverage data immediately at a certain point in time. + ''' + #: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + timestamp: float + #: Identifier for distinguishing coverage events. + occasion: str + #: Coverage data for the current isolate. + result: typing.List[ScriptCoverage] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreciseCoverageDeltaUpdate: + return cls( + timestamp=float(json['timestamp']), + occasion=str(json['occasion']), + result=[ScriptCoverage.from_json(i) for i in json['result']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/pwa.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/pwa.py new file mode 100755 index 0000000..8def6e8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/pwa.py @@ -0,0 +1,260 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: PWA (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +@dataclass +class FileHandlerAccept: + ''' + The following types are the replica of + https://crsrc.org/c/chrome/browser/web_applications/proto/web_app_os_integration_state.proto;drc=9910d3be894c8f142c977ba1023f30a656bc13fc;l=67 + ''' + #: New name of the mimetype according to + #: https://www.iana.org/assignments/media-types/media-types.xhtml + media_type: str + + file_extensions: typing.List[str] + + def to_json(self): + json = dict() + json['mediaType'] = self.media_type + json['fileExtensions'] = [i for i in self.file_extensions] + return json + + @classmethod + def from_json(cls, json): + return cls( + media_type=str(json['mediaType']), + file_extensions=[str(i) for i in json['fileExtensions']], + ) + + +@dataclass +class FileHandler: + action: str + + accepts: typing.List[FileHandlerAccept] + + display_name: str + + def to_json(self): + json = dict() + json['action'] = self.action + json['accepts'] = [i.to_json() for i in self.accepts] + json['displayName'] = self.display_name + return json + + @classmethod + def from_json(cls, json): + return cls( + action=str(json['action']), + accepts=[FileHandlerAccept.from_json(i) for i in json['accepts']], + display_name=str(json['displayName']), + ) + + +class DisplayMode(enum.Enum): + ''' + If user prefers opening the app in browser or an app window. + ''' + STANDALONE = "standalone" + BROWSER = "browser" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def get_os_app_state( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[int, typing.List[FileHandler]]]: + ''' + Returns the following OS state for the given manifest id. + + :param manifest_id: The id from the webapp's manifest file, commonly it's the url of the site installing the webapp. See https://web.dev/learn/pwa/web-app-manifest. + :returns: A tuple with the following items: + + 0. **badgeCount** - + 1. **fileHandlers** - + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.getOsAppState', + 'params': params, + } + json = yield cmd_dict + return ( + int(json['badgeCount']), + [FileHandler.from_json(i) for i in json['fileHandlers']] + ) + + +def install( + manifest_id: str, + install_url_or_bundle_url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Installs the given manifest identity, optionally using the given install_url + or IWA bundle location. + + TODO(crbug.com/337872319) Support IWA to meet the following specific + requirement. + IWA-specific install description: If the manifest_id is isolated-app://, + install_url_or_bundle_url is required, and can be either an http(s) URL or + file:// URL pointing to a signed web bundle (.swbn). The .swbn file's + signing key must correspond to manifest_id. If Chrome is not in IWA dev + mode, the installation will fail, regardless of the state of the allowlist. + + :param manifest_id: + :param install_url_or_bundle_url: *(Optional)* The location of the app or bundle overriding the one derived from the manifestId. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if install_url_or_bundle_url is not None: + params['installUrlOrBundleUrl'] = install_url_or_bundle_url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.install', + 'params': params, + } + json = yield cmd_dict + + +def uninstall( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Uninstalls the given manifest_id and closes any opened app windows. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.uninstall', + 'params': params, + } + json = yield cmd_dict + + +def launch( + manifest_id: str, + url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,target.TargetID]: + ''' + Launches the installed web app, or an url in the same web app instead of the + default start url if it is provided. Returns a page Target.TargetID which + can be used to attach to via Target.attachToTarget or similar APIs. + + :param manifest_id: + :param url: *(Optional)* + :returns: ID of the tab target created as a result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if url is not None: + params['url'] = url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launch', + 'params': params, + } + json = yield cmd_dict + return target.TargetID.from_json(json['targetId']) + + +def launch_files_in_app( + manifest_id: str, + files: typing.List[str] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[target.TargetID]]: + ''' + Opens one or more local files from an installed web app identified by its + manifestId. The web app needs to have file handlers registered to process + the files. The API returns one or more page Target.TargetIDs which can be + used to attach to via Target.attachToTarget or similar APIs. + If some files in the parameters cannot be handled by the web app, they will + be ignored. If none of the files can be handled, this API returns an error. + If no files are provided as the parameter, this API also returns an error. + + According to the definition of the file handlers in the manifest file, one + Target.TargetID may represent a page handling one or more files. The order + of the returned Target.TargetIDs is not guaranteed. + + TODO(crbug.com/339454034): Check the existences of the input files. + + :param manifest_id: + :param files: + :returns: IDs of the tab targets created as the result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + params['files'] = [i for i in files] + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launchFilesInApp', + 'params': params, + } + json = yield cmd_dict + return [target.TargetID.from_json(i) for i in json['targetIds']] + + +def open_current_page_in_app( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Opens the current page in its web app identified by the manifest id, needs + to be called on a page target. This function returns immediately without + waiting for the app to finish loading. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.openCurrentPageInApp', + 'params': params, + } + json = yield cmd_dict + + +def change_app_user_settings( + manifest_id: str, + link_capturing: typing.Optional[bool] = None, + display_mode: typing.Optional[DisplayMode] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes user settings of the web app identified by its manifestId. If the + app was not installed, this command returns an error. Unset parameters will + be ignored; unrecognized values will cause an error. + + Unlike the ones defined in the manifest files of the web apps, these + settings are provided by the browser and controlled by the users, they + impact the way the browser handling the web apps. + + See the comment of each parameter. + + :param manifest_id: + :param link_capturing: *(Optional)* If user allows the links clicked on by the user in the app's scope, or extended scope if the manifest has scope extensions and the flags ```DesktopPWAsLinkCapturingWithScopeExtensions```` and ````WebAppEnableScopeExtensions``` are enabled. Note, the API does not support resetting the linkCapturing to the initial value, uninstalling and installing the web app again will reset it. TODO(crbug.com/339453269): Setting this value on ChromeOS is not supported yet. + :param display_mode: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if link_capturing is not None: + params['linkCapturing'] = link_capturing + if display_mode is not None: + params['displayMode'] = display_mode.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.changeAppUserSettings', + 'params': params, + } + json = yield cmd_dict diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/py.typed b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/runtime.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/runtime.py new file mode 100755 index 0000000..c8b4957 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/runtime.py @@ -0,0 +1,1583 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Runtime +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class ScriptId(str): + ''' + Unique script identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ScriptId: + return cls(json) + + def __repr__(self): + return 'ScriptId({})'.format(super().__repr__()) + + +@dataclass +class SerializationOptions: + ''' + Represents options for serialization. Overrides ``generatePreview`` and ``returnByValue``. + ''' + serialization: str + + #: Deep serialization depth. Default is full depth. Respected only in ``deep`` serialization mode. + max_depth: typing.Optional[int] = None + + #: Embedder-specific parameters. For example if connected to V8 in Chrome these control DOM + #: serialization via ``maxNodeDepth: integer`` and ``includeShadowTree: "none" `` "open" `` "all"``. + #: Values can be only of type string or integer. + additional_parameters: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['serialization'] = self.serialization + if self.max_depth is not None: + json['maxDepth'] = self.max_depth + if self.additional_parameters is not None: + json['additionalParameters'] = self.additional_parameters + return json + + @classmethod + def from_json(cls, json): + return cls( + serialization=str(json['serialization']), + max_depth=int(json['maxDepth']) if 'maxDepth' in json else None, + additional_parameters=dict(json['additionalParameters']) if 'additionalParameters' in json else None, + ) + + +@dataclass +class DeepSerializedValue: + ''' + Represents deep serialized value. + ''' + type_: str + + value: typing.Optional[typing.Any] = None + + object_id: typing.Optional[str] = None + + #: Set if value reference met more then once during serialization. In such + #: case, value is provided only to one of the serialized values. Unique + #: per value in the scope of one CDP call. + weak_local_object_reference: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.object_id is not None: + json['objectId'] = self.object_id + if self.weak_local_object_reference is not None: + json['weakLocalObjectReference'] = self.weak_local_object_reference + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + value=json['value'] if 'value' in json else None, + object_id=str(json['objectId']) if 'objectId' in json else None, + weak_local_object_reference=int(json['weakLocalObjectReference']) if 'weakLocalObjectReference' in json else None, + ) + + +class RemoteObjectId(str): + ''' + Unique object identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RemoteObjectId: + return cls(json) + + def __repr__(self): + return 'RemoteObjectId({})'.format(super().__repr__()) + + +class UnserializableValue(str): + ''' + Primitive value which cannot be JSON-stringified. Includes values ``-0``, ``NaN``, ``Infinity``, + ``-Infinity``, and bigint literals. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnserializableValue: + return cls(json) + + def __repr__(self): + return 'UnserializableValue({})'.format(super().__repr__()) + + +@dataclass +class RemoteObject: + ''' + Mirror object referencing original JavaScript object. + ''' + #: Object type. + type_: str + + #: Object subtype hint. Specified for ``object`` type values only. + #: NOTE: If you change anything here, make sure to also update + #: ``subtype`` in ``ObjectPreview`` and ``PropertyPreview`` below. + subtype: typing.Optional[str] = None + + #: Object class (constructor) name. Specified for ``object`` type values only. + class_name: typing.Optional[str] = None + + #: Remote object value in case of primitive values or JSON values (if it was requested). + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified does not have ``value``, but gets this + #: property. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: Deep serialized value. + deep_serialized_value: typing.Optional[DeepSerializedValue] = None + + #: Unique object identifier (for non-primitive values). + object_id: typing.Optional[RemoteObjectId] = None + + #: Preview containing abbreviated property values. Specified for ``object`` type values only. + preview: typing.Optional[ObjectPreview] = None + + custom_preview: typing.Optional[CustomPreview] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.subtype is not None: + json['subtype'] = self.subtype + if self.class_name is not None: + json['className'] = self.class_name + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.description is not None: + json['description'] = self.description + if self.deep_serialized_value is not None: + json['deepSerializedValue'] = self.deep_serialized_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + if self.preview is not None: + json['preview'] = self.preview.to_json() + if self.custom_preview is not None: + json['customPreview'] = self.custom_preview.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + subtype=str(json['subtype']) if 'subtype' in json else None, + class_name=str(json['className']) if 'className' in json else None, + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + description=str(json['description']) if 'description' in json else None, + deep_serialized_value=DeepSerializedValue.from_json(json['deepSerializedValue']) if 'deepSerializedValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + preview=ObjectPreview.from_json(json['preview']) if 'preview' in json else None, + custom_preview=CustomPreview.from_json(json['customPreview']) if 'customPreview' in json else None, + ) + + +@dataclass +class CustomPreview: + #: The JSON-stringified result of formatter.header(object, config) call. + #: It contains json ML array that represents RemoteObject. + header: str + + #: If formatter returns true as a result of formatter.hasBody call then bodyGetterId will + #: contain RemoteObjectId for the function that returns result of formatter.body(object, config) call. + #: The result value is json ML array. + body_getter_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + json['header'] = self.header + if self.body_getter_id is not None: + json['bodyGetterId'] = self.body_getter_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + header=str(json['header']), + body_getter_id=RemoteObjectId.from_json(json['bodyGetterId']) if 'bodyGetterId' in json else None, + ) + + +@dataclass +class ObjectPreview: + ''' + Object containing abbreviated remote object value. + ''' + #: Object type. + type_: str + + #: True iff some of the properties or entries of the original object did not fit. + overflow: bool + + #: List of the properties. + properties: typing.List[PropertyPreview] + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: List of the entries. Specified for ``map`` and ``set`` subtype values only. + entries: typing.Optional[typing.List[EntryPreview]] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['overflow'] = self.overflow + json['properties'] = [i.to_json() for i in self.properties] + if self.subtype is not None: + json['subtype'] = self.subtype + if self.description is not None: + json['description'] = self.description + if self.entries is not None: + json['entries'] = [i.to_json() for i in self.entries] + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + overflow=bool(json['overflow']), + properties=[PropertyPreview.from_json(i) for i in json['properties']], + subtype=str(json['subtype']) if 'subtype' in json else None, + description=str(json['description']) if 'description' in json else None, + entries=[EntryPreview.from_json(i) for i in json['entries']] if 'entries' in json else None, + ) + + +@dataclass +class PropertyPreview: + #: Property name. + name: str + + #: Object type. Accessor means that the property itself is an accessor property. + type_: str + + #: User-friendly property value string. + value: typing.Optional[str] = None + + #: Nested value preview. + value_preview: typing.Optional[ObjectPreview] = None + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.value_preview is not None: + json['valuePreview'] = self.value_preview.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + type_=str(json['type']), + value=str(json['value']) if 'value' in json else None, + value_preview=ObjectPreview.from_json(json['valuePreview']) if 'valuePreview' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class EntryPreview: + #: Preview of the value. + value: ObjectPreview + + #: Preview of the key. Specified for map-like collection entries. + key: typing.Optional[ObjectPreview] = None + + def to_json(self): + json = dict() + json['value'] = self.value.to_json() + if self.key is not None: + json['key'] = self.key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=ObjectPreview.from_json(json['value']), + key=ObjectPreview.from_json(json['key']) if 'key' in json else None, + ) + + +@dataclass +class PropertyDescriptor: + ''' + Object property descriptor. + ''' + #: Property name or symbol description. + name: str + + #: True if the type of this property descriptor may be changed and if the property may be + #: deleted from the corresponding object. + configurable: bool + + #: True if this property shows up during enumeration of the properties on the corresponding + #: object. + enumerable: bool + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + #: True if the value associated with the property may be changed (data descriptors only). + writable: typing.Optional[bool] = None + + #: A function which serves as a getter for the property, or ``undefined`` if there is no getter + #: (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the property, or ``undefined`` if there is no setter + #: (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + #: True if the result was thrown during the evaluation. + was_thrown: typing.Optional[bool] = None + + #: True if the property is owned for the object. + is_own: typing.Optional[bool] = None + + #: Property symbol object, if the property is of the ``symbol`` type. + symbol: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['configurable'] = self.configurable + json['enumerable'] = self.enumerable + if self.value is not None: + json['value'] = self.value.to_json() + if self.writable is not None: + json['writable'] = self.writable + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + if self.was_thrown is not None: + json['wasThrown'] = self.was_thrown + if self.is_own is not None: + json['isOwn'] = self.is_own + if self.symbol is not None: + json['symbol'] = self.symbol.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + configurable=bool(json['configurable']), + enumerable=bool(json['enumerable']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + writable=bool(json['writable']) if 'writable' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + was_thrown=bool(json['wasThrown']) if 'wasThrown' in json else None, + is_own=bool(json['isOwn']) if 'isOwn' in json else None, + symbol=RemoteObject.from_json(json['symbol']) if 'symbol' in json else None, + ) + + +@dataclass +class InternalPropertyDescriptor: + ''' + Object internal property descriptor. This property isn't normally visible in JavaScript code. + ''' + #: Conventional property name. + name: str + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + ) + + +@dataclass +class PrivatePropertyDescriptor: + ''' + Object private field descriptor. + ''' + #: Private property name. + name: str + + #: The value associated with the private property. + value: typing.Optional[RemoteObject] = None + + #: A function which serves as a getter for the private property, + #: or ``undefined`` if there is no getter (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the private property, + #: or ``undefined`` if there is no setter (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + ) + + +@dataclass +class CallArgument: + ''' + Represents function call argument. Either remote object id ``objectId``, primitive ``value``, + unserializable primitive value or neither of (for undefined) them should be specified. + ''' + #: Primitive value or serializable javascript object. + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: Remote object handle. + object_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + ) + + +class ExecutionContextId(int): + ''' + Id of an execution context. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> ExecutionContextId: + return cls(json) + + def __repr__(self): + return 'ExecutionContextId({})'.format(super().__repr__()) + + +@dataclass +class ExecutionContextDescription: + ''' + Description of an isolated world. + ''' + #: Unique id of the execution context. It can be used to specify in which execution context + #: script evaluation should be performed. + id_: ExecutionContextId + + #: Execution context origin. + origin: str + + #: Human readable name describing given context. + name: str + + #: A system-unique execution context identifier. Unlike the id, this is unique across + #: multiple processes, so can be reliably used to identify specific context while backend + #: performs a cross-process navigation. + unique_id: str + + #: Embedder-specific auxiliary data likely matching {isDefault: boolean, type: 'default'``'isolated'``'worker', frameId: string} + aux_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['id'] = self.id_.to_json() + json['origin'] = self.origin + json['name'] = self.name + json['uniqueId'] = self.unique_id + if self.aux_data is not None: + json['auxData'] = self.aux_data + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=ExecutionContextId.from_json(json['id']), + origin=str(json['origin']), + name=str(json['name']), + unique_id=str(json['uniqueId']), + aux_data=dict(json['auxData']) if 'auxData' in json else None, + ) + + +@dataclass +class ExceptionDetails: + ''' + Detailed information about exception (or error) that was thrown during script compilation or + execution. + ''' + #: Exception id. + exception_id: int + + #: Exception text, which should be used together with exception object when available. + text: str + + #: Line number of the exception location (0-based). + line_number: int + + #: Column number of the exception location (0-based). + column_number: int + + #: Script ID of the exception location. + script_id: typing.Optional[ScriptId] = None + + #: URL of the exception location, to be used when the script was not reported. + url: typing.Optional[str] = None + + #: JavaScript stack trace if available. + stack_trace: typing.Optional[StackTrace] = None + + #: Exception object if available. + exception: typing.Optional[RemoteObject] = None + + #: Identifier of the context where exception happened. + execution_context_id: typing.Optional[ExecutionContextId] = None + + #: Dictionary with entries of meta data that the client associated + #: with this exception, such as information about associated network + #: requests, etc. + exception_meta_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['exceptionId'] = self.exception_id + json['text'] = self.text + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + if self.script_id is not None: + json['scriptId'] = self.script_id.to_json() + if self.url is not None: + json['url'] = self.url + if self.stack_trace is not None: + json['stackTrace'] = self.stack_trace.to_json() + if self.exception is not None: + json['exception'] = self.exception.to_json() + if self.execution_context_id is not None: + json['executionContextId'] = self.execution_context_id.to_json() + if self.exception_meta_data is not None: + json['exceptionMetaData'] = self.exception_meta_data + return json + + @classmethod + def from_json(cls, json): + return cls( + exception_id=int(json['exceptionId']), + text=str(json['text']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + script_id=ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + url=str(json['url']) if 'url' in json else None, + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + exception=RemoteObject.from_json(json['exception']) if 'exception' in json else None, + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None, + exception_meta_data=dict(json['exceptionMetaData']) if 'exceptionMetaData' in json else None, + ) + + +class Timestamp(float): + ''' + Number of milliseconds since epoch. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> Timestamp: + return cls(json) + + def __repr__(self): + return 'Timestamp({})'.format(super().__repr__()) + + +class TimeDelta(float): + ''' + Number of milliseconds. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> TimeDelta: + return cls(json) + + def __repr__(self): + return 'TimeDelta({})'.format(super().__repr__()) + + +@dataclass +class CallFrame: + ''' + Stack entry for runtime errors and assertions. + ''' + #: JavaScript function name. + function_name: str + + #: JavaScript script id. + script_id: ScriptId + + #: JavaScript script name or url. + url: str + + #: JavaScript script line number (0-based). + line_number: int + + #: JavaScript script column number (0-based). + column_number: int + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + script_id=ScriptId.from_json(json['scriptId']), + url=str(json['url']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +@dataclass +class StackTrace: + ''' + Call frames for assertions or error messages. + ''' + #: JavaScript function name. + call_frames: typing.List[CallFrame] + + #: String label of this stack trace. For async traces this may be a name of the function that + #: initiated the async call. + description: typing.Optional[str] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent: typing.Optional[StackTrace] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent_id: typing.Optional[StackTraceId] = None + + def to_json(self): + json = dict() + json['callFrames'] = [i.to_json() for i in self.call_frames] + if self.description is not None: + json['description'] = self.description + if self.parent is not None: + json['parent'] = self.parent.to_json() + if self.parent_id is not None: + json['parentId'] = self.parent_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + call_frames=[CallFrame.from_json(i) for i in json['callFrames']], + description=str(json['description']) if 'description' in json else None, + parent=StackTrace.from_json(json['parent']) if 'parent' in json else None, + parent_id=StackTraceId.from_json(json['parentId']) if 'parentId' in json else None, + ) + + +class UniqueDebuggerId(str): + ''' + Unique identifier of current debugger. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UniqueDebuggerId: + return cls(json) + + def __repr__(self): + return 'UniqueDebuggerId({})'.format(super().__repr__()) + + +@dataclass +class StackTraceId: + ''' + If ``debuggerId`` is set stack trace comes from another debugger and can be resolved there. This + allows to track cross-debugger calls. See ``Runtime.StackTrace`` and ``Debugger.paused`` for usages. + ''' + id_: str + + debugger_id: typing.Optional[UniqueDebuggerId] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + if self.debugger_id is not None: + json['debuggerId'] = self.debugger_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=str(json['id']), + debugger_id=UniqueDebuggerId.from_json(json['debuggerId']) if 'debuggerId' in json else None, + ) + + +def await_promise( + promise_object_id: RemoteObjectId, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Add handler to promise with given promise object id. + + :param promise_object_id: Identifier of the promise. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :returns: A tuple with the following items: + + 0. **result** - Promise result. Will contain rejected value if promise was rejected. + 1. **exceptionDetails** - *(Optional)* Exception details if stack strace is available. + ''' + params: T_JSON_DICT = dict() + params['promiseObjectId'] = promise_object_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.awaitPromise', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def call_function_on( + function_declaration: str, + object_id: typing.Optional[RemoteObjectId] = None, + arguments: typing.Optional[typing.List[CallArgument]] = None, + silent: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + throw_on_side_effect: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Calls function with given declaration on the given object. Object group of the result is + inherited from the target object. + + :param function_declaration: Declaration of the function to call. + :param object_id: *(Optional)* Identifier of the object to call function on. Either objectId or executionContextId should be specified. + :param arguments: *(Optional)* Call arguments. All call arguments must belong to the same JavaScript world as the target object. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. Can be overriden by ````serializationOptions````. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param execution_context_id: *(Optional)* Specifies execution context which global object will be used to call function on. Either executionContextId or objectId should be specified. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. If objectGroup is not specified and objectId is, objectGroup will be inherited from object. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to call function on. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental function call in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````executionContextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Call result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['functionDeclaration'] = function_declaration + if object_id is not None: + params['objectId'] = object_id.to_json() + if arguments is not None: + params['arguments'] = [i.to_json() for i in arguments] + if silent is not None: + params['silent'] = silent + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.callFunctionOn', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def compile_script( + expression: str, + source_url: str, + persist_script: bool, + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.Optional[ScriptId], typing.Optional[ExceptionDetails]]]: + ''' + Compiles expression. + + :param expression: Expression to compile. + :param source_url: Source url to be set for the script. + :param persist_script: Specifies whether the compiled script should be persisted. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :returns: A tuple with the following items: + + 0. **scriptId** - *(Optional)* Id of the script. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + params['sourceURL'] = source_url + params['persistScript'] = persist_script + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.compileScript', + 'params': params, + } + json = yield cmd_dict + return ( + ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables reporting of execution contexts creation. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.disable', + } + json = yield cmd_dict + + +def discard_console_entries() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Discards collected exceptions and console API calls. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.discardConsoleEntries', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables reporting of execution contexts creation by means of ``executionContextCreated`` event. + When the reporting gets enabled the event will be sent immediately for each existing execution + context. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.enable', + } + json = yield cmd_dict + + +def evaluate( + expression: str, + object_group: typing.Optional[str] = None, + include_command_line_api: typing.Optional[bool] = None, + silent: typing.Optional[bool] = None, + context_id: typing.Optional[ExecutionContextId] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + throw_on_side_effect: typing.Optional[bool] = None, + timeout: typing.Optional[TimeDelta] = None, + disable_breaks: typing.Optional[bool] = None, + repl_mode: typing.Optional[bool] = None, + allow_unsafe_eval_blocked_by_csp: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Evaluates expression on global object. + + :param expression: Expression to evaluate. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param context_id: *(Optional)* Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. This is mutually exclusive with ````uniqueContextId````, which offers an alternative way to identify the execution context that is more reliable in a multi-process environment. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. This implies ````disableBreaks```` below. + :param timeout: **(EXPERIMENTAL)** *(Optional)* Terminate execution after timing out (number of milliseconds). + :param disable_breaks: **(EXPERIMENTAL)** *(Optional)* Disable breakpoints during execution. + :param repl_mode: **(EXPERIMENTAL)** *(Optional)* Setting this flag to true enables ````let```` re-declaration and top-level ````await````. Note that ````let```` variables can only be re-declared if they originate from ````replMode```` themselves. + :param allow_unsafe_eval_blocked_by_csp: **(EXPERIMENTAL)** *(Optional)* The Content Security Policy (CSP) for the target might block 'unsafe-eval' which includes eval(), Function(), setTimeout() and setInterval() when called with non-callable arguments. This flag bypasses CSP for this evaluation and allows unsafe-eval. Defaults to true. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to evaluate in. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental evaluation of the expression in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````contextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Evaluation result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + if object_group is not None: + params['objectGroup'] = object_group + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if silent is not None: + params['silent'] = silent + if context_id is not None: + params['contextId'] = context_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if timeout is not None: + params['timeout'] = timeout.to_json() + if disable_breaks is not None: + params['disableBreaks'] = disable_breaks + if repl_mode is not None: + params['replMode'] = repl_mode + if allow_unsafe_eval_blocked_by_csp is not None: + params['allowUnsafeEvalBlockedByCSP'] = allow_unsafe_eval_blocked_by_csp + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.evaluate', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def get_isolate_id() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,str]: + ''' + Returns the isolate id. + + **EXPERIMENTAL** + + :returns: The isolate id. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getIsolateId', + } + json = yield cmd_dict + return str(json['id']) + + +def get_heap_usage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float]]: + ''' + Returns the JavaScript heap usage. + It is the total usage of the corresponding isolate not scoped to a particular Runtime. + + **EXPERIMENTAL** + + :returns: A tuple with the following items: + + 0. **usedSize** - Used heap size in bytes. + 1. **totalSize** - Allocated heap size in bytes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getHeapUsage', + } + json = yield cmd_dict + return ( + float(json['usedSize']), + float(json['totalSize']) + ) + + +def get_properties( + object_id: RemoteObjectId, + own_properties: typing.Optional[bool] = None, + accessor_properties_only: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + non_indexed_properties_only: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[PropertyDescriptor], typing.Optional[typing.List[InternalPropertyDescriptor]], typing.Optional[typing.List[PrivatePropertyDescriptor]], typing.Optional[ExceptionDetails]]]: + ''' + Returns properties of a given object. Object group of the result is inherited from the target + object. + + :param object_id: Identifier of the object to return properties for. + :param own_properties: *(Optional)* If true, returns properties belonging only to the element itself, not to its prototype chain. + :param accessor_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the results. + :param non_indexed_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns non-indexed properties only. + :returns: A tuple with the following items: + + 0. **result** - Object properties. + 1. **internalProperties** - *(Optional)* Internal object properties (only of the element itself). + 2. **privateProperties** - *(Optional)* Object private properties. + 3. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + if own_properties is not None: + params['ownProperties'] = own_properties + if accessor_properties_only is not None: + params['accessorPropertiesOnly'] = accessor_properties_only + if generate_preview is not None: + params['generatePreview'] = generate_preview + if non_indexed_properties_only is not None: + params['nonIndexedPropertiesOnly'] = non_indexed_properties_only + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getProperties', + 'params': params, + } + json = yield cmd_dict + return ( + [PropertyDescriptor.from_json(i) for i in json['result']], + [InternalPropertyDescriptor.from_json(i) for i in json['internalProperties']] if 'internalProperties' in json else None, + [PrivatePropertyDescriptor.from_json(i) for i in json['privateProperties']] if 'privateProperties' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def global_lexical_scope_names( + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Returns all let, const and class variables from global scope. + + :param execution_context_id: *(Optional)* Specifies in which execution context to lookup global scope variables. + :returns: + ''' + params: T_JSON_DICT = dict() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.globalLexicalScopeNames', + 'params': params, + } + json = yield cmd_dict + return [str(i) for i in json['names']] + + +def query_objects( + prototype_object_id: RemoteObjectId, + object_group: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,RemoteObject]: + ''' + :param prototype_object_id: Identifier of the prototype to return objects for. + :param object_group: *(Optional)* Symbolic group name that can be used to release the results. + :returns: Array with objects. + ''' + params: T_JSON_DICT = dict() + params['prototypeObjectId'] = prototype_object_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.queryObjects', + 'params': params, + } + json = yield cmd_dict + return RemoteObject.from_json(json['objects']) + + +def release_object( + object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases remote object with given id. + + :param object_id: Identifier of the object to release. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObject', + 'params': params, + } + json = yield cmd_dict + + +def release_object_group( + object_group: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases all remote objects that belong to a given group. + + :param object_group: Symbolic object group name. + ''' + params: T_JSON_DICT = dict() + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObjectGroup', + 'params': params, + } + json = yield cmd_dict + + +def run_if_waiting_for_debugger() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Tells inspected instance to run if it was waiting for debugger to attach. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runIfWaitingForDebugger', + } + json = yield cmd_dict + + +def run_script( + script_id: ScriptId, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + silent: typing.Optional[bool] = None, + include_command_line_api: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Runs script with given id in a given context. + + :param script_id: Id of the script to run. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :param await_promise: *(Optional)* Whether execution should ````await``` for resulting value and return once awaited promise is resolved. + :returns: A tuple with the following items: + + 0. **result** - Run result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['scriptId'] = script_id.to_json() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if silent is not None: + params['silent'] = silent + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if await_promise is not None: + params['awaitPromise'] = await_promise + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runScript', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def set_async_call_stack_depth( + max_depth: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables or disables async call stacks tracking. + + :param max_depth: Maximum depth of async call stacks. Setting to ```0``` will effectively disable collecting async call stacks (default). + ''' + params: T_JSON_DICT = dict() + params['maxDepth'] = max_depth + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setAsyncCallStackDepth', + 'params': params, + } + json = yield cmd_dict + + +def set_custom_object_formatter_enabled( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setCustomObjectFormatterEnabled', + 'params': params, + } + json = yield cmd_dict + + +def set_max_call_stack_size_to_capture( + size: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param size: + ''' + params: T_JSON_DICT = dict() + params['size'] = size + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setMaxCallStackSizeToCapture', + 'params': params, + } + json = yield cmd_dict + + +def terminate_execution() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Terminate current or next JavaScript execution. + Will cancel the termination when the outer-most script execution ends. + + **EXPERIMENTAL** + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.terminateExecution', + } + json = yield cmd_dict + + +def add_binding( + name: str, + execution_context_id: typing.Optional[ExecutionContextId] = None, + execution_context_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + If executionContextId is empty, adds binding with the given name on the + global objects of all inspected contexts, including those created later, + bindings survive reloads. + Binding function takes exactly one argument, this argument should be string, + in case of any other input, function throws an exception. + Each binding function call produces Runtime.bindingCalled notification. + + :param name: + :param execution_context_id: **(EXPERIMENTAL)** *(Optional)* If specified, the binding would only be exposed to the specified execution context. If omitted and ```executionContextName```` is not set, the binding is exposed to all execution contexts of the target. This parameter is mutually exclusive with ````executionContextName````. Deprecated in favor of ````executionContextName```` due to an unclear use case and bugs in implementation (crbug.com/1169639). ````executionContextId```` will be removed in the future. + :param execution_context_name: *(Optional)* If specified, the binding is exposed to the executionContext with matching name, even for contexts created after the binding is added. See also ````ExecutionContext.name```` and ````worldName```` parameter to ````Page.addScriptToEvaluateOnNewDocument````. This parameter is mutually exclusive with ````executionContextId```. + ''' + params: T_JSON_DICT = dict() + params['name'] = name + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if execution_context_name is not None: + params['executionContextName'] = execution_context_name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.addBinding', + 'params': params, + } + json = yield cmd_dict + + +def remove_binding( + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + This method does not remove binding function from global object but + unsubscribes current runtime agent from Runtime.bindingCalled notifications. + + :param name: + ''' + params: T_JSON_DICT = dict() + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.removeBinding', + 'params': params, + } + json = yield cmd_dict + + +def get_exception_details( + error_object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Optional[ExceptionDetails]]: + ''' + This method tries to lookup and populate exception details for a + JavaScript Error object. + Note that the stackTrace portion of the resulting exceptionDetails will + only be populated if the Runtime domain was enabled at the time when the + Error was thrown. + + **EXPERIMENTAL** + + :param error_object_id: The error object for which to resolve the exception details. + :returns: + ''' + params: T_JSON_DICT = dict() + params['errorObjectId'] = error_object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getExceptionDetails', + 'params': params, + } + json = yield cmd_dict + return ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + + +@event_class('Runtime.bindingCalled') +@dataclass +class BindingCalled: + ''' + **EXPERIMENTAL** + + Notification is issued every time when binding is called. + ''' + name: str + payload: str + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BindingCalled: + return cls( + name=str(json['name']), + payload=str(json['payload']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) + ) + + +@event_class('Runtime.consoleAPICalled') +@dataclass +class ConsoleAPICalled: + ''' + Issued when console API was called. + ''' + #: Type of the call. + type_: str + #: Call arguments. + args: typing.List[RemoteObject] + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + #: Call timestamp. + timestamp: Timestamp + #: Stack trace captured when the call was made. The async stack chain is automatically reported for + #: the following call types: ``assert``, ``error``, ``trace``, ``warning``. For other types the async call + #: chain can be retrieved using ``Debugger.getStackTrace`` and ``stackTrace.parentId`` field. + stack_trace: typing.Optional[StackTrace] + #: Console context descriptor for calls on non-default console context (not console.*): + #: 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call + #: on named context. + context: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleAPICalled: + return cls( + type_=str(json['type']), + args=[RemoteObject.from_json(i) for i in json['args']], + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + timestamp=Timestamp.from_json(json['timestamp']), + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + context=str(json['context']) if 'context' in json else None + ) + + +@event_class('Runtime.exceptionRevoked') +@dataclass +class ExceptionRevoked: + ''' + Issued when unhandled exception was revoked. + ''' + #: Reason describing why exception was revoked. + reason: str + #: The id of revoked exception, as reported in ``exceptionThrown``. + exception_id: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionRevoked: + return cls( + reason=str(json['reason']), + exception_id=int(json['exceptionId']) + ) + + +@event_class('Runtime.exceptionThrown') +@dataclass +class ExceptionThrown: + ''' + Issued when exception was thrown and unhandled. + ''' + #: Timestamp of the exception. + timestamp: Timestamp + exception_details: ExceptionDetails + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionThrown: + return cls( + timestamp=Timestamp.from_json(json['timestamp']), + exception_details=ExceptionDetails.from_json(json['exceptionDetails']) + ) + + +@event_class('Runtime.executionContextCreated') +@dataclass +class ExecutionContextCreated: + ''' + Issued when new execution context is created. + ''' + #: A newly created execution context. + context: ExecutionContextDescription + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextCreated: + return cls( + context=ExecutionContextDescription.from_json(json['context']) + ) + + +@event_class('Runtime.executionContextDestroyed') +@dataclass +class ExecutionContextDestroyed: + ''' + Issued when execution context is destroyed. + ''' + #: Id of the destroyed context + execution_context_id: ExecutionContextId + #: Unique Id of the destroyed context + execution_context_unique_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextDestroyed: + return cls( + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + execution_context_unique_id=str(json['executionContextUniqueId']) + ) + + +@event_class('Runtime.executionContextsCleared') +@dataclass +class ExecutionContextsCleared: + ''' + Issued when all executionContexts were cleared in browser + ''' + + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextsCleared: + return cls( + + ) + + +@event_class('Runtime.inspectRequested') +@dataclass +class InspectRequested: + ''' + Issued when object should be inspected (for example, as a result of inspect() command line API + call). + ''' + object_: RemoteObject + hints: dict + #: Identifier of the context where the call was made. + execution_context_id: typing.Optional[ExecutionContextId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InspectRequested: + return cls( + object_=RemoteObject.from_json(json['object']), + hints=dict(json['hints']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/schema.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/schema.py new file mode 100755 index 0000000..5077f78 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/schema.py @@ -0,0 +1,48 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Schema +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class Domain: + ''' + Description of the protocol domain. + ''' + #: Domain name. + name: str + + #: Domain version. + version: str + + def to_json(self): + json = dict() + json['name'] = self.name + json['version'] = self.version + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + version=str(json['version']), + ) + + +def get_domains() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Domain]]: + ''' + Returns supported domains. + + :returns: List of supported domains. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Schema.getDomains', + } + json = yield cmd_dict + return [Domain.from_json(i) for i in json['domains']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/security.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/security.py new file mode 100755 index 0000000..e7714fe --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/security.py @@ -0,0 +1,507 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Security +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import network + + +class CertificateId(int): + ''' + An internal certificate ID value. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> CertificateId: + return cls(json) + + def __repr__(self): + return 'CertificateId({})'.format(super().__repr__()) + + +class MixedContentType(enum.Enum): + ''' + A description of mixed content (HTTP resources on HTTPS pages), as defined by + https://www.w3.org/TR/mixed-content/#categories + ''' + BLOCKABLE = "blockable" + OPTIONALLY_BLOCKABLE = "optionally-blockable" + NONE = "none" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SecurityState(enum.Enum): + ''' + The security level of a page or resource. + ''' + UNKNOWN = "unknown" + NEUTRAL = "neutral" + INSECURE = "insecure" + SECURE = "secure" + INFO = "info" + INSECURE_BROKEN = "insecure-broken" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class CertificateSecurityState: + ''' + Details about the security state of the page certificate. + ''' + #: Protocol name (e.g. "TLS 1.2" or "QUIC"). + protocol: str + + #: Key Exchange used by the connection, or the empty string if not applicable. + key_exchange: str + + #: Cipher name. + cipher: str + + #: Page certificate. + certificate: typing.List[str] + + #: Certificate subject name. + subject_name: str + + #: Name of the issuing CA. + issuer: str + + #: Certificate valid from date. + valid_from: network.TimeSinceEpoch + + #: Certificate valid to (expiration) date + valid_to: network.TimeSinceEpoch + + #: True if the certificate uses a weak signature algorithm. + certificate_has_weak_signature: bool + + #: True if the certificate has a SHA1 signature in the chain. + certificate_has_sha1_signature: bool + + #: True if modern SSL + modern_ssl: bool + + #: True if the connection is using an obsolete SSL protocol. + obsolete_ssl_protocol: bool + + #: True if the connection is using an obsolete SSL key exchange. + obsolete_ssl_key_exchange: bool + + #: True if the connection is using an obsolete SSL cipher. + obsolete_ssl_cipher: bool + + #: True if the connection is using an obsolete SSL signature. + obsolete_ssl_signature: bool + + #: (EC)DH group used by the connection, if applicable. + key_exchange_group: typing.Optional[str] = None + + #: TLS MAC. Note that AEAD ciphers do not have separate MACs. + mac: typing.Optional[str] = None + + #: The highest priority network error code, if the certificate has an error. + certificate_network_error: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol + json['keyExchange'] = self.key_exchange + json['cipher'] = self.cipher + json['certificate'] = [i for i in self.certificate] + json['subjectName'] = self.subject_name + json['issuer'] = self.issuer + json['validFrom'] = self.valid_from.to_json() + json['validTo'] = self.valid_to.to_json() + json['certificateHasWeakSignature'] = self.certificate_has_weak_signature + json['certificateHasSha1Signature'] = self.certificate_has_sha1_signature + json['modernSSL'] = self.modern_ssl + json['obsoleteSslProtocol'] = self.obsolete_ssl_protocol + json['obsoleteSslKeyExchange'] = self.obsolete_ssl_key_exchange + json['obsoleteSslCipher'] = self.obsolete_ssl_cipher + json['obsoleteSslSignature'] = self.obsolete_ssl_signature + if self.key_exchange_group is not None: + json['keyExchangeGroup'] = self.key_exchange_group + if self.mac is not None: + json['mac'] = self.mac + if self.certificate_network_error is not None: + json['certificateNetworkError'] = self.certificate_network_error + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=str(json['protocol']), + key_exchange=str(json['keyExchange']), + cipher=str(json['cipher']), + certificate=[str(i) for i in json['certificate']], + subject_name=str(json['subjectName']), + issuer=str(json['issuer']), + valid_from=network.TimeSinceEpoch.from_json(json['validFrom']), + valid_to=network.TimeSinceEpoch.from_json(json['validTo']), + certificate_has_weak_signature=bool(json['certificateHasWeakSignature']), + certificate_has_sha1_signature=bool(json['certificateHasSha1Signature']), + modern_ssl=bool(json['modernSSL']), + obsolete_ssl_protocol=bool(json['obsoleteSslProtocol']), + obsolete_ssl_key_exchange=bool(json['obsoleteSslKeyExchange']), + obsolete_ssl_cipher=bool(json['obsoleteSslCipher']), + obsolete_ssl_signature=bool(json['obsoleteSslSignature']), + key_exchange_group=str(json['keyExchangeGroup']) if 'keyExchangeGroup' in json else None, + mac=str(json['mac']) if 'mac' in json else None, + certificate_network_error=str(json['certificateNetworkError']) if 'certificateNetworkError' in json else None, + ) + + +class SafetyTipStatus(enum.Enum): + BAD_REPUTATION = "badReputation" + LOOKALIKE = "lookalike" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SafetyTipInfo: + #: Describes whether the page triggers any safety tips or reputation warnings. Default is unknown. + safety_tip_status: SafetyTipStatus + + #: The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches. + safe_url: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['safetyTipStatus'] = self.safety_tip_status.to_json() + if self.safe_url is not None: + json['safeUrl'] = self.safe_url + return json + + @classmethod + def from_json(cls, json): + return cls( + safety_tip_status=SafetyTipStatus.from_json(json['safetyTipStatus']), + safe_url=str(json['safeUrl']) if 'safeUrl' in json else None, + ) + + +@dataclass +class VisibleSecurityState: + ''' + Security state information about the page. + ''' + #: The security level of the page. + security_state: SecurityState + + #: Array of security state issues ids. + security_state_issue_ids: typing.List[str] + + #: Security state details about the page certificate. + certificate_security_state: typing.Optional[CertificateSecurityState] = None + + #: The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown. + safety_tip_info: typing.Optional[SafetyTipInfo] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['securityStateIssueIds'] = [i for i in self.security_state_issue_ids] + if self.certificate_security_state is not None: + json['certificateSecurityState'] = self.certificate_security_state.to_json() + if self.safety_tip_info is not None: + json['safetyTipInfo'] = self.safety_tip_info.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + security_state_issue_ids=[str(i) for i in json['securityStateIssueIds']], + certificate_security_state=CertificateSecurityState.from_json(json['certificateSecurityState']) if 'certificateSecurityState' in json else None, + safety_tip_info=SafetyTipInfo.from_json(json['safetyTipInfo']) if 'safetyTipInfo' in json else None, + ) + + +@dataclass +class SecurityStateExplanation: + ''' + An explanation of an factor contributing to the security state. + ''' + #: Security state representing the severity of the factor being explained. + security_state: SecurityState + + #: Title describing the type of factor. + title: str + + #: Short phrase describing the type of factor. + summary: str + + #: Full text explanation of the factor. + description: str + + #: The type of mixed content described by the explanation. + mixed_content_type: MixedContentType + + #: Page certificate. + certificate: typing.List[str] + + #: Recommendations to fix any issues. + recommendations: typing.Optional[typing.List[str]] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['title'] = self.title + json['summary'] = self.summary + json['description'] = self.description + json['mixedContentType'] = self.mixed_content_type.to_json() + json['certificate'] = [i for i in self.certificate] + if self.recommendations is not None: + json['recommendations'] = [i for i in self.recommendations] + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + title=str(json['title']), + summary=str(json['summary']), + description=str(json['description']), + mixed_content_type=MixedContentType.from_json(json['mixedContentType']), + certificate=[str(i) for i in json['certificate']], + recommendations=[str(i) for i in json['recommendations']] if 'recommendations' in json else None, + ) + + +@dataclass +class InsecureContentStatus: + ''' + Information about insecure content on the page. + ''' + #: Always false. + ran_mixed_content: bool + + #: Always false. + displayed_mixed_content: bool + + #: Always false. + contained_mixed_form: bool + + #: Always false. + ran_content_with_cert_errors: bool + + #: Always false. + displayed_content_with_cert_errors: bool + + #: Always set to unknown. + ran_insecure_content_style: SecurityState + + #: Always set to unknown. + displayed_insecure_content_style: SecurityState + + def to_json(self): + json = dict() + json['ranMixedContent'] = self.ran_mixed_content + json['displayedMixedContent'] = self.displayed_mixed_content + json['containedMixedForm'] = self.contained_mixed_form + json['ranContentWithCertErrors'] = self.ran_content_with_cert_errors + json['displayedContentWithCertErrors'] = self.displayed_content_with_cert_errors + json['ranInsecureContentStyle'] = self.ran_insecure_content_style.to_json() + json['displayedInsecureContentStyle'] = self.displayed_insecure_content_style.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + ran_mixed_content=bool(json['ranMixedContent']), + displayed_mixed_content=bool(json['displayedMixedContent']), + contained_mixed_form=bool(json['containedMixedForm']), + ran_content_with_cert_errors=bool(json['ranContentWithCertErrors']), + displayed_content_with_cert_errors=bool(json['displayedContentWithCertErrors']), + ran_insecure_content_style=SecurityState.from_json(json['ranInsecureContentStyle']), + displayed_insecure_content_style=SecurityState.from_json(json['displayedInsecureContentStyle']), + ) + + +class CertificateErrorAction(enum.Enum): + ''' + The action to take when a certificate error occurs. continue will continue processing the + request and cancel will cancel the request. + ''' + CONTINUE = "continue" + CANCEL = "cancel" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.enable', + } + json = yield cmd_dict + + +def set_ignore_certificate_errors( + ignore: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable whether all certificate errors should be ignored. + + :param ignore: If true, all certificate errors will be ignored. + ''' + params: T_JSON_DICT = dict() + params['ignore'] = ignore + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setIgnoreCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +def handle_certificate_error( + event_id: int, + action: CertificateErrorAction + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Handles a certificate error that fired a certificateError event. + + :param event_id: The ID of the event. + :param action: The action to take on the certificate error. + ''' + params: T_JSON_DICT = dict() + params['eventId'] = event_id + params['action'] = action.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Security.handleCertificateError', + 'params': params, + } + json = yield cmd_dict + + +def set_override_certificate_errors( + override: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable overriding certificate errors. If enabled, all certificate error events need to + be handled by the DevTools client and should be answered with ``handleCertificateError`` commands. + + :param override: If true, certificate errors will be overridden. + ''' + params: T_JSON_DICT = dict() + params['override'] = override + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setOverrideCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Security.certificateError') +@dataclass +class CertificateError: + ''' + There is a certificate error. If overriding certificate errors is enabled, then it should be + handled with the ``handleCertificateError`` command. Note: this event does not fire if the + certificate error has been allowed internally. Only one client per target should override + certificate errors at the same time. + ''' + #: The ID of the event. + event_id: int + #: The type of the error. + error_type: str + #: The url that was requested. + request_url: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CertificateError: + return cls( + event_id=int(json['eventId']), + error_type=str(json['errorType']), + request_url=str(json['requestURL']) + ) + + +@event_class('Security.visibleSecurityStateChanged') +@dataclass +class VisibleSecurityStateChanged: + ''' + **EXPERIMENTAL** + + The security state of the page changed. + ''' + #: Security state information about the page. + visible_security_state: VisibleSecurityState + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> VisibleSecurityStateChanged: + return cls( + visible_security_state=VisibleSecurityState.from_json(json['visibleSecurityState']) + ) + + +@event_class('Security.securityStateChanged') +@dataclass +class SecurityStateChanged: + ''' + The security state of the page changed. No longer being sent. + ''' + #: Security state. + security_state: SecurityState + #: True if the page was loaded over cryptographic transport such as HTTPS. + scheme_is_cryptographic: bool + #: Previously a list of explanations for the security state. Now always + #: empty. + explanations: typing.List[SecurityStateExplanation] + #: Information about insecure content on the page. + insecure_content_status: InsecureContentStatus + #: Overrides user-visible description of the state. Always omitted. + summary: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SecurityStateChanged: + return cls( + security_state=SecurityState.from_json(json['securityState']), + scheme_is_cryptographic=bool(json['schemeIsCryptographic']), + explanations=[SecurityStateExplanation.from_json(i) for i in json['explanations']], + insecure_content_status=InsecureContentStatus.from_json(json['insecureContentStatus']), + summary=str(json['summary']) if 'summary' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/service_worker.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/service_worker.py new file mode 100755 index 0000000..9dd80b1 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/service_worker.py @@ -0,0 +1,414 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: ServiceWorker (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +class RegistrationID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RegistrationID: + return cls(json) + + def __repr__(self): + return 'RegistrationID({})'.format(super().__repr__()) + + +@dataclass +class ServiceWorkerRegistration: + ''' + ServiceWorker registration. + ''' + registration_id: RegistrationID + + scope_url: str + + is_deleted: bool + + def to_json(self): + json = dict() + json['registrationId'] = self.registration_id.to_json() + json['scopeURL'] = self.scope_url + json['isDeleted'] = self.is_deleted + return json + + @classmethod + def from_json(cls, json): + return cls( + registration_id=RegistrationID.from_json(json['registrationId']), + scope_url=str(json['scopeURL']), + is_deleted=bool(json['isDeleted']), + ) + + +class ServiceWorkerVersionRunningStatus(enum.Enum): + STOPPED = "stopped" + STARTING = "starting" + RUNNING = "running" + STOPPING = "stopping" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ServiceWorkerVersionStatus(enum.Enum): + NEW = "new" + INSTALLING = "installing" + INSTALLED = "installed" + ACTIVATING = "activating" + ACTIVATED = "activated" + REDUNDANT = "redundant" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ServiceWorkerVersion: + ''' + ServiceWorker version. + ''' + version_id: str + + registration_id: RegistrationID + + script_url: str + + running_status: ServiceWorkerVersionRunningStatus + + status: ServiceWorkerVersionStatus + + #: The Last-Modified header value of the main script. + script_last_modified: typing.Optional[float] = None + + #: The time at which the response headers of the main script were received from the server. + #: For cached script it is the last time the cache entry was validated. + script_response_time: typing.Optional[float] = None + + controlled_clients: typing.Optional[typing.List[target.TargetID]] = None + + target_id: typing.Optional[target.TargetID] = None + + router_rules: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['versionId'] = self.version_id + json['registrationId'] = self.registration_id.to_json() + json['scriptURL'] = self.script_url + json['runningStatus'] = self.running_status.to_json() + json['status'] = self.status.to_json() + if self.script_last_modified is not None: + json['scriptLastModified'] = self.script_last_modified + if self.script_response_time is not None: + json['scriptResponseTime'] = self.script_response_time + if self.controlled_clients is not None: + json['controlledClients'] = [i.to_json() for i in self.controlled_clients] + if self.target_id is not None: + json['targetId'] = self.target_id.to_json() + if self.router_rules is not None: + json['routerRules'] = self.router_rules + return json + + @classmethod + def from_json(cls, json): + return cls( + version_id=str(json['versionId']), + registration_id=RegistrationID.from_json(json['registrationId']), + script_url=str(json['scriptURL']), + running_status=ServiceWorkerVersionRunningStatus.from_json(json['runningStatus']), + status=ServiceWorkerVersionStatus.from_json(json['status']), + script_last_modified=float(json['scriptLastModified']) if 'scriptLastModified' in json else None, + script_response_time=float(json['scriptResponseTime']) if 'scriptResponseTime' in json else None, + controlled_clients=[target.TargetID.from_json(i) for i in json['controlledClients']] if 'controlledClients' in json else None, + target_id=target.TargetID.from_json(json['targetId']) if 'targetId' in json else None, + router_rules=str(json['routerRules']) if 'routerRules' in json else None, + ) + + +@dataclass +class ServiceWorkerErrorMessage: + ''' + ServiceWorker error message. + ''' + error_message: str + + registration_id: RegistrationID + + version_id: str + + source_url: str + + line_number: int + + column_number: int + + def to_json(self): + json = dict() + json['errorMessage'] = self.error_message + json['registrationId'] = self.registration_id.to_json() + json['versionId'] = self.version_id + json['sourceURL'] = self.source_url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + error_message=str(json['errorMessage']), + registration_id=RegistrationID.from_json(json['registrationId']), + version_id=str(json['versionId']), + source_url=str(json['sourceURL']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +def deliver_push_message( + origin: str, + registration_id: RegistrationID, + data: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param data: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['data'] = data + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.deliverPushMessage', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.disable', + } + json = yield cmd_dict + + +def dispatch_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str, + last_chance: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + :param last_chance: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + params['lastChance'] = last_chance + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def dispatch_periodic_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchPeriodicSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.enable', + } + json = yield cmd_dict + + +def inspect_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.inspectWorker', + 'params': params, + } + json = yield cmd_dict + + +def set_force_update_on_page_load( + force_update_on_page_load: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param force_update_on_page_load: + ''' + params: T_JSON_DICT = dict() + params['forceUpdateOnPageLoad'] = force_update_on_page_load + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.setForceUpdateOnPageLoad', + 'params': params, + } + json = yield cmd_dict + + +def skip_waiting( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.skipWaiting', + 'params': params, + } + json = yield cmd_dict + + +def start_worker( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.startWorker', + 'params': params, + } + json = yield cmd_dict + + +def stop_all_workers() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopAllWorkers', + } + json = yield cmd_dict + + +def stop_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopWorker', + 'params': params, + } + json = yield cmd_dict + + +def unregister( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.unregister', + 'params': params, + } + json = yield cmd_dict + + +def update_registration( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.updateRegistration', + 'params': params, + } + json = yield cmd_dict + + +@event_class('ServiceWorker.workerErrorReported') +@dataclass +class WorkerErrorReported: + error_message: ServiceWorkerErrorMessage + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerErrorReported: + return cls( + error_message=ServiceWorkerErrorMessage.from_json(json['errorMessage']) + ) + + +@event_class('ServiceWorker.workerRegistrationUpdated') +@dataclass +class WorkerRegistrationUpdated: + registrations: typing.List[ServiceWorkerRegistration] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerRegistrationUpdated: + return cls( + registrations=[ServiceWorkerRegistration.from_json(i) for i in json['registrations']] + ) + + +@event_class('ServiceWorker.workerVersionUpdated') +@dataclass +class WorkerVersionUpdated: + versions: typing.List[ServiceWorkerVersion] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerVersionUpdated: + return cls( + versions=[ServiceWorkerVersion.from_json(i) for i in json['versions']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/storage.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/storage.py new file mode 100755 index 0000000..ba1b851 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/storage.py @@ -0,0 +1,2053 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Storage (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import network +from . import page + + +class SerializedStorageKey(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SerializedStorageKey: + return cls(json) + + def __repr__(self): + return 'SerializedStorageKey({})'.format(super().__repr__()) + + +class StorageType(enum.Enum): + ''' + Enum of possible storage types. + ''' + APPCACHE = "appcache" + COOKIES = "cookies" + FILE_SYSTEMS = "file_systems" + INDEXEDDB = "indexeddb" + LOCAL_STORAGE = "local_storage" + SHADER_CACHE = "shader_cache" + WEBSQL = "websql" + SERVICE_WORKERS = "service_workers" + CACHE_STORAGE = "cache_storage" + INTEREST_GROUPS = "interest_groups" + SHARED_STORAGE = "shared_storage" + STORAGE_BUCKETS = "storage_buckets" + ALL_ = "all" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class UsageForType: + ''' + Usage for a storage type. + ''' + #: Name of storage type. + storage_type: StorageType + + #: Storage usage (bytes). + usage: float + + def to_json(self): + json = dict() + json['storageType'] = self.storage_type.to_json() + json['usage'] = self.usage + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_type=StorageType.from_json(json['storageType']), + usage=float(json['usage']), + ) + + +@dataclass +class TrustTokens: + ''' + Pair of issuer origin and number of available (signed, but not used) Trust + Tokens from that issuer. + ''' + issuer_origin: str + + count: float + + def to_json(self): + json = dict() + json['issuerOrigin'] = self.issuer_origin + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + issuer_origin=str(json['issuerOrigin']), + count=float(json['count']), + ) + + +class InterestGroupAuctionId(str): + ''' + Protected audience interest group auction identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> InterestGroupAuctionId: + return cls(json) + + def __repr__(self): + return 'InterestGroupAuctionId({})'.format(super().__repr__()) + + +class InterestGroupAccessType(enum.Enum): + ''' + Enum of interest group access types. + ''' + JOIN = "join" + LEAVE = "leave" + UPDATE = "update" + LOADED = "loaded" + BID = "bid" + WIN = "win" + ADDITIONAL_BID = "additionalBid" + ADDITIONAL_BID_WIN = "additionalBidWin" + TOP_LEVEL_BID = "topLevelBid" + TOP_LEVEL_ADDITIONAL_BID = "topLevelAdditionalBid" + CLEAR = "clear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionEventType(enum.Enum): + ''' + Enum of auction events. + ''' + STARTED = "started" + CONFIG_RESOLVED = "configResolved" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionFetchType(enum.Enum): + ''' + Enum of network fetches auctions can do. + ''' + BIDDER_JS = "bidderJs" + BIDDER_WASM = "bidderWasm" + SELLER_JS = "sellerJs" + BIDDER_TRUSTED_SIGNALS = "bidderTrustedSignals" + SELLER_TRUSTED_SIGNALS = "sellerTrustedSignals" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SharedStorageAccessType(enum.Enum): + ''' + Enum of shared storage access types. + ''' + DOCUMENT_ADD_MODULE = "documentAddModule" + DOCUMENT_SELECT_URL = "documentSelectURL" + DOCUMENT_RUN = "documentRun" + DOCUMENT_SET = "documentSet" + DOCUMENT_APPEND = "documentAppend" + DOCUMENT_DELETE = "documentDelete" + DOCUMENT_CLEAR = "documentClear" + DOCUMENT_GET = "documentGet" + WORKLET_SET = "workletSet" + WORKLET_APPEND = "workletAppend" + WORKLET_DELETE = "workletDelete" + WORKLET_CLEAR = "workletClear" + WORKLET_GET = "workletGet" + WORKLET_KEYS = "workletKeys" + WORKLET_ENTRIES = "workletEntries" + WORKLET_LENGTH = "workletLength" + WORKLET_REMAINING_BUDGET = "workletRemainingBudget" + HEADER_SET = "headerSet" + HEADER_APPEND = "headerAppend" + HEADER_DELETE = "headerDelete" + HEADER_CLEAR = "headerClear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SharedStorageEntry: + ''' + Struct for a single key-value pair in an origin's shared storage. + ''' + key: str + + value: str + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=str(json['value']), + ) + + +@dataclass +class SharedStorageMetadata: + ''' + Details for an origin's shared storage. + ''' + #: Time when the origin's shared storage was last created. + creation_time: network.TimeSinceEpoch + + #: Number of key-value pairs stored in origin's shared storage. + length: int + + #: Current amount of bits of entropy remaining in the navigation budget. + remaining_budget: float + + #: Total number of bytes stored as key-value pairs in origin's shared + #: storage. + bytes_used: int + + def to_json(self): + json = dict() + json['creationTime'] = self.creation_time.to_json() + json['length'] = self.length + json['remainingBudget'] = self.remaining_budget + json['bytesUsed'] = self.bytes_used + return json + + @classmethod + def from_json(cls, json): + return cls( + creation_time=network.TimeSinceEpoch.from_json(json['creationTime']), + length=int(json['length']), + remaining_budget=float(json['remainingBudget']), + bytes_used=int(json['bytesUsed']), + ) + + +@dataclass +class SharedStorageReportingMetadata: + ''' + Pair of reporting metadata details for a candidate URL for ``selectURL()``. + ''' + event_type: str + + reporting_url: str + + def to_json(self): + json = dict() + json['eventType'] = self.event_type + json['reportingUrl'] = self.reporting_url + return json + + @classmethod + def from_json(cls, json): + return cls( + event_type=str(json['eventType']), + reporting_url=str(json['reportingUrl']), + ) + + +@dataclass +class SharedStorageUrlWithMetadata: + ''' + Bundles a candidate URL with its reporting metadata. + ''' + #: Spec of candidate URL. + url: str + + #: Any associated reporting metadata. + reporting_metadata: typing.List[SharedStorageReportingMetadata] + + def to_json(self): + json = dict() + json['url'] = self.url + json['reportingMetadata'] = [i.to_json() for i in self.reporting_metadata] + return json + + @classmethod + def from_json(cls, json): + return cls( + url=str(json['url']), + reporting_metadata=[SharedStorageReportingMetadata.from_json(i) for i in json['reportingMetadata']], + ) + + +@dataclass +class SharedStorageAccessParams: + ''' + Bundles the parameters for shared storage access events whose + presence/absence can vary according to SharedStorageAccessType. + ''' + #: Spec of the module script URL. + #: Present only for SharedStorageAccessType.documentAddModule. + script_source_url: typing.Optional[str] = None + + #: Name of the registered operation to be run. + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + operation_name: typing.Optional[str] = None + + #: The operation's serialized data in bytes (converted to a string). + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + serialized_data: typing.Optional[str] = None + + #: Array of candidate URLs' specs, along with any associated metadata. + #: Present only for SharedStorageAccessType.documentSelectURL. + urls_with_metadata: typing.Optional[typing.List[SharedStorageUrlWithMetadata]] = None + + #: Key for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.documentDelete, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.workletDelete, + #: SharedStorageAccessType.workletGet, + #: SharedStorageAccessType.headerSet, + #: SharedStorageAccessType.headerAppend, and + #: SharedStorageAccessType.headerDelete. + key: typing.Optional[str] = None + + #: Value for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.headerSet, and + #: SharedStorageAccessType.headerAppend. + value: typing.Optional[str] = None + + #: Whether or not to set an entry for a key if that key is already present. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.workletSet, and + #: SharedStorageAccessType.headerSet. + ignore_if_present: typing.Optional[bool] = None + + def to_json(self): + json = dict() + if self.script_source_url is not None: + json['scriptSourceUrl'] = self.script_source_url + if self.operation_name is not None: + json['operationName'] = self.operation_name + if self.serialized_data is not None: + json['serializedData'] = self.serialized_data + if self.urls_with_metadata is not None: + json['urlsWithMetadata'] = [i.to_json() for i in self.urls_with_metadata] + if self.key is not None: + json['key'] = self.key + if self.value is not None: + json['value'] = self.value + if self.ignore_if_present is not None: + json['ignoreIfPresent'] = self.ignore_if_present + return json + + @classmethod + def from_json(cls, json): + return cls( + script_source_url=str(json['scriptSourceUrl']) if 'scriptSourceUrl' in json else None, + operation_name=str(json['operationName']) if 'operationName' in json else None, + serialized_data=str(json['serializedData']) if 'serializedData' in json else None, + urls_with_metadata=[SharedStorageUrlWithMetadata.from_json(i) for i in json['urlsWithMetadata']] if 'urlsWithMetadata' in json else None, + key=str(json['key']) if 'key' in json else None, + value=str(json['value']) if 'value' in json else None, + ignore_if_present=bool(json['ignoreIfPresent']) if 'ignoreIfPresent' in json else None, + ) + + +class StorageBucketsDurability(enum.Enum): + RELAXED = "relaxed" + STRICT = "strict" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class StorageBucket: + storage_key: SerializedStorageKey + + #: If not specified, it is the default bucket of the storageKey. + name: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['storageKey'] = self.storage_key.to_json() + if self.name is not None: + json['name'] = self.name + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_key=SerializedStorageKey.from_json(json['storageKey']), + name=str(json['name']) if 'name' in json else None, + ) + + +@dataclass +class StorageBucketInfo: + bucket: StorageBucket + + id_: str + + expiration: network.TimeSinceEpoch + + #: Storage quota (bytes). + quota: float + + persistent: bool + + durability: StorageBucketsDurability + + def to_json(self): + json = dict() + json['bucket'] = self.bucket.to_json() + json['id'] = self.id_ + json['expiration'] = self.expiration.to_json() + json['quota'] = self.quota + json['persistent'] = self.persistent + json['durability'] = self.durability.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + bucket=StorageBucket.from_json(json['bucket']), + id_=str(json['id']), + expiration=network.TimeSinceEpoch.from_json(json['expiration']), + quota=float(json['quota']), + persistent=bool(json['persistent']), + durability=StorageBucketsDurability.from_json(json['durability']), + ) + + +class AttributionReportingSourceType(enum.Enum): + NAVIGATION = "navigation" + EVENT = "event" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class UnsignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'UnsignedInt64AsBase10({})'.format(super().__repr__()) + + +class UnsignedInt128AsBase16(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt128AsBase16: + return cls(json) + + def __repr__(self): + return 'UnsignedInt128AsBase16({})'.format(super().__repr__()) + + +class SignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'SignedInt64AsBase10({})'.format(super().__repr__()) + + +@dataclass +class AttributionReportingFilterDataEntry: + key: str + + values: typing.List[str] + + def to_json(self): + json = dict() + json['key'] = self.key + json['values'] = [i for i in self.values] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + values=[str(i) for i in json['values']], + ) + + +@dataclass +class AttributionReportingFilterConfig: + filter_values: typing.List[AttributionReportingFilterDataEntry] + + #: duration in seconds + lookback_window: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['filterValues'] = [i.to_json() for i in self.filter_values] + if self.lookback_window is not None: + json['lookbackWindow'] = self.lookback_window + return json + + @classmethod + def from_json(cls, json): + return cls( + filter_values=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterValues']], + lookback_window=int(json['lookbackWindow']) if 'lookbackWindow' in json else None, + ) + + +@dataclass +class AttributionReportingFilterPair: + filters: typing.List[AttributionReportingFilterConfig] + + not_filters: typing.List[AttributionReportingFilterConfig] + + def to_json(self): + json = dict() + json['filters'] = [i.to_json() for i in self.filters] + json['notFilters'] = [i.to_json() for i in self.not_filters] + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=[AttributionReportingFilterConfig.from_json(i) for i in json['filters']], + not_filters=[AttributionReportingFilterConfig.from_json(i) for i in json['notFilters']], + ) + + +@dataclass +class AttributionReportingAggregationKeysEntry: + key: str + + value: UnsignedInt128AsBase16 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=UnsignedInt128AsBase16.from_json(json['value']), + ) + + +@dataclass +class AttributionReportingEventReportWindows: + #: duration in seconds + start: int + + #: duration in seconds + ends: typing.List[int] + + def to_json(self): + json = dict() + json['start'] = self.start + json['ends'] = [i for i in self.ends] + return json + + @classmethod + def from_json(cls, json): + return cls( + start=int(json['start']), + ends=[int(i) for i in json['ends']], + ) + + +@dataclass +class AttributionReportingTriggerSpec: + #: number instead of integer because not all uint32 can be represented by + #: int + trigger_data: typing.List[float] + + event_report_windows: AttributionReportingEventReportWindows + + def to_json(self): + json = dict() + json['triggerData'] = [i for i in self.trigger_data] + json['eventReportWindows'] = self.event_report_windows.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + trigger_data=[float(i) for i in json['triggerData']], + event_report_windows=AttributionReportingEventReportWindows.from_json(json['eventReportWindows']), + ) + + +class AttributionReportingTriggerDataMatching(enum.Enum): + EXACT = "exact" + MODULUS = "modulus" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableDebugReportingData: + key_piece: UnsignedInt128AsBase16 + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + types: typing.List[str] + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['value'] = self.value + json['types'] = [i for i in self.types] + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + value=float(json['value']), + types=[str(i) for i in json['types']], + ) + + +@dataclass +class AttributionReportingAggregatableDebugReportingConfig: + key_piece: UnsignedInt128AsBase16 + + debug_data: typing.List[AttributionReportingAggregatableDebugReportingData] + + #: number instead of integer because not all uint32 can be represented by + #: int, only present for source registrations + budget: typing.Optional[float] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['debugData'] = [i.to_json() for i in self.debug_data] + if self.budget is not None: + json['budget'] = self.budget + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + debug_data=[AttributionReportingAggregatableDebugReportingData.from_json(i) for i in json['debugData']], + budget=float(json['budget']) if 'budget' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + ) + + +@dataclass +class AttributionReportingSourceRegistration: + time: network.TimeSinceEpoch + + #: duration in seconds + expiry: int + + trigger_specs: typing.List[AttributionReportingTriggerSpec] + + #: duration in seconds + aggregatable_report_window: int + + type_: AttributionReportingSourceType + + source_origin: str + + reporting_origin: str + + destination_sites: typing.List[str] + + event_id: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filter_data: typing.List[AttributionReportingFilterDataEntry] + + aggregation_keys: typing.List[AttributionReportingAggregationKeysEntry] + + trigger_data_matching: AttributionReportingTriggerDataMatching + + destination_limit_priority: SignedInt64AsBase10 + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['time'] = self.time.to_json() + json['expiry'] = self.expiry + json['triggerSpecs'] = [i.to_json() for i in self.trigger_specs] + json['aggregatableReportWindow'] = self.aggregatable_report_window + json['type'] = self.type_.to_json() + json['sourceOrigin'] = self.source_origin + json['reportingOrigin'] = self.reporting_origin + json['destinationSites'] = [i for i in self.destination_sites] + json['eventId'] = self.event_id.to_json() + json['priority'] = self.priority.to_json() + json['filterData'] = [i.to_json() for i in self.filter_data] + json['aggregationKeys'] = [i.to_json() for i in self.aggregation_keys] + json['triggerDataMatching'] = self.trigger_data_matching.to_json() + json['destinationLimitPriority'] = self.destination_limit_priority.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + time=network.TimeSinceEpoch.from_json(json['time']), + expiry=int(json['expiry']), + trigger_specs=[AttributionReportingTriggerSpec.from_json(i) for i in json['triggerSpecs']], + aggregatable_report_window=int(json['aggregatableReportWindow']), + type_=AttributionReportingSourceType.from_json(json['type']), + source_origin=str(json['sourceOrigin']), + reporting_origin=str(json['reportingOrigin']), + destination_sites=[str(i) for i in json['destinationSites']], + event_id=UnsignedInt64AsBase10.from_json(json['eventId']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filter_data=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterData']], + aggregation_keys=[AttributionReportingAggregationKeysEntry.from_json(i) for i in json['aggregationKeys']], + trigger_data_matching=AttributionReportingTriggerDataMatching.from_json(json['triggerDataMatching']), + destination_limit_priority=SignedInt64AsBase10.from_json(json['destinationLimitPriority']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + ) + + +class AttributionReportingSourceRegistrationResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + INSUFFICIENT_SOURCE_CAPACITY = "insufficientSourceCapacity" + INSUFFICIENT_UNIQUE_DESTINATION_CAPACITY = "insufficientUniqueDestinationCapacity" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + SUCCESS_NOISED = "successNoised" + DESTINATION_REPORTING_LIMIT_REACHED = "destinationReportingLimitReached" + DESTINATION_GLOBAL_LIMIT_REACHED = "destinationGlobalLimitReached" + DESTINATION_BOTH_LIMITS_REACHED = "destinationBothLimitsReached" + REPORTING_ORIGINS_PER_SITE_LIMIT_REACHED = "reportingOriginsPerSiteLimitReached" + EXCEEDS_MAX_CHANNEL_CAPACITY = "exceedsMaxChannelCapacity" + EXCEEDS_MAX_TRIGGER_STATE_CARDINALITY = "exceedsMaxTriggerStateCardinality" + DESTINATION_PER_DAY_REPORTING_LIMIT_REACHED = "destinationPerDayReportingLimitReached" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingSourceRegistrationTimeConfig(enum.Enum): + INCLUDE = "include" + EXCLUDE = "exclude" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableValueDictEntry: + key: str + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + filtering_id: UnsignedInt64AsBase10 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + json['filteringId'] = self.filtering_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=float(json['value']), + filtering_id=UnsignedInt64AsBase10.from_json(json['filteringId']), + ) + + +@dataclass +class AttributionReportingAggregatableValueEntry: + values: typing.List[AttributionReportingAggregatableValueDictEntry] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['values'] = [i.to_json() for i in self.values] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + values=[AttributionReportingAggregatableValueDictEntry.from_json(i) for i in json['values']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingEventTriggerData: + data: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['data'] = self.data.to_json() + json['priority'] = self.priority.to_json() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + data=UnsignedInt64AsBase10.from_json(json['data']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingAggregatableTriggerData: + key_piece: UnsignedInt128AsBase16 + + source_keys: typing.List[str] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['sourceKeys'] = [i for i in self.source_keys] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + source_keys=[str(i) for i in json['sourceKeys']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingAggregatableDedupKey: + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingTriggerRegistration: + filters: AttributionReportingFilterPair + + aggregatable_dedup_keys: typing.List[AttributionReportingAggregatableDedupKey] + + event_trigger_data: typing.List[AttributionReportingEventTriggerData] + + aggregatable_trigger_data: typing.List[AttributionReportingAggregatableTriggerData] + + aggregatable_values: typing.List[AttributionReportingAggregatableValueEntry] + + aggregatable_filtering_id_max_bytes: int + + debug_reporting: bool + + source_registration_time_config: AttributionReportingSourceRegistrationTimeConfig + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + trigger_context_id: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + json['aggregatableDedupKeys'] = [i.to_json() for i in self.aggregatable_dedup_keys] + json['eventTriggerData'] = [i.to_json() for i in self.event_trigger_data] + json['aggregatableTriggerData'] = [i.to_json() for i in self.aggregatable_trigger_data] + json['aggregatableValues'] = [i.to_json() for i in self.aggregatable_values] + json['aggregatableFilteringIdMaxBytes'] = self.aggregatable_filtering_id_max_bytes + json['debugReporting'] = self.debug_reporting + json['sourceRegistrationTimeConfig'] = self.source_registration_time_config.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + if self.trigger_context_id is not None: + json['triggerContextId'] = self.trigger_context_id + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + aggregatable_dedup_keys=[AttributionReportingAggregatableDedupKey.from_json(i) for i in json['aggregatableDedupKeys']], + event_trigger_data=[AttributionReportingEventTriggerData.from_json(i) for i in json['eventTriggerData']], + aggregatable_trigger_data=[AttributionReportingAggregatableTriggerData.from_json(i) for i in json['aggregatableTriggerData']], + aggregatable_values=[AttributionReportingAggregatableValueEntry.from_json(i) for i in json['aggregatableValues']], + aggregatable_filtering_id_max_bytes=int(json['aggregatableFilteringIdMaxBytes']), + debug_reporting=bool(json['debugReporting']), + source_registration_time_config=AttributionReportingSourceRegistrationTimeConfig.from_json(json['sourceRegistrationTimeConfig']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + trigger_context_id=str(json['triggerContextId']) if 'triggerContextId' in json else None, + ) + + +class AttributionReportingEventLevelResult(enum.Enum): + SUCCESS = "success" + SUCCESS_DROPPED_LOWER_PRIORITY = "successDroppedLowerPriority" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + DEDUPLICATED = "deduplicated" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + PRIORITY_TOO_LOW = "priorityTooLow" + NEVER_ATTRIBUTED_SOURCE = "neverAttributedSource" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + NO_MATCHING_CONFIGURATIONS = "noMatchingConfigurations" + EXCESSIVE_REPORTS = "excessiveReports" + FALSELY_ATTRIBUTED_SOURCE = "falselyAttributedSource" + REPORT_WINDOW_PASSED = "reportWindowPassed" + NOT_REGISTERED = "notRegistered" + REPORT_WINDOW_NOT_STARTED = "reportWindowNotStarted" + NO_MATCHING_TRIGGER_DATA = "noMatchingTriggerData" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingAggregatableResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_HISTOGRAMS = "noHistograms" + INSUFFICIENT_BUDGET = "insufficientBudget" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + NOT_REGISTERED = "notRegistered" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + DEDUPLICATED = "deduplicated" + REPORT_WINDOW_PASSED = "reportWindowPassed" + EXCESSIVE_REPORTS = "excessiveReports" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class RelatedWebsiteSet: + ''' + A single Related Website Set object. + ''' + #: The primary site of this set, along with the ccTLDs if there is any. + primary_sites: typing.List[str] + + #: The associated sites of this set, along with the ccTLDs if there is any. + associated_sites: typing.List[str] + + #: The service sites of this set, along with the ccTLDs if there is any. + service_sites: typing.List[str] + + def to_json(self): + json = dict() + json['primarySites'] = [i for i in self.primary_sites] + json['associatedSites'] = [i for i in self.associated_sites] + json['serviceSites'] = [i for i in self.service_sites] + return json + + @classmethod + def from_json(cls, json): + return cls( + primary_sites=[str(i) for i in json['primarySites']], + associated_sites=[str(i) for i in json['associatedSites']], + service_sites=[str(i) for i in json['serviceSites']], + ) + + +def get_storage_key_for_frame( + frame_id: page.FrameId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SerializedStorageKey]: + ''' + Returns a storage key given a frame id. + + :param frame_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['frameId'] = frame_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getStorageKeyForFrame', + 'params': params, + } + json = yield cmd_dict + return SerializedStorageKey.from_json(json['storageKey']) + + +def clear_data_for_origin( + origin: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for origin. + + :param origin: Security origin. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def clear_data_for_storage_key( + storage_key: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for storage key. + + :param storage_key: Storage key. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[network.Cookie]]: + ''' + Returns all browser cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + :returns: Array of cookie objects. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getCookies', + 'params': params, + } + json = yield cmd_dict + return [network.Cookie.from_json(i) for i in json['cookies']] + + +def set_cookies( + cookies: typing.List[network.CookieParam], + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets given cookies. + + :param cookies: Cookies to be set. + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + params['cookies'] = [i.to_json() for i in cookies] + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setCookies', + 'params': params, + } + json = yield cmd_dict + + +def clear_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearCookies', + 'params': params, + } + json = yield cmd_dict + + +def get_usage_and_quota( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float, bool, typing.List[UsageForType]]]: + ''' + Returns usage and quota in bytes. + + :param origin: Security origin. + :returns: A tuple with the following items: + + 0. **usage** - Storage usage (bytes). + 1. **quota** - Storage quota (bytes). + 2. **overrideActive** - Whether or not the origin has an active storage quota override + 3. **usageBreakdown** - Storage usage per type (bytes). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getUsageAndQuota', + 'params': params, + } + json = yield cmd_dict + return ( + float(json['usage']), + float(json['quota']), + bool(json['overrideActive']), + [UsageForType.from_json(i) for i in json['usageBreakdown']] + ) + + +def override_quota_for_origin( + origin: str, + quota_size: typing.Optional[float] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Override quota for the specified origin + + **EXPERIMENTAL** + + :param origin: Security origin. + :param quota_size: *(Optional)* The quota size (in bytes) to override the original quota with. If this is called multiple times, the overridden quota will be equal to the quotaSize provided in the final call. If this is called without specifying a quotaSize, the quota will be reset to the default value for the specified origin. If this is called multiple times with different origins, the override will be maintained for each origin until it is disabled (called without a quotaSize). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + if quota_size is not None: + params['quotaSize'] = quota_size + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.overrideQuotaForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its cache storage list. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its cache storage list. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for cache storage. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for cache storage. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_trust_tokens() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TrustTokens]]: + ''' + Returns the number of stored Trust Tokens per issuer for the + current browsing context. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getTrustTokens', + } + json = yield cmd_dict + return [TrustTokens.from_json(i) for i in json['tokens']] + + +def clear_trust_tokens( + issuer_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Removes all Trust Tokens issued by the provided issuerOrigin. + Leaves other stored data, including the issuer's Redemption Records, intact. + + **EXPERIMENTAL** + + :param issuer_origin: + :returns: True if any tokens were deleted, false otherwise. + ''' + params: T_JSON_DICT = dict() + params['issuerOrigin'] = issuer_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearTrustTokens', + 'params': params, + } + json = yield cmd_dict + return bool(json['didDeleteTokens']) + + +def get_interest_group_details( + owner_origin: str, + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,dict]: + ''' + Gets details for a named interest group. + + **EXPERIMENTAL** + + :param owner_origin: + :param name: + :returns: This largely corresponds to: https://wicg.github.io/turtledove/#dictdef-generatebidinterestgroup but has absolute expirationTime instead of relative lifetimeMs and also adds joiningOrigin. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getInterestGroupDetails', + 'params': params, + } + json = yield cmd_dict + return dict(json['details']) + + +def set_interest_group_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_interest_group_auction_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAuctionEventOccurred and + interestGroupAuctionNetworkRequestCreated. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupAuctionTracking', + 'params': params, + } + json = yield cmd_dict + + +def get_shared_storage_metadata( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SharedStorageMetadata]: + ''' + Gets metadata for an origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageMetadata', + 'params': params, + } + json = yield cmd_dict + return SharedStorageMetadata.from_json(json['metadata']) + + +def get_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[SharedStorageEntry]]: + ''' + Gets the entries in an given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + return [SharedStorageEntry.from_json(i) for i in json['entries']] + + +def set_shared_storage_entry( + owner_origin: str, + key: str, + value: str, + ignore_if_present: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets entry with ``key`` and ``value`` for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + :param value: + :param ignore_if_present: *(Optional)* If ```ignoreIfPresent```` is included and true, then only sets the entry if ````key``` doesn't already exist. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + params['value'] = value + if ignore_if_present is not None: + params['ignoreIfPresent'] = ignore_if_present + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def delete_shared_storage_entry( + owner_origin: str, + key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes entry for ``key`` (if it exists) for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def clear_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all entries for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + + +def reset_shared_storage_budget( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets the budget for ``ownerOrigin`` by clearing all budget withdrawals. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.resetSharedStorageBudget', + 'params': params, + } + json = yield cmd_dict + + +def set_shared_storage_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of sharedStorageAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_storage_bucket_tracking( + storage_key: str, + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Set tracking for a storage key's buckets. + + **EXPERIMENTAL** + + :param storage_key: + :param enable: + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setStorageBucketTracking', + 'params': params, + } + json = yield cmd_dict + + +def delete_storage_bucket( + bucket: StorageBucket + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes the Storage Bucket with the given storage key and bucket name. + + **EXPERIMENTAL** + + :param bucket: + ''' + params: T_JSON_DICT = dict() + params['bucket'] = bucket.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteStorageBucket', + 'params': params, + } + json = yield cmd_dict + + +def run_bounce_tracking_mitigations() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Deletes state for sites identified as potential bounce trackers, immediately. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.runBounceTrackingMitigations', + } + json = yield cmd_dict + return [str(i) for i in json['deletedSites']] + + +def set_attribution_reporting_local_testing_mode( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + https://wicg.github.io/attribution-reporting-api/ + + **EXPERIMENTAL** + + :param enabled: If enabled, noise is suppressed and reports are sent immediately. + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingLocalTestingMode', + 'params': params, + } + json = yield cmd_dict + + +def set_attribution_reporting_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of Attribution Reporting events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingTracking', + 'params': params, + } + json = yield cmd_dict + + +def send_pending_attribution_reports() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,int]: + ''' + Sends all pending Attribution Reports immediately, regardless of their + scheduled report time. + + **EXPERIMENTAL** + + :returns: The number of reports that were sent. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.sendPendingAttributionReports', + } + json = yield cmd_dict + return int(json['numSent']) + + +def get_related_website_sets() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[RelatedWebsiteSet]]: + ''' + Returns the effective Related Website Sets in use by this profile for the browser + session. The effective Related Website Sets will not change during a browser session. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getRelatedWebsiteSets', + } + json = yield cmd_dict + return [RelatedWebsiteSet.from_json(i) for i in json['sets']] + + +@event_class('Storage.cacheStorageContentUpdated') +@dataclass +class CacheStorageContentUpdated: + ''' + A cache's contents have been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Name of cache in origin. + cache_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + cache_name=str(json['cacheName']) + ) + + +@event_class('Storage.cacheStorageListUpdated') +@dataclass +class CacheStorageListUpdated: + ''' + A cache has been added/deleted. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.indexedDBContentUpdated') +@dataclass +class IndexedDBContentUpdated: + ''' + The origin's IndexedDB object store has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Database to update. + database_name: str + #: ObjectStore to update. + object_store_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + database_name=str(json['databaseName']), + object_store_name=str(json['objectStoreName']) + ) + + +@event_class('Storage.indexedDBListUpdated') +@dataclass +class IndexedDBListUpdated: + ''' + The origin's IndexedDB database list has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.interestGroupAccessed') +@dataclass +class InterestGroupAccessed: + ''' + One of the interest groups was accessed. Note that these events are global + to all targets sharing an interest group store. + ''' + access_time: network.TimeSinceEpoch + type_: InterestGroupAccessType + owner_origin: str + name: str + #: For topLevelBid/topLevelAdditionalBid, and when appropriate, + #: win and additionalBidWin + component_seller_origin: typing.Optional[str] + #: For bid or somethingBid event, if done locally and not on a server. + bid: typing.Optional[float] + bid_currency: typing.Optional[str] + #: For non-global events --- links to interestGroupAuctionEvent + unique_auction_id: typing.Optional[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=InterestGroupAccessType.from_json(json['type']), + owner_origin=str(json['ownerOrigin']), + name=str(json['name']), + component_seller_origin=str(json['componentSellerOrigin']) if 'componentSellerOrigin' in json else None, + bid=float(json['bid']) if 'bid' in json else None, + bid_currency=str(json['bidCurrency']) if 'bidCurrency' in json else None, + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']) if 'uniqueAuctionId' in json else None + ) + + +@event_class('Storage.interestGroupAuctionEventOccurred') +@dataclass +class InterestGroupAuctionEventOccurred: + ''' + An auction involving interest groups is taking place. These events are + target-specific. + ''' + event_time: network.TimeSinceEpoch + type_: InterestGroupAuctionEventType + unique_auction_id: InterestGroupAuctionId + #: Set for child auctions. + parent_auction_id: typing.Optional[InterestGroupAuctionId] + #: Set for started and configResolved + auction_config: typing.Optional[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionEventOccurred: + return cls( + event_time=network.TimeSinceEpoch.from_json(json['eventTime']), + type_=InterestGroupAuctionEventType.from_json(json['type']), + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']), + parent_auction_id=InterestGroupAuctionId.from_json(json['parentAuctionId']) if 'parentAuctionId' in json else None, + auction_config=dict(json['auctionConfig']) if 'auctionConfig' in json else None + ) + + +@event_class('Storage.interestGroupAuctionNetworkRequestCreated') +@dataclass +class InterestGroupAuctionNetworkRequestCreated: + ''' + Specifies which auctions a particular network fetch may be related to, and + in what role. Note that it is not ordered with respect to + Network.requestWillBeSent (but will happen before loadingFinished + loadingFailed). + ''' + type_: InterestGroupAuctionFetchType + request_id: network.RequestId + #: This is the set of the auctions using the worklet that issued this + #: request. In the case of trusted signals, it's possible that only some of + #: them actually care about the keys being queried. + auctions: typing.List[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionNetworkRequestCreated: + return cls( + type_=InterestGroupAuctionFetchType.from_json(json['type']), + request_id=network.RequestId.from_json(json['requestId']), + auctions=[InterestGroupAuctionId.from_json(i) for i in json['auctions']] + ) + + +@event_class('Storage.sharedStorageAccessed') +@dataclass +class SharedStorageAccessed: + ''' + Shared storage was accessed by the associated page. + The following parameters are included in all events. + ''' + #: Time of the access. + access_time: network.TimeSinceEpoch + #: Enum value indicating the Shared Storage API method invoked. + type_: SharedStorageAccessType + #: DevTools Frame Token for the primary frame tree's root. + main_frame_id: page.FrameId + #: Serialized origin for the context that invoked the Shared Storage API. + owner_origin: str + #: The sub-parameters wrapped by ``params`` are all optional and their + #: presence/absence depends on ``type``. + params: SharedStorageAccessParams + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SharedStorageAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=SharedStorageAccessType.from_json(json['type']), + main_frame_id=page.FrameId.from_json(json['mainFrameId']), + owner_origin=str(json['ownerOrigin']), + params=SharedStorageAccessParams.from_json(json['params']) + ) + + +@event_class('Storage.storageBucketCreatedOrUpdated') +@dataclass +class StorageBucketCreatedOrUpdated: + bucket_info: StorageBucketInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketCreatedOrUpdated: + return cls( + bucket_info=StorageBucketInfo.from_json(json['bucketInfo']) + ) + + +@event_class('Storage.storageBucketDeleted') +@dataclass +class StorageBucketDeleted: + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketDeleted: + return cls( + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.attributionReportingSourceRegistered') +@dataclass +class AttributionReportingSourceRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingSourceRegistration + result: AttributionReportingSourceRegistrationResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingSourceRegistered: + return cls( + registration=AttributionReportingSourceRegistration.from_json(json['registration']), + result=AttributionReportingSourceRegistrationResult.from_json(json['result']) + ) + + +@event_class('Storage.attributionReportingTriggerRegistered') +@dataclass +class AttributionReportingTriggerRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingTriggerRegistration + event_level: AttributionReportingEventLevelResult + aggregatable: AttributionReportingAggregatableResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingTriggerRegistered: + return cls( + registration=AttributionReportingTriggerRegistration.from_json(json['registration']), + event_level=AttributionReportingEventLevelResult.from_json(json['eventLevel']), + aggregatable=AttributionReportingAggregatableResult.from_json(json['aggregatable']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/system_info.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/system_info.py new file mode 100755 index 0000000..d1b2f6b --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/system_info.py @@ -0,0 +1,366 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: SystemInfo (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class GPUDevice: + ''' + Describes a single graphics processor (GPU). + ''' + #: PCI ID of the GPU vendor, if available; 0 otherwise. + vendor_id: float + + #: PCI ID of the GPU device, if available; 0 otherwise. + device_id: float + + #: String description of the GPU vendor, if the PCI ID is not available. + vendor_string: str + + #: String description of the GPU device, if the PCI ID is not available. + device_string: str + + #: String description of the GPU driver vendor. + driver_vendor: str + + #: String description of the GPU driver version. + driver_version: str + + #: Sub sys ID of the GPU, only available on Windows. + sub_sys_id: typing.Optional[float] = None + + #: Revision of the GPU, only available on Windows. + revision: typing.Optional[float] = None + + def to_json(self): + json = dict() + json['vendorId'] = self.vendor_id + json['deviceId'] = self.device_id + json['vendorString'] = self.vendor_string + json['deviceString'] = self.device_string + json['driverVendor'] = self.driver_vendor + json['driverVersion'] = self.driver_version + if self.sub_sys_id is not None: + json['subSysId'] = self.sub_sys_id + if self.revision is not None: + json['revision'] = self.revision + return json + + @classmethod + def from_json(cls, json): + return cls( + vendor_id=float(json['vendorId']), + device_id=float(json['deviceId']), + vendor_string=str(json['vendorString']), + device_string=str(json['deviceString']), + driver_vendor=str(json['driverVendor']), + driver_version=str(json['driverVersion']), + sub_sys_id=float(json['subSysId']) if 'subSysId' in json else None, + revision=float(json['revision']) if 'revision' in json else None, + ) + + +@dataclass +class Size: + ''' + Describes the width and height dimensions of an entity. + ''' + #: Width in pixels. + width: int + + #: Height in pixels. + height: int + + def to_json(self): + json = dict() + json['width'] = self.width + json['height'] = self.height + return json + + @classmethod + def from_json(cls, json): + return cls( + width=int(json['width']), + height=int(json['height']), + ) + + +@dataclass +class VideoDecodeAcceleratorCapability: + ''' + Describes a supported video decoding profile with its associated minimum and + maximum resolutions. + ''' + #: Video codec profile that is supported, e.g. VP9 Profile 2. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Minimum video dimensions in pixels supported for this ``profile``. + min_resolution: Size + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['minResolution'] = self.min_resolution.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + min_resolution=Size.from_json(json['minResolution']), + ) + + +@dataclass +class VideoEncodeAcceleratorCapability: + ''' + Describes a supported video encoding profile with its associated maximum + resolution and maximum framerate. + ''' + #: Video codec profile that is supported, e.g H264 Main. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Maximum encoding framerate in frames per second supported for this + #: ``profile``, as fraction's numerator and denominator, e.g. 24/1 fps, + #: 24000/1001 fps, etc. + max_framerate_numerator: int + + max_framerate_denominator: int + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['maxFramerateNumerator'] = self.max_framerate_numerator + json['maxFramerateDenominator'] = self.max_framerate_denominator + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + max_framerate_numerator=int(json['maxFramerateNumerator']), + max_framerate_denominator=int(json['maxFramerateDenominator']), + ) + + +class SubsamplingFormat(enum.Enum): + ''' + YUV subsampling type of the pixels of a given image. + ''' + YUV420 = "yuv420" + YUV422 = "yuv422" + YUV444 = "yuv444" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ImageType(enum.Enum): + ''' + Image format of a given image. + ''' + JPEG = "jpeg" + WEBP = "webp" + UNKNOWN = "unknown" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ImageDecodeAcceleratorCapability: + ''' + Describes a supported image decoding profile with its associated minimum and + maximum resolutions and subsampling. + ''' + #: Image coded, e.g. Jpeg. + image_type: ImageType + + #: Maximum supported dimensions of the image in pixels. + max_dimensions: Size + + #: Minimum supported dimensions of the image in pixels. + min_dimensions: Size + + #: Optional array of supported subsampling formats, e.g. 4:2:0, if known. + subsamplings: typing.List[SubsamplingFormat] + + def to_json(self): + json = dict() + json['imageType'] = self.image_type.to_json() + json['maxDimensions'] = self.max_dimensions.to_json() + json['minDimensions'] = self.min_dimensions.to_json() + json['subsamplings'] = [i.to_json() for i in self.subsamplings] + return json + + @classmethod + def from_json(cls, json): + return cls( + image_type=ImageType.from_json(json['imageType']), + max_dimensions=Size.from_json(json['maxDimensions']), + min_dimensions=Size.from_json(json['minDimensions']), + subsamplings=[SubsamplingFormat.from_json(i) for i in json['subsamplings']], + ) + + +@dataclass +class GPUInfo: + ''' + Provides information about the GPU(s) on the system. + ''' + #: The graphics devices on the system. Element 0 is the primary GPU. + devices: typing.List[GPUDevice] + + #: An optional array of GPU driver bug workarounds. + driver_bug_workarounds: typing.List[str] + + #: Supported accelerated video decoding capabilities. + video_decoding: typing.List[VideoDecodeAcceleratorCapability] + + #: Supported accelerated video encoding capabilities. + video_encoding: typing.List[VideoEncodeAcceleratorCapability] + + #: Supported accelerated image decoding capabilities. + image_decoding: typing.List[ImageDecodeAcceleratorCapability] + + #: An optional dictionary of additional GPU related attributes. + aux_attributes: typing.Optional[dict] = None + + #: An optional dictionary of graphics features and their status. + feature_status: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['devices'] = [i.to_json() for i in self.devices] + json['driverBugWorkarounds'] = [i for i in self.driver_bug_workarounds] + json['videoDecoding'] = [i.to_json() for i in self.video_decoding] + json['videoEncoding'] = [i.to_json() for i in self.video_encoding] + json['imageDecoding'] = [i.to_json() for i in self.image_decoding] + if self.aux_attributes is not None: + json['auxAttributes'] = self.aux_attributes + if self.feature_status is not None: + json['featureStatus'] = self.feature_status + return json + + @classmethod + def from_json(cls, json): + return cls( + devices=[GPUDevice.from_json(i) for i in json['devices']], + driver_bug_workarounds=[str(i) for i in json['driverBugWorkarounds']], + video_decoding=[VideoDecodeAcceleratorCapability.from_json(i) for i in json['videoDecoding']], + video_encoding=[VideoEncodeAcceleratorCapability.from_json(i) for i in json['videoEncoding']], + image_decoding=[ImageDecodeAcceleratorCapability.from_json(i) for i in json['imageDecoding']], + aux_attributes=dict(json['auxAttributes']) if 'auxAttributes' in json else None, + feature_status=dict(json['featureStatus']) if 'featureStatus' in json else None, + ) + + +@dataclass +class ProcessInfo: + ''' + Represents process info. + ''' + #: Specifies process type. + type_: str + + #: Specifies process id. + id_: int + + #: Specifies cumulative CPU usage in seconds across all threads of the + #: process since the process start. + cpu_time: float + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['id'] = self.id_ + json['cpuTime'] = self.cpu_time + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + id_=int(json['id']), + cpu_time=float(json['cpuTime']), + ) + + +def get_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[GPUInfo, str, str, str]]: + ''' + Returns information about the system. + + :returns: A tuple with the following items: + + 0. **gpu** - Information about the GPUs on the system. + 1. **modelName** - A platform-dependent description of the model of the machine. On Mac OS, this is, for example, 'MacBookPro'. Will be the empty string if not supported. + 2. **modelVersion** - A platform-dependent description of the version of the machine. On Mac OS, this is, for example, '10.1'. Will be the empty string if not supported. + 3. **commandLine** - The command line string used to launch the browser. Will be the empty string if not supported. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getInfo', + } + json = yield cmd_dict + return ( + GPUInfo.from_json(json['gpu']), + str(json['modelName']), + str(json['modelVersion']), + str(json['commandLine']) + ) + + +def get_feature_state( + feature_state: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Returns information about the feature state. + + :param feature_state: + :returns: + ''' + params: T_JSON_DICT = dict() + params['featureState'] = feature_state + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getFeatureState', + 'params': params, + } + json = yield cmd_dict + return bool(json['featureEnabled']) + + +def get_process_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ProcessInfo]]: + ''' + Returns information about all running processes. + + :returns: An array of process info blocks. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getProcessInfo', + } + json = yield cmd_dict + return [ProcessInfo.from_json(i) for i in json['processInfo']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/target.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/target.py new file mode 100755 index 0000000..2a59a9e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/target.py @@ -0,0 +1,713 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Target +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import page + + +class TargetID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> TargetID: + return cls(json) + + def __repr__(self): + return 'TargetID({})'.format(super().__repr__()) + + +class SessionID(str): + ''' + Unique identifier of attached debugging session. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SessionID: + return cls(json) + + def __repr__(self): + return 'SessionID({})'.format(super().__repr__()) + + +@dataclass +class TargetInfo: + target_id: TargetID + + #: List of types: https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypeTab%5B%5D%22 + type_: str + + title: str + + url: str + + #: Whether the target has an attached client. + attached: bool + + #: Whether the target has access to the originating window. + can_access_opener: bool + + #: Opener target Id + opener_id: typing.Optional[TargetID] = None + + #: Frame id of originating window (is only set if target has an opener). + opener_frame_id: typing.Optional[page.FrameId] = None + + browser_context_id: typing.Optional[browser.BrowserContextID] = None + + #: Provides additional details for specific target types. For example, for + #: the type of "page", this may be set to "prerender". + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['targetId'] = self.target_id.to_json() + json['type'] = self.type_ + json['title'] = self.title + json['url'] = self.url + json['attached'] = self.attached + json['canAccessOpener'] = self.can_access_opener + if self.opener_id is not None: + json['openerId'] = self.opener_id.to_json() + if self.opener_frame_id is not None: + json['openerFrameId'] = self.opener_frame_id.to_json() + if self.browser_context_id is not None: + json['browserContextId'] = self.browser_context_id.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + target_id=TargetID.from_json(json['targetId']), + type_=str(json['type']), + title=str(json['title']), + url=str(json['url']), + attached=bool(json['attached']), + can_access_opener=bool(json['canAccessOpener']), + opener_id=TargetID.from_json(json['openerId']) if 'openerId' in json else None, + opener_frame_id=page.FrameId.from_json(json['openerFrameId']) if 'openerFrameId' in json else None, + browser_context_id=browser.BrowserContextID.from_json(json['browserContextId']) if 'browserContextId' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class FilterEntry: + ''' + A filter used by target query/discovery/auto-attach operations. + ''' + #: If set, causes exclusion of matching targets from the list. + exclude: typing.Optional[bool] = None + + #: If not present, matches any type. + type_: typing.Optional[str] = None + + def to_json(self): + json = dict() + if self.exclude is not None: + json['exclude'] = self.exclude + if self.type_ is not None: + json['type'] = self.type_ + return json + + @classmethod + def from_json(cls, json): + return cls( + exclude=bool(json['exclude']) if 'exclude' in json else None, + type_=str(json['type']) if 'type' in json else None, + ) + + +class TargetFilter(list): + ''' + The entries in TargetFilter are matched sequentially against targets and + the first entry that matches determines if the target is included or not, + depending on the value of ``exclude`` field in the entry. + If filter is not specified, the one assumed is + [{type: "browser", exclude: true}, {type: "tab", exclude: true}, {}] + (i.e. include everything but ``browser`` and ``tab``). + ''' + def to_json(self) -> typing.List[FilterEntry]: + return self + + @classmethod + def from_json(cls, json: typing.List[FilterEntry]) -> TargetFilter: + return cls(json) + + def __repr__(self): + return 'TargetFilter({})'.format(super().__repr__()) + + +@dataclass +class RemoteLocation: + host: str + + port: int + + def to_json(self): + json = dict() + json['host'] = self.host + json['port'] = self.port + return json + + @classmethod + def from_json(cls, json): + return cls( + host=str(json['host']), + port=int(json['port']), + ) + + +def activate_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Activates (focuses) the target. + + :param target_id: + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.activateTarget', + 'params': params, + } + json = yield cmd_dict + + +def attach_to_target( + target_id: TargetID, + flatten: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the target with given id. + + :param target_id: + :param flatten: *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :returns: Id assigned to the session. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if flatten is not None: + params['flatten'] = flatten + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToTarget', + 'params': params, + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def attach_to_browser_target() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the browser target, only uses flat sessionId mode. + + **EXPERIMENTAL** + + :returns: Id assigned to the session. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToBrowserTarget', + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def close_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Closes the target. If the target is a page that gets closed too. + + :param target_id: + :returns: Always set to true. If an error occurs, the response indicates protocol error. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.closeTarget', + 'params': params, + } + json = yield cmd_dict + return bool(json['success']) + + +def expose_dev_tools_protocol( + target_id: TargetID, + binding_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Inject object to the target's main frame that provides a communication + channel with browser target. + + Injected object will be available as ``window[bindingName]``. + + The object has the following API: + - ``binding.send(json)`` - a method to send messages over the remote debugging protocol + - ``binding.onmessage = json => handleMessage(json)`` - a callback that will be called for the protocol notifications and command responses. + + **EXPERIMENTAL** + + :param target_id: + :param binding_name: *(Optional)* Binding name, 'cdp' if not specified. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if binding_name is not None: + params['bindingName'] = binding_name + cmd_dict: T_JSON_DICT = { + 'method': 'Target.exposeDevToolsProtocol', + 'params': params, + } + json = yield cmd_dict + + +def create_browser_context( + dispose_on_detach: typing.Optional[bool] = None, + proxy_server: typing.Optional[str] = None, + proxy_bypass_list: typing.Optional[str] = None, + origins_with_universal_network_access: typing.Optional[typing.List[str]] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,browser.BrowserContextID]: + ''' + Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than + one. + + :param dispose_on_detach: **(EXPERIMENTAL)** *(Optional)* If specified, disposes this context when debugging session disconnects. + :param proxy_server: **(EXPERIMENTAL)** *(Optional)* Proxy server, similar to the one passed to --proxy-server + :param proxy_bypass_list: **(EXPERIMENTAL)** *(Optional)* Proxy bypass list, similar to the one passed to --proxy-bypass-list + :param origins_with_universal_network_access: **(EXPERIMENTAL)** *(Optional)* An optional list of origins to grant unlimited cross-origin access to. Parts of the URL other than those constituting origin are ignored. + :returns: The id of the context created. + ''' + params: T_JSON_DICT = dict() + if dispose_on_detach is not None: + params['disposeOnDetach'] = dispose_on_detach + if proxy_server is not None: + params['proxyServer'] = proxy_server + if proxy_bypass_list is not None: + params['proxyBypassList'] = proxy_bypass_list + if origins_with_universal_network_access is not None: + params['originsWithUniversalNetworkAccess'] = [i for i in origins_with_universal_network_access] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createBrowserContext', + 'params': params, + } + json = yield cmd_dict + return browser.BrowserContextID.from_json(json['browserContextId']) + + +def get_browser_contexts() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[browser.BrowserContextID]]: + ''' + Returns all browser contexts created with ``Target.createBrowserContext`` method. + + :returns: An array of browser context ids. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getBrowserContexts', + } + json = yield cmd_dict + return [browser.BrowserContextID.from_json(i) for i in json['browserContextIds']] + + +def create_target( + url: str, + width: typing.Optional[int] = None, + height: typing.Optional[int] = None, + browser_context_id: typing.Optional[browser.BrowserContextID] = None, + enable_begin_frame_control: typing.Optional[bool] = None, + new_window: typing.Optional[bool] = None, + background: typing.Optional[bool] = None, + for_tab: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetID]: + ''' + Creates a new page. + + :param url: The initial URL the page will be navigated to. An empty string indicates about:blank. + :param width: *(Optional)* Frame width in DIP (headless chrome only). + :param height: *(Optional)* Frame height in DIP (headless chrome only). + :param browser_context_id: **(EXPERIMENTAL)** *(Optional)* The browser context to create the page in. + :param enable_begin_frame_control: **(EXPERIMENTAL)** *(Optional)* Whether BeginFrames for this target will be controlled via DevTools (headless chrome only, not supported on MacOS yet, false by default). + :param new_window: *(Optional)* Whether to create a new Window or Tab (chrome-only, false by default). + :param background: *(Optional)* Whether to create the target in background or foreground (chrome-only, false by default). + :param for_tab: **(EXPERIMENTAL)** *(Optional)* Whether to create the target of type "tab". + :returns: The id of the page opened. + ''' + params: T_JSON_DICT = dict() + params['url'] = url + if width is not None: + params['width'] = width + if height is not None: + params['height'] = height + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + if enable_begin_frame_control is not None: + params['enableBeginFrameControl'] = enable_begin_frame_control + if new_window is not None: + params['newWindow'] = new_window + if background is not None: + params['background'] = background + if for_tab is not None: + params['forTab'] = for_tab + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createTarget', + 'params': params, + } + json = yield cmd_dict + return TargetID.from_json(json['targetId']) + + +def detach_from_target( + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Detaches session with given id. + + :param session_id: *(Optional)* Session to detach. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.detachFromTarget', + 'params': params, + } + json = yield cmd_dict + + +def dispose_browser_context( + browser_context_id: browser.BrowserContextID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes a BrowserContext. All the belonging pages will be closed without calling their + beforeunload hooks. + + :param browser_context_id: + ''' + params: T_JSON_DICT = dict() + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.disposeBrowserContext', + 'params': params, + } + json = yield cmd_dict + + +def get_target_info( + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetInfo]: + ''' + Returns information about a target. + + **EXPERIMENTAL** + + :param target_id: *(Optional)* + :returns: + ''' + params: T_JSON_DICT = dict() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargetInfo', + 'params': params, + } + json = yield cmd_dict + return TargetInfo.from_json(json['targetInfo']) + + +def get_targets( + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TargetInfo]]: + ''' + Retrieves a list of available targets. + + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be reported. If filter is not specified and target discovery is currently enabled, a filter used for target discovery is used for consistency. + :returns: The list of targets. + ''' + params: T_JSON_DICT = dict() + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargets', + 'params': params, + } + json = yield cmd_dict + return [TargetInfo.from_json(i) for i in json['targetInfos']] + + +def send_message_to_target( + message: str, + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sends protocol message over session with given id. + Consider using flat mode instead; see commands attachToTarget, setAutoAttach, + and crbug.com/991325. + + :param message: + :param session_id: *(Optional)* Identifier of the session. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + params['message'] = message + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.sendMessageToTarget', + 'params': params, + } + json = yield cmd_dict + + +def set_auto_attach( + auto_attach: bool, + wait_for_debugger_on_start: bool, + flatten: typing.Optional[bool] = None, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to automatically attach to new targets which are considered to be related to + this one. When turned on, attaches to all existing related targets as well. When turned off, + automatically detaches from all currently attached targets. + This also clears all targets added by ``autoAttachRelated`` from the list of targets to watch + for creation of related targets. + + :param auto_attach: Whether to auto-attach to related targets. + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param flatten: **(EXPERIMENTAL)** *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['autoAttach'] = auto_attach + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if flatten is not None: + params['flatten'] = flatten + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setAutoAttach', + 'params': params, + } + json = yield cmd_dict + + +def auto_attach_related( + target_id: TargetID, + wait_for_debugger_on_start: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the specified target to the list of targets that will be monitored for any related target + creation (such as child frames, child workers and new versions of service worker) and reported + through ``attachedToTarget``. The specified target is also auto-attached. + This cancels the effect of any previous ``setAutoAttach`` and is also cancelled by subsequent + ``setAutoAttach``. Only available at the Browser target. + + **EXPERIMENTAL** + + :param target_id: + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.autoAttachRelated', + 'params': params, + } + json = yield cmd_dict + + +def set_discover_targets( + discover: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to discover available targets and notify via + ``targetCreated/targetInfoChanged/targetDestroyed`` events. + + :param discover: Whether to discover available targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. If ```discover```` is false, ````filter``` must be omitted or empty. + ''' + params: T_JSON_DICT = dict() + params['discover'] = discover + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setDiscoverTargets', + 'params': params, + } + json = yield cmd_dict + + +def set_remote_locations( + locations: typing.List[RemoteLocation] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables target discovery for the specified locations, when ``setDiscoverTargets`` was set to + ``true``. + + **EXPERIMENTAL** + + :param locations: List of remote locations. + ''' + params: T_JSON_DICT = dict() + params['locations'] = [i.to_json() for i in locations] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setRemoteLocations', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Target.attachedToTarget') +@dataclass +class AttachedToTarget: + ''' + **EXPERIMENTAL** + + Issued when attached to target because of auto-attach or ``attachToTarget`` command. + ''' + #: Identifier assigned to the session used to send/receive messages. + session_id: SessionID + target_info: TargetInfo + waiting_for_debugger: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttachedToTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_info=TargetInfo.from_json(json['targetInfo']), + waiting_for_debugger=bool(json['waitingForDebugger']) + ) + + +@event_class('Target.detachedFromTarget') +@dataclass +class DetachedFromTarget: + ''' + **EXPERIMENTAL** + + Issued when detached from target for any reason (including ``detachFromTarget`` command). Can be + issued multiple times per target if multiple sessions have been attached to it. + ''' + #: Detached session identifier. + session_id: SessionID + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DetachedFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.receivedMessageFromTarget') +@dataclass +class ReceivedMessageFromTarget: + ''' + Notifies about a new protocol message received from the session (as reported in + ``attachedToTarget`` event). + ''' + #: Identifier of a session which sends a message. + session_id: SessionID + message: str + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ReceivedMessageFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + message=str(json['message']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.targetCreated') +@dataclass +class TargetCreated: + ''' + Issued when a possible inspection target is created. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCreated: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) + + +@event_class('Target.targetDestroyed') +@dataclass +class TargetDestroyed: + ''' + Issued when a target is destroyed. + ''' + target_id: TargetID + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetDestroyed: + return cls( + target_id=TargetID.from_json(json['targetId']) + ) + + +@event_class('Target.targetCrashed') +@dataclass +class TargetCrashed: + ''' + Issued when a target has crashed. + ''' + target_id: TargetID + #: Termination status type. + status: str + #: Termination error code. + error_code: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCrashed: + return cls( + target_id=TargetID.from_json(json['targetId']), + status=str(json['status']), + error_code=int(json['errorCode']) + ) + + +@event_class('Target.targetInfoChanged') +@dataclass +class TargetInfoChanged: + ''' + Issued when some information about a target has changed. This only happens between + ``targetCreated`` and ``targetDestroyed``. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetInfoChanged: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tethering.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tethering.py new file mode 100755 index 0000000..af358ad --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tethering.py @@ -0,0 +1,63 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tethering (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +def bind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port binding. + + :param port: Port number to bind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.bind', + 'params': params, + } + json = yield cmd_dict + + +def unbind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port unbinding. + + :param port: Port number to unbind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.unbind', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tethering.accepted') +@dataclass +class Accepted: + ''' + Informs that port was successfully bound and got a specified connection id. + ''' + #: Port number that was successfully bound. + port: int + #: Connection id to be used. + connection_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> Accepted: + return cls( + port=int(json['port']), + connection_id=str(json['connectionId']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tracing.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tracing.py new file mode 100755 index 0000000..9952697 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/tracing.py @@ -0,0 +1,360 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tracing +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import io + + +class MemoryDumpConfig(dict): + ''' + Configuration for memory dump. Used only when "memory-infra" category is enabled. + ''' + def to_json(self) -> dict: + return self + + @classmethod + def from_json(cls, json: dict) -> MemoryDumpConfig: + return cls(json) + + def __repr__(self): + return 'MemoryDumpConfig({})'.format(super().__repr__()) + + +@dataclass +class TraceConfig: + #: Controls how the trace buffer stores data. + record_mode: typing.Optional[str] = None + + #: Size of the trace buffer in kilobytes. If not specified or zero is passed, a default value + #: of 200 MB would be used. + trace_buffer_size_in_kb: typing.Optional[float] = None + + #: Turns on JavaScript stack sampling. + enable_sampling: typing.Optional[bool] = None + + #: Turns on system tracing. + enable_systrace: typing.Optional[bool] = None + + #: Turns on argument filter. + enable_argument_filter: typing.Optional[bool] = None + + #: Included category filters. + included_categories: typing.Optional[typing.List[str]] = None + + #: Excluded category filters. + excluded_categories: typing.Optional[typing.List[str]] = None + + #: Configuration to synthesize the delays in tracing. + synthetic_delays: typing.Optional[typing.List[str]] = None + + #: Configuration for memory dump triggers. Used only when "memory-infra" category is enabled. + memory_dump_config: typing.Optional[MemoryDumpConfig] = None + + def to_json(self): + json = dict() + if self.record_mode is not None: + json['recordMode'] = self.record_mode + if self.trace_buffer_size_in_kb is not None: + json['traceBufferSizeInKb'] = self.trace_buffer_size_in_kb + if self.enable_sampling is not None: + json['enableSampling'] = self.enable_sampling + if self.enable_systrace is not None: + json['enableSystrace'] = self.enable_systrace + if self.enable_argument_filter is not None: + json['enableArgumentFilter'] = self.enable_argument_filter + if self.included_categories is not None: + json['includedCategories'] = [i for i in self.included_categories] + if self.excluded_categories is not None: + json['excludedCategories'] = [i for i in self.excluded_categories] + if self.synthetic_delays is not None: + json['syntheticDelays'] = [i for i in self.synthetic_delays] + if self.memory_dump_config is not None: + json['memoryDumpConfig'] = self.memory_dump_config.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + record_mode=str(json['recordMode']) if 'recordMode' in json else None, + trace_buffer_size_in_kb=float(json['traceBufferSizeInKb']) if 'traceBufferSizeInKb' in json else None, + enable_sampling=bool(json['enableSampling']) if 'enableSampling' in json else None, + enable_systrace=bool(json['enableSystrace']) if 'enableSystrace' in json else None, + enable_argument_filter=bool(json['enableArgumentFilter']) if 'enableArgumentFilter' in json else None, + included_categories=[str(i) for i in json['includedCategories']] if 'includedCategories' in json else None, + excluded_categories=[str(i) for i in json['excludedCategories']] if 'excludedCategories' in json else None, + synthetic_delays=[str(i) for i in json['syntheticDelays']] if 'syntheticDelays' in json else None, + memory_dump_config=MemoryDumpConfig.from_json(json['memoryDumpConfig']) if 'memoryDumpConfig' in json else None, + ) + + +class StreamFormat(enum.Enum): + ''' + Data format of a trace. Can be either the legacy JSON format or the + protocol buffer format. Note that the JSON format will be deprecated soon. + ''' + JSON = "json" + PROTO = "proto" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class StreamCompression(enum.Enum): + ''' + Compression type to use for traces returned via streams. + ''' + NONE = "none" + GZIP = "gzip" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class MemoryDumpLevelOfDetail(enum.Enum): + ''' + Details exposed when memory request explicitly declared. + Keep consistent with memory_dump_request_args.h and + memory_instrumentation.mojom + ''' + BACKGROUND = "background" + LIGHT = "light" + DETAILED = "detailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class TracingBackend(enum.Enum): + ''' + Backend type to use for tracing. ``chrome`` uses the Chrome-integrated + tracing service and is supported on all platforms. ``system`` is only + supported on Chrome OS and uses the Perfetto system tracing service. + ``auto`` chooses ``system`` when the perfettoConfig provided to Tracing.start + specifies at least one non-Chrome data source; otherwise uses ``chrome``. + ''' + AUTO = "auto" + CHROME = "chrome" + SYSTEM = "system" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def end() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Stop trace events collection. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.end', + } + json = yield cmd_dict + + +def get_categories() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Gets supported tracing categories. + + **EXPERIMENTAL** + + :returns: A list of supported tracing categories. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.getCategories', + } + json = yield cmd_dict + return [str(i) for i in json['categories']] + + +def record_clock_sync_marker( + sync_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Record a clock sync marker in the trace. + + **EXPERIMENTAL** + + :param sync_id: The ID of this clock sync marker + ''' + params: T_JSON_DICT = dict() + params['syncId'] = sync_id + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.recordClockSyncMarker', + 'params': params, + } + json = yield cmd_dict + + +def request_memory_dump( + deterministic: typing.Optional[bool] = None, + level_of_detail: typing.Optional[MemoryDumpLevelOfDetail] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[str, bool]]: + ''' + Request a global memory dump. + + **EXPERIMENTAL** + + :param deterministic: *(Optional)* Enables more deterministic results by forcing garbage collection + :param level_of_detail: *(Optional)* Specifies level of details in memory dump. Defaults to "detailed". + :returns: A tuple with the following items: + + 0. **dumpGuid** - GUID of the resulting global memory dump. + 1. **success** - True iff the global memory dump succeeded. + ''' + params: T_JSON_DICT = dict() + if deterministic is not None: + params['deterministic'] = deterministic + if level_of_detail is not None: + params['levelOfDetail'] = level_of_detail.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.requestMemoryDump', + 'params': params, + } + json = yield cmd_dict + return ( + str(json['dumpGuid']), + bool(json['success']) + ) + + +def start( + categories: typing.Optional[str] = None, + options: typing.Optional[str] = None, + buffer_usage_reporting_interval: typing.Optional[float] = None, + transfer_mode: typing.Optional[str] = None, + stream_format: typing.Optional[StreamFormat] = None, + stream_compression: typing.Optional[StreamCompression] = None, + trace_config: typing.Optional[TraceConfig] = None, + perfetto_config: typing.Optional[str] = None, + tracing_backend: typing.Optional[TracingBackend] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Start trace events collection. + + :param categories: **(EXPERIMENTAL)** *(Optional)* Category/tag filter + :param options: **(EXPERIMENTAL)** *(Optional)* Tracing options + :param buffer_usage_reporting_interval: **(EXPERIMENTAL)** *(Optional)* If set, the agent will issue bufferUsage events at this interval, specified in milliseconds + :param transfer_mode: *(Optional)* Whether to report trace events as series of dataCollected events or to save trace to a stream (defaults to ```ReportEvents````). + :param stream_format: *(Optional)* Trace data format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````json````). + :param stream_compression: **(EXPERIMENTAL)** *(Optional)* Compression format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````none````) + :param trace_config: *(Optional)* + :param perfetto_config: **(EXPERIMENTAL)** *(Optional)* Base64-encoded serialized perfetto.protos.TraceConfig protobuf message When specified, the parameters ````categories````, ````options````, ````traceConfig```` are ignored. + :param tracing_backend: **(EXPERIMENTAL)** *(Optional)* Backend type (defaults to ````auto```) + ''' + params: T_JSON_DICT = dict() + if categories is not None: + params['categories'] = categories + if options is not None: + params['options'] = options + if buffer_usage_reporting_interval is not None: + params['bufferUsageReportingInterval'] = buffer_usage_reporting_interval + if transfer_mode is not None: + params['transferMode'] = transfer_mode + if stream_format is not None: + params['streamFormat'] = stream_format.to_json() + if stream_compression is not None: + params['streamCompression'] = stream_compression.to_json() + if trace_config is not None: + params['traceConfig'] = trace_config.to_json() + if perfetto_config is not None: + params['perfettoConfig'] = perfetto_config + if tracing_backend is not None: + params['tracingBackend'] = tracing_backend.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.start', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tracing.bufferUsage') +@dataclass +class BufferUsage: + ''' + **EXPERIMENTAL** + + + ''' + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + percent_full: typing.Optional[float] + #: An approximate number of events in the trace log. + event_count: typing.Optional[float] + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + value: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BufferUsage: + return cls( + percent_full=float(json['percentFull']) if 'percentFull' in json else None, + event_count=float(json['eventCount']) if 'eventCount' in json else None, + value=float(json['value']) if 'value' in json else None + ) + + +@event_class('Tracing.dataCollected') +@dataclass +class DataCollected: + ''' + **EXPERIMENTAL** + + Contains a bucket of collected trace events. When tracing is stopped collected events will be + sent as a sequence of dataCollected events followed by tracingComplete event. + ''' + value: typing.List[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DataCollected: + return cls( + value=[dict(i) for i in json['value']] + ) + + +@event_class('Tracing.tracingComplete') +@dataclass +class TracingComplete: + ''' + Signals that tracing is stopped and there is no trace buffers pending flush, all data were + delivered via dataCollected events. + ''' + #: Indicates whether some trace data is known to have been lost, e.g. because the trace ring + #: buffer wrapped around. + data_loss_occurred: bool + #: A handle of the stream that holds resulting trace data. + stream: typing.Optional[io.StreamHandle] + #: Trace data format of returned stream. + trace_format: typing.Optional[StreamFormat] + #: Compression format of returned stream. + stream_compression: typing.Optional[StreamCompression] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TracingComplete: + return cls( + data_loss_occurred=bool(json['dataLossOccurred']), + stream=io.StreamHandle.from_json(json['stream']) if 'stream' in json else None, + trace_format=StreamFormat.from_json(json['traceFormat']) if 'traceFormat' in json else None, + stream_compression=StreamCompression.from_json(json['streamCompression']) if 'streamCompression' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/util.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/util.py new file mode 100755 index 0000000..93a39ef --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/util.py @@ -0,0 +1,20 @@ + +import typing + + +T_JSON_DICT = typing.Dict[str, typing.Any] +_event_parsers = dict() + + +def event_class(method): + ''' A decorator that registers a class as an event class. ''' + def decorate(cls): + _event_parsers[method] = cls + cls.event_class = method + return cls + return decorate + + +def parse_json_event(json: T_JSON_DICT) -> typing.Any: + ''' Parse a JSON dictionary into a CDP event. ''' + return _event_parsers[json['method']].from_json(json['params']) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_audio.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_audio.py new file mode 100755 index 0000000..0a23d7a --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_audio.py @@ -0,0 +1,603 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAudio (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class GraphObjectId(str): + ''' + An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> GraphObjectId: + return cls(json) + + def __repr__(self): + return 'GraphObjectId({})'.format(super().__repr__()) + + +class ContextType(enum.Enum): + ''' + Enum of BaseAudioContext types + ''' + REALTIME = "realtime" + OFFLINE = "offline" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ContextState(enum.Enum): + ''' + Enum of AudioContextState from the spec + ''' + SUSPENDED = "suspended" + RUNNING = "running" + CLOSED = "closed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class NodeType(str): + ''' + Enum of AudioNode types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> NodeType: + return cls(json) + + def __repr__(self): + return 'NodeType({})'.format(super().__repr__()) + + +class ChannelCountMode(enum.Enum): + ''' + Enum of AudioNode::ChannelCountMode from the spec + ''' + CLAMPED_MAX = "clamped-max" + EXPLICIT = "explicit" + MAX_ = "max" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ChannelInterpretation(enum.Enum): + ''' + Enum of AudioNode::ChannelInterpretation from the spec + ''' + DISCRETE = "discrete" + SPEAKERS = "speakers" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ParamType(str): + ''' + Enum of AudioParam types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ParamType: + return cls(json) + + def __repr__(self): + return 'ParamType({})'.format(super().__repr__()) + + +class AutomationRate(enum.Enum): + ''' + Enum of AudioParam::AutomationRate from the spec + ''' + A_RATE = "a-rate" + K_RATE = "k-rate" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ContextRealtimeData: + ''' + Fields in AudioContext that change in real-time. + ''' + #: The current context time in second in BaseAudioContext. + current_time: float + + #: The time spent on rendering graph divided by render quantum duration, + #: and multiplied by 100. 100 means the audio renderer reached the full + #: capacity and glitch may occur. + render_capacity: float + + #: A running mean of callback interval. + callback_interval_mean: float + + #: A running variance of callback interval. + callback_interval_variance: float + + def to_json(self): + json = dict() + json['currentTime'] = self.current_time + json['renderCapacity'] = self.render_capacity + json['callbackIntervalMean'] = self.callback_interval_mean + json['callbackIntervalVariance'] = self.callback_interval_variance + return json + + @classmethod + def from_json(cls, json): + return cls( + current_time=float(json['currentTime']), + render_capacity=float(json['renderCapacity']), + callback_interval_mean=float(json['callbackIntervalMean']), + callback_interval_variance=float(json['callbackIntervalVariance']), + ) + + +@dataclass +class BaseAudioContext: + ''' + Protocol object for BaseAudioContext + ''' + context_id: GraphObjectId + + context_type: ContextType + + context_state: ContextState + + #: Platform-dependent callback buffer size. + callback_buffer_size: float + + #: Number of output channels supported by audio hardware in use. + max_output_channel_count: float + + #: Context sample rate. + sample_rate: float + + realtime_data: typing.Optional[ContextRealtimeData] = None + + def to_json(self): + json = dict() + json['contextId'] = self.context_id.to_json() + json['contextType'] = self.context_type.to_json() + json['contextState'] = self.context_state.to_json() + json['callbackBufferSize'] = self.callback_buffer_size + json['maxOutputChannelCount'] = self.max_output_channel_count + json['sampleRate'] = self.sample_rate + if self.realtime_data is not None: + json['realtimeData'] = self.realtime_data.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + context_type=ContextType.from_json(json['contextType']), + context_state=ContextState.from_json(json['contextState']), + callback_buffer_size=float(json['callbackBufferSize']), + max_output_channel_count=float(json['maxOutputChannelCount']), + sample_rate=float(json['sampleRate']), + realtime_data=ContextRealtimeData.from_json(json['realtimeData']) if 'realtimeData' in json else None, + ) + + +@dataclass +class AudioListener: + ''' + Protocol object for AudioListener + ''' + listener_id: GraphObjectId + + context_id: GraphObjectId + + def to_json(self): + json = dict() + json['listenerId'] = self.listener_id.to_json() + json['contextId'] = self.context_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + listener_id=GraphObjectId.from_json(json['listenerId']), + context_id=GraphObjectId.from_json(json['contextId']), + ) + + +@dataclass +class AudioNode: + ''' + Protocol object for AudioNode + ''' + node_id: GraphObjectId + + context_id: GraphObjectId + + node_type: NodeType + + number_of_inputs: float + + number_of_outputs: float + + channel_count: float + + channel_count_mode: ChannelCountMode + + channel_interpretation: ChannelInterpretation + + def to_json(self): + json = dict() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['nodeType'] = self.node_type.to_json() + json['numberOfInputs'] = self.number_of_inputs + json['numberOfOutputs'] = self.number_of_outputs + json['channelCount'] = self.channel_count + json['channelCountMode'] = self.channel_count_mode.to_json() + json['channelInterpretation'] = self.channel_interpretation.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + node_type=NodeType.from_json(json['nodeType']), + number_of_inputs=float(json['numberOfInputs']), + number_of_outputs=float(json['numberOfOutputs']), + channel_count=float(json['channelCount']), + channel_count_mode=ChannelCountMode.from_json(json['channelCountMode']), + channel_interpretation=ChannelInterpretation.from_json(json['channelInterpretation']), + ) + + +@dataclass +class AudioParam: + ''' + Protocol object for AudioParam + ''' + param_id: GraphObjectId + + node_id: GraphObjectId + + context_id: GraphObjectId + + param_type: ParamType + + rate: AutomationRate + + default_value: float + + min_value: float + + max_value: float + + def to_json(self): + json = dict() + json['paramId'] = self.param_id.to_json() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['paramType'] = self.param_type.to_json() + json['rate'] = self.rate.to_json() + json['defaultValue'] = self.default_value + json['minValue'] = self.min_value + json['maxValue'] = self.max_value + return json + + @classmethod + def from_json(cls, json): + return cls( + param_id=GraphObjectId.from_json(json['paramId']), + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + param_type=ParamType.from_json(json['paramType']), + rate=AutomationRate.from_json(json['rate']), + default_value=float(json['defaultValue']), + min_value=float(json['minValue']), + max_value=float(json['maxValue']), + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables the WebAudio domain and starts sending context lifetime events. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables the WebAudio domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.disable', + } + json = yield cmd_dict + + +def get_realtime_data( + context_id: GraphObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,ContextRealtimeData]: + ''' + Fetch the realtime data from the registered contexts. + + :param context_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['contextId'] = context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.getRealtimeData', + 'params': params, + } + json = yield cmd_dict + return ContextRealtimeData.from_json(json['realtimeData']) + + +@event_class('WebAudio.contextCreated') +@dataclass +class ContextCreated: + ''' + Notifies that a new BaseAudioContext has been created. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextCreated: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.contextWillBeDestroyed') +@dataclass +class ContextWillBeDestroyed: + ''' + Notifies that an existing BaseAudioContext will be destroyed. + ''' + context_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']) + ) + + +@event_class('WebAudio.contextChanged') +@dataclass +class ContextChanged: + ''' + Notifies that existing BaseAudioContext has changed some properties (id stays the same).. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextChanged: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.audioListenerCreated') +@dataclass +class AudioListenerCreated: + ''' + Notifies that the construction of an AudioListener has finished. + ''' + listener: AudioListener + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerCreated: + return cls( + listener=AudioListener.from_json(json['listener']) + ) + + +@event_class('WebAudio.audioListenerWillBeDestroyed') +@dataclass +class AudioListenerWillBeDestroyed: + ''' + Notifies that a new AudioListener has been created. + ''' + context_id: GraphObjectId + listener_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + listener_id=GraphObjectId.from_json(json['listenerId']) + ) + + +@event_class('WebAudio.audioNodeCreated') +@dataclass +class AudioNodeCreated: + ''' + Notifies that a new AudioNode has been created. + ''' + node: AudioNode + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeCreated: + return cls( + node=AudioNode.from_json(json['node']) + ) + + +@event_class('WebAudio.audioNodeWillBeDestroyed') +@dataclass +class AudioNodeWillBeDestroyed: + ''' + Notifies that an existing AudioNode has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']) + ) + + +@event_class('WebAudio.audioParamCreated') +@dataclass +class AudioParamCreated: + ''' + Notifies that a new AudioParam has been created. + ''' + param: AudioParam + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamCreated: + return cls( + param=AudioParam.from_json(json['param']) + ) + + +@event_class('WebAudio.audioParamWillBeDestroyed') +@dataclass +class AudioParamWillBeDestroyed: + ''' + Notifies that an existing AudioParam has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + param_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']), + param_id=GraphObjectId.from_json(json['paramId']) + ) + + +@event_class('WebAudio.nodesConnected') +@dataclass +class NodesConnected: + ''' + Notifies that two AudioNodes are connected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodesDisconnected') +@dataclass +class NodesDisconnected: + ''' + Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamConnected') +@dataclass +class NodeParamConnected: + ''' + Notifies that an AudioNode is connected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamDisconnected') +@dataclass +class NodeParamDisconnected: + ''' + Notifies that an AudioNode is disconnected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_authn.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_authn.py new file mode 100755 index 0000000..a035e16 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v129/web_authn.py @@ -0,0 +1,528 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAuthn (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class AuthenticatorId(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AuthenticatorId: + return cls(json) + + def __repr__(self): + return 'AuthenticatorId({})'.format(super().__repr__()) + + +class AuthenticatorProtocol(enum.Enum): + U2F = "u2f" + CTAP2 = "ctap2" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class Ctap2Version(enum.Enum): + CTAP2_0 = "ctap2_0" + CTAP2_1 = "ctap2_1" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AuthenticatorTransport(enum.Enum): + USB = "usb" + NFC = "nfc" + BLE = "ble" + CABLE = "cable" + INTERNAL = "internal" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class VirtualAuthenticatorOptions: + protocol: AuthenticatorProtocol + + transport: AuthenticatorTransport + + #: Defaults to ctap2_0. Ignored if ``protocol`` == u2f. + ctap2_version: typing.Optional[Ctap2Version] = None + + #: Defaults to false. + has_resident_key: typing.Optional[bool] = None + + #: Defaults to false. + has_user_verification: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the largeBlob extension. + #: https://w3c.github.io/webauthn#largeBlob + #: Defaults to false. + has_large_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the credBlob extension. + #: https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html#sctn-credBlob-extension + #: Defaults to false. + has_cred_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the minPinLength extension. + #: https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#sctn-minpinlength-extension + #: Defaults to false. + has_min_pin_length: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the prf extension. + #: https://w3c.github.io/webauthn/#prf-extension + #: Defaults to false. + has_prf: typing.Optional[bool] = None + + #: If set to true, tests of user presence will succeed immediately. + #: Otherwise, they will not be resolved. Defaults to true. + automatic_presence_simulation: typing.Optional[bool] = None + + #: Sets whether User Verification succeeds or fails for an authenticator. + #: Defaults to false. + is_user_verified: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup + #: eligibility (BE) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_eligibility: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup state + #: (BS) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_state: typing.Optional[bool] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol.to_json() + json['transport'] = self.transport.to_json() + if self.ctap2_version is not None: + json['ctap2Version'] = self.ctap2_version.to_json() + if self.has_resident_key is not None: + json['hasResidentKey'] = self.has_resident_key + if self.has_user_verification is not None: + json['hasUserVerification'] = self.has_user_verification + if self.has_large_blob is not None: + json['hasLargeBlob'] = self.has_large_blob + if self.has_cred_blob is not None: + json['hasCredBlob'] = self.has_cred_blob + if self.has_min_pin_length is not None: + json['hasMinPinLength'] = self.has_min_pin_length + if self.has_prf is not None: + json['hasPrf'] = self.has_prf + if self.automatic_presence_simulation is not None: + json['automaticPresenceSimulation'] = self.automatic_presence_simulation + if self.is_user_verified is not None: + json['isUserVerified'] = self.is_user_verified + if self.default_backup_eligibility is not None: + json['defaultBackupEligibility'] = self.default_backup_eligibility + if self.default_backup_state is not None: + json['defaultBackupState'] = self.default_backup_state + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=AuthenticatorProtocol.from_json(json['protocol']), + transport=AuthenticatorTransport.from_json(json['transport']), + ctap2_version=Ctap2Version.from_json(json['ctap2Version']) if 'ctap2Version' in json else None, + has_resident_key=bool(json['hasResidentKey']) if 'hasResidentKey' in json else None, + has_user_verification=bool(json['hasUserVerification']) if 'hasUserVerification' in json else None, + has_large_blob=bool(json['hasLargeBlob']) if 'hasLargeBlob' in json else None, + has_cred_blob=bool(json['hasCredBlob']) if 'hasCredBlob' in json else None, + has_min_pin_length=bool(json['hasMinPinLength']) if 'hasMinPinLength' in json else None, + has_prf=bool(json['hasPrf']) if 'hasPrf' in json else None, + automatic_presence_simulation=bool(json['automaticPresenceSimulation']) if 'automaticPresenceSimulation' in json else None, + is_user_verified=bool(json['isUserVerified']) if 'isUserVerified' in json else None, + default_backup_eligibility=bool(json['defaultBackupEligibility']) if 'defaultBackupEligibility' in json else None, + default_backup_state=bool(json['defaultBackupState']) if 'defaultBackupState' in json else None, + ) + + +@dataclass +class Credential: + credential_id: str + + is_resident_credential: bool + + #: The ECDSA P-256 private key in PKCS#8 format. + private_key: str + + #: Signature counter. This is incremented by one for each successful + #: assertion. + #: See https://w3c.github.io/webauthn/#signature-counter + sign_count: int + + #: Relying Party ID the credential is scoped to. Must be set when adding a + #: credential. + rp_id: typing.Optional[str] = None + + #: An opaque byte sequence with a maximum size of 64 bytes mapping the + #: credential to a specific user. + user_handle: typing.Optional[str] = None + + #: The large blob associated with the credential. + #: See https://w3c.github.io/webauthn/#sctn-large-blob-extension + large_blob: typing.Optional[str] = None + + #: Assertions returned by this credential will have the backup eligibility + #: (BE) flag set to this value. Defaults to the authenticator's + #: defaultBackupEligibility value. + backup_eligibility: typing.Optional[bool] = None + + #: Assertions returned by this credential will have the backup state (BS) + #: flag set to this value. Defaults to the authenticator's + #: defaultBackupState value. + backup_state: typing.Optional[bool] = None + + def to_json(self): + json = dict() + json['credentialId'] = self.credential_id + json['isResidentCredential'] = self.is_resident_credential + json['privateKey'] = self.private_key + json['signCount'] = self.sign_count + if self.rp_id is not None: + json['rpId'] = self.rp_id + if self.user_handle is not None: + json['userHandle'] = self.user_handle + if self.large_blob is not None: + json['largeBlob'] = self.large_blob + if self.backup_eligibility is not None: + json['backupEligibility'] = self.backup_eligibility + if self.backup_state is not None: + json['backupState'] = self.backup_state + return json + + @classmethod + def from_json(cls, json): + return cls( + credential_id=str(json['credentialId']), + is_resident_credential=bool(json['isResidentCredential']), + private_key=str(json['privateKey']), + sign_count=int(json['signCount']), + rp_id=str(json['rpId']) if 'rpId' in json else None, + user_handle=str(json['userHandle']) if 'userHandle' in json else None, + large_blob=str(json['largeBlob']) if 'largeBlob' in json else None, + backup_eligibility=bool(json['backupEligibility']) if 'backupEligibility' in json else None, + backup_state=bool(json['backupState']) if 'backupState' in json else None, + ) + + +def enable( + enable_ui: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable the WebAuthn domain and start intercepting credential storage and + retrieval with a virtual authenticator. + + :param enable_ui: *(Optional)* Whether to enable the WebAuthn user interface. Enabling the UI is recommended for debugging and demo purposes, as it is closer to the real experience. Disabling the UI is recommended for automated testing. Supported at the embedder's discretion if UI is available. Defaults to false. + ''' + params: T_JSON_DICT = dict() + if enable_ui is not None: + params['enableUI'] = enable_ui + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.enable', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable the WebAuthn domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.disable', + } + json = yield cmd_dict + + +def add_virtual_authenticator( + options: VirtualAuthenticatorOptions + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,AuthenticatorId]: + ''' + Creates and adds a virtual authenticator. + + :param options: + :returns: + ''' + params: T_JSON_DICT = dict() + params['options'] = options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + return AuthenticatorId.from_json(json['authenticatorId']) + + +def set_response_override_bits( + authenticator_id: AuthenticatorId, + is_bogus_signature: typing.Optional[bool] = None, + is_bad_uv: typing.Optional[bool] = None, + is_bad_up: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets parameters isBogusSignature, isBadUV, isBadUP to false if they are not present. + + :param authenticator_id: + :param is_bogus_signature: *(Optional)* If isBogusSignature is set, overrides the signature in the authenticator response to be zero. Defaults to false. + :param is_bad_uv: *(Optional)* If isBadUV is set, overrides the UV bit in the flags in the authenticator response to be zero. Defaults to false. + :param is_bad_up: *(Optional)* If isBadUP is set, overrides the UP bit in the flags in the authenticator response to be zero. Defaults to false. + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + if is_bogus_signature is not None: + params['isBogusSignature'] = is_bogus_signature + if is_bad_uv is not None: + params['isBadUV'] = is_bad_uv + if is_bad_up is not None: + params['isBadUP'] = is_bad_up + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setResponseOverrideBits', + 'params': params, + } + json = yield cmd_dict + + +def remove_virtual_authenticator( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes the given authenticator. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + + +def add_credential( + authenticator_id: AuthenticatorId, + credential: Credential + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the credential to the specified authenticator. + + :param authenticator_id: + :param credential: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credential'] = credential.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addCredential', + 'params': params, + } + json = yield cmd_dict + + +def get_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Credential]: + ''' + Returns a single credential stored in the given virtual authenticator that + matches the credential ID. + + :param authenticator_id: + :param credential_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredential', + 'params': params, + } + json = yield cmd_dict + return Credential.from_json(json['credential']) + + +def get_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Credential]]: + ''' + Returns all the credentials stored in the given virtual authenticator. + + :param authenticator_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredentials', + 'params': params, + } + json = yield cmd_dict + return [Credential.from_json(i) for i in json['credentials']] + + +def remove_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes a credential from the authenticator. + + :param authenticator_id: + :param credential_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeCredential', + 'params': params, + } + json = yield cmd_dict + + +def clear_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all the credentials from the specified device. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.clearCredentials', + 'params': params, + } + json = yield cmd_dict + + +def set_user_verified( + authenticator_id: AuthenticatorId, + is_user_verified: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether User Verification succeeds or fails for an authenticator. + The default is true. + + :param authenticator_id: + :param is_user_verified: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['isUserVerified'] = is_user_verified + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setUserVerified', + 'params': params, + } + json = yield cmd_dict + + +def set_automatic_presence_simulation( + authenticator_id: AuthenticatorId, + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether tests of user presence will succeed immediately (if true) or fail to resolve (if false) for an authenticator. + The default is true. + + :param authenticator_id: + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setAutomaticPresenceSimulation', + 'params': params, + } + json = yield cmd_dict + + +def set_credential_properties( + authenticator_id: AuthenticatorId, + credential_id: str, + backup_eligibility: typing.Optional[bool] = None, + backup_state: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Allows setting credential properties. + https://w3c.github.io/webauthn/#sctn-automation-set-credential-properties + + :param authenticator_id: + :param credential_id: + :param backup_eligibility: *(Optional)* + :param backup_state: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + if backup_eligibility is not None: + params['backupEligibility'] = backup_eligibility + if backup_state is not None: + params['backupState'] = backup_state + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setCredentialProperties', + 'params': params, + } + json = yield cmd_dict + + +@event_class('WebAuthn.credentialAdded') +@dataclass +class CredentialAdded: + ''' + Triggered when a credential is added to an authenticator. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAdded: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) + + +@event_class('WebAuthn.credentialAsserted') +@dataclass +class CredentialAsserted: + ''' + Triggered when a credential is used in a webauthn assertion. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAsserted: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__init__.py new file mode 100755 index 0000000..e825da8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__init__.py @@ -0,0 +1,60 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +from . import accessibility +from . import animation +from . import audits +from . import autofill +from . import background_service +from . import bluetooth_emulation +from . import browser +from . import css +from . import cache_storage +from . import cast +from . import console +from . import dom +from . import dom_debugger +from . import dom_snapshot +from . import dom_storage +from . import database +from . import debugger +from . import device_access +from . import device_orientation +from . import emulation +from . import event_breakpoints +from . import extensions +from . import fed_cm +from . import fetch +from . import file_system +from . import headless_experimental +from . import heap_profiler +from . import io +from . import indexed_db +from . import input_ +from . import inspector +from . import layer_tree +from . import log +from . import media +from . import memory +from . import network +from . import overlay +from . import pwa +from . import page +from . import performance +from . import performance_timeline +from . import preload +from . import profiler +from . import runtime +from . import schema +from . import security +from . import service_worker +from . import storage +from . import system_info +from . import target +from . import tethering +from . import tracing +from . import web_audio +from . import web_authn +from . import util + diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdd17b5020844ae758ec9abc93480797e422216b GIT binary patch literal 2055 zcmYk+Id9`e7zSX;sRWtf_M_1q)BlRE>clkf=g5qm*Fy%#TB?h6>$}= zQdL}oYg7|Y!BaFPuETYzi>KjfnikK%Gc+Tfg=cA2JO|IwoVWous3D$*=V@NN058yj zcoANtMe!26L`&jjc$t>PEAR@fh*#lNS{1LsYqTa_hu3Lcya8{}hIkX+q)qV_yhU5$ zZFrlu#XIm0?TB~bUD_4z!F#kP-iP;TUwi-`(1G|6KBPnO5qv~P;$!%jj>RYN37v?W zaFd$iQ}~ol#b@vtor%xkb2=Bd;1;#S7w`pLh;7&=Tik}*)E0N(4t2zr@FiV}uiz`X z5?{mDbS=JtZ|FvR3*XYM_zu3KyPP$A(|r4P4)?T~`&@TDPo-(l4Z^?-QBiT@AaYHh zV-$*R<_9K)%5G-#eGrClqw9JPy+miR@1!bu3_OL}`EHmgqqXTfD$2r_DN5Z$KcN?T zSn#3%pm17b_Z!+^N1R^ zf1Rl8yTJd#&H&O1xKnJnxLREb- zDo(LE{2;}9GfY82Nm_Lb|0*k4C|8mJ_Q_}6#~>u4A_gM_zK zo@^q}sICUFuRdW`zl%~ahzFT*ph^&@1La}IxKrp3RpOXL$xem3hsw!F`GL!WA{FU` zPqGv%^Q4mprhZfjhJpFP6L%{N#(Q7GvhH;fxv?DL!mFZVu--6;`BzGVM1|V*!SbtB zmy#^zUZ^gnIMj%zE~m=NlJRYte!d?LFGL=+^!2!E<9%|1_?{oWXxyZy_*g4OnLf5F z<|iwe#P!CkJgKh3SCYFw7fhcoY9TX0_+9hOXDi9$VkZR-yqc|~$Wh`bb5uC^?VZ#( zra0;x(;PD#vmA3A4UTz^1&&3IC5~l|6^>PoHI8+T4USEYEskxD9gba&J&t{j1CB$E zBaUN^6OJawDaRSdIY*1*g2U!$b96W^Ij%UaIc_*^Iqo>#aJ)tQYJEXk|NUh5b)@Vl z>$_3p`t}FyWqc!3``f^L%(`}`-EMtwhiU8k`_?zwSGI~D?J(%tgQ4l``0Ao_X{Uiv ztpQ#DxId|#s!+v27TGu%KM8QlY)?m#j&1yh;bjn}_G9O&Z96#Rz&OsuVEDQGF4BG$ zs`trztcu@5>2HXC^0{2@->Q|{7+K3BYhh$9jjWxKwL7vFN7mfPS|3@B7q5*h{H;nK zbVCz*V$}A?T9L8y(z-8AvoDqCfL2U}R?LrS$1`JEOtmLP%!bPGuVW=Jnoz`87`gnX K)kxl9!T$r!3n5|v literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/accessibility.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/accessibility.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc4acfb343f31d9866d86201da6bb8b46bb1e14f GIT binary patch literal 27449 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 Ip~P1GFGtK$XaE2J literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/audits.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/audits.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad3d23add70f1c009eb420b295d2b05f86414925 GIT binary patch literal 78203 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/autofill.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/autofill.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..014aeb8d0e5aa358e1a0ca26d1111b617942ed8d GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/background_service.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/background_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb4f71673207f5deed482e699f79d238b8a6a649 GIT binary patch literal 8048 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 Y>^l|qFck};7?8Ty2z#H0Jk^l@0msuX0{{R3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/bluetooth_emulation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/bluetooth_emulation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ddb33ae2af99387624b4a7811659a8d106037ac GIT binary patch literal 7539 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cache_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cache_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e50883d986c52eb621a52a7b929aee21391a0acf GIT binary patch literal 12126 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 DT-M%B literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cast.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/cast.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e8004fd794cc297e73cd700bf90b8623efc3e59 GIT binary patch literal 5469 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d307d6c78c687d1ee69fe639c572c511d7db4f50 GIT binary patch literal 3603 zcmbUkYi|?T_0GfN$JlWmPGA!PLlROiP(}KXfesVj8)7<-^v*cc z7PO(HRjmEcL_!Vu6z!L4QMM8v`yZ-GS!JbKv#GjOzjVKa^;Ug+>bZBu#tuP9JCe`6 z=XLKn=bn4c^`BCy1cL9Oe)Grg97%gFwY`Y8f@%NtBgrhu?7l9B@o>mAI~PhgA9# z8hjy9vjXY_C;F1>QD1SL5-kuvVuH7(FMH(Y-gG77l^2Tkor!A;EFy+^14M86Qi+-` zvx>HN%a_ffO?;)`m?g_DgvY>R!6E`bq2347b>ua94a*-0_tD+(pt(i}?h9C8-U3%{ zr3Z81iXk^lyjB_D@;HNTtd$pOzT*0v{$IfB0=sAw*<`z$%odhD!#fgQo zAN3raSykz4Ptb{wJ_5$N6#z?UH{J8W;)+~*V{mg|V_-#I`Ej+QcKFCjrdE5aR~Y$x_58M~)dr4jp5HhRXK3tuyrF&M?I_!=Lt%=Cags1K@S9Cn+o+$v#1`M{A-Dl9H=B_QQql2W)-kJl=tv`T#(-3qVDb*R9t zST^>$1XNy^dX(J^UxH%rRP?2S>Cy}k!X%`UXgsl(MDGgk2`>or z5ZI7a{g|%XhDCJUPw2Yk;F8JaNnQV0$uL7sRM)Xn0CHN_TiS@O@4Lmck3~V{UBe=9 zw=g{dl&6Sq#$!a|K;VE?0rw_=U!&);7>Vu0P^$CMl|2O|(~sVVLG5^S8HVF0mM(0^ z2Y2KVK!!$_rnVDDcjOa*jGSEh?sih!k-zb!tVS|>{YdG0F2*8>y408j8?!wN@N0hT z4h*xB&CI)k1lG-=+!loga07lPtP2l>vh)Y(o{*I*hj=fUa)_%z1D$70Bj_$l;9{jW zJnD&pNemkHC3l*_1_)9mR{^p}ho(cWrlP z_at#pS-J#HclTG{c{ugoI_ns}N+gA^?bn^aucB+rn&4Yl$~5d)M$sPA7ASulxY}Ha zdh>)f1sc|BETy$s0s+w|S#YRFu;w`$2x|qi2n9HZ6FmWzR?>|i;b6lcJam+K8`SaO z3PnRc{U&fOGVcCZ48If$ngzM99f#lWIJ{>c90r%z*yTPo{e~xiNeawc*U{z-+U~SA zTZUJNVY`|$$MpE>w{M5q?_x~w?b|GqigU#Re~z_=sqwm*Al#l;MM(+RbQ~Q2etVFT zJYj|o4pJr4IEGex+CnG6a_|ZD34pJD-;oGbu)Hic-Z*&$9-C1=c{O-|aX%|(x$~D@ zw*><_Y!haMO6Vf?4q04GnMLY~0_$ zJ{Gsa#~D0Hq-i<{GFc%Q#Go>Ef|PxYP5+h0i{tHEMC!Hdy!R_2X^GH-l^60byUngb*orGqd~mhki#0~!NtX*$FJ zw{4isSnUqVDO2RyH(|offO4t?<+S6-jy&*rr1MKrYSu)U1=@T^k)8py%4GN$zDR6B z4bP!BTK)@+X>G`~W0PC(4u@_rR|4CiTTm8yUoLq?lSY_5+%>iN2ZFdX$|ZJpKROXKGy7|IGKlWD8mENJ}K$xAMivjFOf*|~>0|~=_L#O_Vj(>*K&rs@f zA@Ofwl$;T>V5#xzu>0f1{TaN@ZPD7WJO D+Cng- literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/css.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/css.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b54c2b67f5e0b0d849a0451c373efe4bfc5f884 GIT binary patch literal 87986 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6596d7a2321e2397bab5ebf5397d41c05fd7d84 GIT binary patch literal 6176 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 ObOI!M?g>z&-uXY)W=J~# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f67c2b7a27ce788f2f7c6ed11cf14db48251c79 GIT binary patch literal 54917 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 PsEn!~zo-D>>ht*@TsVgk literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b2a0447d6004b88c5d6ec190fa70fc39413b49a GIT binary patch literal 78769 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom_debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/dom_debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b00cb742366a7b672725ebdf8b21718805d1ace8 GIT binary patch literal 11056 zcmd5?TWlLwdY&PNcgeb#x{K0SaurjtZnooiZO4gjc9htZE6I*SM;VVeBWWCx!<-q) z5vw$E)@^O``0H9=6B0Fb8Eu;-Ze2Gwh^!N7NN|L7gM&4!fbRGwO+X!(KYh1$kfC z$1*nN6eGE>F_K4iU2e@!T72KPoB41p?dgS{zNhruB|B-~8t7Yl-)4@#Z;=ewc^D5P zwPITQliH+R*Bs&cVh!|Zm+G!@;ReWc6zioYBGvZUV|J`JOa!Zi1}g6XS7J7j;FAYrg>g zFhQH)lUL-pE<~cDrWw9D;kDW6kT5YdJ_r3hlBkQcB?KkAq{iUoBFVU}#N>!|MD%4H z8@qJ?inkb<39}Ltwn=Q*F4@AIWDh$eF6@*X*O;(Nc1zA{OyP(PQPg#!EF|@kx|+Bu z$pb`=sVlM+!CmJc%!9nJTkVj!#jG)x^DQOsS>_%ay2l!h6)~EWA;W2MbWy{x{4Z|| zEvqqkD3)9nV=+-0nouLj7#ycIbV|`*O)dyT9V0NV%2czs&H9TUMvWx{*q|+qQ785sQDA z$0IS1r4cf>K;_n$HTJ%BaI*}lh3b3EJ)2>VL^XrMNi`hL^8`m2o<#y{qigBdzLr8` z2lTa8^N)3nA0PU`YTDgOnxHlm^crqKh>I~<5Dc#%0DqHF%-0CQyGb!>wYUU9QX^1Z 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/extensions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d16e3f26d22b0ff0c0b1867772206a61ce5d4f3 GIT binary patch literal 5059 zcmcIo-EUOK6~CYR;q?dp0^2dkB?*Bw?5_DJMOH$zvcYkoriv+2m(un1&e*=>ez-Gt zm+sa`CPFGGkpg+Bt2Phh(L$A~s{cj%0HRWzn^vXjOY^p1DwRC-oVmN+^@0&3?X`C1 z%$YN1&dmJIIWzuaM@O3k-_`t&7o;7M^iOQmKRqPmjXwjiDiMjuw&ch;S(b=GR9kV> zoa$&f4cZdXY~6|EB7)ZKXf6so-HzpAiZm&a$Tf*XY4lQ0U3sIvqlR>@EiQ$Bq=Uq+ zX}LsPBAsC&vlLYWuG=OXmX$O8+Sx@$Ug;OWxAYr<$ z=bOIex%?{`c}kF=CF=V5f^BjhB+li(H*v+^i9z-T?nlYOC_x2jblKp zN>s|pM9L{d&Z$JnX++KGM9W2p4%-7;l8ezeiC&ZL)O6(9%CTfTNX+;iGZ$!5=hcs-nyfFmCsU;T1+;c0vO}mt?F?WKkyd8=aX}zoW zlgf?C-Pqs;uCY)%8l-V6!tFpfu1X4Q$g+H=wqY|8>jL%~Vn8j}JkW4Dj^ho3;fNqU z&paozqQBXSP4*y2)$I63SI^C(AC>RM23Q|(r;~{wme0GUL-YBdEuVKhQnZn7&*y(y zH0@eXG@mD40oc)*lQT0@XQu=G%-QkmnLwNQ(e!u_{eE^jJ9%<~^`boq0Y!(xMiYi} zGu#Lukv57?o{5XR1n)Fan^jI|_bq%acuDAEDoLoe8NMepq*AtLl2l{N_?anV-ZmF_+IXM(MdtD*g;NuT=N72Yxj97WSv0vZ zN2zOAp-Ggajcmz;spf2ISo2~?!M4Cr42v5D&vj|R2WyMmau=|-W)7o{2fjh*TybFm zx>8Hl5-b2Lf<+RcCY7Qts!bJLZqCz&@r_YJnHU6h96n=G#gOq}XE-P1imz4?W6Rn^u zKvKW0?5RqTK>Di{!@)bes8x8`WSIVzD-T9`o5)J-eYXs2q^U zEXcl%^=ui7W{w#n`_C?6zBcXTh;bTN%_CbOEf&P~!^s4Rrj-X8>Z%Mi;d+7kGvSU+ zLEPYMFOJc0W7iaxgocQ?YtcZ3H3sd?>tGq|76_Lub^sd!-%+3t-|&SH?}kb8^^uSg zVHym{-+>?JP=qiauEV@{C&2vZ)idkE`~NaLdT)62{_tVoymL<*T#qL1Mt6O&H+g?> zX3#GJmHw~K1^nJ z%6H<~ZtV}R1NCf2`4j~ImyYtyoTMCSb%n~G#38>AfwV+<1I;2Eyres937g**%V^JY zk=y_;iiXe?SY>J0Yk{iD?k0$0t|-x`P&&;Hq4;4a_*0PU3kS8J?l{Q)0OfxIMTokA z7eL(?d-mS%f9vzUUu8cvZ};8nhgckj;X_a1?drsnM+s@?z8b*xWux+1JgaEG?+5Cs zJDIpc%z-W20!)EO4A*H9W1k<1l`s+$734LDuj;ZY;;UBHMeK}JJ`;c$x2egRvwh7m zpC2&)?+9rCpfcQa_64+do1;(a>u| zBs{l~rCu;!o`b}<#JrM4ARjhV2}E7CY#VNchC>;=!;H(8zX_`FGXv`!-C`1)n$nD$(HF|H3fu|b@;xEM7g zci_Wzz6kFqc-S)Z`9LfBmd!8>F~mcV*!&L)j|~$m;8T@+<3|-BlIp2k~PYI@Hyp(vk00qXY7*>m56)D%1~l?y2ff}=7J^WNAn1uAwZFgC4YlZo8oImt Pt5Kv-&*L~y;x+zXV*4kp literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fed_cm.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fed_cm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78c3586497d325d0a8a60a877106f5671c2f5e0e GIT binary patch literal 10332 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 A5dZ)H literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fetch.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2cf24d2daa792e783ba313276cbfda39a4eca0d GIT binary patch literal 21616 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/file_system.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/file_system.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..343343181cb154649d124b5580851ccd045c2085 GIT binary patch literal 5077 zcmbVQYitwQ6`rwY{F=NINH9rkL&C-^enG-60YROZyr7{==>G6RE#sLG2S38hB*N$7DuRNBv z7kuX2d(M5GbMAM~%^$0)Z4{LEBiC>Jy^5m#hLu8LHHO~$9WYB2Pw{kuO44DPrg#Hy zOc;{JurbMm8K_e{lVFpku!-<&!W=e38=J6%Eud>kSd+G}jr21E&xJXf5=;hakm4;5 zDBiki(B@jz=MGotQX5FQUD9e@S_RVTUD6sWrTyb;`I-kzxHiMO>%PR1-L%R@Q>nBZ zmE-A@^d*gL29*Baq2c~(pl{`)a+F9$p=M4A^4+v}8(B$C zi_u#`OkXnj7_|z$bs3l?N}$3tPlXNN1=9&e-f#|Dc_VNP;aK2IghQ#BaA1xwBe1;n z0aY}HDPwbUDl-sI2&z$%MU_cKlfvvleKFo^@uV;oPsN0bQ|Z`*S`GVE6jh7o}(sp2NgQucaG+1Tr)_S z@^+1%H1BRJj0io6Eug1mw-!i^`nV)GD>Xn$tT#uGQEqlrtOl`KgFi`lc`7_j^LojO4j8?&(kSf=@`z_!9A(zNw5nkxrfR22T2!>YXFXwDH(9D$tUjN&+x zb)1Fv?2{<=X@_(7zSrHJA5-|eR znjL4zIxeP@TAbA42nN*{OGsi1@OprVxCpTg$ZQSqO|eG@Dj@*OQ-7^(*r;!Mcy0OE z;`MC(kqx^mXZI_1f6m^k*n6LKKd({FUdh_Ovr&KWp}ah>IG3&O*l0NLkY7H%n8-F9 zePw0qY?~BowTX5ZaP+BJwL~I#`Xdq57QsV44Y3kYt0Iv*)6s-3sf|R+U@j6NA*6By z#*zX=Cr=jslp>>QJKVFUKYMJpjrZYC}qZW5h>zT{|vFv-Ra#=(-zfm9B;-PpUviyadS! z*dQw}MSo#E{~tPrsGk^OhFfsjZb0$9PzSz*jwYCNM=9&sp!J+Ao|=+s zVRbNSQ*l%cRRK3+2Aa%tw~TW$I+oUJwkX&aET(c=6WU60v*H1mM>|n&a+F{JnhR{~GoS@RDn z9YYJuTD4QLxbod^=ejShcVEo54=CLiSMDs|`6TmE=Hu_LbzfB42LRn}D3-%{gtzUN zEY&$oZ>#MC5=Q8XHQ2%Yo^1}gnF`RuONY4pIWVsSy#j=lxdlS;o}m;dbA|#yf-`DM z&OrPq>jjpBUL^?CvoBC8mWq)MX(N5gtm=nrAGhjPq<8{`5j{ZM#vQ(c1_Fd=6Ac%P zVmtEaN6`nQ(vt-98cUum0^fO5jRM&Pe0hKOTF=nBe>m$HQT)Rzfu9>62Y+E&^A9VI zk$lgYXP)(*q3oeyrDy2Z^rMbXydQa2>i=wi6FMn}hF_T(L_x-C+y25avaKE(me5B_ z4Z(x9-?Rn~SB;7esEeIQ5GS>WdjmNnUie8!bVPg6(v@Yp0M8mbvdqz!3=3FRLlBHD zVi|DSP&hyge#N4jo8B6Lrq^RxnBh$o*&QpGDzZB>q^CBuxoRe&+ zUz0;tpdDbGYSS%-)~i8V^%qU0+BBPt!u?u+IlKr7xQRW;okl|93B#Zg+#LJ3umE*e zp@(!END1oNT)8%n(&ovv^(bvU*|xU;udXW=d)^bsd4lVnVAj>Ac!DeR6W5w2sJQwN z_SzInd!DP!afcP|@EZ3<-qo3N1r%3cA@s0SscP53&P*NYrzP~sZ>_;2l@M3V>;3>@ z9pZq~%3ittUcN=2mS&~Vro9dl!95KI1E91A;JNnmZV~>%*f9k}gTEF>uBBUP>CUyB zS6a?Llb>H!F1(X%xeC5rJK4AH>Cd)?6i@#O{b=lQ{m1XFdHR*sQ2x|~=iSPw!AHjB z(BoF6)thbcmEaE`Ym~l9mm0ReXblk;uQmkRY;KF_gy}^Wk|RitA|Wx0*RR-t1mSxp zRGz{%B!lpi(2yTcFj<2)%Xr{>@K~1Vgs>;w@WQzYXfOqC2jrI+Y?Mwuxn@Ad4Qg9mqcppH?$G~T7%>@07C z6YT7rii**sQ^!M00rkgMB%xt&ucjsn^0b(edYxA_#wkw-&O&0Dai(uhLPF|{%A_5U z#Y_6B&DzMjp}o1(=x#Tyk~8zwDHS50JX68ssWknTblll+S~6fY;@P&cF6_uqi{ zEznafu_PwK@EXR8T|$%L_Q_?bR>J~{S#m}UfiQ+zSAhJ3`u9Bbs)jo3_}Q`ffqYkA zu4_c;8p(EDo*!7_Iuxe!MZ=r zqgu{s&#&_$KKAf|D$N1eG}1Kv&l-w8`WNc>=alO+iu;VJ{+v1h|KSW7xPKY!G^8^? wwv15SB-LIbIDi5mx&W(wB4|MY5M6-P(>3(Te8<^MBYa<2&%I*dOH!8q04@_{*Z=?k literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/headless_experimental.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/headless_experimental.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d954f61507e223c059ceef2f36de100bb2ba3d8a GIT binary patch literal 5041 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/heap_profiler.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/heap_profiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd48e10e392462c7e804f22dac549da401ad8a37 GIT binary patch literal 16599 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/indexed_db.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/indexed_db.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27a64c37f7433f0e741919d29385ce7aad8b3b02 GIT binary patch literal 19962 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 aemhkHzf=eO>Qx}+=DcI@F$9prIsXGa8dl{1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/input_.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/input_.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e9d10cab2ab81561d754599ace223351028e92f GIT binary patch literal 28497 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
    N^l8n)cjJcc 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/io.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8615312463d6bd922f3b2b2aa2646944f91c706a GIT binary patch literal 4025 zcmbVPTW=g$5k5VAnI4aC>&?xHqdmEMjO}rfC0R^1Y>3H)izBVG5}FW=d-|M-JL${p z=^i^XOcp0H!WOI)9v~9%2SVVTN8Wj{Wu&!wv%-iM_H7mivAa)Hou2UxA{08AbFEXS z>QvQNl&2O{Pb+9J zCrop7&nOsjth?z#8rF2zESNxRxEZgb(4mkNxk^}ifiRP2pQ#D|LT82~|5zu>ENF!; zoH5z9cVOPlIu`UocYB5Puq@E_)bw2Mr^qO$#97PtgUE`Uzz;uFa4i*Q`7HONqU~B? z7-w%5zddzhvN&=5@=c)6Fe|d;&LqszqUuME$L&O{q;1KlY+Qi(Pv8|eDJYB-QcNkR zOlK*OLE}0zn7W`nYn?0@i=?bDZNV(07s-94U`~--I_{i`1h>3vmd{*XpYNdX-JEek z3jeti&2T}3Qe-(kXS6H=k6NG&u6jJ02^b9o4J+Js$_@}%A)THsxj||CLbd9!i__C| z4rsaLIz7F)2)r$yzW3hs2^y5CMZXD0MkSGrFVy~U47w^C1`M8%2ALvHmC2|0s#?h1 za)<=<%OB-u0*~jt>Wt-i7RyfrcGZLT4f9u>=vuXuKRq@!GGW!iksIZa%K_tg?$733 zr{#9jMk}>A9Re&Z_C*Y3_ z(omkYUSf)fPFNOQ(17cxwj0J8-WDPYN<|NJaRzOZ2(fR65S#1!fhHj&AYOxo9dC~DC1tq?gI_2RVana@Hi1?AqD}dilm_`QLrB}tw&c#GChNW1g&F+e zgIrFHjdCD7D~k27THzu#i$%dJqFBtOL^rUGGsPq_ip505d8wl4hrRmV?fgdDClA3^ zH~`J(_{K**>KR<=8T{Ser~6lOUt7(6eYNMpvUx%33NL5~9#w@Ot6?N^nn3diJS&ik zK;+3~P$=K>c(E9F6pLQKsxFQ@i^cb=mfPA%7mF;gL55y96K7@2CQ%{wA}bU)?rJGx zbJqnG6>$(&rQ^PnsD&5GThWf;SD^WPfqa%yb#ud1^gT_37_a>!rRe<|DvX*q`j?^T zZ#M}vQYU$OhY``Cj$z<@9|qqc3OH4?X~edn9)RKQBIT~Hz28unf&jx(Fj9Y$dXQ?Q zeyKcB9;h|#_v)OI)9Y0kvzOf<3S!!l}OnTGOEZzv6wsc5H03T7#oY0_#sj0~`v*3hKYbe3-DvqW@9 ztrQ9;U=5wL9kRZ{QV}AR{9xDIzPsaGX8TTAog&gBI;q93B7O7DN{&c zTUl$ERzzTPNMCc1??6_(fR+Q-4d(CwGKEAPNe;PDIt9swMzsnLQLn`1L+V*I8u)IF z0;qw%1AqR06_Su+x$CVD%=imF$e?+u4^So_cB4`j08o7ac=}0#1oOjMnVY&H)_!a z6HVTA23E)57k&s$f+a^^h9zt1uH|(9+My$h#^U`I^T1j*#mdqKq8n+`yRWYES8d8X*Fae5;;?m*$%EzGRd-fcYJ5bhil$4DOE?!Z3mBVYV=b9??>zQ*ebm*mw{|4dF5?ufQ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/layer_tree.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/layer_tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aec1757912a621366cbcd43e7c52a6ca3e184d86 GIT binary patch literal 19212 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 J3rI3F{lB2XK`;OS literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/log.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/log.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b828b48bf6fc53ec43cd353e7aa01e1400430d3b GIT binary patch literal 6962 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 eQjx=MQg$9DhM~3fd3b>O>PJP literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/overlay.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/overlay.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a7a6457b40cdb619209f9795f0d98b351bbc190 GIT binary patch literal 56902 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 e&SuK(Dx49dWltHd literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/performance.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/performance.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea845df9a746561c9a7354ee3082d7aba0d27ac GIT binary patch literal 4036 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/preload.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/preload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb685f13be4efca932fe1e94c3544beadfca1cd GIT binary patch literal 26821 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/pwa.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/pwa.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96ba91f95ddb9eec2d145d8420964e58638d666b GIT binary patch literal 10851 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 n!$R*)&jWW^&S1(f}@_=6Ax-o$E5vlDI8Y} literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/runtime.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/runtime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d24de8c341fa1f202c29d0527b843cd630febf31 GIT binary patch literal 66310 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 SsGw{JjBLRVJ$Pgt!~Y8zi!)mQ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0240cc33c039bca58bf602a92138ad67508dbe37 GIT binary patch literal 1817 zcmZuy-ES0C6u)=o?(D~GKenw_u+UW^vZUQ+}n2Qe607* zmTW_lDwvc=qV>U+Cwv4^{}Eq6Vr&MC8eimXu^7cC&z;$=3-Km%_S|#MoH^%rKK8q= zt{j5%p?QAxJ%Z40^3p!3gu$EBz^oyPD0Y#Ds~97yP}NmDwW@lgO5lztaZ{dF)nY#7 zrmJa?rQA$4!!!jQLsYwhX!^F2_`KcvMm0;bG;@VibB$Cf_fSepIMOZO4?-(+0$)7D zQl>;YTVQ@@+O8!;q@On5oH{jWR!$r_4fa`Tg;uPYv|EnjA2qq)%|pPfA%?1$qN?&P zBvMtW!U$ERCgw=YrLLfAifJ;~tq{|VbSV>QmB6zce{nQdgi~R{=1xsUSPW*0;T$X0 zcn}75;1+3YSdQ%?RfIeuzU8qfy}-DD7i^hP`^XUC!JB7*SwrELuKoEXd zFfe6Mi`@zM<<|WLh*9hTvWy<|^nbFjLN*3pTx+a0R>;bktND%XJ8z6!AA!r+t34Y% z{VVz=*dn_V#WVZjYh7`c@KkOy8+dzK1RgI@KN~h*)wcXKxGwH-x=|C8BIb_hp zs_hEi3w#S^UI0GI&hWrX676jzx+U2ujb8<_jDGFudr%no?DYEX)${iXFFzO>lLj`3drY%q z>cnM1M1zy825SXg62o?0H zVk@&y*b9RQEh*ualX)oZv*(i1F6XLpZ5x5NmXs-=IOZ;*Z`6ypL>4FGxqXL)b?%Fz zsMl%%4;gJuwJ7Ie{Xw1>94wx6L?~Cl|5(aJ5orm2i-oDAt!G)7)L2C6WK)Qel7J~8 zhWX6c9yQ|`m7Nk{N62izSJEvyc!09WWh6Ktg?7Uu-T?AD`g<8QyHU1qr|*@fs_f8~ zk3$vuwqHHGT-hj%-gLeizNb&z8vgS2Ye#>~58cfVt-t+4e)#6_U47yXnRxQOKJi4z zE%8zB0sQ&UIQcen07KhqNw$lxg^ily&z6rdpK&V;__>ZfJW_n>(lV9soJ$hEaG|8j zW}K-5w$O}RrWKKT=(t?|)o@w*NZ;D!OmI1+5n+Dai?qaHf|N{~?~p{cdxA^mP}1dx z`CgF8$rby6G*yi8pWO)W`Wfy03B7b5>Gx6BFF5y?@*IYl0Rla#=uLTjJeI=;W1s&5 D%@Vbd literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/security.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/security.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..240ac1b5a4ddf26f10c3c8fd237a8121c1a1b20a GIT binary patch literal 20575 zcmch9Yj7M_c3$^P&kJvWcs~a(0s|5lz9doKjwwxrT#N!r>H*I8Flk>b+E@rH3;T2&HnDwXoIhW4O(=?cBh54$QqK!V9i z`y-X_-0tb=9t;RcRlAMC>3i?F_x639d(OG%+&llhyu5_N^Je&4=l=2l$NfD;a*taN z@GF-c9Cw`)IgyWZGyD|KbD~3Z#vL=xDd&tZB_Pg;Lfkduo^rFWEAE-{Ak7u`PI-~n z9rw+YOqKAQgFDQLo-3T_l}bNy>h({Ru~Z*YOC-2F%UOz?W$Waul-w+D zIr3I~g!a?(k^bVQsu->kxToI!qytt24EXk zVe426n}BOxr-k)mKy0}pOf}%$ig%-r)BnT)u?_L2T%6wGCb1o9&ABvjv)F-ni-VJ# zqW>daA0VS;o%niJVav=hY-MG-3(EAMOz)ay+E|&51!ekBrhm;c?eng{;6GBs0=!ll zNhFe~NGg_0DE~;U4LGz?>7tZKg`@F^qG+X);b$ktL*bFJ;YsB8iIG%o0? zQoaz?yQxEi3i*{ii2p9=T;is9k(+Xe{FGC4i4Kg9Ah|@h=)5ABy?0;b&hnyg#XIG> z%Dv7{c_+AlM=Kweo#1qGMhec%O-E*CB4ThP8J(NK zSSZ26vDA^dGr_G}whWF$=9R(mvxCD)Q3^_li@|v8OmKESHJwasAKJPtsKipz;A|v% zA#zSqf~Z|e#O7v#m!vbI9J?sV!Dw=3CYcC|(#2FV8CQZAw{G8pe9<{MmYN@$o!306 zWca+2Of1ydx<6zjZ$MiW55OX~RJq}5=?a2e)L4=frmpJUtwG>An8ao7GM^)o2~I9U zvRn@Ep+j><X%U zpR|p=3khuO_aX4lc`ymfAnN>9q{z%~9d_xrv)cgZ(A;0P^L+gj8ATW#A!D{u?-whD)GMTu=Hl;H~+ z=B{jIK&=dX-1}jlI7T~ ziO7r;4r?Xh@Jv#ii&MBP9DZ#s5;riOa9B)6(S~Z2(Ms7$n~^|UqTE1LQG>K{qc>40 z9!DQ}xecj|g!k+Hq7SmKQs?~0pu)h@d^clARD?`m3cBD74QUjngj znFC;bVx^-fXgA~iWbD=mCiU(bF~QlfHfmbj2VdDcHe`TS8mqrd;ikwZU%UDd&=M zOj1}G&37iA#G*YDmlkT1tSymve16bO)r3ScA=yaVWGh50#8%Fm!<7#h>kX{N#n_Wv z0i4co^x2}RUT7>FoZM>f1J+n&SnY2wTw6$co7fzEvn4Or(&sHpoe|bT^Q!Ng>wEwO z7SGP;&~ zs1&1TVnVE1eJH52G67mQ3Q-!-t<&XQ_Hxy&i(^YIThl`0Qfc+#$U}j5H8VD5ss#p##W(BtSAik2HnmS@T*dO^!2QmF`4$`n*(^Cf{&t$f1Z*Aoz)(!zE|LX*>y zKgY-YaY)fPQFDY5sy`{4G^`6K%`=y{kVsxikQkjy$&t9`jU`xlNpl--A(l9sT&T>Y z51x^e7o@~DCPJBbL2&}Cv-K!PeY+|DAOXhLO&*ODr~c2c5aw}0W(|sKuz%1bx4rZ= z3%QjSB{$Eh(9zKN3n9%D8a*|6^1w08I~JN49X@q(RC60|VJviLT&v8bhYy|{KROy( zhXl9N=LrPyuj~gfSSM($vT^b7QbhwmWz*u3rSiJPLyQ)e>iZVQ*C9x%(ngRpet7tm ze*nxAdRpnGtPylA-WGWd=#r?nEW^_UnY0@l2GIF;0dGf?idc1yM4>4*}(BtAz**knt#b$5derT1N{wvW34fKPEO9vYR;KRRBN(!%@~@nB+E(J#-0SwFi4$Wxd-NPolBXjUyh@`0d?=Z zm9d}zJ(qcrCsG2I>L_@Cbr@J$Rrq;Sug_N7Qi+I`e7N{D$MQ<6Xz^ zxdp@##wNt5m$ayY2UxZMQ7k}ZFf zB*9+rpkBrjfF+%@-~qP8XfN^Gf(KZ}L{PSf2?1EfSb%LUD2OPqSP?mb8n4=grFE=_tim8L*^X6g;d{k#v+|Y!9V278F60l`4{sQjA4j<|jZi zJfoXSTwp^;9ziLs6f0)b;5hOjq{v5DvcXhB*aOJVQi_i;i$laWJS;ew)LJa7>PSR+ z0qkPJ^$MT4cqA>AG@N?agNs|jK(nqq?@kJ31pgCUPmlm{i>K&SidV;a2|#<2T2%t=rYs?U~jmQ08UT+qBf&{=wkQ z!EAF-Z4PFdw<7taYn4kw+p?CV>fN+DL9Z@X%f^B1#{KHX{gl5;^>!}> z2D5>~YTz&>^s3&COFjMBo;_;M9!l`5-p-}IP1(MKYTrRh=vKWwOQn_B(k`{MD_uIo zko(lWeOE`))!k|tA>ZD0ZCARqgBsj_v;XSIJ9XENvN8d+G>|TRf;I7&I&_T645($B zn8o7DhrL|K9>tAu|Eb$I8W3z-nNlP(iSaWgG01u$`eRUw^0EUfkZ(e^j|^$@9;AT{ z>ny+uHmp#9b)h~NrCB5cb|!CF>vZJ41zAz4%L;teZL8N)P_Ng9^%h`#d6P#m33uLu z1{FMLXGuXVrQfKQvVvO5Q!u#b557@RfUUG)s|v8yHf&7+c7qLDTY#;zVe1R94K{3J z0k+A8Z7#sJh^?3Ti`eYg=AhM@D*>}4=CDm{E0VLVNX~Y#gXOHU)!AXq`5ylVkP1{U zy)DwAQre7jnawDJ{Hcz@x@mt#F%54LX1PcN+HH3BNSr1@(hI- z!;DghaZQmzjCD#BGWn-`mZG!|54hxE3X{g9RoInWeYbub81UOV%EfG4F@)?Kmv;3F zU2Ae&bC>shD)~2z=fZgSklRpIa<8uOM(vIBYE$5D-N3RFDgUdf^~U6_LA7nm-KMR} zE~GqibF~fcq;4E}_uF?jY+Uvr38sO8q1!W`2liwd_o{(Cw+_6&;l_y{)TaY`K5yK+ z?4wd8TyvYHrcz2Pv(;2iNflgUN48;5Z5Yfp>{J_e-VyG+tnM1S+wkmiCE=^M`nGJ{ zCbe!;w(beF?uk#tJ5T*MdAIJ+ay6lAxXoKW5zp=7^8v8myIsS}O_bQo^=-PnBfaH_x@qk0#%GsXD6y66 z?7cOa9@wk)?z`)MX1R?L+qs_p+d_J9SnVIV+daD6fy8A$cYvSZ)6Y+-`={PlZtY0- z?^e5?zT2@U{i^uIawlc!;(7;ePyX=u_nhyH+^Bo^=-n#+C#f%%y9w9Bjq}rd`a)6- zC4UsX-IER;Q3qH%dI`;K@RdC1;V$wE{IZ$wL`oK}^Dq+@F7Se52)EQc^ z=Ht*q{K^0Vc@u$dARwD7HrX!84Yx^tlkI_f$E{UPM9xa7`N`NU8K~wIt^7AoJ#7f&WHVB31(n;SGAV@ql%_2)>_PA)vdu1x?1CsDW>|rY>4*O}w~?Ik%sXLfFE>YH4E96TMy*<5BoR)< zX2WDinNvdYDSS}#5+Xb&$8Gy|Y7YMSm4AxB*V(t9r=?%;<*(pj`>i7B zD5dZ9AyEU)kXEVpBv0HPN;oCQ;d(iTI_1|1usy{*LLcf*ASSVFhHuKTP&biVDKu0$ zO8pEd0&x^yXx&AHF)o}z3I{(Y!p72xj6$hxarzB z({xvxO-ZX`<2s9gZZ=IJq(A2kBFM$*O=D)&FhtlWpx10jnd403W6klgGw1vzO~e`t z2qF2mP^Wwu0M0QsP&7sXCnFMF%nwtJS^(QY4FKAJ?h}T?@d6+$8L6H>H?2kPLd){U&;NEBl!p$vq0f8m1n3` z)Yf%m!zIc>;4kp6YytQV2cFz$aQck{i$~HGkOqN=f(zWZf^lQPh;dyNb2h1J+r+UeXfW(97cbvHW+P|ny?>M3MpCqG2 zkLvAZ28aQ*bRb>&0 zJ^R(3{h6MF;Ncx=S*KyHDCGhZJkx1^;yc)6H&@WcnNjNhL*Sb*^c?%P(4TI6$TRpN z#s|^K#6V-p6qsuW51T23w!EUiO17m;ie00m%}nyK>myo|c$iSJ#4MX!cS!yx$RYnO zfvW_r0YEG>TCtM}wwv222gwzE<9U!mjD5!uvQrS{T4*myL8cJ;-&E=Y09^>R^k-YP zsV&<+*>R^*-F_s~GPd;O?)1|qKYwx}(>tj?Iq^v~HZ`4payI?sgxWi~?BHhkXC2FM zaXU^r9&m`AblmNGCfhfr_Kp3lCp{ihpFMxK?*ekX==hdnDRep=k<^g%{&C%Y_sPhe z4t2*^ruErJJ{Ji#myb55aekK1Cw%#f-bqGCKdd>hyQH`;T^Duv^~5xp9`viI&wP;( z1XTPhv_;SFh3br5Pe(8#3_%DU=TGoyp*`&%%LvaQzVqqD@pPTOHSt0i)-qw}HiaQV zx-g{rqxd%;P&_^SiVXObgdvGV<{p6toAX|J5i0aqmO*Idy_J;^lWxf)R$0WPcfKr8 ztu@+s)adK8@d%u1kc10kOjP2Sn3PXsp7@0SY$Te3C!P+0$gwkXDL4WBsbmo^qeXt| z#5;_BYOYi)6_+%RGKceF^1N1RIl02lEoe3Dlu6h)WfF!6)a5Pn0fZJh3uU4aHyx1> zi?T!~#H0j{+R?GR;$rdYZ%izj+ILYA2kc|S7_d2SS{adx{aHttuj0x5v>Fd;}d*^I|)x!3?2HX36d_evK0&fFoRg4yf^9P<75yuh8n(tSZ!?mpyXx=gzO8~%E_R=`Q~QB@jxz& zA+>!7QRe^X?#p(=khDA7eNgQ_nCTuN$=jiN{p&hI$eoarx!a!1Zaeh(wnLeXht+L| zZlCz$*V5Y#sT&WIfbLSux((Uufve!lUu-MY+n>4jyY|?UFsm$CBIhO*KiJLZX79#vA8i0q%@lKRxj)$*T`eW}$ zv=zm}( zEwO*ErtTf_#?E(VGBrK-Y8!3{H(t6~nW^o+*VqChY@6B|%rtJf*AdKiJf(I#b*Cr& z%n5b($xO!t9A?E0%WC7^rLn2>D`(WPGq)$x+lD_M9Lcnfs)Hl9`S&MoRsZ1m^x%lv zI{K*6ONxLOia-Sy<7fDM!j})rU?=@jYaL~T{nL(`gB>+L-B)w4rxwh?Peam4po>5^ zff)jf8&p$hO@-k12utAq;$I=R!fJ(}tn#gAA^$6?-#Ug@jbY_%GOV9DW9jaFq#it( z5%xY5N}wJzGWEb`ss{+^>H&Q%ihuLLQly7pNdP`ZJ)mPwg@>CcO;;2sq#tw2D+(0K z@1V*0Y2874=F0;WTHTm&j?Un{x(#&UDW(^Y;ljRW&Yi9^kDOvRojYM<=mE#k4Xs*^ zB*HfNt~H1;1&YVKBo-iQNdt(`p;QAwAJtl^hMaD2DVCZJ)1FH|HKS-<`O4PHqi^V& zshV7?&H9woJaiL(zLMfOZ2APv6aM*?9>zBFeyyCv?l*rr$D%V7*#HBZ(+kSb_JZep zWkCX>xtdY~>CD)iVz>*IU1vH}Uu&xojfcYoO z3Og;KXzgYt#qkX&xr(l7#@oz-#n3rT<2r^yzCqw70orQIe?;JY0*s^lfI{prgaaYl z8H%=5Rg(cZr)3Ni2c{3?wTzs#lr#foB<kC+{<$_WJ1|oca!SLxxoxKrtm2-8Ic<~WTLgYc;ExIXa{@mi@FxHe=8vZt zA{W?=i8WdzdU3mPM{)WwWq1gKq7dmB_Tw({RXzn36Q^qK!LeDJ9vW2xhcZ2f?{)Ux z64RTW!MT=9=Ye~W&|-S~adjw^35?$hZvSK?{nSh9j;T!W<$HZQvVC-30WwhavXXg0Z8UIML?F{DJkQ>aX+^)svk{!jc&@H;G+wbW*;S1Sns0zW8iGva_eaMCqT><>s9xv zUdjI&d2P!GONe7LM~ag^b9s@M;~u0UlE|byvyufDGweYs3$3bJv ziGyHi%YIz7TFpijzcQVii{o0Ct}T?bekipNU1TFR=DgH_>gJzH8=aP68ey5_8aVF?;u$wSEI~MH!$)d z>Yz`sL#SFCstxPkV(PxZPYkVJ{`biI+cZHz1Q^-joKZ{1A8o|tl7_a$LsxgHLhb#U zol7;14_r=0hh94!Hn;M&1C-{hok5Lj&YA>t6VCHY-QKylK%ElL)ElNXmaUhAFh88E^Bm8^`v!)h{8(#NB=pJhCJx((oEopbI5EUx9!!HgdGdGDck&PzK-du*$|n&8?SP=rBnE_eIc`LOPKDEk-K@ z$N4$D87mFAG;gk{@~4zqKntYFQDY5aXw)lSO$hR5$oLM?!F~jEI;hRjL8BjZ@RTal zfg-Md``vG68v0Da*j|h<6vm(igZ!^+IY;Wy)M6_-i7U=>OeCJYYS^I>V5#biNnB&K z>a?Kv6B0-zm1Lj5($$BJZg{e-`G|CJk}gmCqwyGSlQOj-&nzMd<&s3CMq6zEtFIQH z%vWE9Mglv2LWCT#vK6BXl7+FX?uxFSpk+pGQA*@AlU(_QUXz@_0><@$Sw&NdPE_*0 z!?c5+{AauhX~@n`I*6a-zOkB+6#2iPiXYiIN==TEnmR!^yH%n7e$7+G2uJ=8D7?^Q zHrwp61)n-4J>Jp9T*z`VM->Iz%_M1<)C!VduWM340c0Oq}c60NFm#YK+g=nQN? zh8!r$UKm{&LsFdbsGv!B5IOh_fmB|+u-VU%7$X{F`3i(HrJ= z%jYDs**Ov@UOUFgxIKsaCjJzztm)*b-%I}~CX6{WClHiD!DKSLIo&K-drcTjkkK=JKob0Jv`nR@hprG@eYit0O0b_Q8Lo^-FF`Noc0rE1IO zOv9jVD{fU=hcb=9M;?L9x`IzPe}=GZN$$(!ir26F|0O~nde%1M_E63S0_6lqh1YMa zP(hi%PpDnAGr<vj1Ve1UZ ze}kH}y4+wJwsqYj#6}tCkk~x`HS)2{a+X5m#>YuFMhA>hAE#7ubg}8vrA-{sV&{}> zgkY?Z{4!s`3@Y!T=$Z~oo5gc!?D)?TpO2l+G`*sZo&NN|-R5oC<~?fjo;xT0y7`&( z*lD%tm3uu;WqXFzp5aeN(qpfxBauwcnWfE7+^JPJ@BQAe>G6D2>L&K#hCi}|8{v=e z`GhYY;#NagKjikOtq1wCB2w)x^}ZNyVF&_$M_qdw0pczCeGGO6={{YQVD~R}WrUsg z+qPwdZTHJ5jd2~1$#oFYxenC^#!9xBUu`iK*D<1Y z%^6i8|D39G>zV`87Cxm^GF9mUo8b-ZyP#AD{a(-6Il8ZpdnzO*H327w;xdsYlleFY zl>1pMNs&D)hm@F`(cF5&HT_bRuBOmJ)`U@@*@+>Y!bpMEPhel7&?136t+8hQ8KwP% z09g#!c9CiNOk0o{cW2X3PFPc+(7b!}pBmaH|2+_x9!~i&;IfnF`TtYF@!kKE8~9tU z^XFXY&$;ry=B3H@=B0`yvLMz1LXxUvQl(2Lv#`Xz(7#+2!7xW zMS_F@FfbGqb<7Z901OO5kIwMreAA7|4_>0OQZ@%B)Lww1!Ac+sXW!a)lo1!dBfn-v$6528ZVOJ6q5Mb_tQixCq zWh;pkr-{=hv7M%|JV__f*l9eScB=MIHR+$u^hdFVGvsWPDLehs^iL^Koy7jt@7!Gg zyC5jq8Rv01JbNGKp8GoY+;h&o__xYRzkqNh^1``}t%C4hl*k9S5fNAB9D?wgAPcgX z5T?XQQ50l{>`XYOoRiKeX;MO3kfnrc%021kaaY1K=|P?=;hppX*PZZ9`6vCN;1CW9 zvgfKGdzHZ3PJ{krh2rMwJR!PY%iTSEb2%d9&PrZ-c$mNXc8|MwB&{mdRV?CgeAv zZZp2k`Et2mZb7=GkRFhONCyk)LAe#_R!h1K={C@5$G5$Z-!FF{-BCyn${Ud0U`cl( z-RTe%r`+|nXiTd){%(xFr*!;ywdDT1V zz9xKLob*fxA-7&NuAGajX~z3@Xf$R{C2xe{Xh&S39rcM=oSHcwotlcugQKa~%oK*E4jzoBpPo50xNT^te>6I)_8&dl|5Qp=29@N+ z!9@Jb;PhetSre}3eIu*H~rjnT^`@jaw{2Fvw^#IHZi`Dhl z0xO6LF>~`$oJMSnx(<=ou=VGJIWfQV69TJ1Hmd}<>Cm0AgsMx_o=POTx){;deP>x} z%IHQ*NjC~5^*~%9TJyqxR@c3{^Of1Gw}nxgwl#1egRj9bBHs}q&cqAWH9{_hbYTS7 z#W~^6d__T2?0Lu$&eYkvv*`<$Lm{W`KAU1w(X{STXQmaVdm|C1OtVNNx zdVueoDFw_WGwKKLsa|Q0BBmq~7@NpCP{euo31d9e4sVPGt@Z)@_NuVr5M2$+Zoyr9 z53%5i6R~BA{l+c29$yv!_$YYA80r)PF%p8fG6q=OpeL||lTO)z4eERhC9*_YmB-wO zd3elwRhV=sZW(7wVFP<+{h@#!oG^I)BxiZ+-Y}Ix|fga#P|{27gtA(5rtg3 zB*$ZE_AqF0)?u3{wi)22!TOvPt$UlJWx8#XY+Z!BoFVQ}M*-%AJJt2CT)ZYNc0aVx zy-Vxfwa~p^>)xO1e*Bu0t?bae8y4F--yD8p_?mQWQuDSfws*aG^o^rPJ+FC#Tu2#W z!8)5X16(Ym5ix`m#f)&lEzBIQ%eDmTUU04U2S6c~5M;>TSttIbBd7TAw>>P>u|39$epI(>lK-+nnx0l@ zk3i8#qd@mC1B0?qhAi9er`^uEua$QT`?b*HV#GWup)9yAMiVm%t3sKfG8p2PrZp3? zt$Vrt<#!bAee=M?rub&&dM4`)@_GB+j_)-Xam)H0Dlp{Z=n`uoK<9Qi86UUDp zJ9c1H_f8xi89#m~d{Fm{p9qI3f-ICFwhn*oCi(>EUmXOvDlAqt&mUZ@4$ePajNOw& zS1UiL?iLOz9y550YM1A&eJFVlZ^0yT!yJP7GwD06&XcWrz?>jkztN=;kXs-l#woZ$l}b^oC-nCi$8;w7IM2dDW*o;rT$xe?B5J~NJN z-}r&i6XDU3@bPun?Ep1SfDSM95dg58zk2?u#oCVfXBKPP<_}q7lw61Lh?b4nd(jQ0S&h;$`4Evf85%*$gw#QZ!KfDo)es?tokd8*1xdE{!8)tD)-T#Hnlnexf? zNHy?OBiP%o1Yp+|*}Gyk5Ng&N%B@+ZtBkS*JB7rnsb|rVr~A!3QnC1HNV6_BAjVT&yoxtI66%hWHj;o*+eRuKBYI9WMD$3Nh6M* zjbs1hbD5$}!!S`I>G+hA=`W>WrjNk-d)_cG2aa<)^U&z2Q+i!2l}xi#BB998{o`cL zWx7_8;P}OAy3Zhl!Dbptk)hh3(kobMCatgtgYvH0wm0b`{7jj~q4%2b(KSlaY-j~> z3Q72sgbM|2rdW^{U!?h%H6Nr=3KwYMO2RsHC6g{0cqL(-n%ok=Sm?AY30JDi=VKgv zcc7Fsl9Iq{mB~jfZfl?xon9s3%9ir^qrx{GF~>QW%%@Q6vSZHipz(am@%07?xWE&Q zeG96j0G5O+9p&>ML>m-+<}5drkVBG>x=cQ5aj8LeLd+rZzFiVRfw1l~cj_UTE4E|{ z(HTZdn{98jEd;k} z!L7OA0J1-Qy=pN~y%5-_1vX{_LyMvQh0v2)=*erN+1iJ+ioW#=d$d4LHZZU_{N%#$ ziT8$22AO=xx+09s<2@4qqS61|C}M?0xf#Z+vl~ zbC=e+E7!T_+UTpTT17i=uw4tZX9JrSd-@i7c4$32P}ZSUbaFfFgL?rXbW&8wI{lZL z=FuIJP4%P&;3BMwi!kyW6~!1B&u)O3y1gKjGl_w1H_8eIHcD(pS(-Y-!y0rXs|lAb z2)Z?}T~=(_Jttm-9+eK{+d%7XD@GDNN7+*b%d-m0%dv()!AoTpK>{1>vLjs(mE}ZV z+1@(x#w^54uOVi5e|)^9p5K8YM9Qju`#H6G+e-SaSnmYhHV=piK^Ckji-4&Jv(p&0 zVKYZ5c80)b2*e1;1QY^i37i9fJy8?}A5{)`4aXVRHMqIDo5+z8rn|V>z=#EOZ~m;m z>12(BL9&va2e69{B9YlpR&*5f)t9MOkP8pEGVe6EzP|HDKx^BYYwj;=q}veM9$RP| z)7r*vr~mb+cJPH<+o?PC{R{PbwE8`_q+6f<$EsZY!Nsx3?2Bi#u`@qvyphgseL{P9 zBZWyY@%!A6LIsz0mcD*7eA(?q760 zmK}?{*Liwb5XKzOI2I2a%}$)u4xIe<+1FCvN-Z=EYE6UhO7Bi;Lr=WlG?G0PUEKBL zZCTs(%=hbGKYpWM>ln%fx7}|HkZ&R2^Dj3D&x$9+V#WveYJ{$+Au)bl-#6-L3RRY9 z^Nd^uY$t)Wg!?)w`w6N`;5h!(Ie?-EqPF4Xqf3pwyAPTI9p(U+6@U@Pw2 zo0VF!twT9!&$8E=T6+3OR%*(&9LPyWmbUMnKa{N=%t^bKLjChcvURB4e^07~E2EFQ zGAatL48#m`le$BET?i126vP!`^pC0alm2h|MG@ntK5pU)`oHNbt*~hBp4rM!Rf(_k z0AnfkDMeLr#gOSMqrNMI&^2XXSe5unUJ@}&ih4ZXo>1mfGYppy12MD=YadFG6D?H2GpIkiTK1Wr_u&}K*KfLUoW!q{OPO!hB znk1ME&vI+W>++3ZZNv6l>yGtLFxzp~LO$nqt$iTZGI+;I=YFM!4hc`*0nN5kmrH!f zNy;Pe7x?Gb2SrKV(43Q+tfHLD^ICE%FV#1p?4IO>L~h^`*;|mvh#3-@$i_@5j406f=iY_Yjxe(c&_O=?)|99Zbwt#$6s zb?%)X%LdvsseQ3Ah|=9x!b^2K7wcN?x||*E`KNJ2*R@_BzB2m3iUfi$ZQm)z@GS(g zDENZ5BVsJ53_Bt&UWO&Y7eJg9_yRb??2Ew3G};uq0XeQl&mA?qjlII(p8=n%of=J0DHP6eHi@ zrLE|@?gTOpHTVmj;s}|}Rg*s*O~=kp%qC+8=xGSMjA~&v4;b=TnDRPN3s{=s9BNrD z62hD}^W0gFCF8UsDu_q;!xQ#(U@hQZB>`(NXUj)p&W2_%=dLTCT5JO&UwcfGT9)c| zlw(tsv+15k#6KCiGx|v^c5zV|twrYH@(X!PVR3kdVr3W9DrJaB=^D~uX{;f4;ppv! zCBzF2PS(1X-vIXi;{W3dn*3TW)je8n1=-7>8pD4fe0(8e_n!|a$%2ewUj|w0iLJZM z(pOP{_j#*j%cfPbg?$yctMqCvS4d{8DOd170qP5vD>At!osbT2XL9M_oRzqAaDCWr zWtgHb-`w4&(LkonzWlh~npR?I<9&v)hi{7fe7PwZ_B6Ldlu+q5FTOZYs>UL1CuPK7Xo`9wS1fc&0cc%_t=4!8IEz-AVT8?Ev}6 z+I7DN>TNXJWI2?~cHiT4JojiYrR(;Un{M`9RQi2Q^@nZNsV=P%7@X3S6?WbbhzJ1%yX1RQ4vJ^Yuie5I(-}vwPhK=sCqmB4G#z z)lmOe3Bek|ir~K7?3K!Xh#ovmY+0&m4gF!oA^UT5ggY`bEhW1aUABrmW4^x)^pg1w z@WEZ;uh-aLqx=|+s|;sZgxl6XCTEolbS7!oCU9UF`q^5H<+ot|7~_nrF;2@4`lF7s z#BegixbdDI`7YM*Xmph6=|I7k@e)mU4{Dpfj2#QD`?c2n zx8&Qy+VFU;b>hC$L7oUl-V*_DN)t6kqcR@cl1YEl&AKR~n*fnBT-3c3<9#b}T~HlH z;4-yO7U-7+*ny;OTP7TC&nh9dAuEpyPAyfO`B`m9eP zY~sy|eG1pXmPfU!jWg(Og>%MPMDmZvjkUL2cwzo<;ROsMl;xNLhv0H6Xk2btxyEv} z1pav!gup-i<1k(%@--sQPMQ0h-Zkf-$VT6wW!#JUoQ)O_AI%<%ym$C?t~IJ1K7Bj- ze%sE4wqdPp_}1rs(KeDjd|GRb78&aUy*0{}&#$!)c*Cn1>}R0MeoCN(i+BNn>vk^M zmy;e@i;D<7V}I6Viizip_c)&{12q_vXQ!R%UXyoB#8bN0G#~yXIOgv$Y2XF75ZY9c{R1`OFWUq+@_7@l5N3!#u}=AJ z73&l+O&hY%S))yfy-|j$sp^;D_R{Ys&d%Tm7x?`IqXScyX43Hla}fzT1@u7S_eYA# z$epB13huM;OCMENTO$m_(&UBSr2=hiJF zql^83z*_`dmz|<0{$G_K z_Wp;k`By^sFNMG_h00$E4fowX@$pwD?hE)Vw+N2FZye1cjzj=F$#w*mDS3ZqKn(sw z`kC*h@4kTO{q{;Rc%$LR!MB3<1w@y-c*RGlB7j+ul5_aMAV~I734mEb$s=N&*t%F# zzwE?!DfsZR3tya))pg4rig^Y9-W4BWE1O+N)-;;f_;PG~fn8O*?4g)fXlh;dQOr;E z0u&oU*_ub$7-m5>$%1XE3_p8sp#GBijrHLx$n&~I zun5*^%Zzp0YPARnLgIA7OyYRrjBVV8XNzE)PMS#`PiFT?(<$RAc$YMtI-ZKW$Er3FTng?p#xvM`D(*AKGp&{cOP@tZd&MH8yR+U+e{H(awWAE zsq3OrD_H;QkhVTf|0|Vx>XEl0s-7w(wGpXJQK{9el?_O1j?;>r<=lvzEjk$2u(z#v z+opTFmc4Dq+fBN+wMtJm96n|;SApGGQ7JbxbSW_Qg16Ie^;1zC24$5_zf%jt}uzWd&6&q?+OCm z>{DwKz9+a*)BbP{R_^zNDdci!xxO!)MXpZm`HpZ7&t2N{_XQ80yS3*#!g)ORXwTml zUchs&_IyW}#&e(c{C!~t&j+;UJHjlU`-S%eFa93X-v2R80rj2m zLqWvzVcoM2&x6|Y|04MDJfuDUfiREfBgPrfQvXo6h?zL5KGR>}ec=*H46E;iKN4QV z^N8+w0nek_^ACkZJddf*^jG*};WK!5OnoQ(OW`t}j|=}wcnN<`Xz%~E@L4>c)SiDR z{0g4Og?}Sl!QWHDzZG7_-{%r6?nL2p?^?N-Rj}>zz_wQ+u}zc2r&*aVM3ng=%KU1~ zGS9OzS0li^V=x%?U-fGEhIJm=x+(x8m)4MYj)P_clkZuS>N9h1~w+h z8SabjS-*2~+U4`f8KcgFBSVAE?*6V(3KiIG8Mg|S@dUvpSV01bZkv!KB)nqN5IpIsWy&ffzLGkg zeAV)zbv$Ln(wHn4jJQRQYudBu7DoJD5zQQOFH9@63#MwpDOn^n1P2zSfKFo7-A_yyGo%3v!Cz>pbuC&MsD%jjKgT%|nkLrr>hL zvXqm5HRB;}EkNY(kEWLmnzFtQ8{o3#vQ@>25sR3O*J2JXw-e;V$!VW#qgH)Xh21Vv zAvtYI^v>|kRGD^0OD{zBhncusvHXXeyjQn;c_ENmBGOv}Ad>Kc^=U6|zG;QkV?D12 z6yDO$uZ`oH^|IyH(kvDg1;YJrOc-1&G3!*rXI^T&ohT_Wbswt@(Y^##!yb1l+*UZ!uN`$ zc1N(iE11(ANbP20$IK>+ZvVVED<}H=Vxvu@vSJ-w*3pG#>~<=3Zq_y9b~@#Br*pN0xPfhgSVlG2>2;PemPz;YG)8C@*WxWh>iv9F)DCNm zhVE;?5IYRdM z8X;#qS6K6kWjxQFFThw-!98BEkk^1b%Oj_{=H@0{ljq!W%B0u(g2(NXGp9V5T;GDv@1F6=X`WfZ{i0hCCgiMX z@1$$msZ=9p`p&rox9H@>lR>_|3)6Cr&n;f`OuC)K)ZC&^&SL3WsT|L&-z~a*e&<=y zJ3r@>vr&!c7Qz{n`kfQ=lP|daJ~`1fJuN4B{pZ}Gfl@SlOv-&hezbJ{=x2^6FuGCopRQ|P?uxCIWjsl?C9%}Ge-_Mx_gG5ym<2Q zp3ae@19Hwt&+xJSt{&&{q2WV4!y|GQOV>)}^bd~q4EKzTI{Su)#*U20*{Ei?r#qZM zso&W-)^(_7bVRl}1_qpR($MIEo?%9$ViS#n5hrn1PC&#?#TNBai5uTJTwbw!n2?Z^ z3L;!ncICiQcJY*j-`Wl|lY4W6hQB zrOf;*Js;VuNo9uh%OwBCTZv$X?mOi0v)|eRA?-^8rHRqR&Z$D<@4&dx>e! zQ)LE%&`?oief4W%L**4OK~$XABQNsN?>q^eh@V>KvQ@CsxKL7Y$LTX7HG!pCp=Trx z${9*mX@ue!ayHszo8X!Biz9g8z^B)Wh+)j$Kog7{3-lAE(qk8j`L^J4#d1F<|H~Jz z+Lo%;hN@bns@71|cByK6u&U##?doYMwS1|h;;r->>3BMREsM$iXu2iE025|?IF1`G z`~A4%zwLgrc}C+a_Vcv=8@=Uu(W;XadXJ_3)vwdRTZ->TjpZB?i zMmwvPRmbbL6JYHAb1uJ9uR_11$H-Z{DJO4ABw)))livARzd89HLx$Hat0!L_iQ2ST z)NUe4G?Vvch>cr3gM5vN;tBi_ophlW;z?Yh$ueIznJQJDqMRFW2~%ZtZK%3ks%{7Q zJujtJJQgwbq9%nHHSQHfcp7oWBfJUJ#z&YC9voN?(=Jz_xkCLwHIj4DP)P!Fk}Ipc zF5KKJRc#8EZC;7kM4BRIMR0u2qes#S+2ts1d>e5g+DT-zQ&1eV6)k71iAyk7 zn2RK=n4vgsb0-POFc8BgBMe2Dj5e5zDa>R{1=mWEi~1Ekt&h|+$NVIjy8Xi9K2AiU z*YBS6y9K*zUhueQC*5{cud_3~4)0kByGMX|=$Z1kMNSe1l-E?au+xlnjZt|6X((Ec^&yFy zupY;?xW}=^pxx!T*9h4md{|4+0J`C zvvSh3+jY?`C(qBpbA-Q8`UJNiCr)^9xr7W^EQ}9LIX(8KEF$Z0FtvOy|YuEv%_wmclx4RFtA-szO2GUumUdEt=L-? zqhH5FJR^**U%3MsUVn?apu=lZRxGECj5>x#fx|gnLxa8jeNI^OLj%Wpx+9r%gmL~w zs+}&c;-8QBb{Oq)N??~4t-mr9$H1oI=6JLdDY5WK?Vgh0Gfnwz8n`FYQ-2@W?ucBZWQlkm2cf@8-J;7|_~+Y$OBkVZ z$-R_Ub>+|!{7(H#m74>$GJcJN;Z&bFhA$#zH5k4cNAP%_kUO3)7tW%Nv~zB9e^WOy`K{6mi;t!-7}*8 znpjP1bpO9o<2t&pFs1wa?xC)+!##tePAEgp!$aL;13hy1B}lucYt%^?m8s<%9vjp> zjr5GlIa(S#;yr_qZrY1()Bx2jTYJHjEM56Nl+Pf4H}W~DvTXH1sY`oSs>)K+c}-eb zswh)UJJfS>M9xv4Fuq~(&TCZ-^bGcm9*|4a48uK#9sPs-gMDzEcT+{_2YQ%)o;sAJ z+$;T2AC>N8Dygec9^W9C(B(b+^AWcSGrjVbfUS6`Y$ILs?QpWQ3yF0m+n1R7$lfu| z$R63HU@eqM_AXq4B~))G1v9te%E2X;hg~R794<;7G;q;GyudH6SCCxtw%y1{S|@YF z!y*4JD{HZgr!1s2rpkE+#3j04SUkkkgAu<7T~zhQgV^B$e8Ii2k*yus=g4))oP~

    9JSKzP`;< zCJbsKT){>5z6EJs0gX%ny955U>~X3xr!)h8{CGOl;nM_nBW5#mWx6S9E*J zwVmlHnYtbjWdluqK=Abie3 z#(ch5^=Ja!TA=yCRRo!79}LuU+ChBLnR{_T`?oLpCZ)MhL>gyjl~k^UioAs0u`Ygb z@JnUt9_%9@8L(k7nD#xDw6yh0^o8#qPvYqm zw9n7yWOl7BdtT(dSq-D7Jru#L$Ff_OsbhG5fIg?4bN@9f+)S0cNR!CS-B;h2NL4GzisFr>FABZ?04fy2^(pyMEwG_@NFz51Z=swXe0m;e6fsPzUeBeH-+(*M+yNH>?kJ@ILIQ zKv;asf5ZP!2k%OsuE6#W1yAVpU@zo8Fd$-uM;t0(iM5mlM@ypMZkA9+32?Lo3U;%E zR!V@QCBXOaN&PN#Z2FB8ub+6RgLeg1B-HXVtYvbw%*-1pFzf3cR9N(ND>b^!+Y<){ z6Z>6>Ejw1M&HCMm(w-Fqem|+*yJEyIjEE}su9(SZ(be^{Jg_q=Jgk3UqsT*gyd0O< zx^u-?jlv~uD+c`HOo)Y1m@=9XwX##UZP$vSLf@T0BK>}19e7~G@5<&>Csxc2S`YBc zdVpW82jsJ`>a64))Kh(|(W1&nG@2S8JR6-Wwoa`9{IUk{t2IDA46$#;O1?rJ#zMJ4 zD`^Zx@P0atX)THtIb#@wzVIIkifJj}u-PSN(~5xLr>)u9iYObLbhb|g1R1OUfBkV^ AbpQYW literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/animation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/animation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7695f697670ccf38d68a713e7b7d8915b9e0f739 GIT binary patch literal 16614 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 V@U3E_5(9973DiDUamkC@{{lJ#1ycY3 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/autofill.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/autofill.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adacc29f0465adb4c27405154dc0facd2ba1eadf GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/background_service.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/background_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8797bad28cb49914553dbfbd6119bb37fa8e7ed9 GIT binary patch literal 8048 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 Xd$GbEreZ-915y_oVej#fryBBK;}I_e literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/bluetooth_emulation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/bluetooth_emulation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9434c0cac543a7ac98ab40b7104a19cc3aac2f0 GIT binary patch literal 7539 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/browser.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/browser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..320afc03209af6471c3446472c27ca4e4a09e771 GIT binary patch literal 26296 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cache_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cache_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7e186063c3518f894c15ccf8123420bffd391ab GIT binary patch literal 12126 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 Di2mMB literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cast.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/cast.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27b7314359184b9ece0e2905446cc3e895fbd8a2 GIT binary patch literal 5469 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/console.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ae77d5ddf24ec261cd6c596c6bc35584547ffbf GIT binary patch literal 3603 zcmbUkYi|?T_0GfN$JlWmPGA!PLlROiP(}KXfesVj8)7<-^v*cc z7PO(HRjmEcL_!Vu6z!L4QMM8v`yZ-GS!JbKv#GjOzjVKa^;Ug+>bZBu#tuP9JCe`6 z=XLKn=bn4c^`BCy1cL9Oe)Grg97%gFwY`Y8f@%NtBgrhu?7l9B@o>mAI~PhgA9# z8hjy9vjXY_C;F1>QD1SL5-kuvVuH7(FMH(Y-gG77l^2Tkor!A;EFy+^14M86Qi+-` zvx>HN%a_ffO?;)`m?g_DgvY>R!6E`bq2347b>ua94a*-0_tD+(pt(i}?h9C8-U3%{ zr3Z81iXk^lyjB_D@;HNTtd$pOzT*0v{$IfB0=sAw*<`yT1GP zk9v;Itg7_2C+I{-9|2?C3V(qzD~x=;dVX8gY6HhM&u^Rua$og( zjQnQx&24q4Hh6sV#>NdGAFfW<(mg9`9d<{B)A zc52VO+UVFb`9u40PaySa*U%qFYNyUT!=Ie`_T#h7CBI5VI}>{-8c*yc(YwNX!V3aD z1U6(5f z!5w)7kfG6~sqMtk9r*+xBPW->yPec_fpv2zw?*Lr+<@N+>%s$}Ed4>cCuHTyA>K=-9O7!wK<8Q02)c_BxLD~8 zk9wkD5`%_)$(^RK0fJPC6)ddt+V)bubZ`wlY+5co2^w$1&pis@pXfhJXfJ`{UEAH+ zJxLr?mM($Q-Tl>f9!~wY&N{}g5=r4}`*kPqtLPfDCioVXG7USHQMAXj1t~OVq z-aMgAfrhmjOKEMEKtMD~798pkta*+G!dk&BLIDoqL{EUFm2@LWIM^@<4;^LR26a5R zLeY>s@;#{%7pJT0IYP@bH2)E}|QBndn9S6t1-yWnS zPne;DgH*{hj-l0_w$Mqi9DG830^qCPcO-%pEHBHAH%?xG$7a+|UJV{#+|SBc?)+uf zEkUsE%@bR*$-VuFq!nGwU||X4z%HvF4ee{|R;;#zc|!d=+%(>;U>1CLL&F<58~1mx zkHxL! zqnT&fr}|Fj?XM(})nGB6;KgVj~)(m@y~OL%&W0gVB+G#z4q z+cwN*tabG`~W0PC(4u@_rR|4CiTTm8yUoLq?lSY_5+%>iN2ZFdX$|ZJpKROXKGy7|IGKlWD8mENJ}K$xAMivjFOf*|~>0|~=_L#O_Vj(>*K&rs@f zA@Ofwl$;T>V5#xzu>0f1{TaN@ZPD7WJO DT}bv$L}txSk(4e&*{XPRHNVjdrCA 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/database.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc139978c43279b17563b1c0c7cb2cac24240af GIT binary patch literal 6176 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
    >K{H`*5n^ zh}M1hPRXr_+f6^dlBXOG1zgK#|_m4^kU3nweTyH{x+Dbti z1xz^BCKs{$V&gk|}gL7LP|RPU=1y!AV&xF2(&k z)0UbJJQ2P)C`pQqAP{ur5W>HH@S9~vJV9X)*N(8;IP*--u#x~o#KpT@Zb5$PQckSW{n;v)-X z!52?{;c~ibkwC6(x~DkD1UI4AZD2!_fuD2vAVL#tR=WNGeB4k#nod9Dd~0?3@y)uh zSUTh?9bGkrss6Ju(?0Xrhf{D0m%g$nN~pg08S^F~Tx5w2aRu z!Ycf1$6+Sr`n7V*HkLnj`%Q&e_P`J$Ck_&Mcm# z5&Rwn*=5;s>n!Qu`y?$ZiNYq2uxZ!G$2HUJrd!*xOQy#5@)^`BB~vsaemWb_Azy)E znmtslC2T4#D=~+MYKCVWE0f+v-5}k@_~BW{tC?LAth7yofk)#s5j4*$G(-#A4}GL) z+fUpo%eL)YJTqp}>s7?Mc2p}!G%wHEbownSOu;GYQ9mN)W|dVq9!F<4sc2eLt}d&) zOctj*s%8Zl!rTZ0!6Oc5cKFQ!og^sF_^+_!RG$i0#K zpE}=mzTle8`OkB&J3Bmcw-_Ty2NH?SgyX^R^WljZa#IP?8L-JaE|wD$G=FAd+16UBLXYp-(xe~lmUbq14qL9AVU%73t*wVxX#&JUR;-Su_T!u z?56kZJGM5B~k z05*07Joemgpty$)s0MB7bZ^wbv*!-o!EhK14@a}iADtYr%wce7GD61-gYhe|nMoyx zc<5isZ)eU^|UU4POeY;pha?FTybn{Z)fk!lCJ)Fh9jR zEMr9$JZpkiVv|aD@XQRRCmIV*My4W(U<6_$(Ty-zISnj^M6@M|gmBIQO?WICd2Ysf zn2dTxbEE^acp+VeVF>TN_z+FNC`L0^WI(f+WA*p3⪈)#D0|NwCtFG#2S%(U$(s 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 Q1t~O2wtnuSXXYyZF909X1ONa4 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_access.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_access.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80975503064318c73f0a76e4fa73cb788eaf8c9c GIT binary patch literal 5429 zcmcIo+iz6I8J{`l?A_~K+iM4NT?{r}z+Ma_G3KHm94>(@Re*+WKu62YF)Z0z=A1R% zjUAanThp{EsA*lPeF#z>K%`P1)BX#6!Llk_Csd{FOY>40mWqU@e&5XQ@%oZLt8}cL zGxN>$`@Y|I8UHC5^b;so^>Y`WH4*X;?9_`}HfZ%<(3m2OFq$PfnxvF4g{fI3rzX{$ zmein6n3i?r+)1}+yRx372WYOWH|bT#5yITp3G*1fd#cJ-+_LeLK@#86rI9+jKa_HTjxTbJ(d zoYPWv#X7#g1u<#|Qu%zrN?Dmg-uwc0i79r#7&Y>ip3bIB(+-^0-#B$Lp${KBbQ*C$5>^pKMG~o7|o=OD3|1DhV=__y2iD*0k+{1w2Eq-B4gwf zxl0pwp|Um8$c~seA^Pkm@k@oA5zmz_rE<9xiw_slr5tc;#*bvIqooV+fgL;ghErv; z@8n3|p#n4FMt(G&&0L5V%hshrepmm%&bXPejJ{$j{ch@_Va8#1BcCbd;#Z6djAup- z9#0o?xk5h9j8Usl$eQudfn5XG11|JbI&GL{f3a+Ptb%^oEaWRK4#WL5QVU$R>Vay4 z%!S$}1662}bPX}sMqVYqto_jz$ybB0I@CTsrOA3ZWFE=U%s8}rL z@;B%h`I(Q9Itmsp9a9pOpmUSn_s3&*RogvM;JK7#yUbG2;I>!Sxl!c0eplhmu&?dY zB~o==GB+WZ9 zV2Hxh<*?okR4!QEid&%$YWNc)SmE|Bj=w#KKWS4OSEu3U6jT!wiNA%gaR%H71P;Z} zn7R+fnFcMFXhEz^x(qk-Tz6bZ(o^=ve0I}!z@Zf_DU!-@fkD}cX7bXFK%9%Rj9JX4 z$_4{!G!-qG29FlS%BWR{qB~DpKxe{V%TOckZL1lk3;VY2HM-U)kMw@m6|3)C0!~9lzNR)ep%d4V*vteShnrZf&lPH(OiBJ z3Pek8g&U;d=M;qGCIs$UXdEXLbi+Wt89ENI`xTv{EPZ{0GlD(l=6M}g_q)i(}Y9sa7S!IU5Po9O?{U9WT)8S{DU@gX>> z5?RC>I2Bwbnd1U2DA{_h<*AMH*MRsY{FZUlyNn}_8P&3+Pw46c7?HYK!OxJX zq&Q9ma&qZ5o-<207p9IWO#7`eu8ye!4O-bH(BQ7TFXVMq9`Zy~ zm+cn&nhEH?0)62ZV=mz%;Z-AZb8w);IELbpeiD5Syg=$|49cDLq6ioK2#mfBKNA}Q zo=+lV&4%CfOdOtT>zLYmYws`iPaK}yef7j#XV+}!*6GfzGo9OkGBmAqJZ$ZoYhCro zr3xH->o_(Aj`!}T%fgG${8>2ZYc-D{=9@HM3nxqg52}Jrl`%!=R4r>lr>=@2WPT`> zha?nqC;9x=bt<&CL}zJnrqmff1Y9Qg>rg{}B3$?qy`Yd9)FKzx)p865--VyK8!D-m z@XBiWMjiBSrIoHlxRNkgg5ES7;*^^7X>|}tFOtr{o7fBgK4^Fompzcmw99js998*1 zsK?2xdF@49C>nV%qvz%_(YJ(UvgnnJbqUCHsEH^(WmEaui(5P&ggz>r zR=JqTU+h1TF|Bu`*5sAX+a4(q(ZW=zz1-9yN?!-f^L*Y6|~KY|q|qPvz%bk2r1O@}vqJbWi|`;D1!d~R^xXW#o{ zXeM&>524==d~|NMecN>VwmS#^+}{6LXgYFqA;I|S?~$V>I;q=h54!w`dNz;QqI{$t zhgQt9QvSgaqFAmu5mz~5>3pVIc|qE4caH_pf0Qu^Y(dl>J5&j!iQNodu5f*9Y3LxS3h5Acx^ zyx8FZ&QUA2R>{Geh*z;jX*UYX`!p^*0nRme# ybHKr>2V1?(wPE-^^u1bj!S_)YQG)k_12c5z9Q8j{g1A3aVt=f5J<^~nxcLvtO`Z_| literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_orientation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/device_orientation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12cb7abea9f1ed4d736c7b45718bc73068e204a8 GIT binary patch literal 1423 zcmaJ>&uiR96rRzq{S~{(#!elltrb!NTWZU$At@n*5-&;G(%nLH+NKCuGxn;{NXyJ< z!YYZKsr*GbSn)%**Px@_U zrix&U{5#vfS_u86CX-Q=T<(-fnK<{YPNjm5UZg@w;I9tsM)if-s)6%bkR+)LWRxc21y(*IuhBkDq#wqC z5P9vk|HU`$mf!q*<2K}1NFW0pX@zQu$xzfUAcPOz1MnrniasVrgm=*pJ;qP)E*_Y_ znD=nQ+F7rb<;lOJR*c9Zj<(-kh*Oi0R>HKMQ7&@qq3Wloz)^^Iw4dm z9doyfMQQ6NRZ}@+#3xZGbL)EnwJN@@`}&dBO&RrA)(sd7h}TTRjKR*ryBWz_*`~L) zy1Lv924cCrwY-rM>d~a{#nGnM8vvbTeP!(vPehU~_k!?luuX+0XiSqRW8OWwNq7V- zyf9@fO*}&TGEHOQ_1D(d)C?;1)2T{(gZ#WM#y=kP4-bj*S)e`xxA*|e-{`+RG_In` zso(3(v1z>T?A;nWsJ{5{+Nk+TK!>3pswZ%00+tm>a~sZg9o@ zDh=-zcsjUAt zEogpAHBiIhC&AB8DN|SGv@$hiPJj^(7}eme%au&|672H7g3d$MyXwu)z-U2VE}(Nu zKVICsv47^=-i-&BNA3Ojvj8rQT5mni>(}?|3;)=rmb`pa@((X!XnKcJnepWHsvPv9 zWP9Z%O(+j!%DC|ziX6rjk&!Qr-3X=T>x@Ly&9cSQ^mSb%d5V>mBCKb z_ql4W+{$DWb6cgT)5vRY{~A>AlFpz>#&V}1rdyh;W8muNcmOvl&aQlwr6h~#HNFHs z)uf^cW^7`N|D8qn!k_4)KhXJSsP+ua99Sj1IG&rsi~H})jZJtypFKUc;R#>F$@y_f Pp)#s|`mzFutIy{RU%!VF literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fd52e0289f0f02291befd3da539d77950d95756 GIT binary patch literal 78769 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b44f2c23c68b26e41e07e4383e721668963bda41 GIT binary patch literal 11056 zcmd5?TWlLwdY&PNcgeb#x{K0SaurjtZnooiZO4gjc9htZE6I*SM;VVeBWWCx!<-q) z5vw$E)@^O``0H9=6B0Fb8Eu;-Ze2Gwh^!N7NN|L7gM&4!fbRGwO+X!(KYh1$kfC z$1*nN6eGE>F_K4iU2e@!T72KPoB41p?dgS{zNhruB|B-~8t7Yl-)4@#Z;=ewc^D5P zwPITQliH+R*Bs&cVh!|Zm+G!@;ReWc6zioYBGvZUV|J`JOa!Zi1}g6XS7J7j;FAYrg>g zFhQH)lUL-pE<~cDrWw9D;kDW6kT5YdJ_r3hlBkQcB?KkAq{iUoBFVU}#N>!|MD%4H z8@qJ?inkb<39}Ltwn=Q*F4@AIWDh$eF6@*X*O;(Nc1zA{OyP(PQPg#!EF|@kx|+Bu z$pb`=sVlM+!CmJc%!9nJTkVj!#jG)x^DQOsS>_%ay2l!h6)~EWA;W2MbWy{x{4Z|| zEvqqkD3)9nV=+-0nouLj7#ycIbV|`*O)dyT9V0NV%2czs&H9TUMvWx{*q|+qQ785sQDA z$0IS1r4cf>K;_n$HTJ%BaI*}lh3b3EJ)2>VL^XrMNi`hL^8`m2o<#y{qigBdzLr8` z2lTa8^N)3nA0PU`YTDgOnxHlm^crqKh>I~<5Dc#%0DqHF%-0CQyGb!>wYUU9QX^1Z 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/dom_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5c1fc39a21bd28d00fb1faf51d8ce1fe5e29a75 GIT binary patch literal 8711 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 KKETd4ns?Em(p-3m8hN2%kf5bEUp_l@udYV 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/event_breakpoints.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/event_breakpoints.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d36b6eba457f9370406d5e2e57b665062ae267b2 GIT binary patch literal 1663 zcmcgs&5smC6tC*;>G|447%__@U@s7pAQ{ z%w#uNhzGrRl!N{Q8{=Q%MQ@uXMiM>9ZOCAvoP1Ty&h83wgX(nEtM^{jd%sujy`Sdi zD+tD&;IoxK3JCqKH`~L?2|Oi0+(QHr93zIi7$ag4JGPkJwVBg(V2_9s7ns|14PA(f z-6HS`aj9D>qx>Uf;(qCL%e(eP*jGq}lwhrn3XSSRZL)#0YRGw_LKP)kKE#@5WmP() zTm}6&lrpPc4?enfwG*_joWBnGWfH2;NIHG3zCCOpjw6JpXMy+_VSu4#@*kdRt>ZPc zh6&a>!~)9x-deZTtZ(r>yl#)2AMM+?Q5f@z2jd!5((4Ht-WntkS6;%sK`2zzPvcN{ z99$k!&v@FZm;+}(9I~7h@Q~3n-W4vDNEx6p2;mf?o=QBak^x-UGUu|gxupZLar1(P z{^883Y)PvAbIXo&)5=^%)oMaA*BFZ?sBtK?zSHpLtu&Psho0xis(n-b#f z08=A<@{PZmFzT~(HDoL#emm(Kr=@=>QkT=7zr3{6Y=199naVN~O zH5g?_0dx@Uja{&#BMyS&^YBX_ra#f&8|d+V^w!(oy|Zy~tA1kR;#cqg;w(IHS zcZ816krc1NG)oBaI_$E={P>F=VgdAy>XR>ii1zayLc9S7`|!_(ZbPPq4+D|cFu}x% z@H$#Urbh9|HZ|&u7xx4?jN@IUDveB3;g<2CXM#c^8TMk@*@RXj4uFoR!6dbD&&!b) zpX!J@Ff}x(L7GIHR8aZA&$Uw%+cJ6OZs(N=-rdR^Za88;XlFK*e&!0QQo)}rsnH0!G(zp>x1%p(*mrMW6xneK32qa0Z)ql1zW$((f|Me literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/extensions.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5048009eac821070d2fdf083df3034a44eedd6b1 GIT binary patch literal 5059 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 P8&RZC&*L~y;x+zXbQ>qG literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fed_cm.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fed_cm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3d95036b747a091d59354b191596966df1779b7 GIT binary patch literal 10332 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 A5&!@I literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fetch.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957991e903d53b5e0370c33d61276019eb02946a GIT binary patch literal 21616 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/file_system.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/file_system.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b8e9e33a2a5783e84e6e22f9d02b47af0b9e570 GIT binary patch literal 5077 zcmbVQYitwQ6`rwY9NUvPPe=$!Y(v7vEPg@4E&)NEn7p8&OX&XaLM`K&5C=cP%p}NZ zkg|oXvTCK0KTTF;wFtFRP_|Xo9~HkUD)nEb$`h-yHJerGR+YN{vV^M5{^~h*#;-h< zwikTn+hWN$E=(+YBlv%nC_49F0dLN#(AEN5`*>g@Ypl*FfLGN8|{Rj6tm`DadzI;%#Il zIVDDJ2~mB?(L5D0d>2e77CtJS#WZ|gf2>#&Kz zow`ga!^fgB(GqRgUL~i(Q&K8Pw8VO7f(T$FAwHop*e>Bt9geRTy_2bg;7!a-MiPk# z?+vD+GYJS2$vYI2hi7hj{XU;N7)eX+D--U46fby%EX4N zV@ubw^+z^Zow-(@((22#_9?A>&w8HQl(Sc|t>4+GKlo5y8C;sr)^~0+9C*mDoL-7& z8;-uRuyxi=inUn9Rv2*XX_aaYhw=1>!>TomhkOQNC9GD5!*^yPaa~dy4wu1PI7~uF z=!IKl+j} zu}zzGl&StJgNe0n84H{?APy6SU$G#@K%uw#f&LG;Sf!&Opke_#LZ-CEWmPS~m?%U6 zg43E85eB}lgEJpX-tt_IN%DIDlsD9dqyWc=5A(WqOpxa4%eByTH`Hof4Nsm_fsS|y zk`u5&R$hw!!g~HcbPQ5IF+>fw;I!R<=)Gr{H!K-`Y+|4ed}VAQ7Ks2ZvQZbl6>ndxpB=VEj$t=DW(urF9l<+LWWmE>Z@12B(vqFl%wM}i>r z)F?J1kEcYXV-kAZ;c#g2MNq81FlxF0Wp9CwlmN01l=*sczM*yBP_}be@eQr|pS+Xt z4Jn<&i%h1*p_rZdp0{&77uS0(W;+Izo{Ot@R_=U~{wV$N_cJ{gm5xC`w;PK2a30}p z`z1?tjnLa_$Do7}x@rk@GQVe=11_cl^zhOlE`JWp>p-snVP$TCP`qa-1@1TJIA=*U4 z1*6!3Jo-`e0;%*Q!Mw(jCyT&$9#tbib^%}B*OTcTUiXb;?W2lsWYzz3 zSEe!Rjl?x%$kQHbL7^hlwi=p*wXsdyusZ^_GlQFno3owTlAptkB7rE0&NIYQ}RDzp*9~Ty& z?ke<BfcxT4YEMow%WAUK_a-P!Jr?M_5eKRe%>v@UkE!UfoSm8V$ZeoC@np? zmh(!>`DgO;%gTj!vMpD^x0#du>+XSUTTpQitkRFhAJ>2UZpJ;Jv<360EyJXyvK--E}pOc#7z?uAR4`mQWYt<$*d*{nB`scCmB3 z6;80DZ#p7I5)K^?F$L5gU*Wih!F`&VD9AHnQtESD)fk67DL4v=W!jOtIRy!+BO;S_ zL>3R}r#5RN?}ql~Qj_PFAQx{`cx{-pG+i~3wMp=2h(fvxVNCKb;!wPth(leB+PeP+ z#BYI~YK|r_5r)?=UhEQ@47X1%OSJ|TP|T9kVi1H;)Vc!XAJo4Ws8=@Xu>EJp76$X( z{kiT@rF%5neR*Lp!*wc5*NcWX^9?OuvBq}O!tkb5B3^;-mHkELgrlNTG}#ST9lnPq zX23=89uhH%RAxqw#YIFw5icE;EB-A%?vXVM>9F43vHf52NY)1(k$Ax40krt2(OFiq2ihkPO+9YD^2Rnbpa$@wJa5>{$HMb(&eSu)hyl99Y03whp;&X`Z9rSQ+l zwtL;T(PyM?C+0IozmdMJ%xCe=;N4eGVC>%Qqa-sdu(iv?M_OdVe< zS-R&1**WbyvsY)d>6b6efj({MzAjc~N|6xa6%PmU)-`nQN>rMc4QW313Y4CY8?kxC zh|`3joW&|es*%7*jYdf$iBU?7(zhk3oQ9xMN6Ab*mdgfvXG@Gy$E&#h_jIP)-s*UU z;JN6OT*Gvhh+7p}kh05&PP`6vL6FU?4*B&e=n7W_oo-$Ce6|oIL2m25wsYBZd@R3N z(=F4lfBo3@-HWbkEd+!7RNGvo8u(~ll~SX`&DegpUGOh&{T`jWlHXZtYj;y#lU|S9 z+TO(9w+42fUy}`)TMDa6FMZe-yLOq!u2{57{U5t_na8fU*d@zpb~o-BH%PxDp1^oG7f zy&?{wj#;ydD|FFd<}zi)l55+pQ#9zZ4{v$J<;hc%#R}C8i+Y|$->On(@>6xIP^||^ z-_^K`s|U72tq`pog7DsJXx61a4ebB%@`lpN4*cxwowJSXXzTFE2RH8B*qDCzz@3?% z>8Fl-VBNDY{luNCnEo_-q?tX^$QD}1PJDXoT=Uqujp@d|(PrP%t%3a;*)1@aO1*eU zVL~7%Od~OP-jLViWr^+SqKTv82@u|o@Z})-j95g)F(@96f*n+GLABqH(iM;eulG{@ zM!6qxm_?%M9pw@;Yyg}?XYWNX7vJvvco0XN1#v`EpzxRh9^xg-WBWlKp@9vdAEe97 zwL=FS+~I)E+EKpk2WZx%zYYwxPMrFk-#qccFD|^Ny!ZWkdp;RD_VG|_{MnC&n&U5u z$=B`;d@^+W9Y@pU;Hwu?9FUSN;`BagD2c;_8CaSV^M(hHcLmLlq%V|MBDI;4j^@@cH~L2&D90i0BZJ9j8_MI2 z1NjHa>3=Gz#L(uDr0)A7mPll_;_Y5|2xndDO%dGjqdZ0Z0iEwk^6qI$S(9!h)}%Eh zN+dEyGDcy7h+!1NNF?~R_^thG@z*=B1Ka3nCp}Omcw#YB^pfw#ZYI_ezm)IFH`N{( zsz$08hDLf#1?UI-WSiTXYNUH9$}s>`=Iw9eD{?NQ{{%TrB>!3J7#`8dOLWO}F5%-r ziSH7>f|t&gs84jqAdLDo=6GbKLLISI7KAIhN03LV7WJu7AnmV*RVO9AiX9Y;#Ub4< z4&i7OEU;R$eExM3%nIZheY0lrJ$^;^dnFLZFskDavSRubLLGh4qK07ImHUG0_{_Bm zWSV;Bk^^GoWK#2JxGA4!H7BoIR-TLOB0;(=@A*7G<`*eQY2IM^$~f^TCA#Igf_=sJ ztKOMnamjTHOBOAbDv+P%+leyIU_N9@t_2RW!G$a$>n<_3<`{*H;BltPKgyw+8a{~> zP3aBq3>iD#Hd$_r%wYlI*j3_|p}pz#y2Nx~9)1#Kf^d#AAjfUfvP_SbT<$|`tMM-` z%@xSYWrErTs`%r=lBF7hq_8TMVGhe8iKb|+3`noE+)HI00Kje+@SBSU6wNiy3iXbu9 zj~}Z$CW@S45r z5|QRQK@nxWGvqw+Yd9;+BV56ky*yZNS?GY z$2WGf6*m ~#XN)ZG0%Tx;;WP8_-th6IVyYy{2iaJ<$II-YeLr+O>U5s+O9f}e6(qub5y-m?5VU1L z5*7ot8S*+Z8@6zG!xtq~nB|&7KPZd?l({FZLF#i=FQoswy?CC<0YvVlPN{JQVEda^h;|6o$*HB&rd1koOLt$t8om zLb{&x&7Q$RFt{`2u;YB&7++15Yy%kyg}*52_~)6M8&6o*WrdWQV9h45TEM^eA)0?k z|5=y59Fq7%@K;#FK&IvJ?3P5CCObWzaA^|&ZTl+}|Whr`AEv+j}h$CZf7 zwkN`!2Txd#gm7Uwuw8v}SJxv6az--@=Sv^PSP`$CHFYu~W2dnED*nBv&V z4dJg73xOJ@*44R)^fGlQ(@~IJ@A*k(oIEm!NauJazRqt;NR_+%YO%18i?Qdq924Jw z`3#cPLav|RW5V2st4SP80;T4g7UTB-#(^GWdBPKy6zVY^&w)annjNU&Vc`{pN3wvG zFuj0b_ZAbR&W2Z|bL<@G_^s6YA)3v&EX)7eBgvzGk;eWkjeI6$Ka=_&%9(%14$HWR zp}~D6mfaM?mt^Vm^Q{xb7TV{}Zl<4+)z(1(7Vn3H$2Svr;~sSQp1jnB2N1C*^}*4xtgk{TF(`om>C_ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/heap_profiler.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/heap_profiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb1e55a4f7f594f290c37af9ffc0261c3345d3e GIT binary patch literal 16599 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 awtrQ@=lwno7AeR>)#vumeVQ9rkN*qVZb;1l literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/indexed_db.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/indexed_db.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89ec4e2f0b06a75a8e52ce077317d72b57ddbc82 GIT binary patch literal 19962 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 aemhkHzf=eO>Qx}+=DcI@F$9prIsXHNn^xuk literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/input_.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/input_.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86119c24799fa0f793076d2d9ee8025de68311b9 GIT binary patch literal 28497 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/io.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9546949af01adac56e5fbd944f47c050321e4cb9 GIT binary patch literal 4025 zcmbVPTW=g$5k5VAnI4aC>&?xHqdmEMjP1!~Nfwh08)9i4$Qk*$Gl$XZm+N&mId0Lnx5h@0fYCtEu)<4D*#QDOq*GHxHztX3U%X=;kj z0xg$Zr=~U+fw%3`_ujiPPJ=SF={MoXs3a=k3$;HSgRaVk0fQ%`K_4pE-ScWZbTWBR9(&qP7shWVK@ z=g#DvV6;+;(@|jE3j@EtXZvH0wpRCmkYO5{IkMLC`a*UChNP6jw)LSsrJj8-cmn>| zAPwbN>m??M=!9j_1r4~4T5`i!!`nh+L8<70F3zBB5+U~O5MpzEKahpUX^#B0r*G-a zpVpSm1L8GU*zx8VUs9G!F!+T65vJVRZWCC=FWQuUQE8A5GlaDLY)kH3YNFn|U6{ci zKFsCR*eD0Wv!hrKs}(L{)3OAw2+PW)L^rUGGgcBAmX)YDCsh>vuvg!^o!@BtJ-}uN!J%cMfgTLGRbpJ~3Ypc1hul8JAHZMwD;ROxBqpI*@HH<_~6KEcRX9aQ* zh&;Ir3gz1#x2(9svb=y*T^x5>*85f4ZSABjiv=Z+p%>1?SsAlQREWLE3I&e4TFR8T z>w=1kI0&oKao(xnU~$o~A*J*Zz@G^!^PMMok?3%TV;U zn*ZslQ1*Of^!! zRGugg)tdHubymsg^{R~7D{c^S3ZOvYMFC5ODRaV-EdUSv8jZMD34|?bvwN=jeFr|%)x*Zz^`=Ss4lZ7LH2y`1j2{mUDW&ai zj7TOevkZfmT1NdJmQfSSG?YhrLusf?MLRW8FiXKqlUCDVWPsJQh9<41vvfnBA)-5K zrBFBlYv`oyko6UoiV&&f2fOC>-5uvL+jq+9B#|D`VgDF#L7MelZiD@4X}ap)-)YTP zGCTMaORV1Vlb~DUxMFb@d>1!799mt9o&~o6q!7Ls?rjV#3$sspNCn4F;s8-=2>Xo>BNIkno1K+Jt z05$M;;LqQ$LK1RpR~`&^Xc0PfzDtMi*$*7A>QTSy6*1|SX|Wc;9iSG9P6u6Hj%c+K z_);PWAU~3U25<)NKzFN^Yh9S2T{uQB)2Lc;d7>pMwWT8DJ}(?g41=+7dXx?g7449p zfAd>@2{I-d8loe+-#o%Qkr7rbST7_eMtE{Wx&d-KgWQltG8sqWXxfhGEK~+kw?tAT zJ&U9~C`-yoFhlDG?z54gJW_T*{!-vGN2(l@N>w4yaMQTavT(vp2K+>9B<6&A0babG z2EafnaRNL%?%JUtzy(Mat8hEO#UKzQxULl;-OB`#GZGXT#=Q}25Klx78wn*C+^9tx zOf-4dSy(*{zwkq75-d6TGAvn3cP*#;*A5+7Fcu!Hm9wf@5}pIPi)?>qD# zP%}5ae(L-mj<1}$^fPVY)>3|@>*$}&V}BffZe|z8m-a1wch&5FZg#@fiN)J6Zl<+P zqe(Q~_##AsA74Ix`J}QVeIRm4kPDM0=v^09b7Yk`|2U_20HI1QYdUorqN; z6r=ZeXHvg^B$>kW|W#E{(0!rIB@CR>UBNLB30qg+X)YMNndl)l^wspOB`RQ?zc$r@Ls zD!=b^PfyQi1m^B0ZFA;TOvs z9Cw|QIEjyN)BHHkbCN@HMjX@5ap$x!E+EZGLc}%g9(S|2E8-dVAkP)?j(bto9VwbF z9xvuO2e+4#JRfqBSN47GG}<38VYx-fEw<&B%5IkLLw?EU7y&(>8$aB5nMo}LwQLF1 zZ&LlBmM@`}o74(WE0<6!Sg%!}Rm+vu7^{jn<3FiGs`*eDua;IxwfL>UZykPXEqbR^ zk93`tUM)2sU2oRz%H(H%rGV7HpnQ=Oiia3w3@N7+o1QR+YlJ3G@QYiK{s>$r zbK|_kjXNZM+$p&v2j(frF3Bx9KNPH4xG!^)yd-?+9rs-3&hg{k!(70ld-jLsWMx#E zZz~q@ycrFjo|Q$GDTXDCFgzKSl|DwCFc*!Dg5nqmzeo~rojcDR=I-)icM<4-z@Q^{e5y+&dGRI2Ae}tNmzQj)rHa`_Ib9B_(`DR{AGm)6=nN zza*cD$6^t+|IEPpf&K{1EErd0xo>7p_rzntlWHtF?>A@MXJ%AkoQoa=7q|s~)n(rz zqTGZjOBAPR8dI%A;YS7=;0EAB!DTk-9P{G12a@F(qW1iAFYt)XAx z&vPFaWdR{Okr=#+;!^i$(S-7it8?Qc1BioZ!oCHGfFUc*P-~)s$LW{ zcr_R_CU${MOj!Zie0gR{nM#ewRhtofON-i^^0#aL_CMWyd#~0pnC#e)^lwafH?kRG z$=r$@pH-r|Q;jPDL8(JErJaH{3J7}d7SVX3p=mi7)Qf|`>6kPdp?FC!czQMzF)5y4 zP>M}p3>B!O`QpQa zp5xZ?vmXS3=~VXc;>u;BE9(Vgc6HH4#^Yo`5lZgDH@8N zh{)pEDOr(4l@$m_Pl!{YnHf2%im|8|pOVGtP?#c$9Fh!G^PLw;uaD~Mf`X6%g6@jX z&B(zVP_(#B!7#6LaSISLgL@w!c+$?FC`Zppg44VwQ|CM{@ibY~H0?WkK~Nox%0q)X z$CN=3b%BN!5OhHbW3-gTP)K+j1)paH7x-Sct-?~ylx%1cN%>*g0rQ%4MjfrCv5kq;!5i_3eyD+pMBz+kT z5~o(#LyKXjeBsQPL|7cbSR7>|iUu6Us?dUf>%I8V1$w~-Hn$_aEFfeT$N~h?f#woH zXFjZ`zFvQ=K2_1KRkYt4xl?<4f3jlWVP(x#>Bfd@kz{52Q+QBv@)6f**5_1*nR&m-AJ9Fa~8& z;{V{aCxQUQQ37@G*de%znc`qEqbX{juv8uebdAH@L&{^O+$`l~DQp_X zJ+fCSwn=Oe%u}CUe>fhVI5l@L1_KMW=`I*8aRs6npYLSyYmmhmlP*qJ1yn;!mGu~) z?pIke!Q-)WFd87TH7FQIJCO9?@kngq6w4m_t{y^yyuJf7)Lkg@j%ha>(^p32kRq$` zV1yZM>Qs0#PPMZw>#LV3lHXThcvuHu`2PbBF8~$;I=GW00C~^F7649x{1>#y5E?bv zCN;N7)?$JD7qrND>O8@lYfLXS-odM}a}18Fvg`dSy;_#pV!j*pJ`bBO&)^=^)7uM? zcUe5b+6lN7f<0v?1q6)BFa^6P7@=S@f~Dvw8oexK;S84kkg9!*Ad979M@k&j#KDxf zRTH-+#q9vlpyq8^=cQ~Ya=G{=oO4mlokNF8!~aU#{XL+jh|m5|siX*=ZyeUm6~)bXwZ z#n1Bi;kfr45*0rS9sBFOslnaa;O?)a#OpKKp3})eObSTRvsR>AF{!W7WTs|OKe6d(y-9!yhaqIzu#&ofsP zDAs)kVV%t?@{w>vo`1{Gak3H)MZ)v4Bu*-!6Xcr^W0NA&L*k54Tnt5GFj~)s<5OZd z4y$!?QkCN@&Fog$C~oLP-8C7BVI$3-)A>2WZuOY$6jn_n<}ag~$QYw}0`g5!LBe{- zATz0ME7OXQpfW0fJIu2&P?Q4{(7T1yFbvMkT?TopY-^bT+c`9%l7*KA+v@u3d#>#P z!XCa-w2+f%T=7}Y%^pzRzT#g76iFF6X)pO6BBt>Qcr+eb2Rn3RZGT#W917a7>f`{` z7edB+$&_9GdN}hl9LgJLh`rTitkoL(vRL?W0ku>zmJIwTtGYUJqw3mdvTVged%U{t zhH&HUoBm{V*He!`(k)~RR)t<0^D-F{Q%=eKncx&6Y~i!w=`H?BVkInA3d6MwDZiO= zOXWyam?@7`iBy%D^1|CJNHu1vh^1=HR544{nJJ%CkCF{$szho;s>w{1O3g^Mu+$15 zMVaiE;Q!6+{l?4ZN&}+qVy4XeT80s$QNuX~qg4zYkIlx#5NzRT!!8CeFt9K!V$w6Z zm*oV*5@Q$LYXC;@oE4kXU1!5md`fpu$>9@Iaoq{4TldY7@g1Cq%_1QjhbvPrm6Xs~ z6r z_lMQ^I}F2)9n*`jA&9Cp{qJh?%Nu2MZzwu36;o(-W^B%i&Cl25*P>~m-Ej0wSPdTs z4tM33u#Y3_Q@~(K3+@ei zkAx)KRuss8!74BmK#SGOv{)ej1uYht>q;Ki5#GslGE1U&r5pgrGroOfJv z{M0QVjW}=M6UIn3W8QPoUpODNeC9aF@16IsS_Se^iyeItR?1ELGt1njG;ijZKd$8X{Da`Hn57-)+#bIN2}x}&U@HCPPm7^Gf@-_m!m;vlAhOZ?IS!ovvDAh|1 zNZn8F2Q*S@f~5hT%6nAVW1t%vHX?6lBIAlobf1Avv>{gYdINEm?n?uehK=T7BtnQ zm9(I#pKZIcE#d1}Skd;`^v!AHH(WXJ^4VrrV#hDbZkJ^nPx+cPUvt9OwXkVxYSZZb zO{2-S*R)Ne_Xcha{BrZ{&A-@^*fgrOy@nbsT1hLLS-0lvPWUz~^si6#k7@m5ss6XL z{EZ5FHUZf%&1E8sHIYw>8!{U;!YNxZJE6$IV&(~zf{g@x5X`oSs|^uOpE0O zTC9*NSc}bA!3v_=5EYK(_Z_yCaAaKTz)`<}qvp6Or7G4+nXNQ0RTb#3TB<2fvZg@E zTB)u;$+`k1>!o_LqU3g3ly>AW5a31Hk;!_dY1y) z4(p{kc0D_NU>=&gPKC@JoOlw{Lpm8wm zM_#%d9;Bmu;+>$jFZk)+RCBM^+ zPBr#vjeU1c|E6&uv1ROj!+}Ip`8M53^+awa$I&5*w4kb|f|oT^LRH*CmC`NObjF*q11SJ9Ev85~yPq+x{wlVSl1> zC@Bo1(i{8_;PYIO5J!{3!6!l!{4GPw-%@G$TM#q+Ei^xZ2kS9))$iq&NXbERB^*>@ zljQ2`XKsvPMG4K3b2A>E#^IXUgX4Eu#BCpunZ=?SmuCzwM$V>~9Bvqz{ifH8Zj4mh zd(T*#{~PTnv}xT8X9g*Mt zGF7>K057^XQe!V{-5mKp7)bW!$jX$zOY?VqQFFIW3v5mXwj}*q6W*i4?nw2khQY%^GxYUl8Z2N~_e zD>@>tbNup76nf=(&*x?u1_X1MNVFk$eo7m2$KTouRupbc{hYCvjURb{0s0Lk)Ra z9Wq8lmDcu&-Q6}1=OJTS-Q8j@nu)+cNCSiijbKDnXXJ_Sy0Fh5V?HjU zQ8{N7s5^QF3U)avso%F#adbpwEA{>RRmkp}Z)SVqBXm!6>6GbyqH%{%ce7We>Xl1N z>D5c}FmhOAo6v!w>mU_4PB+ZWONi^k^fFNET7iHdis;j3wsvo#Z-NlR^OGZ@4m3-@@7q_c~rS}p|bw5%h}?- zun!usvhm9H3nPyjS`sVP-EUZ*^bTqb>#q*~wCeH?KCVqPtk=AQ*v2PT4Bl^eCF$Lu zHN27~zM^?Iq+QMuH}286+|P9HApUK5#z5;*-|!m#Ughvg;cG_`qF?(ehdbS0x0E41 zfq`0&12KjW&4?HXAz}L&=HJI=l}R~2=VUS_m}+YztcKtx&I%7P8eQuZ!%<>Ax=Ug@ z-!G!gdEN_WkZ*b3w;y%f;?4fydhiW7b)1Q<4k z&V!CpYCf20Q2E;^+(&FcM!EqSl_qHXr=Edi?Yg_WZ=Jq+n(i3>{15N!)@s)QKQ>-G z@Tju80DL_3)uepnySpXadRG(IC4K7?!un@VO1ZlA&s4fMeaSyu&0nh<_6v7<5X<2z zdb5nHNE)BVRfRVB86H~RMtA||m=?t6SPXg&8~WTe|IreDF?4Tc33F~$+qs4nTTXR9 zpGR_gFfokjBpaVhhfc{ke4<>%xRq-NVC^yY1>=V-w$TEU7BQ4aDK(Jggik;mCQhJ3 z{#;Hds6Jle{j0=-mv#*E{DdXF$Z_Kzd*5VdF8jU(92YzXGa&KCAsTb&y>t(f;EQO6C-(ska&@Wy=}H=0cw(PLVcXKeMzG>ySBn*qD!0GQY{&?AN?MSPoN+Hhf63YaXL?Ngdn*r!W{`okSh>Mv77 z?81E*6-HiEQUlBMn$!M7Bs{~8a|<+1Gz>d)g&cFhrSZrd-6fBj(_xmt3n1CT@)_C@ zi!;WS*tYpqW;5mk36@@lbw0$F**GWiAw6O)0gN^bicWau8}`#t5!1wGlQ}|)?~RO2 zcIHkELvps|Vo2`AagnKyzy*4F{>#-%C?~V7dXcqI2KZaT&eVWPjzN-mdJL&AHwTp! z{J)PfM@aB*B4P-BW5#Z5>P$8DX-$2}rnSKRt(s83;HgV^+85f_Uv?+_t(sR{@Khx{ ztqWq$W%uRx>9VA!JmG0xXz5I~^l2@9$(FSs%;TWvQDtudm4P#kd!xVlQPQ{L?vL)Q z{OSHwNt;&Ec5C1_C9CfINb~JT2s@tL_w9J5!hYZ`4Oa|rY&{Z-?JZ?x8of!7wzD4fF z&i0ZE@9i=LO!OxfwDXpNkKNFF4sVU&g92+~0si{CsFTMQYOW3_H=D_F!)??#P24~Y z8Qf65JU0}2r!az9FPFNybMfBN@1LUSWna(l2k%|yoj~$sFx}=AFws4O)~43?hLRa% zhQ#Cj8ir!tiw;F4zzuz(mf7R0vk|(TE*=lZr$ca={qES#Tvp_ND}aNOVFmkbBH9p@ zDu`VssIvr_ruY_e4kbfM`~|pF#)p{kmA+^YvNmHdZi4ys#fc4`^TcF&H@DVe(~u!AXn8J|(4y@(a-O1&?+s42LsF z>^Hi|ir!t6xJ06N1`$K_RxB@i7S5XRy5K2Gcp4X)+K@h{c>&ZV2~Yh(V=K~UulOHT z_7p(hhrY7Q@vEa(fWNH?q4k+cHrb`&;$iGxF%s*sOtl-xT2^%b+Q_=B`_3A}`2y}c z%b?0Q-(2&*Fp>Ft$?QZZdIpZMNbJP#CaD$+(nim+D$Ld=XQRv!0ksf`WWJ7JU~Y3S zWw3r1K34{+?2nx=H-7N*WHN4H<+0Bzfa!*+&)er!XWGP-Hr7TE^HgZRew$c~?vdmf z`Ac&J^|&L)?PB(i-X9@y<3X!^OD0xpIV*@SZT&&3d zI*#^w%AX;COP>v$#Rc05Fj;oSR}3|X<$V8Aj|_9I%{9m#?EXu7`5RHdxNn?$rkkwU zSonjv{Ey^dTQJ`w&DJ}qv&(8MBQ5oCYnDUP8PjK{zISI4q5js72$A0F91CV1qVt&rCW0?cGwJ*`h z7|vpkVVvaPo6meG$*yACJ}5ZG2LIiLmuNR*+TaTKl2uUt1+9&9Y-|kQ3NektT#bK% z-0!N*J~AGLcd&UrrjSXmgedrX2<98|3uV6AHU>Js`y~cy7B!}9JG{nnnp+$;xHjti zpCiZ_@-Hd(OA78-F=m~yu~MD+{+AdFz1Sta&To5(7VNX3LmtecmHu?aZhqJnI1<3gPgz++4l66#{zMwL`2RXv( z(IK62`1=u2=xBo-1~6B!@(Cr$BcR--fJ{=zf5DahC0Fs(UBYj=Jn@vn&(jqp{FbX#6yJioEe_vr z9W^{~0l}gZ$uvu@WrUSPKwuImxetF62~`@2g21Fua)=RRo+uQWB#J&g=q%y4T^*!O zx20Fq^6rJohO`sEkBTN1UHDyG=iwU{s}ZED%lW|t|LU|8zmJNxExPcV?xakrW6$j7 z*3o@U{GTpr1NgS)JE#%7(}9p}!h9dCh} zKqahJ3P`BfEfGniN+42|=BIAIklK${{n^n{c{?F0Rezd4gQ-&T)pPI6uGjWDMCsT* zbI(2Zo_o)^_q@h`Eh=(S@LUO=8@u75sDEK3`&f+zz5D_iw<(bl=_nPWhiIA-8Ig@L zF?NWJaYG#7l*mObG3$_(v@KEFkPZ4QQTvb`##*C}m~+TU=Gmal5Aif5SsCgWCEBl1 zqT>N$to6WLd&p%{oj~Q+QHw;6=(@%Y6~ns--X-uZhIgrhGJeDgu>|lk=r4u0o1r9D zEPFs3>`mTo;9b6!cWwve(-xoiOFY3x>wG94m(`FOk>kpjn2V3md1+FLtHE$Iq$oN+ z7(703vOgH;Jv<2G9b!lg5lTN`wz#BD$><&2M2WZ>iAiB&CkAAV7rp!$G;UK8HAIWl z5c302_z){H5+}0zfI?bau4N%DD^P8uWgoJL4#1oyW+fPJVm8qQv?3F;i^YJIn3zK> z1+2`(oMfKc#CWkBXdZ%9T%+J%ibU@J_oo%A>bcmNeZIcU0r zpgOClNVh6-0)-{r5(UjgbxxJuQNCfbI2)!@Aq-3nHU07!h>`K4}R-Gr4^&3ll#PQPi{94V;o< zvMQY%8JEK9@UYH>(3lc7FDkhg7JzU==;cqqNN!VVj+Q-xOY}u*+%zCE!vq&;k;dl+ zR4%{YXakiosivXlj{z#Vb1>JQ-*2?X`SpF--M~z8M`5OG{irJ?h5KO^xz9i?-e6XN zewbx7WhmWXR)Kz)MJxu^au=9YU%3AjGTY64fD>K&T)`X*^uL0m!{q2)%MaW&)?$Hv zkc?PAP^${e+FH0jKz+c3nK3HN41+!{F&CL{+SyI!XC4m5!Z=za-sK`a060zhrYN7Q z9~Hsk2%i@!!2q8DD#HNlTX$l^>?d}qJBi5=`_oHJYswjzZZ~YHS45RC(O0B%VkE2< zVz1j&IXJG!@s)K@IbIR#9aUg}^=0s3bxx6@qdJEt=yXKE4j8=F*E9YLa!m5a5*I?T zSV;5-N(`5r0=_XL}$tt+byUZ9goFl3$8X`lFE%|HQOqw-kC#5CFj zJ4u#iy=jLj)K2JCwu0f$P)|zAe>!=c%T(9jt(~vE&Rst(<5A16u2W#nz)*>(O*;&-Fm6tXXrl;MEVz9!T+<@vbh_`dHekQzfmOMD z4x;5EJqZT1YIRHgh&Ut&qP4&%>$*`kbCe^yD6D2%H_A>%HK{9mCwXCZj`7}L@Ah@v z945D104U_tH{j-2$IV$lPUpH&JQ=kUJ0(oZb83y)spUylAS4vr3zNMC;PRRcm-ngb zff@P+Am`1;@*H5%D;yxg`$IJt)M8MF0da7AA=mb8JemVxRU>@Hx+5=>8bxx9xJ8|X zoJe=BWIG6lb=|SzYhC$?h>z9Ta8yA8<_h|wvMv%e;hxO^lJ1$qX>}cstNec+%$zurI(J?>asG~Nv8qk0YFn)8)~dQ64lZodb{>0N z)sq?>&zu=g#gTRf-I-c!=+qiI7aR6y4SN>4QwL9Jdj}pj45r?@nDOsk7}WfSZiVMs z=8{@X+hgz6M{1^jFm>kKU*ZdckGA{)1Udfua|`sX)iy<_2= zR(AYFrK{ArM7bQ!B`+1G$LN)gm(RVFyN@Q$>W`gU0-Ni6CAvKrjE7=UFsM6&!I&&2 zqPXn}2H#DDq9(-_42p6Xx=Vt=yy7Gn{1(@RL>ZkY^+`;Ez$KCsy-zK}`BBCZ<7DqGXB=a(FWIT0(yM(-R?1a!^*Frv;;X&zDs4=2!qd&ZnVwW}Q=0QZSL5cH z!zo97nri{X*FMviD%+gqwgIwhA4a;<++IKqyh*1xZ>nlfnmYt&>(-gxR7rE1YXjsU z9iV3dDd)a4clbHyv3QoYQP#3&Op(R8%w}6?dv>#7XyhIo)#0I+aU%5%Wfcbnj#*4W zfn$-ZqAjn$u|a|3&`VE8OoG#CvgMTk@Bnc9{GYi#WNJRPAK`ogy$-;~qI%q3 z>0nR;?hpVdI2Z_maUV!xQk4_e)Iv5v8NPimoF=`N=)J~zXwa*XHXlw){9KMT+KR>bKWinvy|5W z%uv|dt@3KM;EQUty7siU3uH9JN7xMVfC_J^ZV2q}VkK@xD{O8RuG;Y*SZ2n-!zJffdS zaG!yKJthW8?k>O*`4>yKkdf#O=uco8zK{Q={yRf0IVnfkjjc;8Q*WK=0bk&*nLThN z@NyX!v+p}y^mmrwhh)Ejh!Pr!N(z=h5an1X65l3FAo5j55k?aTq(g*=zhp#UAU=6v zL;~vF7b@wZ04u<60MXsCl^}R0pI0W^-I}jjRh^RREI@EFvz2**nZ7_99Eng`0+&BU=y? z!?7e!6AeMRi&SAU8%)f5guie(34PB*2!Fxevm`cq{#Y6Q_@zjn9IxyG6$^z=<9@fPnx&!TN)$*o**rC1D=S?OlPd zUf2jw4~)BoC-ed!ru(9ls%`k?mYJh}Z{Lxw?7n~c9z93jb<8_Ho1o~qjUQo#=T{gVCk&B|Tey^8(c-Q1grW(QPxVnuuTiYFox zo2@c*C{L_a;YQcgs{q#mDme~&{}omV*71rrOSw0=x5;9|B(lb{%D~OLNH60!v2h+F zSwySIUE{L%bjS){ux+~YNX{ga?L-s3ijn}Up1L5#g}5{YW~?aitwNXz5nnhaiKemg zu%2!qCcP?Bc|D-1w0gAU?Uj2YZl!tn!Dwr!F#PA52xKbUa$;~!b~m-bL5gEEQ@YM zlA1tqbOI2cZR7B~VPwV=$?V@iLlFQ#WVRaFvdeSz+?S==Wecw;F5c6sa3Yp=q2G$w_eVCNYfoYvK?P zHUXlNHCc>q-)EFG2hiIv1Uqcy697vrP1FA=rs(E>P;FmOjh|Ee=Ty-bR0aG(@Mrk1 zm>!yjBg7DLe}-Q&I!-f$Sb=E(OcHK&+US~P4*_<%X31Mj*JMf|q{92DPq)CD zg$g#L7P3h#q?`a%NgP-C0fM)J{SqG6`;@B91LFx1)$1fq^0NCT5GgPFlGPleKbQXR-M_4_k4U)QjsIZcmn$Uczv#xff}$ZWwD=_HlB7wRoR%{3 zs4PpGPxGgJ8ULt1ql_xJmoz0E$OK1&yd6k~MnmWeq{E|OpR`ZXf@dWyq}N>c3!bA9 z-Wx`5jb7{a*6BgsA3=ZZb<9fFb@3yO*4x-RVC$D)8*FR?u#HQwjW)Ik*ybhJCL7xV zZ0iziv$j@?o>fL$@Y{ypR-dH%wf5_>SeQ-Q0ou;RwC>uYoTh6L%`(s|uS(O#X}TBD ztN_i*sxRzI$1&3H1MFbu2qX#BvDk>U8B{kxB1e2tbc6C5*~6lW-)EgbT~bGZL8L{67R zWlb9OY4WIF3urzZzM==TpyofTxJMg2CymRRayC2~Iw!p&kA{y(v5*x$lupd*Y`>P@ zA5n3MTSGmON~hHc-Bc44KCSlbAI&j*M^IozwIIJ$rm0ojNu!J!?+pvQPDI-ZEgMOnu{Y zBKZ~;WekA3o=weU22SY5G?qH9vw>tTlgVWVH2t`l%cYHh_^$=9`>D>9>2DvBrfEz-j4DW9zxv1vI6kt$5U?EsAZnpm9m^VWTHyM^uhTtQOs@ z4&a*4@+Z@VrO-?Uu~1dkh##wFoaHiN0WIzV+`cG=ED(d!(tk9zT-f@P*<0aGMzfV2 zcK{vyxObuP7c$I|Jmq~H=%vea*M43;Dg9YZ$$XU79Pzsx3{^(Tfn%@eJ=U66T zS^;BbT4z=`9%uSAi^s3|SOeHvHE|)z@wnL9X}&cElPTq!9bWwoRVTWQZh+s?xvrRN z>?t(%eDvyvuNT%nU0nN2v2pvY@OHjOXiAXj<_ybPe#2xjg|&l>ts`!H?EFwY~yk$Gil< z_r$4_AapMhB3$yqcEB>lRx}w(?bj8d-mX#yxKjI})KG6IbqGowv}%r~GP+?VGSg+U zQ9%_;a>@8UxH5_j(&^-zT~3ZF(CIMJ2O)c|9HHlH>i{ER_R2m#_NE6FS88rK#Y*M6jbI8j))t+;M`v2n+(uz2b* z9~W3FFrLmOOh=IWX*QL>lK`i_%&BkL9664g1S^n+TTNRbXaUVtrUkB)zQ(s?y4KNI?kQNrDX&~(99<`6 zO{OgZtMHC80IZK=WvHNkm~94@Z2^e+Ek#Qu%~FqTEV&6Q(*mw?ZDq&gsNJ*RWYEJt zEq&40`jg}5lslc>A4IN1&MD_!KVN@m*~$<4uJqyNjq{D%MJ-iN@?Y4zyzo6Vgo`R| zo;KHoe#iWmVSHZ9$9^Z;!A2GDMtz zOtGcsi)hDX8jI21`vHGbWM1;uMED+uuPxD*wP0a2#^auN%Qp8O9U@;Uq@KJl z+vEVQQGK}kW9hEq4}|BJNp+294t!bPbmrhaMS&vK!JyyuDS-$#?Yt!z5s$~FJ`Li~ z4zV1x#GK7%UOQh`t{N1u{hw)ryCK+lx6PiRy;jzR&P6+PmErre z$C5HMM=u<`yzb%;ip{INim_N37=;cz(DcYQ84pHaKk;;A8=(rKl-h_g2w>R?pEm;-3PI zLB6Hr47$}1hOZ3Ib#EzjZz*@WE!aX6{@xxq2 z=>&YN)b{guMFcjhFjo~tvHc zD+@UxM&O6|H#P#0BM{2c)KyeEzmB#L{bSRXE?XoR%dsQ58J5%!=90XukiWon;xKYD z-JtAQP3NF1nriT2YC45TD?5`prZYoD=9Xh7kchRA#`>ZCY z5=>X=)Yar9Aku0zxnYBv%1ozq%G3GuCErr%lSv4PT zK(-H$gpmPse2?2vMe|lwJ!VG_-vzgaxuG(j^uOVTTy1=mrn!5A8}hbS(ILD@pt3hw zQ+>~_%Keyjy&gcQoYygV+F#2tQ6$O;oFJZ#W1^rdEF4p${>=VII3^;mtZKrbImNLh zIg7_J!9|6*iwdJv!&?!wYIzHFRPMIw%iLB&tkHE_q&fMX>haiK8X&wCJpe1hbuCUQ z4}TbzLW+}LhmKTsqW@sZFyE~DAjVL9L0Ryv-*r|QjseNUjG=QUgWQ9Ph%%;iF1JLq z6}{iY6_Vkn6L~}eBu!OthI^!+`jWm06wSt3BgnhCf0|N!bX<*&zZHma-!N zv5@fa!_-m2b6;N?Qtd~2ZmGL_{afe?8t^axEGST1|L|RJB(T^ z;~zR+Xi`2~-SI-3QdSTp9Cjoxgt?SaL9`TfktBHo1+%JQqvuZ}Jx>}HkW)TWK_|ba zLQbpnd(wB^mUu`~mn%t1MNVOd?(1?gX>a@@N%8LEVw_N0u;JF=rYa4qq7Xk{DpV>~WVKz~TN(sliKOBP06>Um3sQe};07pRs@mj849 zB#%zwRag=+^D!Mi=`>>K%uL!$Ar@A7BHG8}W_tu&u|{=D18>s?)EwSJv6QB(1DqAp zGw4yp=G19X+`;bp)gc7xcn3#auTi}QVLGHEVM4q(Q6g0ko)s${6W1;MXAvWi%ss=m0e*uj_d4io$uAFP{EwuMujlyll zb`;wO@9Z4pp?arre?Hnm|94ZCB5B{^`&;t2{ z54(o~kzuFaPZ5%+_a8&+T8OQtjx_{&2&^TrgTOih+}u;7;wkD7AtUfl_~-FBY++Eu z&P|;~rQ=T1hN80J%Rtk;O0`O&%y)QIi)Yrxkf!O6N2%=hf1YXbf5Ua)h>j#vr`nI9 zCh&)Z(=eez>2&S{;$gC;8B!o<+p&b1oP;{%#LMSnEO!Edu8OykD(tSo+2LI@UjNct z_I`E$xI@zC%#fKeOm*ns>qBoGA&y9XDWlEikSRmG(kk9H=yo0~WQv3=Un$t86_3F< z^Ob++w26&lU+gUaN0E5jt4KpMqKYCdKg8{^=V_Ky=+~g*ZyBnp(6+&w+ds_~TlapF zz0v&sOLNg!AsV~7>UOm6Mz+wp*Q-CRd)Wl|RZyKNTHYjqMXJFO1pW>G6;*@6f}U!s zL6rGrUe&PQFd29og=z{3gnRi#>-Tm!QE{H-Gv%KzDTq)DH8&35GOOBewkXuVml;`I zxERQ@rl;vs2VL`c2W}_x%a-~Dd$utv?C|@Jit#j_f+NPf?G@uqKvomum6eXYB*_mz z`fz73xa(&A^T7kfwwDTn2X4IberB$HW1)TH)x_=gO}7RQ6xv?$3Uk{_)r6S}nH7bZ zBM8jXTBzay#G9TU2_h2{TdVJH5ips}aWGL<(`qV-aQh>lN=j`CZinndi~p zK#bWd*bs~^IZrkYc&5I{klGO-OUX}stY9eM3u9Cgv z2m&%#R1~p?+DoF$N4+9u>}EP5)hgme<@)NuIsb4?DGSL1_)yJ${poPdf6fJJw}`$^ zOzK&OS>&gR2&zi~wFe0>zjkjb9r&QeX`iv^k!t9HVX#02s~ zVXO0POD*(%ZOjS@>T+oh;}GF{m#|Uv%e4SIFR`Rji=dEMVXASRw zQA`#;K2OYDMPTi>o6b`!32Qe=+EZZ0Lxek9x8Lmgbfg&F^U287x8MK%T-*9W+xn~W z?Y1Xxj1;1K?)!aIGVq~fU`6*B3h4f%yFXkZCO839MH%M^0xdN2Dm2K9DkwEaq=q#` zWi>aTezz=umI$_q2Fj}9C%?&lK>HwWECB&{)APkOXW|R{!N&~D~_cKr3U{uVq6dmtqte}`olzu2bW289ZWf^yAJkJ@TzV8v> zhJ#83Jj3Rx0ppPn_aLOCj2}XIuw;dw6W_`0Vt<4oI2_5y1J3(pS^n<^NnZ2s(v$xx zt@@Qz`zxvbzEUUeIA`3K@N<7QaHAt*saaJ}pw5D4yFc{b~zn}9b-E#7R^Lg6HMU%c7ML-LZByr5NFsCr2)spMhzO=d`C*@slV|8)1v z^k}%b)~(X%)8{|u?{ogk_y6bg{99dJt$^!%{M{3yFA2hb(Sv)*c10{46$Rm%pb46o z64K(hC<>ZS^QU}i|F}ObjZ1hIG$|#g1LFZ+ms7#gg<-R;C=1k|NqVPO?Jjtfn*7 z)U8m0CCy|)O(kgd?nQOzS1fd*a!oiVoN_5;_rt<1aTIHk�-Kj*4XHsY!#zD!;!F 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 eQjx=MQg$9DhM~3fd3Z{o^A;M literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/overlay.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/overlay.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..655eb8767f5c6ddf9eb01c035d336332271a0d5d GIT binary patch literal 56878 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 bgJWdtS_hrW`v}A>Hd_+3u8#;B%as0qM};Jc literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/page.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/page.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abd04b77637be839ab0e6fe7aad64e8390a86132 GIT binary patch literal 153023 zcmdqK34EK^btg)Q;0o?LDK4N$EtEt`vLs8?W`T<&NF+#c(E?k6A%2iVnVUa=mWkMj zQai2HC5aoiwmNAor_Dre+(yo{Q_t?Soz|UpX7CwK$@xa}M$NqUW_h!uR_3+NZ0~>0 z{Z`-uAlY$e-atQH-u>S1-gD1A=iGD8{p0fT(medW5PIVB-}p0E-oK)N{wow7*Zqpx zyu4TQq&&$rmpAVUx?FkEIw^l{-F$v9f8HH*Bb+C>=L+TvgN5ubm@5hvA+BJqI9QCl zg>xnIrNL4zR|LN&=wW{`{AIy1_Lsn49xP{nDf|_|3if;8uMAeY^48@Y&y&ht%#+F^ zRo}`NeG67|Yz1N~BSlxc^{$(LjhwZdvkEz@bL6ax6ms4g(f#jxMTy;8gsPL$T^#kvpGl3CeGP{oa=MsZ04M;$k~=7XA9?SN6wBMIoE67>qXwq zwC`=zQa2#AD=oE+Tj@sH#vHA*bIwi3xj9G94$ip+IeT*C^lE+EioDy>`qrtXZbxcw zTIvQZwGXK~(o(y$)SXD(m6qDAr9Ohx-D#;CwbVUG-J6!WNlSecsr%AWH}kjeM_RvS z4Q%1q1BgACV?=ti+7BV`;k4SfYNo=!{M z!y_|+w8_8Kj2NQV(jWPa-v(mU>7_y@=GAwA8~|s)W=?TIvxk^%7Dqr=>oorCvemY+CA3 zE%ho=pGr&hX{mEaoli?0&{7wWx|o(asHH9;_35D{y^ho`q@|9O zcZPrT?3jvC=AJDhUivc9gYdOVUxDv&_}ZkG;d?@_9Wm|F&m-mnd>ztP;rk4H zUg;J1LhyA;zX0Ep@YP7a2wzw)Nq-T$L3$Oj7vbxYUW0GO+8ZrTw{#OdlJt_uyHWSs z{~~3R^h?Ma(c=-bS^8_J_mUoy`7iQr$(;HyDX6JO`WpIiS(HLJ1$q#(Rr+P*xT4pK zm~GOppr^C8nAZ_=)e^H^x`mjhC4*&+QJ zViqkiJEd5PA!9!-O@MFlI$@5d!*Ya6V=Ng?_TLm zT#cO1SN=?-fAEc@Pu?>Y8;2fpX^GKe`O{SCx?j?;b%zRz3I4okm{ znCp5B{YAbb(%(ev7r4al!1oh+I$|D^-a*U@wwS+#m=_(s>!|d%(bF$-J%0yze$rB^ zPx`xv`6)|`Px^a^d1+lvzF3S8~#xg(6 zWqv=U%s)h#Kgd|-XSmECrj&UPW&S8*nV;n{|0t!*AEV5lWGwS@T;?CAl=&wp^G`FD z`4X2&q?A!m=KYLizRYEkDP=xDneSyR^A#@hrzvGtQD!Y;nU}fDKT9d2qRcRut|2kut zU*t0XCZ){3MVWt>vCOMn=Ko14^Y2mSKV&TP8khNxDP{f>%KRW>nVVeZ&r`~Lh%)yx zmiZ+v^TU)f{~2Ze-;8Dc8khNtlrn#bG9P6u^EEE>qm(lL1!ewg#xlRmW&T@Ang5P5 z|083WU!gL5SyKk%!rLaxSBl7b^j2;KLu%BBrk|L46c)0!F;JeT8ACQ z9Vw6srTiD&#(q)wQr;z(-Me-yA$Q->idqy~3|);bF2pOfZ|&0}n$W}hMR2a?tyR{(IKDecX5YW~bzRCQBBQL4i0mFw|GEx9Bw z&WrY|_4bXZ^~iC*49@kuKdY?y%ATKDNfbB9)Gymu7a)Si`UpI~;DUJ8b=5i-h^1f5 z==u%Ub9p~kl9#7XzS-rTb%D4?>&KSQKHu|ZzFK%`QJxRS)Pm^pQbbmZLm@e`B!@z8 zu9NFft6CBgpdAW{54+AECU+q%UZsDMUZ?}H(N;KrNrT$DTG^#kcKzD$8^@LIJ<0Az zla>1t#ryaRF=T~uB(^LssQJ;D+~bz1n7oCY&E!$=aM%fmcjI>_#$eM zTcyvAZi53X{pah}6%^kubQRS7pfInn`ondug68}A@cn>%e}RPkKgff_-^8V7P|)~k zQ{uY+2%=I}>bjs?$`2Mu?qH!*@M2!DC{ipHzGzHZuwCr$RYrWu^@Z54l#-V{2N&)pe5Aj+{&-FD&qpCqX*4&rl zH{yxnW&!aA^dd{X`0u)(YvIY%P3wZ=36IxXn>LnPAM(oWf&-;0gc8km{Zo8=KYGBEgSbu3hMUNUa;3 z81_vK4}}KKBN&<-obZoNsr942slgKzJ2EzS${#o$nwTCL&H+Dl<4lQY$?7xE3Cnjm92NpT-Lp)Ut>P=208W8r$ce@KD5zty5nw&ttp1Y6Udpqu*63 znex-iJO>(?h72XOvr}uvFKly;AIkgkx|wyCL1kP35_x{zbL+CT@$$N#t#czU@_`oT z)?AYayEyJzUQd1i1gW__$fwYU9=Gbo_7Ia#A|N1-qTkHt-JCaB)ioO>_yEBtc0SrR z4V)=vSYM8QBt@Tub3N~FW$n*A^OAe5eZy+|PNjY4YWsereSfn3z)S9zE-1z8*F2T0 zo>s-vn(%B{>p#5OfAanQlgX}AO8?0_zFWR;`rq(><5Z&mq|$ZjrJ=91D`j3LyFU6b zKd*a45R%_r*XZkX+h{P5F@pH{b$A2~7K2axu4-Vehv_fPOf&xKM302gdj?pZ#*pGI zbI?e05OY&0`Z?CNPOk^E(JW@;t$dwdn8azgHDs9^cR(IRonlVbiP_-!$rl?2?^tEPTDGsYJgT%jdgtlywe%+j&nnI5eprxSRr-Ux{F2gp z&pu}cKKg$1x%;#dzR~KdD(y+di(=EP423M55hyYG)Esz^Kuad)DE>zY`F%0(&)p!m zutU~$B;D=zhW*z^5;X%!xBo+T0VuEv&|QDN&RtN-6d3!&&Pla6qd!_T+0Y+QUjd^& zP+q};NTCE2_$`#7U$AJU7^tsQ-yXpxg#_NyIisi-ln+^HV0>OXR{V&1uYTjQ3^2>(OtcZ-zSF!jwd_k%H1%3&F)W^?FK$6%Y;v; z3L8GrCe?NSQKXpoL=aO}J`TE2gh`4cB{ob_%9x~jGBUF)M+O%cVv%QK%+Z||2qlf9 zBfKJT#w_?ZZtR2DE;jnza!69w%T^ z3nzyMrzeKhD)Bc2dfqp3Vr+6st@H=9xJi)uqr+;o5#b9A4o^;vP2_-5f-ISwDE%jf z$7C2Q8m=E(Yuu7>*R3^dx<0nnv^C+b&q4fCRrKHZ8PG}`Wj1I9q&iC-+6U#uXmm`T zy*#_%k1j$&8Ideg7(eqMU^_!~^e%EGfKyRRcGxY}8&f@jMX;%&jM`!e90SveMKm-U z4PV42`f0%IrtDv@1MtscbU!5k-jbsS1~h+}`e1=(XPHK^e{yVu*j2SGFh(q_7HYGG zLdU?-0_GvRp7afj3=ic1<3(zkoEPywN}y(faaGIp6Kl0z@UY!S6YkC&08Ewqm;t!z zIDxEh+^>O4RIQo30@;V;ljZQr!1AR_5jm=MrpHam;e{v?eRFe**CLYIG#-&zLJAx? z8VN@MdZUr~MR`T7v80U4iX+!?_e&VHPYL{5(%Lit?w6_6EC8q0O`d?D zWGLjDnDCts4NM<9Hasz@Zgh$bO-=X$lSmKwMn=ZY0z6yBhbNAWO^gyI4UG=_CJ7!# zheyXI&a1W7wDF0tWB#0?l@;nNIj`V9vltMqtlvRWmF;5*ch6eq!Gybgtp#$H#vCw8 zwK&7*FJh<6hGdB(fNFG6utX{jmP#c-k5n2glRUw4sVrC_l?N-OieQyg8LXD7f;Ccg zuvV%G)=9O&dZ{khAk_yOrG{XW)EI1*nu0A-b8x-X5^R;$2iv69V7t^7?2y`nUa2G4 zDS3k%q|RWMv?16nbp0B@sZg?6?wdu#3mE%^G;m>g%w#?p7%ztEH2MUUYwPHwIiAf zf^@GGxiq_=v2wEuh@O?D&{9~At?alsH@ooE4v1T&h|Gsna%2ZiSoEesOWYlYsF2Y* z9VhM8$hz|I42~`$I8KVhB67SoJU7=1?g`TVXzxsTiT1>JU3mWDEabbrbF-JP#CoGh zTa@GV;aE(by|_%Gv|b$UEXpy+*3{zga%>Tz;T5&yB82!jI*VP2S6-ACuSJpEi?rF9 zs9HD!shk{+H)(B1y+DDN!ZVRxB1YxKxp?8sm0oE{j#ts&$TPD@nr93d_fX8@wFMdo z&K8-8#Tya1Bu5DUqKdgi8DBxWt{4oNXW)EMc=!psU+F2`c= zGGvT~pNaI+xoaG!9KFlocq#ws4a+lE;^o4BaW=LPiALiUB8X9l5t8Q~FNe{r6q)17 zIB*fDJzgWSQnp@vKgi{%5x0!Fz(FKI8Gj#2U9!YsI-;?7gS{=I0F4p~TwA>M=pL@| znc2uSnxx(<5t_z$H8L1+*JdS5Q!%21uVQ9ycIo0`Se7ugVJTi|hOfyuIK{Lq&Mz&~ z395`QCMZD+&m5?yUgk04^;S}?S0~lt6@c!DjJfE&6amo38zs<#vG80kz>Y;A;kjt< zZEwvB{UGlSm87f1tE`- zdog*`9ZZ&5O4B4(5g*lFq{H}#T67sezZ8aC<#Gfdio-U_Tyl8@6z$C7Qbf(aLgE;4 zLLS5Cq>jg|gq})RsA!6go@c@FVfbT!_$!#%c*E7j*@fP))N3SMmKT?o;$=@oR>Wk^ zhnM0WYI?5s5~eGvmd%GRLo+~I{$3uPUK-4cI2rF1V?&?*%xrWPgt1yWKZ{vi!XbJ@ zbHs*pjuYYSB`7g-+w+HCXC|K+v6D&8rqJ0Rb#TCQ0HH?MJ@e&Gg zujAF%W*2~1d*^YkcNw@7Q&{^f`nZI0s1&G?kMBMW-pIOJ+BQ_3EX5VEPm3(wVA-kd zZ5!li5w&h1PiGvt`*Ppl;PA-s#MtQY)bNB_3-XhW@P>y2lc7Q1IB`L0oo{r&PX~S@ z{^KX6LX$`vn^5b0Q&SWEf$1qflzb+J$Hyk7aLlI``=+PH#z%bT)slgc>ES7y8lO-r z2PVeOPSPnL()@#yYT=-7ba=w2Hfe3(+;Dp0m=C1x;8eA?L}8MMO8N*%MrVLBj$X|T6t z6wul{J9hTbJzV1%|L|Fwq|k|BnnoOYp9mRoXZ=H%reZ`1U&Y{ve|%ufH!*~%#UXE{ z89qDVpMo@KaBOsZdTN*keUf++is6|9yBs<;f$3H22PeiRCqrWs{^S0D$!b>&(KHcb zbZi)B#A@RZ(x-eQA%NWwz|8L(nG78to>D7@{1cel&?HWfho>gh274Gy`_F)tS1ZA$ z6T}$+TRAi~I6X=bJ2W=x^9R(*;lSX;`Efd>9vvR?`_zu%bC7B==$?go!*FP9dMY$_ z%oq^0H8lgt2XN{=G>lHFZO72SB*tp$1Qnc~B*txUin>FSRZ7z&R*_nAY+`I+nnVt2 z(Q%B*I7ZWRd>9})C^DBEKaXJ=92*~2^H2DP)FwX7ReA8lFtHjiW&iYObleiOD1``ahgdkbt=z-(F zbdRVNS_H{DeaDB@W_uX8a)cmwdSXN^ogDRH^$lW8snwI?!>AlciqmN_E3_&AM-ZJ( z;#gvOAmke#C*S$NVCdY53AJ!KFfs=C$)BDaz(K|2KxjHZ^FM)c22@r8SxosMoh1xD zhThek9p*YP0T|H{03o$hMzI)6tTf>35(;sz)#|hU01#^kG6#GMPhssj^l=>JP$^I& zYjWfehJBGF4di^CBn@?tz>+YGP9BQ$>btLxuC+kw(73i9x*X8x*bR-2waRA5$g0*~ z_pdcea%xR(u z_KJEqv+0P=b@>u*?^^dDqvf)wm`gv;-|FR0l=C3ntbZ_F9AyULlOoNi(@%mT}2&SrR5S)(){9O0xG|Lo*lDZjgHnHxKlnej+VX#x@gW1qXJV8qNV-y-kZHbSt!}E3+fK% zZ&b2k*AAt9$7=gNrF~zry&v(c*hSj$S=1mFPNnkr-S)rn z`DFdRyUlx7n;%n}AA8sR?gi!OWU_fGO`D-8l?8nOMTUH|E0fbk9Uy)9FXr8=s871< z@744r-F-Rq7pUZnKDhK(n+@0fV+iD4pU`M1#A+?#)e2=$){H8#tk$BHf}T<}eYI-B zbFgc_aX~JyPeGzvv)FKEs=v*xj?@Lwj%sM3()FKjw0SV0D+l(K57yi5M|2{l_ zHR?@<3RB+IVxu31=L>Dn{B($SQsB|`%upjM<30!NPEy=~VH{jUAg2mWPl3>e;#kHA zM$!YL1?#lvXrUi##B0{u}y}7X?!#t=g~!hY3jDG);+4! zJ$fhhj{oh?C+m*it!sL%?zP#Q9m%?$wejE3v+y!wUF zdq)PYA5WAYOu7d?bQeOos*07X3JhgU__zmL$BaIm^w&^VIfH7C8OavI+8-pGR}EM97Cy< z8kp&NGHN-0v=MAbNk6tIPeXRDmQ61_wSY4_9tj(+#k7k>`~X*jvM7YLi*HGt2OTXv zL15O8rqT%x1KC4&Uc(~J*YPqeMQu9LS~k{Th}yOYk84wRZoVK?G&wDV73Cx%nw%ad z`62`n#kw9CChy!hgm}=lIXf{1@vo2tlA_od--sVlU;ps{tJ+}td?O?UMc#6eR~LO& zrE24-6+$wkYv-uVsW~9rnqaA%T0R{(6@ai9%mQQ>ITm&ueKk2J@jn{I*qWk?$|msZ zbsHd4U`Ci3ZdU7Iy)+@c;AEk)21!R?&AXpO6cn3-i=Z~05y2%jZ%NZo;s-V-}q!Gt%%YH+|aiMA* z!|5oF=_a)EKRQZw2k2O~aB}%#6esIw)cBDfh|YEYlVRB|%M7Nrt^?2t+WM3LXk)hK z4N!WHI$!~%G}?qNpcsRX`K_IWh9N0|j!3RlW|DzFwm6+fMS$#j2?_X_nBN?bKC3dZ>|SFckV{T+J;T58}=(3_P^v#l(#Fz z9c!)L*T-&-A@y;kxH3{?LP9*rYJSH+J2$I7k6wB^W``}h){&c~U+h%z<~&vLEL0lZ)hEbT{t zld;tTTS}>3I72;!*4%FueM{>B*!yAuIPxi)%Mo%$$qA4%2B)Wx0V@>4eju9UH%v*@cO4O9$#d=njrE}>GvgVr{DCHC5hmp_-R-E_Bo!>v7uEtug0 z$@YVH8(Uu6bIYTw-=1vjkrz(|)CC|2uW>%qjh+l1(Fb*LU1<-};Q=-IH9u z_ilUtYWtwlKKSlX!vDB3^hC1#!Vk-fh*vEt5sYC#hSgwUPeU+@e7k;-;>h^|b&kZC zU^~kyUpRHIaedOg{$5q>3uE`HHz(bj@6|OW-A(rzA4$3&`OsYq7PO98&|-rHg-_H> z_08yWNPjf|`!UPM(uVph)X)SKD)4)S9KIG}zA!{Lf|v@23KQS44#YcCC1j~Hhg;83 zfW#F;QHL|u{(XGjj}L2KrOR(AKMUp+x0D@mc1Foq_8P5{F|`ci#Z>tejn*_~QT2!s z;8YP}9k zXm+=EXj0%+`UrolL?j@FwY%>Oz0>q|AXz)OHp0@fk?;r2J*&;Tm1at6Q}!HB zHlHx1V-F=RV~FC7xsN`Fzlnqr7Q8h{A4|?RsIPQ{0K8S#m~=PZE8CECZ-8FFzJqkV zd3Vx%Acw?^s&PhF1E@DAd0GGh)U@wF2X9vU4uvZv5aoL;!!BlvDG+9`Xr0A3TP-kH zGV{VSSIq^rhVfZ6L@Ku-fy!)%iJ%SW)^-1V?z_2z>uBWTk&_=EFJ-q#sBRf)kc$45s|Ji3%cpr{Mv8^eIuFaHyW#cM62ts|xPkU#n)QcbeX zPPjRvB(lmd{(k>>vg@?cKW??kFs^i+wvlXXmSMsbCDP@)1&zLLyIBUJfOr;v6P}#( z+e2X}oszT6OCuX#Y-H;HZB}QxrtHz)?1mskVEywoj?;yB)i8;!V(3N7hbHC(c}X|MYCKz8&skk%lc@Op3agW`yjA>c{K5>*-2%lhz$ydTm zG5Iw17``%&D~GRweU&V-LZ`#U1zaKD7~z#}rLE6^qgjc|ERtrZMBY-UJcyD#H*2<{VB^5yK=*h*-T zxqh`|9+W*B#Npe*YOT1v9irsHLEQR=>Of-Z zBW~MJ86}`r+W1m_%s)89=jbP+7S!03QXPU{sC16UhTFFZ zf*_Z2h)1b%tt}FSru_Ju9pZC*GowzDQ&~2>$^guZ;)GG4BflhH0%BLI1tRh-NE135 zs?gDp*wxfx!a`H9%B5Bd{9~~LptdvO5jpkS`quO+#wylp*u?^IpaVV2p4C%iL2Xgk(fb3aTkWKKc&%GC5bsnI(tJW6DpFGe^z>In&fJz}*%xz&!nO2^)0 z$3F0;ElOD{?0J2;|3-hpzON5ZphZDY^s#(rfZ ziY2N$m9h<7P*0@q+OKr)U+q4sbRSK251@t)rL0pk3D%g`tUqUHY%(yWC>YNY*j#B zCam%dIgFOBk?&b@_^d5XzR!~L968UE!)WPqVDp-7?>)C>byh1)dIg@Z4cpPCo*|a>@Nl0-VofX_oRpV+^r&85O&&wDs=Jfw6yxpw&YdwZ0_W3OCZZP=_dY`*Qj z9aOgL|Dd5iF@1h*)Al>=Hx^#0{mRs9n_hn6gX#_Mbg%6lcvn*Pp8Q(vYg4yiC~W5k z&ASrgQ)>rLy%$psPJV4r@An6-`x56btOYJ4!Vx79`P%4e>u#l$y%vkLI8hSwk6$L@wex=E9pK4 zPxGTm_g?(nw&S`#Q3-i`9|9XTT^~x6wnIk@fvtTc?%I@e_ae}{>-t!tz9;G4i2wv) z2naz~J>>R%EVr*RY^bBKB%W|T~yYQiuul*I@MHna#;#P?=lCG|`W+$76N z34O%tbZ%15&16^sm?oUo5}_0LkuH`q45jKt?59E()N+`okC6dwvgj`Ts3Dc}x&*>7 zh64p=E*D~<=xjXlqx#fbq{DjwCd0$Hi4S6OhOT?38eyV2!GG8N7tzCq;mfcg>AaV* zK^rrj_wfaMv_)$)wy~X>^)ij^5TB#HEc_bN`o>mlwuF9UIeX?(#@1^qm4(0KQpQ$h zDkv+o^OFa|QIt1%P^%(6R-$v~wQEj7>8`r-Ye>uL|*rPP|BpbJZ96ocS zEQK~EVzW*0v?V+}eEz&w>Ds&6by(>-oa}lG^dy^@bvlJHsnstZym2t$*?@EI*B`(6 zIO3ab1c>fEeB*G!(@li&^EaPIG}FV**C1%38Qdo@8V?}}eLxTg(AX(Yv?6{4)>axt zax-PK!F&h6Q4!riwvC!>lqyqZ1sXNwv9xESS~*vtmWzx^@(*>{C|J%_#JOr?)?7Bq z^{wJ>Y5ijQ$`a}+5x^^diGYpCDAH+=ze0`ydp$)KD9r?*$i%pnNue?wBBy9gu#ERK zs#FUY5wgZjh7+nrJ3t!(-_H<8|276eBZ(|@PEGS_%_gO0(`wC5rG`vmUV6JVS#!ij z(M#Kf7kZM*Nplx+uJ+4GwFwR1NsKB(RNZr$3B{&%L79llqlbULbj+Yc*?iTo%A z`B9N~!ZqSDBY1=DDa%Z8IIZ~X#0KGinH;=@nHPNuBV!>ph`NA%e2v)9sEQ*4uIrE40B#-8iP5@nr9_Z9>;Z@YdXQPBkwhUcK>?WIFAk}l86u;@va_`R}5O+XxlSeMYlmE z1hhuMKzv8)HlDHE6uM2u)cJV`VUaz9G4<^j*@xNObBL_;jo(4&YT-{GR-BkcAj>A& ziy0Vf&L?Qi;WW^~9pYloFVcc|6%ICBdVhnbEUF&~aw@MV$|Ao;P6h#0vu(0z()4|G zg_hb2_#$&(ZEAhJ^k(U5(^jQvYqE(h@|?XcWWA7-SP4cu}+Mj4oX=ky0H+g4ll zDlL2OgumCaKQS<^G@mg~EP=G2am6jSkv{rN`;OrlWy* z!SwQy$iCt3&J*zFfN=xr; zpr@UQ1EWf_#qj*S`KQf$+j#LJAWvZmcFe#bA~#kfU#uFmC1Z>J6mIslq_t`6cl1A!!Be9(#)q|>hUQph?_N+h_9ks9Se9}kgnQ@h?2{Z1u$w*kkPV|;aoiX zIj4F^Plz(k&&KFMLpokpi(uIjFL>gKHO&(;%NM}PZp3cHfM$nDVbUs~w=}QfZ|YBf zZgL+IoEKh$IS4c|`m+0nv;g|46sbVib`>-#8YUDcXz+)+P}`K!qOs`Sqc+?1HUm9% zPGSYs&9)2+rp}M!HlW8hG(<-ALIb`Dyfy|?W1)euu~V=fc1jE48kn%KR|!*H(`4^U zk0?1l9DrR#x`ZoAk}byJGcY^oVH1PMIO?BL3nzxzkXR9nrJWrkgJhZqcK7u11u)z= zoa+IHZ(_z|a{dObAqn4UUOO~j{A1%)Y>$f_HX6m2qBv+8_To#m!g>_h@yc;kjheMB zJ(@)PQkPyjDGC{exTNNWPaJ`ePc!lXpEwACWP{Cp;If(_;V4=u>nT?&1L0?8g#p-M z7!Y33wi7cJ;taBlx&nLINY*aZ=EHocIL|Z=Hq;8T!^`?>66t|qiO$Ag+M2#it&AB9 zoO9SvwgIsZOQnLh(?tvhe<%iyT;e5Z!^P4wcs*OHetzH}FhE)TEWqg$!4P?x_36Wk zlHxpoWb}pF;V}#9%V>OP5lgV4CzG95<0e$Kn2q9(AgbTV-%WCIgrSovI^D#ra z#aV`K2m@}T!#QQ>8pMlfvr52i_rz?naa)Q_)@`{b<}4Yv$-Lhx{FbK5hAG1(z-1b0 z9{xWzhW}6CgG?vW%wV(r1Io**fgoN8p9%NdrixhocysDh87TJO(PR<-Z;>|Fy?pYk zm3OTN?6#W`HT7SSUfcKbe6ptdZtK?7);&t=o;y>C11FWer;@EBKlBumaJbO8jul4j zsnqX3qz;qwkE#7(x|oEG-Q$$X}FCJb$Jo;%a#JmnFqb(6IhOXnj9BWUGumX7jjvui|4@g#R;iy z2`=U~f<}XheLSxeV@_l=5(~3!`EI5=%v9~QCK%`Ebd5FtD!xc9UA%M&*Sv8_Ye}sp zwc$_{rk^7rVMSgo6GroKVFH%j)p9K)Y`;S(7#enXuvn|&+0=-Yfc%rxMhRW-g_7*N z-PWFgFTKe0Fyh+(S@_bxiJ5Ni>Sv)2C#8In>kxmn8qkyS)2A8jS=g>VJnVkPj zI~q|;=8jg~0E>IryqYv6s9J4LtJ9RB8gK=f9`x4#9ymhEPtb%q{Gq!PJ6%(zb4hB? zw$q_)`hCI&21|!v4r1{#5s2|l-k?r~p9upuk)Q{!X&}wY9~S_($uYGE+8>u@<#{~$ z09#jh2E6QI1Z-_YykTIYztQa<2di3R_EX1Py8vUK5}R6QY0ZG?J=C6sMRhh~Q{clZ z0aI!bth^ud!=`;9tk=NswpunY49;>`Sf&;TJ0pPIBLE|33oWBZF@h$ySYC&x;h6zs z8^dHxI0yen717m=Xh!;Bjc%j0J2Q2VBlE|tNKt$!LMIcSc;sq1F&>F+LH1zm|O7a<4!NDs) z%kvp*j{H1-l!=)2ef#5G5~c0q6Z3h*t>MJ(KhU)PM{@oXIX{4-pX53uWl)Z4N*!E% zIh-U|8N|n%8@bI6BQ)|4-#m;>nQsX|TWaOy6@*Ah%4XlgncpIPb2Q+(ALrp+2gcVN zVhoa9TV8{(9}mCvR>8Nlol`Kq4r7Jg%PDr9V40YCa^{v=(nix*?h`bgM|nKy*t4z? znlk5aRwnDV+^r|WidU89o@D*jyVZ3AY!;jYF0#Scpgh&L+8${YQAf&+5;sWE~x zb0?_~XOERNFN|Wp@Kn6u$Di`57fxAE9t#bY2tL6QQFSw@$@poL;ky3_qOvV_Z9&7< zvc6{Uo^@eQk-FY8O5c9FA=oP0Rgnj8iZ>pRP?)RZ!o#*)54qv_+(q$SPU&GDC?Pu6a<`J0K|qFX1) z=3RGN+Fp}x9U+s;ExR9RQ~D82GC51snq47=_8)BF2ut9NaA1Qg(dcB&nk~?PLNnI}bvdjQ~w%S7F)UidRZ|D%FZJvv`PZ&cGc9cuy0N z>9}J%7$Y5VY-dEm(mAUDuh@{j>An>wFi^1>f};w^FJW|4cYJYi-Wj88K>Gjg!Z<8D zAy{*~mY(I>g1A^tBtS_(EfOPtPWPOb9TufbH*{qWEl=&nLNP^@kmImg&Fqyx81e+Yl#85e6uZCyZNrwpIMkzL+s1h zo8`%xO>0~F?sUId@k%{x^&NZpxny9e^nk-k<2jDa#$lr=iU#x<2XNaK@yN+V<*|J?IhxTUbgZso<%0< z2gGdj81t1y%@jO?jOuz;b*-oc;&7)>(3y;ZoVSKM_@w_|Z4KJlbuEDfJ$okClhZ&B zp=H>s4B(UGOz9a=aFssfI`aLO1Z|`ZZzA8irdN->40{MKP2MP3vjuD@)FuwGr8r|z z<1G3Wo{Il9uxRSJbEe@0rJpHDuA(_{#$YwZa2vSm-_U@c;sGb(w1RFk)xPXcRpFI1Dz|^Q0K_`V`_I0?V4z%SlkuT{%D9pLn{=@ajHzU&Y(i$ zhZgAPy8qK~(`i*aev=OydD?k0t_4#_J5$EBU{V5wu|a?DrsZFI}T$eAwABL2XQ0|`$jS(iR}lkN*O z-Wa8Owi%)yyYX1Uvk7O-->iJ2Qa?yWcH7fKh^H5aGDkZZuW`otG)2G)uKSx9+zIDP zF70Nkl?JuR#rbCII)_{~YMOJ23q}<-iq|HT;9TPVu05AcK*726d%4zr*(h$#rQgf7 z=CYk=b1wZ}t~Hm963>2GodQr@=>P>awUkUwQ1_Q;Kf}({U;{m4cj_SE`%MNu>`rTa z``;N-`i{ObsY&ubsNedow6zS1SMo<6AQerL)tZr7oA-O8?^SE8Cx>kk@x z-|Jr6zW1FvW&7b*2E|Fi2X$NC-Qyf-w-|zx1KWx9!N<&?Aiygf32+`KevHXj(vC|s z`~9aDngep~1D>Ow#R!@E=%%f7YZk_5>Go6C=Ig@=Pe;H9AvJgjahnJ1Qonw%K&V*L;ShZ)5^ zC29?n7jU?3g%a%s6-7Dim)hf};!xarlu;<6c=XirODGNvEwL3l?~O8d-(1vs*K(e3 zIKGGAq&%Y62+S|eEs5I3*}`TFsai%|)QJTMCYjEr6nP6dSrkCE>k`&M)3N$KT3CB{ zVd*-cHUe5#4_fW$S33HW9S1>wv!0MMVkMPIMyx>|s~p5Mx-EWAcgkoCtP^ z{V*oDT+3g+6;U`cGDZOxDd_~7=QNuROlvwAnfHwj)0p(38lnDTITpOzvPs<4$CdsC zW!G@B<(PSmh!=Z64paLzPEVybLw3HOy#R+cdYSXqW&E+80oW+!XSF)?=Rb2KUhmb{1_Xvc=0 zvbmb>9rl?4v5%HM$Ud5VyX>WpAZM7mcL3cp7h;C((t0xDaHEeZv#m*l>6dD8;=!** zVP%#_Ds0?hB|jR}Fvtgfri%Ckzk!UKP75qhJQn(zoWt~fO4?=K3@saw zzesIcG|j3~z*a5u1qM&x>At}c|KKUL*1WPbIq4q@;BwNGT9+C*J~la})}EM}8V`x5 z!$T9p$8dk@gxcf}_^0sdUr4+p9`K#U%sJ{%et z85=wm@&~4dCnl%30{LA^t(qL1@Q+U+g(7jqDu;ad5n55?JV`5xZqec$E`Bnwr8nVj zTwA{*;ci+J{*Ha->uhxOX{~*4!o7ZtRpIzS!5q49)Qt05vn$7>uQhGA!>*^3Sius0 zfP8)GY~sO8UCTf%h2%tr^1xL1qFT5Rxki6W@b~QOg0y%|Erzo|7XUvE0Po7uF&)a| zpB|KN%+|aC>d&WudMbuiJ%iH|6T^WiK;eK|6c|3so>KCh^#_K=&Z@<50(4C;2b>)v zI3tHH@GuDlIIC&Derm0v0dH1Tw_ZQVZ&v02A*#U!LivDL{B-Rlt7Qi~qrp@-ziF?r zC;%jSP{XQaRVcKq@RVx|k6ni^LYNm@VQopDe0iA+p$nRH3Cl~~kG5>!Lha+f>;4&d z9)>Q;PXEx3&zg@Konthv(>X>&20EuJ%lGK;_tP{LL~omvk4-c20i^E+!*Gm0KL^7= zn+N~05j4ac7+(hx#_-Eox!L>{^H6h;LwaVCqW5J8Oe=Z-mr@Igue< zE#?Tk6%gMNTUo+cSsz=ha;Q^ZAu#K1zI>T;LMA&z5b>FG? z_nk_1jwt(1-RZp5`OTg;dcLtOvG0`9Ibyq)Nl(6P7!|LI+-~$0*$p-sidolr%(Jgd zeLY%6R2XN%r;48=i*Kk<;!%KRH!iC`zs|~xSjHA>I!MFzI2^2LV;pscpO+I~_sC!) zsm*CjjfMRtjp`73Di$`Y2-Dl^^*w82lZh$m{jo^0^^!6cd9U+>w*9MZ14`S#ySu*E zHk=rXD6N;w75~xqTQ5aXS>CIy2cek|hA&kZaE88voY$yPyD&i07j8JhS4y(3f2zT@ z{t>2M>YH}y#1Ia(3R9m|$G%2KRMt!26?_T20%Sj6IUKz#c)C;zt+$3!iLmKpN62qgf(!YPB6)CP z3?>`26wjn@bXX6RPvSA>!6`l1VGBAGE}afc`i>2U=)!w;o}KJ$%H+IF>tz)4X5Oc% z?EnGTc_86#7hHsR|Cz}`ex`iWV8Y$S#9! zh)Kbj%tcxioQqf75L`D5;;Pl`96vEMNTwd4b040M#?SD28jr}mf@{V}uaQsKgrwUx zfPCVzd38Pcaii>m} z>Ej8uSzw2$O8uphq?gbwS;n~QB&iXRfh28D{Z=uA`kH&6z=Ie;lNz;IFvxKHm_zvX z1S-sRUsV#Pg0(iQ0~v+a=>j+7!?Cj&{x`MzFBLRQ&T=;>9Wt8194q)~%0kW`P=DyO!IZkO^?>3$ z=!M~UO6Y|Zfb6ZvMD|iOA8Vnyuu$zMOtes~^6%mm7v$fi$8f_9|FPbLk_9smKT3O? z)k@jY3s@J_qVUX2WGQARUGc?Yk-f!$^x%u^W6HhTpi4k)ru-~~8B&SV1<6$?NG|Kb zw2)jlcVgCwOpNMF)QHGrskFu%J$+sNYnpVrtZ1%FEJdfodh=+1Yu~rG|N8c1`@T1~ z-#YzEPv73Iw9_*+bpB84l_=Ma{o<{{yb@oEsZoP+{Sq4e7=rUo2Wl3&w$HCKC(ri! zU}ZYxYG31)LDhLv9#oAtCBNWJGtjPemO(Yv_J5*bC3%|=u-gx%#WNQD^o&LS$y-ym zd%hk@*6n>GbjyV^^XgwXb1S6O?KKzqz40kC@X`0{_VP=EZ`AnKm8PqYG7Rv+HFrGw z=6#L6jhsKD?(RZ&@g!mAM*W$Hd%O11d2=7$lE@)vr#hV1{bzWVa|mu+5atLCuL7Kk z6(S_GxC($3iV-qxArV%vlEK9*1wCajECsA^0=ibXK`ofvLKumFfSuQf>X{2KLkQ0X zi~>K}rr`!htDOFMY{V0qm1kg$f>~V0j{ZpJlpV{M^MB!jOrvfiWywMf@8c4-iXR_$ zY@mgYVI=7xtSx)c`;?zff7qUi)0MRx)T_8Phjh2u>J|9xW%G*1vAiFzq2*jdid?F7BkRWl~#J8T2s=}w66B-|DBQVj3nEA zZ;#x5`n9KDU%9#R%b&e7qO|*Lm>A}tk9_p~c3+ex;JY=A16$m`ThchtYnLWaBE#rb zhSBWO1Ph)`Q39}~*fgpnp-r_3P|G@0mbw3!k_e0T6`6`=ovXB34Ryo^mTy=rN@16< zgiQD{ePnaW1fdrV5MmH3uq2t##Yy4?ZnfNoY=lAtW8@4QO}!QHjGd;MK=11edd9uA z6EEW#+fBCX(@pDN8@ko1wDu*NcC7iw6I18@r~_6#j(-Q# zUEiziz4QG0HN%O|TwFUjnK=8na`N#z(mVa%SxnX)dwcOt^((>E`W~ge=XU4!>bKun zRO*hITE)1vdeL>sWk!7TVR2sVG1o^pHDl}2zuh|Esrat9b)c#$efQ#x%UGs42-oLn zz{&Xw+P#GJt9y{mp1KFJ)sH8=YwDBkx_kYHiFhS5Adui9fE{gb(tYSdcL^xj2Bu^k ztY1;R&N~_@B0Mn5>4wHKF`!~UqgxH6*I~8mPyzOB+iS9nyYS)`k&(IyPYD>m{0WdVNF}+M2QSl^K}RdfQUdv33tF9lNylL3mP= zRfXM$12+!<;nGWt&a7%NK88{2Pr&nltg2n<)W)hZ+7k+_b`266y3K6yo@`~9BgW&H zZ;9X`%yJOZXdg!d2|Yq1c^Y4s&dNIJeQxf(Q}@Q_SQqrsm*(UD2W!6f4C5<4R%`IgkdH0|~sp()^yw=+c4)1YOrOsHQkEh#_?#U1l2nzl~s7MW(op_Gsd=v1rX;Lp-1k#mqL>O>;gr|LRvIynqDP#I^i5p(GXHpC?5 zI_Iv0@sQXeuA|sMs2I{nj^&l^3`A#m_b>R|>zZb|=0 z9hM_BA=yRZ`)};WwE!|A)pWB7bVl6`=+QvL#`8Uc$uWKgP(PGN9Q_tQTCkb)x$WXI zgA(IW&_v=q09i0_tHUT5&^|}w(2stk6AxXRZ|`~I&@1`4?#SkJO^Cm@x8Dp1BB3}% zl~3HF=B{NY4PK=sLQaT!vJE`}9;elD&)a={Fi`?~gWWlvj-b-c3ndFi&&MLs#9kUn zU{!%DWEHrI$r)IB8h#cJLXyU)SRix|%a7uzwO7K?kT{Wr5uG_{2Dc5J*UP7i;Q45{ z8l4e`zGt-892gr$0t+b0kcd3}oo84;$D7WRn`Bc;yl*RBl5+@c=wn=b_<1L63+Bn`K(7L5+ zDK2?vH}sh-hp3g9ULn2}4><^v%sMLz<-LeqOMqqy|6TWQ!}Bl{u#-4Q=X^2i`ppGr zo>V9o&6_Jm==r6-IG0MDn@p|kR;crWqEF<37k9RqXg5CD@maQ1D~9N% z_@yo~NoQ`YIUa(!<7e2hM{#zyr^G`QldjFxFl z$7)TFQqyz0`}Var@m|}08wZhcxsk3<6uHS1h#RIr3iI%|rWww*fARch-@o3V&n4%l zse?pOVE^*KI&PETMr{0SA*5baEcJ5WXQ>kBwI4^VcBz*^@0pBAwsRah)e*Px3m_At zkT}&TfWlKLLgJ}!vi)8hDUqzU-%EinDpb$pm9QL{f(l|pQ`sfat6B)%iz|zGPjvNOywc!~MV^fb>Bdh`UfjZ;i`Wl<3Cb9fNfh!hD8zy$+^8evM^H@^^2d3? zA`24HPgxwUzH=#uc=Y7Qe%We< zllkQ+dV52Di-Jsc{|0=zk*VA{1y0R$sAGXHo%;AKT20hj6PMbk4_m-y4>kibMRbOP zb&bwPC0lN80i9oe?b@G_zZ^gLk#EH#Vn>2AQd~? zQfydRJK?d5F8?a-%hTx(-;%dL-^V;t%6z}x0+o0HJ2$N1ru_qC(yqhunNK$D*m^5) z8oSZ&5qSP4gJ&wyXuT9`F|M1kC5b!uPO1srJ-4Uc7-hDr{^e62RC({j){c!PPEUV# z@y^gYjo%qf)(pHodi&{D4y@L0R%$ojc73mQ>zz@hX285%4<(@|Tu)le!+-Q)MPBWo zOX!94wGK4b^`x2kW{IxDD$j8e^d_MMa(VWPIRhh2o}Fe3LPlpO$CA#SX^+hXs*FNHYUct~Mj@d%>mr48 zgarNOf^DS|goOPh7i=q;c0gUQtwiO@iTZ(Zdl`o+v{1QJiL@#$RKaQ0TBwpkHCm`j zszuH^EmSSlBh;XUYNSSlnzT?YmuuESby5q`)@z}9sTH9%Ez}^jBh;aV8o8WT3pGid zNZX)=nmMgY3$<{ln?oD1bk|2(rA?Nzn>J`BZdNPKMlM=xM{8Vb)y444Q7N3DO(=4*bd$Or4S+oM6uvAVo zZs>~8g^J4839|S=olppD{D&7V$J9Yl2(&5cf_TfMK3~#^01m1@gL2H5&%e#tRrv7+l9O5yb!cK7B)wMNbPngMXSjn{uA_(=?&DnDMM=x@t>eIrf1L^QNbxchH!`Y91vcsjq%o$>JVh8 zbBM7cCj8XMdjb4$~{bG2+65NF$6$l z$bUeIWTRA$;r^vs%2We?W>2$F1NxiD!JjO@Lq7Us`EQf+cgSI(v_V_)7s`K+5{&PX z{{aQxCFi^3@Vha;OFrtD{QKnai`di^`47o?kDLrbx&}Lmt+Sc!AQqwlNViNj(^I+X z@hTo~!n1vC)7I5Z2bE0+Um8kOZ&1p*AXr=VtXDki6Q0d$^aA4}%7#ZEb8Az|I!NfI ziRd7U>$%xu%Ho`@U9NgM6;Efv)4R5N-|BAv`@8+g%_o)J{@dYScO`cFmCZ1(nW*kk z%DTDPHpSDH@bs+pA71T0^?v`UWY>t&f9j6!mhYSXH~il?mFPdEbd8|VcBRbwFcLuY z+eufz{2XY>^xy19&7`VGBhapR+7q6wYjlRXPwC#b+WnZ){aCV_^v64tvQEoTq?OG) zdaIsoif3EGvu|zZp4FY>%Fc26{_RRxFE^?W)?wf3;mP+8PbN1{DTgQDaou)(yX4K1 z-|!?3Pb!NcsKYz`mijo^O!42`1W_JOGa^J;6USOulx6QHI6>w{==rm(S7ds zDjP=+x&NrMG2n9lqo&3{q5Ds28v`D@(Ak3uSm^wB!FXs_y*AB4ETCPBQT1O-?iLpw(O^l{<`4xm80*%UK~+ zIOMEw$XO{>an7b#vA)4O_6h`{L+NU%+M%6lhnzK1jYG~Fhn%%iotBdzm4BF{I)|L~ zQUm9tIc%Wxv^g|bKF4ozFr}f5U!&Ay)ZFA)GacRV?;&e$mYN;Lq1oZ z_&xq^hW0J5-y0EwMghyoXoAhB>KMTwFMK!GTdScC#avLtn>h*tnX0VwEIfh1sd zORaX>Esxxm>>jri%Q4$I$xv2j4%=sDqGXn%_QZC3oSajoQXB9a#o^da&YWas4&CZx zBj%dJ?@wlqhu+=_H?6iz zYu|@Whkug#?$9q;)*d00a4N(*{U=7z@p66Q z;WqlNs^EO#Q-z!KD*NPNHGQ)kaRuz=o!_gzKl#bS9rUWE04^fFA1v^QJKuPgJ*Gc- zSWEBf3PuZ`D@;GHWk$5O&#tx{&9of7fBe1b%(3AQTSDm@3!gl!r*aM6bu`kurh*gw zg`N|>lU_F$Oco{zF}h6n<_~@MCeuepGCiXo9vFKFVPIik%O?+8s8}oXa!ZBj+jlb8 z?z}&lKL6|o!RNBOzLp6-_kQ8qFRiwp&a|I?Z^uvDA590J`(W4C@bSQwbNIN8KHgO@ zhnny#xFxjZZwhc1+VYd*>GAjn7pAivGnot1@5eseeSCHI)N=-uvu=L=sfOs8&VqPO2ao*usX!9XP2_Dp6V@?Pxi zh1FdrGrLaSfAOcg9!U>GK4^Oe6~9zCfQt9f$9oIH(B7t}W-=2q@9ll>>mQsM$u^B< z&WzlD>h0#$ojsYIJ@;Zi-FY~DX5@pW(e(U_pFG@0-*pxY7hWn%UwJlj?%B6nR(JMh zcJ|&&K{wpj|KZL7fZ`_)_fxq81xL?%1bYAEVHdqU2*ABkn0_Xjxfq4(;iDg%JeO@4 z&YV04=fm5pja`{Waz1SAPMh8vXQV#RZKa!7KlGU(NZGRew<0dj8R>KRD5Pp`hvy z54K(?s`{hG)(hoTf4sBxLUq+oid!$#RsG5S)(bnUx^}q@mKn#g4&1`A7J6mOY9UpU zD11rhZ9d79P)0bR62@ecG!Y;BA5%m0=dVdSc>>Z5XxDp=q&VlCFI$>l?7SXxc2UZ8ZUrK{r2| zt~;9bJz{(Q0MYSPyN{er``XhT($90a@S>!TdNNYF(UK9co4Nx=^;rfVqp!GryWR1p3LryrxF^5j7J03nHSxhLy8XzRz% ze1~CRrxmh=-A*%e7OupM(mXn}wYaC>7tA%kJ+PEQ1TREKT}Z~slWQf!&ZNPGrFnm1 znsT!yXRpo0{V|m5K}2CL$PtU+7%#&S`}-)bFmlez?DQ&i>oN4tD5oz2979E1PsDE^ z=Z(0AT5N17<lyH-KU`pz96EyZK3gXqA)22z;m#I|}(erAK=320D z`nE@D!YTrnCdZSV3bl%GTN~x8r;5Cxk9NOhE8q-E2c0*?-LRXhlyX?rDk~86By2BNdQ1mq z=quv{cQOC8Enqbw(8X^;iL8RoS)Ut?{ZNz-CG=ZxVBiQ`0OnLece*@&Nifx5wM*Sr z5cTb^4x*Y|Et>H39Tz-#hH^5>ZE>TU`vV9KjR@420~3SMfxy6U5Fz8jlVcOX4M6Fy z2$bm0HwcsnP%Tgb0G$`1+BOKqM&Elw&;;J(gCO#P_X=zX`;dwVa&JYdv~7`Uttzrz ztB&l@wnu8T9g$kCCQ_%>M(VY?NP|`%Y1A4bO!^ zI~3{Bx+A?>Poz)ljU3kcB1g2tk)zs?$T96`rx$k(*zB2n#Yk>|B&B&Izdxu(S; zQ`)tNrcFiSniiSX;*l9`I&xi`iOg!(BR90!$P3zy$ei{w zwZ(|8y%dkyo^DM!u!J68S~#Taj;TzZm%??c0%G)_y7S9qpGRuWH|k{EGH! zUyHx4eb;7L^TzV8b-iwMxKYDsA|Jf|b~TU;B7YqK#TvB{*-E*k?%oQN+V_$K#h7})^^5XTyQ*glw; zM^{m8U~VpPi=I%;BWwap~aF(q*z8eccYvU?Zw&o*_2UxK6Wz( zLl&e42;PpvqJ+$o>P6ECFRCY~R~KfvX@u3J9+{5^^jPvbI?zHR)s_&1X;Q~b$F-q2 zra_NiLg-PW1=BPQKhG2f-LEHZCGkH;eO;J}87{nc)(cA_!4PD*k zn(>J^h2MyVp)?E6rs77s_j?Y9$^~j16%WkCX6KFC(98mw3=;hdENDRt5Q!d!V>jcW z1>_V|KxEX*)frz((Nu*NcxsG2?hz

    |ef^xHS@=Pw30WzWjv{jBp-CVHal?;zsvq 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 NV987v?_@9L{{p$xwm|>@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/performance.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/performance.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1967fd9d0fc59319d0b660686e48db41516903d GIT binary patch literal 4036 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/pwa.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/pwa.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31ab98422eec2f388290b2d9c07576000b588186 GIT binary patch literal 10851 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 n!$R*)&jWW^&S1(f}@_=6Ax-o$E5vlPY+iO literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/runtime.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/runtime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..591b18ea2bbcaf19ecce617683da6f2c1022a26f GIT binary patch literal 66310 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 D(V4Z9 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/security.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/security.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bee42a89e93129c5b76a4766ec9c0073d6d3730 GIT binary patch literal 20575 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

    vzoxebcTi<-Cn0p47@LS#>MbT4#3YV?E3 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 Pa+z`WEqdW6iy;3C(p5-0 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/system_info.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/system_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..544be03ace9da789d522940af9687ce463d1a64a GIT binary patch literal 14957 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 AH~;_u literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/target.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/target.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c0bbfc76a8600164fe655ce2aebd3566dbbd016 GIT binary patch literal 28922 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 ImW9Xv3qn5bWB>pF literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/tethering.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/tethering.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb150caf02ca914a75a650c5b390b49c43f36814 GIT binary patch literal 1983 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/web_audio.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/web_audio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..375edb0727618a652e938bf95b43ed2a15c67775 GIT binary patch literal 24977 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/accessibility.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/accessibility.py new file mode 100755 index 0000000..7977f09 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/accessibility.py @@ -0,0 +1,647 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Accessibility (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import dom +from . import page +from . import runtime + + +class AXNodeId(str): + ''' + Unique accessibility node identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AXNodeId: + return cls(json) + + def __repr__(self): + return 'AXNodeId({})'.format(super().__repr__()) + + +class AXValueType(enum.Enum): + ''' + Enum of possible property types. + ''' + BOOLEAN = "boolean" + TRISTATE = "tristate" + BOOLEAN_OR_UNDEFINED = "booleanOrUndefined" + IDREF = "idref" + IDREF_LIST = "idrefList" + INTEGER = "integer" + NODE = "node" + NODE_LIST = "nodeList" + NUMBER = "number" + STRING = "string" + COMPUTED_STRING = "computedString" + TOKEN = "token" + TOKEN_LIST = "tokenList" + DOM_RELATION = "domRelation" + ROLE = "role" + INTERNAL_ROLE = "internalRole" + VALUE_UNDEFINED = "valueUndefined" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueSourceType(enum.Enum): + ''' + Enum of possible property sources. + ''' + ATTRIBUTE = "attribute" + IMPLICIT = "implicit" + STYLE = "style" + CONTENTS = "contents" + PLACEHOLDER = "placeholder" + RELATED_ELEMENT = "relatedElement" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueNativeSourceType(enum.Enum): + ''' + Enum of possible native property sources (as a subtype of a particular AXValueSourceType). + ''' + DESCRIPTION = "description" + FIGCAPTION = "figcaption" + LABEL = "label" + LABELFOR = "labelfor" + LABELWRAPPED = "labelwrapped" + LEGEND = "legend" + RUBYANNOTATION = "rubyannotation" + TABLECAPTION = "tablecaption" + TITLE = "title" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AXValueSource: + ''' + A single source for a computed AX property. + ''' + #: What type of source this is. + type_: AXValueSourceType + + #: The value of this property source. + value: typing.Optional[AXValue] = None + + #: The name of the relevant attribute, if any. + attribute: typing.Optional[str] = None + + #: The value of the relevant attribute, if any. + attribute_value: typing.Optional[AXValue] = None + + #: Whether this source is superseded by a higher priority source. + superseded: typing.Optional[bool] = None + + #: The native markup source for this value, e.g. a `` or elements that triggered the + attempt (in the case of attempts triggered by a document rule). It is + possible for multiple rule sets and links to trigger a single attempt. + ''' + key: PreloadingAttemptKey + + rule_set_ids: typing.List[RuleSetId] + + node_ids: typing.List[dom.BackendNodeId] + + def to_json(self): + json = dict() + json['key'] = self.key.to_json() + json['ruleSetIds'] = [i.to_json() for i in self.rule_set_ids] + json['nodeIds'] = [i.to_json() for i in self.node_ids] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + rule_set_ids=[RuleSetId.from_json(i) for i in json['ruleSetIds']], + node_ids=[dom.BackendNodeId.from_json(i) for i in json['nodeIds']], + ) + + +class PrerenderFinalStatus(enum.Enum): + ''' + List of FinalStatus reasons for Prerender2. + ''' + ACTIVATED = "Activated" + DESTROYED = "Destroyed" + LOW_END_DEVICE = "LowEndDevice" + INVALID_SCHEME_REDIRECT = "InvalidSchemeRedirect" + INVALID_SCHEME_NAVIGATION = "InvalidSchemeNavigation" + NAVIGATION_REQUEST_BLOCKED_BY_CSP = "NavigationRequestBlockedByCsp" + MAIN_FRAME_NAVIGATION = "MainFrameNavigation" + MOJO_BINDER_POLICY = "MojoBinderPolicy" + RENDERER_PROCESS_CRASHED = "RendererProcessCrashed" + RENDERER_PROCESS_KILLED = "RendererProcessKilled" + DOWNLOAD = "Download" + TRIGGER_DESTROYED = "TriggerDestroyed" + NAVIGATION_NOT_COMMITTED = "NavigationNotCommitted" + NAVIGATION_BAD_HTTP_STATUS = "NavigationBadHttpStatus" + CLIENT_CERT_REQUESTED = "ClientCertRequested" + NAVIGATION_REQUEST_NETWORK_ERROR = "NavigationRequestNetworkError" + CANCEL_ALL_HOSTS_FOR_TESTING = "CancelAllHostsForTesting" + DID_FAIL_LOAD = "DidFailLoad" + STOP = "Stop" + SSL_CERTIFICATE_ERROR = "SslCertificateError" + LOGIN_AUTH_REQUESTED = "LoginAuthRequested" + UA_CHANGE_REQUIRES_RELOAD = "UaChangeRequiresReload" + BLOCKED_BY_CLIENT = "BlockedByClient" + AUDIO_OUTPUT_DEVICE_REQUESTED = "AudioOutputDeviceRequested" + MIXED_CONTENT = "MixedContent" + TRIGGER_BACKGROUNDED = "TriggerBackgrounded" + MEMORY_LIMIT_EXCEEDED = "MemoryLimitExceeded" + DATA_SAVER_ENABLED = "DataSaverEnabled" + TRIGGER_URL_HAS_EFFECTIVE_URL = "TriggerUrlHasEffectiveUrl" + ACTIVATED_BEFORE_STARTED = "ActivatedBeforeStarted" + INACTIVE_PAGE_RESTRICTION = "InactivePageRestriction" + START_FAILED = "StartFailed" + TIMEOUT_BACKGROUNDED = "TimeoutBackgrounded" + CROSS_SITE_REDIRECT_IN_INITIAL_NAVIGATION = "CrossSiteRedirectInInitialNavigation" + CROSS_SITE_NAVIGATION_IN_INITIAL_NAVIGATION = "CrossSiteNavigationInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInInitialNavigation" + ACTIVATION_NAVIGATION_PARAMETER_MISMATCH = "ActivationNavigationParameterMismatch" + ACTIVATED_IN_BACKGROUND = "ActivatedInBackground" + EMBEDDER_HOST_DISALLOWED = "EmbedderHostDisallowed" + ACTIVATION_NAVIGATION_DESTROYED_BEFORE_SUCCESS = "ActivationNavigationDestroyedBeforeSuccess" + TAB_CLOSED_BY_USER_GESTURE = "TabClosedByUserGesture" + TAB_CLOSED_WITHOUT_USER_GESTURE = "TabClosedWithoutUserGesture" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_CRASHED = "PrimaryMainFrameRendererProcessCrashed" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_KILLED = "PrimaryMainFrameRendererProcessKilled" + ACTIVATION_FRAME_POLICY_NOT_COMPATIBLE = "ActivationFramePolicyNotCompatible" + PRELOADING_DISABLED = "PreloadingDisabled" + BATTERY_SAVER_ENABLED = "BatterySaverEnabled" + ACTIVATED_DURING_MAIN_FRAME_NAVIGATION = "ActivatedDuringMainFrameNavigation" + PRELOADING_UNSUPPORTED_BY_WEB_CONTENTS = "PreloadingUnsupportedByWebContents" + CROSS_SITE_REDIRECT_IN_MAIN_FRAME_NAVIGATION = "CrossSiteRedirectInMainFrameNavigation" + CROSS_SITE_NAVIGATION_IN_MAIN_FRAME_NAVIGATION = "CrossSiteNavigationInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation" + MEMORY_PRESSURE_ON_TRIGGER = "MemoryPressureOnTrigger" + MEMORY_PRESSURE_AFTER_TRIGGERED = "MemoryPressureAfterTriggered" + PRERENDERING_DISABLED_BY_DEV_TOOLS = "PrerenderingDisabledByDevTools" + SPECULATION_RULE_REMOVED = "SpeculationRuleRemoved" + ACTIVATED_WITH_AUXILIARY_BROWSING_CONTEXTS = "ActivatedWithAuxiliaryBrowsingContexts" + MAX_NUM_OF_RUNNING_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_NON_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningNonEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_EMBEDDER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEmbedderPrerendersExceeded" + PRERENDERING_URL_HAS_EFFECTIVE_URL = "PrerenderingUrlHasEffectiveUrl" + REDIRECTED_PRERENDERING_URL_HAS_EFFECTIVE_URL = "RedirectedPrerenderingUrlHasEffectiveUrl" + ACTIVATION_URL_HAS_EFFECTIVE_URL = "ActivationUrlHasEffectiveUrl" + JAVA_SCRIPT_INTERFACE_ADDED = "JavaScriptInterfaceAdded" + JAVA_SCRIPT_INTERFACE_REMOVED = "JavaScriptInterfaceRemoved" + ALL_PRERENDERING_CANCELED = "AllPrerenderingCanceled" + WINDOW_CLOSED = "WindowClosed" + SLOW_NETWORK = "SlowNetwork" + OTHER_PRERENDERED_PAGE_ACTIVATED = "OtherPrerenderedPageActivated" + V8_OPTIMIZER_DISABLED = "V8OptimizerDisabled" + PRERENDER_FAILED_DURING_PREFETCH = "PrerenderFailedDuringPrefetch" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PreloadingStatus(enum.Enum): + ''' + Preloading status values, see also PreloadingTriggeringOutcome. This + status is shared by prefetchStatusUpdated and prerenderStatusUpdated. + ''' + PENDING = "Pending" + RUNNING = "Running" + READY = "Ready" + SUCCESS = "Success" + FAILURE = "Failure" + NOT_SUPPORTED = "NotSupported" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PrefetchStatus(enum.Enum): + ''' + TODO(https://crbug.com/1384419): revisit the list of PrefetchStatus and + filter out the ones that aren't necessary to the developers. + ''' + PREFETCH_ALLOWED = "PrefetchAllowed" + PREFETCH_FAILED_INELIGIBLE_REDIRECT = "PrefetchFailedIneligibleRedirect" + PREFETCH_FAILED_INVALID_REDIRECT = "PrefetchFailedInvalidRedirect" + PREFETCH_FAILED_MIME_NOT_SUPPORTED = "PrefetchFailedMIMENotSupported" + PREFETCH_FAILED_NET_ERROR = "PrefetchFailedNetError" + PREFETCH_FAILED_NON2_XX = "PrefetchFailedNon2XX" + PREFETCH_EVICTED_AFTER_CANDIDATE_REMOVED = "PrefetchEvictedAfterCandidateRemoved" + PREFETCH_EVICTED_FOR_NEWER_PREFETCH = "PrefetchEvictedForNewerPrefetch" + PREFETCH_HELDBACK = "PrefetchHeldback" + PREFETCH_INELIGIBLE_RETRY_AFTER = "PrefetchIneligibleRetryAfter" + PREFETCH_IS_PRIVACY_DECOY = "PrefetchIsPrivacyDecoy" + PREFETCH_IS_STALE = "PrefetchIsStale" + PREFETCH_NOT_ELIGIBLE_BROWSER_CONTEXT_OFF_THE_RECORD = "PrefetchNotEligibleBrowserContextOffTheRecord" + PREFETCH_NOT_ELIGIBLE_DATA_SAVER_ENABLED = "PrefetchNotEligibleDataSaverEnabled" + PREFETCH_NOT_ELIGIBLE_EXISTING_PROXY = "PrefetchNotEligibleExistingProxy" + PREFETCH_NOT_ELIGIBLE_HOST_IS_NON_UNIQUE = "PrefetchNotEligibleHostIsNonUnique" + PREFETCH_NOT_ELIGIBLE_NON_DEFAULT_STORAGE_PARTITION = "PrefetchNotEligibleNonDefaultStoragePartition" + PREFETCH_NOT_ELIGIBLE_SAME_SITE_CROSS_ORIGIN_PREFETCH_REQUIRED_PROXY = "PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy" + PREFETCH_NOT_ELIGIBLE_SCHEME_IS_NOT_HTTPS = "PrefetchNotEligibleSchemeIsNotHttps" + PREFETCH_NOT_ELIGIBLE_USER_HAS_COOKIES = "PrefetchNotEligibleUserHasCookies" + PREFETCH_NOT_ELIGIBLE_USER_HAS_SERVICE_WORKER = "PrefetchNotEligibleUserHasServiceWorker" + PREFETCH_NOT_ELIGIBLE_BATTERY_SAVER_ENABLED = "PrefetchNotEligibleBatterySaverEnabled" + PREFETCH_NOT_ELIGIBLE_PRELOADING_DISABLED = "PrefetchNotEligiblePreloadingDisabled" + PREFETCH_NOT_FINISHED_IN_TIME = "PrefetchNotFinishedInTime" + PREFETCH_NOT_STARTED = "PrefetchNotStarted" + PREFETCH_NOT_USED_COOKIES_CHANGED = "PrefetchNotUsedCookiesChanged" + PREFETCH_PROXY_NOT_AVAILABLE = "PrefetchProxyNotAvailable" + PREFETCH_RESPONSE_USED = "PrefetchResponseUsed" + PREFETCH_SUCCESSFUL_BUT_NOT_USED = "PrefetchSuccessfulButNotUsed" + PREFETCH_NOT_USED_PROBE_FAILED = "PrefetchNotUsedProbeFailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class PrerenderMismatchedHeaders: + ''' + Information of headers to be displayed when the header mismatch occurred. + ''' + header_name: str + + initial_value: typing.Optional[str] = None + + activation_value: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['headerName'] = self.header_name + if self.initial_value is not None: + json['initialValue'] = self.initial_value + if self.activation_value is not None: + json['activationValue'] = self.activation_value + return json + + @classmethod + def from_json(cls, json): + return cls( + header_name=str(json['headerName']), + initial_value=str(json['initialValue']) if 'initialValue' in json else None, + activation_value=str(json['activationValue']) if 'activationValue' in json else None, + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.disable', + } + json = yield cmd_dict + + +@event_class('Preload.ruleSetUpdated') +@dataclass +class RuleSetUpdated: + ''' + Upsert. Currently, it is only emitted when a rule set added. + ''' + rule_set: RuleSet + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetUpdated: + return cls( + rule_set=RuleSet.from_json(json['ruleSet']) + ) + + +@event_class('Preload.ruleSetRemoved') +@dataclass +class RuleSetRemoved: + id_: RuleSetId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetRemoved: + return cls( + id_=RuleSetId.from_json(json['id']) + ) + + +@event_class('Preload.preloadEnabledStateUpdated') +@dataclass +class PreloadEnabledStateUpdated: + ''' + Fired when a preload enabled state is updated. + ''' + disabled_by_preference: bool + disabled_by_data_saver: bool + disabled_by_battery_saver: bool + disabled_by_holdback_prefetch_speculation_rules: bool + disabled_by_holdback_prerender_speculation_rules: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadEnabledStateUpdated: + return cls( + disabled_by_preference=bool(json['disabledByPreference']), + disabled_by_data_saver=bool(json['disabledByDataSaver']), + disabled_by_battery_saver=bool(json['disabledByBatterySaver']), + disabled_by_holdback_prefetch_speculation_rules=bool(json['disabledByHoldbackPrefetchSpeculationRules']), + disabled_by_holdback_prerender_speculation_rules=bool(json['disabledByHoldbackPrerenderSpeculationRules']) + ) + + +@event_class('Preload.prefetchStatusUpdated') +@dataclass +class PrefetchStatusUpdated: + ''' + Fired when a prefetch attempt is updated. + ''' + key: PreloadingAttemptKey + #: The frame id of the frame initiating prefetch. + initiating_frame_id: page.FrameId + prefetch_url: str + status: PreloadingStatus + prefetch_status: PrefetchStatus + request_id: network.RequestId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrefetchStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + initiating_frame_id=page.FrameId.from_json(json['initiatingFrameId']), + prefetch_url=str(json['prefetchUrl']), + status=PreloadingStatus.from_json(json['status']), + prefetch_status=PrefetchStatus.from_json(json['prefetchStatus']), + request_id=network.RequestId.from_json(json['requestId']) + ) + + +@event_class('Preload.prerenderStatusUpdated') +@dataclass +class PrerenderStatusUpdated: + ''' + Fired when a prerender attempt is updated. + ''' + key: PreloadingAttemptKey + status: PreloadingStatus + prerender_status: typing.Optional[PrerenderFinalStatus] + #: This is used to give users more information about the name of Mojo interface + #: that is incompatible with prerender and has caused the cancellation of the attempt. + disallowed_mojo_interface: typing.Optional[str] + mismatched_headers: typing.Optional[typing.List[PrerenderMismatchedHeaders]] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrerenderStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + status=PreloadingStatus.from_json(json['status']), + prerender_status=PrerenderFinalStatus.from_json(json['prerenderStatus']) if 'prerenderStatus' in json else None, + disallowed_mojo_interface=str(json['disallowedMojoInterface']) if 'disallowedMojoInterface' in json else None, + mismatched_headers=[PrerenderMismatchedHeaders.from_json(i) for i in json['mismatchedHeaders']] if 'mismatchedHeaders' in json else None + ) + + +@event_class('Preload.preloadingAttemptSourcesUpdated') +@dataclass +class PreloadingAttemptSourcesUpdated: + ''' + Send a list of sources for all preloading attempts in a document. + ''' + loader_id: network.LoaderId + preloading_attempt_sources: typing.List[PreloadingAttemptSource] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadingAttemptSourcesUpdated: + return cls( + loader_id=network.LoaderId.from_json(json['loaderId']), + preloading_attempt_sources=[PreloadingAttemptSource.from_json(i) for i in json['preloadingAttemptSources']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/profiler.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/profiler.py new file mode 100755 index 0000000..ab2ff07 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/profiler.py @@ -0,0 +1,418 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Profiler +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import debugger +from . import runtime + + +@dataclass +class ProfileNode: + ''' + Profile node. Holds callsite information, execution statistics and child nodes. + ''' + #: Unique id of the node. + id_: int + + #: Function location. + call_frame: runtime.CallFrame + + #: Number of samples where this node was on top of the call stack. + hit_count: typing.Optional[int] = None + + #: Child node ids. + children: typing.Optional[typing.List[int]] = None + + #: The reason of being not optimized. The function may be deoptimized or marked as don't + #: optimize. + deopt_reason: typing.Optional[str] = None + + #: An array of source position ticks. + position_ticks: typing.Optional[typing.List[PositionTickInfo]] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + json['callFrame'] = self.call_frame.to_json() + if self.hit_count is not None: + json['hitCount'] = self.hit_count + if self.children is not None: + json['children'] = [i for i in self.children] + if self.deopt_reason is not None: + json['deoptReason'] = self.deopt_reason + if self.position_ticks is not None: + json['positionTicks'] = [i.to_json() for i in self.position_ticks] + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=int(json['id']), + call_frame=runtime.CallFrame.from_json(json['callFrame']), + hit_count=int(json['hitCount']) if 'hitCount' in json else None, + children=[int(i) for i in json['children']] if 'children' in json else None, + deopt_reason=str(json['deoptReason']) if 'deoptReason' in json else None, + position_ticks=[PositionTickInfo.from_json(i) for i in json['positionTicks']] if 'positionTicks' in json else None, + ) + + +@dataclass +class Profile: + ''' + Profile. + ''' + #: The list of profile nodes. First item is the root node. + nodes: typing.List[ProfileNode] + + #: Profiling start timestamp in microseconds. + start_time: float + + #: Profiling end timestamp in microseconds. + end_time: float + + #: Ids of samples top nodes. + samples: typing.Optional[typing.List[int]] = None + + #: Time intervals between adjacent samples in microseconds. The first delta is relative to the + #: profile startTime. + time_deltas: typing.Optional[typing.List[int]] = None + + def to_json(self): + json = dict() + json['nodes'] = [i.to_json() for i in self.nodes] + json['startTime'] = self.start_time + json['endTime'] = self.end_time + if self.samples is not None: + json['samples'] = [i for i in self.samples] + if self.time_deltas is not None: + json['timeDeltas'] = [i for i in self.time_deltas] + return json + + @classmethod + def from_json(cls, json): + return cls( + nodes=[ProfileNode.from_json(i) for i in json['nodes']], + start_time=float(json['startTime']), + end_time=float(json['endTime']), + samples=[int(i) for i in json['samples']] if 'samples' in json else None, + time_deltas=[int(i) for i in json['timeDeltas']] if 'timeDeltas' in json else None, + ) + + +@dataclass +class PositionTickInfo: + ''' + Specifies a number of samples attributed to a certain source position. + ''' + #: Source line number (1-based). + line: int + + #: Number of samples attributed to the source line. + ticks: int + + def to_json(self): + json = dict() + json['line'] = self.line + json['ticks'] = self.ticks + return json + + @classmethod + def from_json(cls, json): + return cls( + line=int(json['line']), + ticks=int(json['ticks']), + ) + + +@dataclass +class CoverageRange: + ''' + Coverage data for a source range. + ''' + #: JavaScript script source offset for the range start. + start_offset: int + + #: JavaScript script source offset for the range end. + end_offset: int + + #: Collected execution count of the source range. + count: int + + def to_json(self): + json = dict() + json['startOffset'] = self.start_offset + json['endOffset'] = self.end_offset + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + start_offset=int(json['startOffset']), + end_offset=int(json['endOffset']), + count=int(json['count']), + ) + + +@dataclass +class FunctionCoverage: + ''' + Coverage data for a JavaScript function. + ''' + #: JavaScript function name. + function_name: str + + #: Source ranges inside the function with coverage data. + ranges: typing.List[CoverageRange] + + #: Whether coverage data for this function has block granularity. + is_block_coverage: bool + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['ranges'] = [i.to_json() for i in self.ranges] + json['isBlockCoverage'] = self.is_block_coverage + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + ranges=[CoverageRange.from_json(i) for i in json['ranges']], + is_block_coverage=bool(json['isBlockCoverage']), + ) + + +@dataclass +class ScriptCoverage: + ''' + Coverage data for a JavaScript script. + ''' + #: JavaScript script id. + script_id: runtime.ScriptId + + #: JavaScript script name or url. + url: str + + #: Functions contained in the script that has coverage data. + functions: typing.List[FunctionCoverage] + + def to_json(self): + json = dict() + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['functions'] = [i.to_json() for i in self.functions] + return json + + @classmethod + def from_json(cls, json): + return cls( + script_id=runtime.ScriptId.from_json(json['scriptId']), + url=str(json['url']), + functions=[FunctionCoverage.from_json(i) for i in json['functions']], + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.enable', + } + json = yield cmd_dict + + +def get_best_effort_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ScriptCoverage]]: + ''' + Collect coverage data for the current isolate. The coverage data may be incomplete due to + garbage collection. + + :returns: Coverage data for the current isolate. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.getBestEffortCoverage', + } + json = yield cmd_dict + return [ScriptCoverage.from_json(i) for i in json['result']] + + +def set_sampling_interval( + interval: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. + + :param interval: New sampling interval in microseconds. + ''' + params: T_JSON_DICT = dict() + params['interval'] = interval + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.setSamplingInterval', + 'params': params, + } + json = yield cmd_dict + + +def start() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.start', + } + json = yield cmd_dict + + +def start_precise_coverage( + call_count: typing.Optional[bool] = None, + detailed: typing.Optional[bool] = None, + allow_triggered_updates: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,float]: + ''' + Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code + coverage may be incomplete. Enabling prevents running optimized code and resets execution + counters. + + :param call_count: *(Optional)* Collect accurate call counts beyond simple 'covered' or 'not covered'. + :param detailed: *(Optional)* Collect block-based coverage. + :param allow_triggered_updates: *(Optional)* Allow the backend to send updates on its own initiative + :returns: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + params: T_JSON_DICT = dict() + if call_count is not None: + params['callCount'] = call_count + if detailed is not None: + params['detailed'] = detailed + if allow_triggered_updates is not None: + params['allowTriggeredUpdates'] = allow_triggered_updates + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.startPreciseCoverage', + 'params': params, + } + json = yield cmd_dict + return float(json['timestamp']) + + +def stop() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Profile]: + ''' + + + :returns: Recorded profile. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stop', + } + json = yield cmd_dict + return Profile.from_json(json['profile']) + + +def stop_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable precise code coverage. Disabling releases unnecessary execution count records and allows + executing optimized code. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stopPreciseCoverage', + } + json = yield cmd_dict + + +def take_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[ScriptCoverage], float]]: + ''' + Collect coverage data for the current isolate, and resets execution counters. Precise code + coverage needs to have started. + + :returns: A tuple with the following items: + + 0. **result** - Coverage data for the current isolate. + 1. **timestamp** - Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.takePreciseCoverage', + } + json = yield cmd_dict + return ( + [ScriptCoverage.from_json(i) for i in json['result']], + float(json['timestamp']) + ) + + +@event_class('Profiler.consoleProfileFinished') +@dataclass +class ConsoleProfileFinished: + id_: str + #: Location of console.profileEnd(). + location: debugger.Location + profile: Profile + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileFinished: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + profile=Profile.from_json(json['profile']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.consoleProfileStarted') +@dataclass +class ConsoleProfileStarted: + ''' + Sent when new profile recording is started using console.profile() call. + ''' + id_: str + #: Location of console.profile(). + location: debugger.Location + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileStarted: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.preciseCoverageDeltaUpdate') +@dataclass +class PreciseCoverageDeltaUpdate: + ''' + **EXPERIMENTAL** + + Reports coverage delta since the last poll (either from an event like this, or from + ``takePreciseCoverage`` for the current isolate. May only be sent if precise code + coverage has been started. This event can be trigged by the embedder to, for example, + trigger collection of coverage data immediately at a certain point in time. + ''' + #: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + timestamp: float + #: Identifier for distinguishing coverage events. + occasion: str + #: Coverage data for the current isolate. + result: typing.List[ScriptCoverage] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreciseCoverageDeltaUpdate: + return cls( + timestamp=float(json['timestamp']), + occasion=str(json['occasion']), + result=[ScriptCoverage.from_json(i) for i in json['result']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/pwa.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/pwa.py new file mode 100755 index 0000000..8def6e8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/pwa.py @@ -0,0 +1,260 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: PWA (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +@dataclass +class FileHandlerAccept: + ''' + The following types are the replica of + https://crsrc.org/c/chrome/browser/web_applications/proto/web_app_os_integration_state.proto;drc=9910d3be894c8f142c977ba1023f30a656bc13fc;l=67 + ''' + #: New name of the mimetype according to + #: https://www.iana.org/assignments/media-types/media-types.xhtml + media_type: str + + file_extensions: typing.List[str] + + def to_json(self): + json = dict() + json['mediaType'] = self.media_type + json['fileExtensions'] = [i for i in self.file_extensions] + return json + + @classmethod + def from_json(cls, json): + return cls( + media_type=str(json['mediaType']), + file_extensions=[str(i) for i in json['fileExtensions']], + ) + + +@dataclass +class FileHandler: + action: str + + accepts: typing.List[FileHandlerAccept] + + display_name: str + + def to_json(self): + json = dict() + json['action'] = self.action + json['accepts'] = [i.to_json() for i in self.accepts] + json['displayName'] = self.display_name + return json + + @classmethod + def from_json(cls, json): + return cls( + action=str(json['action']), + accepts=[FileHandlerAccept.from_json(i) for i in json['accepts']], + display_name=str(json['displayName']), + ) + + +class DisplayMode(enum.Enum): + ''' + If user prefers opening the app in browser or an app window. + ''' + STANDALONE = "standalone" + BROWSER = "browser" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def get_os_app_state( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[int, typing.List[FileHandler]]]: + ''' + Returns the following OS state for the given manifest id. + + :param manifest_id: The id from the webapp's manifest file, commonly it's the url of the site installing the webapp. See https://web.dev/learn/pwa/web-app-manifest. + :returns: A tuple with the following items: + + 0. **badgeCount** - + 1. **fileHandlers** - + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.getOsAppState', + 'params': params, + } + json = yield cmd_dict + return ( + int(json['badgeCount']), + [FileHandler.from_json(i) for i in json['fileHandlers']] + ) + + +def install( + manifest_id: str, + install_url_or_bundle_url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Installs the given manifest identity, optionally using the given install_url + or IWA bundle location. + + TODO(crbug.com/337872319) Support IWA to meet the following specific + requirement. + IWA-specific install description: If the manifest_id is isolated-app://, + install_url_or_bundle_url is required, and can be either an http(s) URL or + file:// URL pointing to a signed web bundle (.swbn). The .swbn file's + signing key must correspond to manifest_id. If Chrome is not in IWA dev + mode, the installation will fail, regardless of the state of the allowlist. + + :param manifest_id: + :param install_url_or_bundle_url: *(Optional)* The location of the app or bundle overriding the one derived from the manifestId. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if install_url_or_bundle_url is not None: + params['installUrlOrBundleUrl'] = install_url_or_bundle_url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.install', + 'params': params, + } + json = yield cmd_dict + + +def uninstall( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Uninstalls the given manifest_id and closes any opened app windows. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.uninstall', + 'params': params, + } + json = yield cmd_dict + + +def launch( + manifest_id: str, + url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,target.TargetID]: + ''' + Launches the installed web app, or an url in the same web app instead of the + default start url if it is provided. Returns a page Target.TargetID which + can be used to attach to via Target.attachToTarget or similar APIs. + + :param manifest_id: + :param url: *(Optional)* + :returns: ID of the tab target created as a result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if url is not None: + params['url'] = url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launch', + 'params': params, + } + json = yield cmd_dict + return target.TargetID.from_json(json['targetId']) + + +def launch_files_in_app( + manifest_id: str, + files: typing.List[str] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[target.TargetID]]: + ''' + Opens one or more local files from an installed web app identified by its + manifestId. The web app needs to have file handlers registered to process + the files. The API returns one or more page Target.TargetIDs which can be + used to attach to via Target.attachToTarget or similar APIs. + If some files in the parameters cannot be handled by the web app, they will + be ignored. If none of the files can be handled, this API returns an error. + If no files are provided as the parameter, this API also returns an error. + + According to the definition of the file handlers in the manifest file, one + Target.TargetID may represent a page handling one or more files. The order + of the returned Target.TargetIDs is not guaranteed. + + TODO(crbug.com/339454034): Check the existences of the input files. + + :param manifest_id: + :param files: + :returns: IDs of the tab targets created as the result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + params['files'] = [i for i in files] + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launchFilesInApp', + 'params': params, + } + json = yield cmd_dict + return [target.TargetID.from_json(i) for i in json['targetIds']] + + +def open_current_page_in_app( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Opens the current page in its web app identified by the manifest id, needs + to be called on a page target. This function returns immediately without + waiting for the app to finish loading. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.openCurrentPageInApp', + 'params': params, + } + json = yield cmd_dict + + +def change_app_user_settings( + manifest_id: str, + link_capturing: typing.Optional[bool] = None, + display_mode: typing.Optional[DisplayMode] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes user settings of the web app identified by its manifestId. If the + app was not installed, this command returns an error. Unset parameters will + be ignored; unrecognized values will cause an error. + + Unlike the ones defined in the manifest files of the web apps, these + settings are provided by the browser and controlled by the users, they + impact the way the browser handling the web apps. + + See the comment of each parameter. + + :param manifest_id: + :param link_capturing: *(Optional)* If user allows the links clicked on by the user in the app's scope, or extended scope if the manifest has scope extensions and the flags ```DesktopPWAsLinkCapturingWithScopeExtensions```` and ````WebAppEnableScopeExtensions``` are enabled. Note, the API does not support resetting the linkCapturing to the initial value, uninstalling and installing the web app again will reset it. TODO(crbug.com/339453269): Setting this value on ChromeOS is not supported yet. + :param display_mode: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if link_capturing is not None: + params['linkCapturing'] = link_capturing + if display_mode is not None: + params['displayMode'] = display_mode.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.changeAppUserSettings', + 'params': params, + } + json = yield cmd_dict diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/py.typed b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/runtime.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/runtime.py new file mode 100755 index 0000000..c8b4957 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/runtime.py @@ -0,0 +1,1583 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Runtime +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class ScriptId(str): + ''' + Unique script identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ScriptId: + return cls(json) + + def __repr__(self): + return 'ScriptId({})'.format(super().__repr__()) + + +@dataclass +class SerializationOptions: + ''' + Represents options for serialization. Overrides ``generatePreview`` and ``returnByValue``. + ''' + serialization: str + + #: Deep serialization depth. Default is full depth. Respected only in ``deep`` serialization mode. + max_depth: typing.Optional[int] = None + + #: Embedder-specific parameters. For example if connected to V8 in Chrome these control DOM + #: serialization via ``maxNodeDepth: integer`` and ``includeShadowTree: "none" `` "open" `` "all"``. + #: Values can be only of type string or integer. + additional_parameters: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['serialization'] = self.serialization + if self.max_depth is not None: + json['maxDepth'] = self.max_depth + if self.additional_parameters is not None: + json['additionalParameters'] = self.additional_parameters + return json + + @classmethod + def from_json(cls, json): + return cls( + serialization=str(json['serialization']), + max_depth=int(json['maxDepth']) if 'maxDepth' in json else None, + additional_parameters=dict(json['additionalParameters']) if 'additionalParameters' in json else None, + ) + + +@dataclass +class DeepSerializedValue: + ''' + Represents deep serialized value. + ''' + type_: str + + value: typing.Optional[typing.Any] = None + + object_id: typing.Optional[str] = None + + #: Set if value reference met more then once during serialization. In such + #: case, value is provided only to one of the serialized values. Unique + #: per value in the scope of one CDP call. + weak_local_object_reference: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.object_id is not None: + json['objectId'] = self.object_id + if self.weak_local_object_reference is not None: + json['weakLocalObjectReference'] = self.weak_local_object_reference + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + value=json['value'] if 'value' in json else None, + object_id=str(json['objectId']) if 'objectId' in json else None, + weak_local_object_reference=int(json['weakLocalObjectReference']) if 'weakLocalObjectReference' in json else None, + ) + + +class RemoteObjectId(str): + ''' + Unique object identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RemoteObjectId: + return cls(json) + + def __repr__(self): + return 'RemoteObjectId({})'.format(super().__repr__()) + + +class UnserializableValue(str): + ''' + Primitive value which cannot be JSON-stringified. Includes values ``-0``, ``NaN``, ``Infinity``, + ``-Infinity``, and bigint literals. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnserializableValue: + return cls(json) + + def __repr__(self): + return 'UnserializableValue({})'.format(super().__repr__()) + + +@dataclass +class RemoteObject: + ''' + Mirror object referencing original JavaScript object. + ''' + #: Object type. + type_: str + + #: Object subtype hint. Specified for ``object`` type values only. + #: NOTE: If you change anything here, make sure to also update + #: ``subtype`` in ``ObjectPreview`` and ``PropertyPreview`` below. + subtype: typing.Optional[str] = None + + #: Object class (constructor) name. Specified for ``object`` type values only. + class_name: typing.Optional[str] = None + + #: Remote object value in case of primitive values or JSON values (if it was requested). + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified does not have ``value``, but gets this + #: property. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: Deep serialized value. + deep_serialized_value: typing.Optional[DeepSerializedValue] = None + + #: Unique object identifier (for non-primitive values). + object_id: typing.Optional[RemoteObjectId] = None + + #: Preview containing abbreviated property values. Specified for ``object`` type values only. + preview: typing.Optional[ObjectPreview] = None + + custom_preview: typing.Optional[CustomPreview] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.subtype is not None: + json['subtype'] = self.subtype + if self.class_name is not None: + json['className'] = self.class_name + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.description is not None: + json['description'] = self.description + if self.deep_serialized_value is not None: + json['deepSerializedValue'] = self.deep_serialized_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + if self.preview is not None: + json['preview'] = self.preview.to_json() + if self.custom_preview is not None: + json['customPreview'] = self.custom_preview.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + subtype=str(json['subtype']) if 'subtype' in json else None, + class_name=str(json['className']) if 'className' in json else None, + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + description=str(json['description']) if 'description' in json else None, + deep_serialized_value=DeepSerializedValue.from_json(json['deepSerializedValue']) if 'deepSerializedValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + preview=ObjectPreview.from_json(json['preview']) if 'preview' in json else None, + custom_preview=CustomPreview.from_json(json['customPreview']) if 'customPreview' in json else None, + ) + + +@dataclass +class CustomPreview: + #: The JSON-stringified result of formatter.header(object, config) call. + #: It contains json ML array that represents RemoteObject. + header: str + + #: If formatter returns true as a result of formatter.hasBody call then bodyGetterId will + #: contain RemoteObjectId for the function that returns result of formatter.body(object, config) call. + #: The result value is json ML array. + body_getter_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + json['header'] = self.header + if self.body_getter_id is not None: + json['bodyGetterId'] = self.body_getter_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + header=str(json['header']), + body_getter_id=RemoteObjectId.from_json(json['bodyGetterId']) if 'bodyGetterId' in json else None, + ) + + +@dataclass +class ObjectPreview: + ''' + Object containing abbreviated remote object value. + ''' + #: Object type. + type_: str + + #: True iff some of the properties or entries of the original object did not fit. + overflow: bool + + #: List of the properties. + properties: typing.List[PropertyPreview] + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: List of the entries. Specified for ``map`` and ``set`` subtype values only. + entries: typing.Optional[typing.List[EntryPreview]] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['overflow'] = self.overflow + json['properties'] = [i.to_json() for i in self.properties] + if self.subtype is not None: + json['subtype'] = self.subtype + if self.description is not None: + json['description'] = self.description + if self.entries is not None: + json['entries'] = [i.to_json() for i in self.entries] + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + overflow=bool(json['overflow']), + properties=[PropertyPreview.from_json(i) for i in json['properties']], + subtype=str(json['subtype']) if 'subtype' in json else None, + description=str(json['description']) if 'description' in json else None, + entries=[EntryPreview.from_json(i) for i in json['entries']] if 'entries' in json else None, + ) + + +@dataclass +class PropertyPreview: + #: Property name. + name: str + + #: Object type. Accessor means that the property itself is an accessor property. + type_: str + + #: User-friendly property value string. + value: typing.Optional[str] = None + + #: Nested value preview. + value_preview: typing.Optional[ObjectPreview] = None + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.value_preview is not None: + json['valuePreview'] = self.value_preview.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + type_=str(json['type']), + value=str(json['value']) if 'value' in json else None, + value_preview=ObjectPreview.from_json(json['valuePreview']) if 'valuePreview' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class EntryPreview: + #: Preview of the value. + value: ObjectPreview + + #: Preview of the key. Specified for map-like collection entries. + key: typing.Optional[ObjectPreview] = None + + def to_json(self): + json = dict() + json['value'] = self.value.to_json() + if self.key is not None: + json['key'] = self.key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=ObjectPreview.from_json(json['value']), + key=ObjectPreview.from_json(json['key']) if 'key' in json else None, + ) + + +@dataclass +class PropertyDescriptor: + ''' + Object property descriptor. + ''' + #: Property name or symbol description. + name: str + + #: True if the type of this property descriptor may be changed and if the property may be + #: deleted from the corresponding object. + configurable: bool + + #: True if this property shows up during enumeration of the properties on the corresponding + #: object. + enumerable: bool + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + #: True if the value associated with the property may be changed (data descriptors only). + writable: typing.Optional[bool] = None + + #: A function which serves as a getter for the property, or ``undefined`` if there is no getter + #: (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the property, or ``undefined`` if there is no setter + #: (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + #: True if the result was thrown during the evaluation. + was_thrown: typing.Optional[bool] = None + + #: True if the property is owned for the object. + is_own: typing.Optional[bool] = None + + #: Property symbol object, if the property is of the ``symbol`` type. + symbol: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['configurable'] = self.configurable + json['enumerable'] = self.enumerable + if self.value is not None: + json['value'] = self.value.to_json() + if self.writable is not None: + json['writable'] = self.writable + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + if self.was_thrown is not None: + json['wasThrown'] = self.was_thrown + if self.is_own is not None: + json['isOwn'] = self.is_own + if self.symbol is not None: + json['symbol'] = self.symbol.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + configurable=bool(json['configurable']), + enumerable=bool(json['enumerable']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + writable=bool(json['writable']) if 'writable' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + was_thrown=bool(json['wasThrown']) if 'wasThrown' in json else None, + is_own=bool(json['isOwn']) if 'isOwn' in json else None, + symbol=RemoteObject.from_json(json['symbol']) if 'symbol' in json else None, + ) + + +@dataclass +class InternalPropertyDescriptor: + ''' + Object internal property descriptor. This property isn't normally visible in JavaScript code. + ''' + #: Conventional property name. + name: str + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + ) + + +@dataclass +class PrivatePropertyDescriptor: + ''' + Object private field descriptor. + ''' + #: Private property name. + name: str + + #: The value associated with the private property. + value: typing.Optional[RemoteObject] = None + + #: A function which serves as a getter for the private property, + #: or ``undefined`` if there is no getter (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the private property, + #: or ``undefined`` if there is no setter (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + ) + + +@dataclass +class CallArgument: + ''' + Represents function call argument. Either remote object id ``objectId``, primitive ``value``, + unserializable primitive value or neither of (for undefined) them should be specified. + ''' + #: Primitive value or serializable javascript object. + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: Remote object handle. + object_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + ) + + +class ExecutionContextId(int): + ''' + Id of an execution context. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> ExecutionContextId: + return cls(json) + + def __repr__(self): + return 'ExecutionContextId({})'.format(super().__repr__()) + + +@dataclass +class ExecutionContextDescription: + ''' + Description of an isolated world. + ''' + #: Unique id of the execution context. It can be used to specify in which execution context + #: script evaluation should be performed. + id_: ExecutionContextId + + #: Execution context origin. + origin: str + + #: Human readable name describing given context. + name: str + + #: A system-unique execution context identifier. Unlike the id, this is unique across + #: multiple processes, so can be reliably used to identify specific context while backend + #: performs a cross-process navigation. + unique_id: str + + #: Embedder-specific auxiliary data likely matching {isDefault: boolean, type: 'default'``'isolated'``'worker', frameId: string} + aux_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['id'] = self.id_.to_json() + json['origin'] = self.origin + json['name'] = self.name + json['uniqueId'] = self.unique_id + if self.aux_data is not None: + json['auxData'] = self.aux_data + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=ExecutionContextId.from_json(json['id']), + origin=str(json['origin']), + name=str(json['name']), + unique_id=str(json['uniqueId']), + aux_data=dict(json['auxData']) if 'auxData' in json else None, + ) + + +@dataclass +class ExceptionDetails: + ''' + Detailed information about exception (or error) that was thrown during script compilation or + execution. + ''' + #: Exception id. + exception_id: int + + #: Exception text, which should be used together with exception object when available. + text: str + + #: Line number of the exception location (0-based). + line_number: int + + #: Column number of the exception location (0-based). + column_number: int + + #: Script ID of the exception location. + script_id: typing.Optional[ScriptId] = None + + #: URL of the exception location, to be used when the script was not reported. + url: typing.Optional[str] = None + + #: JavaScript stack trace if available. + stack_trace: typing.Optional[StackTrace] = None + + #: Exception object if available. + exception: typing.Optional[RemoteObject] = None + + #: Identifier of the context where exception happened. + execution_context_id: typing.Optional[ExecutionContextId] = None + + #: Dictionary with entries of meta data that the client associated + #: with this exception, such as information about associated network + #: requests, etc. + exception_meta_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['exceptionId'] = self.exception_id + json['text'] = self.text + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + if self.script_id is not None: + json['scriptId'] = self.script_id.to_json() + if self.url is not None: + json['url'] = self.url + if self.stack_trace is not None: + json['stackTrace'] = self.stack_trace.to_json() + if self.exception is not None: + json['exception'] = self.exception.to_json() + if self.execution_context_id is not None: + json['executionContextId'] = self.execution_context_id.to_json() + if self.exception_meta_data is not None: + json['exceptionMetaData'] = self.exception_meta_data + return json + + @classmethod + def from_json(cls, json): + return cls( + exception_id=int(json['exceptionId']), + text=str(json['text']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + script_id=ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + url=str(json['url']) if 'url' in json else None, + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + exception=RemoteObject.from_json(json['exception']) if 'exception' in json else None, + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None, + exception_meta_data=dict(json['exceptionMetaData']) if 'exceptionMetaData' in json else None, + ) + + +class Timestamp(float): + ''' + Number of milliseconds since epoch. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> Timestamp: + return cls(json) + + def __repr__(self): + return 'Timestamp({})'.format(super().__repr__()) + + +class TimeDelta(float): + ''' + Number of milliseconds. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> TimeDelta: + return cls(json) + + def __repr__(self): + return 'TimeDelta({})'.format(super().__repr__()) + + +@dataclass +class CallFrame: + ''' + Stack entry for runtime errors and assertions. + ''' + #: JavaScript function name. + function_name: str + + #: JavaScript script id. + script_id: ScriptId + + #: JavaScript script name or url. + url: str + + #: JavaScript script line number (0-based). + line_number: int + + #: JavaScript script column number (0-based). + column_number: int + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + script_id=ScriptId.from_json(json['scriptId']), + url=str(json['url']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +@dataclass +class StackTrace: + ''' + Call frames for assertions or error messages. + ''' + #: JavaScript function name. + call_frames: typing.List[CallFrame] + + #: String label of this stack trace. For async traces this may be a name of the function that + #: initiated the async call. + description: typing.Optional[str] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent: typing.Optional[StackTrace] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent_id: typing.Optional[StackTraceId] = None + + def to_json(self): + json = dict() + json['callFrames'] = [i.to_json() for i in self.call_frames] + if self.description is not None: + json['description'] = self.description + if self.parent is not None: + json['parent'] = self.parent.to_json() + if self.parent_id is not None: + json['parentId'] = self.parent_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + call_frames=[CallFrame.from_json(i) for i in json['callFrames']], + description=str(json['description']) if 'description' in json else None, + parent=StackTrace.from_json(json['parent']) if 'parent' in json else None, + parent_id=StackTraceId.from_json(json['parentId']) if 'parentId' in json else None, + ) + + +class UniqueDebuggerId(str): + ''' + Unique identifier of current debugger. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UniqueDebuggerId: + return cls(json) + + def __repr__(self): + return 'UniqueDebuggerId({})'.format(super().__repr__()) + + +@dataclass +class StackTraceId: + ''' + If ``debuggerId`` is set stack trace comes from another debugger and can be resolved there. This + allows to track cross-debugger calls. See ``Runtime.StackTrace`` and ``Debugger.paused`` for usages. + ''' + id_: str + + debugger_id: typing.Optional[UniqueDebuggerId] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + if self.debugger_id is not None: + json['debuggerId'] = self.debugger_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=str(json['id']), + debugger_id=UniqueDebuggerId.from_json(json['debuggerId']) if 'debuggerId' in json else None, + ) + + +def await_promise( + promise_object_id: RemoteObjectId, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Add handler to promise with given promise object id. + + :param promise_object_id: Identifier of the promise. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :returns: A tuple with the following items: + + 0. **result** - Promise result. Will contain rejected value if promise was rejected. + 1. **exceptionDetails** - *(Optional)* Exception details if stack strace is available. + ''' + params: T_JSON_DICT = dict() + params['promiseObjectId'] = promise_object_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.awaitPromise', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def call_function_on( + function_declaration: str, + object_id: typing.Optional[RemoteObjectId] = None, + arguments: typing.Optional[typing.List[CallArgument]] = None, + silent: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + throw_on_side_effect: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Calls function with given declaration on the given object. Object group of the result is + inherited from the target object. + + :param function_declaration: Declaration of the function to call. + :param object_id: *(Optional)* Identifier of the object to call function on. Either objectId or executionContextId should be specified. + :param arguments: *(Optional)* Call arguments. All call arguments must belong to the same JavaScript world as the target object. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. Can be overriden by ````serializationOptions````. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param execution_context_id: *(Optional)* Specifies execution context which global object will be used to call function on. Either executionContextId or objectId should be specified. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. If objectGroup is not specified and objectId is, objectGroup will be inherited from object. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to call function on. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental function call in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````executionContextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Call result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['functionDeclaration'] = function_declaration + if object_id is not None: + params['objectId'] = object_id.to_json() + if arguments is not None: + params['arguments'] = [i.to_json() for i in arguments] + if silent is not None: + params['silent'] = silent + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.callFunctionOn', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def compile_script( + expression: str, + source_url: str, + persist_script: bool, + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.Optional[ScriptId], typing.Optional[ExceptionDetails]]]: + ''' + Compiles expression. + + :param expression: Expression to compile. + :param source_url: Source url to be set for the script. + :param persist_script: Specifies whether the compiled script should be persisted. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :returns: A tuple with the following items: + + 0. **scriptId** - *(Optional)* Id of the script. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + params['sourceURL'] = source_url + params['persistScript'] = persist_script + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.compileScript', + 'params': params, + } + json = yield cmd_dict + return ( + ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables reporting of execution contexts creation. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.disable', + } + json = yield cmd_dict + + +def discard_console_entries() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Discards collected exceptions and console API calls. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.discardConsoleEntries', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables reporting of execution contexts creation by means of ``executionContextCreated`` event. + When the reporting gets enabled the event will be sent immediately for each existing execution + context. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.enable', + } + json = yield cmd_dict + + +def evaluate( + expression: str, + object_group: typing.Optional[str] = None, + include_command_line_api: typing.Optional[bool] = None, + silent: typing.Optional[bool] = None, + context_id: typing.Optional[ExecutionContextId] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + throw_on_side_effect: typing.Optional[bool] = None, + timeout: typing.Optional[TimeDelta] = None, + disable_breaks: typing.Optional[bool] = None, + repl_mode: typing.Optional[bool] = None, + allow_unsafe_eval_blocked_by_csp: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Evaluates expression on global object. + + :param expression: Expression to evaluate. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param context_id: *(Optional)* Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. This is mutually exclusive with ````uniqueContextId````, which offers an alternative way to identify the execution context that is more reliable in a multi-process environment. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. This implies ````disableBreaks```` below. + :param timeout: **(EXPERIMENTAL)** *(Optional)* Terminate execution after timing out (number of milliseconds). + :param disable_breaks: **(EXPERIMENTAL)** *(Optional)* Disable breakpoints during execution. + :param repl_mode: **(EXPERIMENTAL)** *(Optional)* Setting this flag to true enables ````let```` re-declaration and top-level ````await````. Note that ````let```` variables can only be re-declared if they originate from ````replMode```` themselves. + :param allow_unsafe_eval_blocked_by_csp: **(EXPERIMENTAL)** *(Optional)* The Content Security Policy (CSP) for the target might block 'unsafe-eval' which includes eval(), Function(), setTimeout() and setInterval() when called with non-callable arguments. This flag bypasses CSP for this evaluation and allows unsafe-eval. Defaults to true. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to evaluate in. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental evaluation of the expression in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````contextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Evaluation result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + if object_group is not None: + params['objectGroup'] = object_group + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if silent is not None: + params['silent'] = silent + if context_id is not None: + params['contextId'] = context_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if timeout is not None: + params['timeout'] = timeout.to_json() + if disable_breaks is not None: + params['disableBreaks'] = disable_breaks + if repl_mode is not None: + params['replMode'] = repl_mode + if allow_unsafe_eval_blocked_by_csp is not None: + params['allowUnsafeEvalBlockedByCSP'] = allow_unsafe_eval_blocked_by_csp + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.evaluate', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def get_isolate_id() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,str]: + ''' + Returns the isolate id. + + **EXPERIMENTAL** + + :returns: The isolate id. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getIsolateId', + } + json = yield cmd_dict + return str(json['id']) + + +def get_heap_usage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float]]: + ''' + Returns the JavaScript heap usage. + It is the total usage of the corresponding isolate not scoped to a particular Runtime. + + **EXPERIMENTAL** + + :returns: A tuple with the following items: + + 0. **usedSize** - Used heap size in bytes. + 1. **totalSize** - Allocated heap size in bytes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getHeapUsage', + } + json = yield cmd_dict + return ( + float(json['usedSize']), + float(json['totalSize']) + ) + + +def get_properties( + object_id: RemoteObjectId, + own_properties: typing.Optional[bool] = None, + accessor_properties_only: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + non_indexed_properties_only: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[PropertyDescriptor], typing.Optional[typing.List[InternalPropertyDescriptor]], typing.Optional[typing.List[PrivatePropertyDescriptor]], typing.Optional[ExceptionDetails]]]: + ''' + Returns properties of a given object. Object group of the result is inherited from the target + object. + + :param object_id: Identifier of the object to return properties for. + :param own_properties: *(Optional)* If true, returns properties belonging only to the element itself, not to its prototype chain. + :param accessor_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the results. + :param non_indexed_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns non-indexed properties only. + :returns: A tuple with the following items: + + 0. **result** - Object properties. + 1. **internalProperties** - *(Optional)* Internal object properties (only of the element itself). + 2. **privateProperties** - *(Optional)* Object private properties. + 3. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + if own_properties is not None: + params['ownProperties'] = own_properties + if accessor_properties_only is not None: + params['accessorPropertiesOnly'] = accessor_properties_only + if generate_preview is not None: + params['generatePreview'] = generate_preview + if non_indexed_properties_only is not None: + params['nonIndexedPropertiesOnly'] = non_indexed_properties_only + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getProperties', + 'params': params, + } + json = yield cmd_dict + return ( + [PropertyDescriptor.from_json(i) for i in json['result']], + [InternalPropertyDescriptor.from_json(i) for i in json['internalProperties']] if 'internalProperties' in json else None, + [PrivatePropertyDescriptor.from_json(i) for i in json['privateProperties']] if 'privateProperties' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def global_lexical_scope_names( + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Returns all let, const and class variables from global scope. + + :param execution_context_id: *(Optional)* Specifies in which execution context to lookup global scope variables. + :returns: + ''' + params: T_JSON_DICT = dict() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.globalLexicalScopeNames', + 'params': params, + } + json = yield cmd_dict + return [str(i) for i in json['names']] + + +def query_objects( + prototype_object_id: RemoteObjectId, + object_group: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,RemoteObject]: + ''' + :param prototype_object_id: Identifier of the prototype to return objects for. + :param object_group: *(Optional)* Symbolic group name that can be used to release the results. + :returns: Array with objects. + ''' + params: T_JSON_DICT = dict() + params['prototypeObjectId'] = prototype_object_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.queryObjects', + 'params': params, + } + json = yield cmd_dict + return RemoteObject.from_json(json['objects']) + + +def release_object( + object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases remote object with given id. + + :param object_id: Identifier of the object to release. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObject', + 'params': params, + } + json = yield cmd_dict + + +def release_object_group( + object_group: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases all remote objects that belong to a given group. + + :param object_group: Symbolic object group name. + ''' + params: T_JSON_DICT = dict() + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObjectGroup', + 'params': params, + } + json = yield cmd_dict + + +def run_if_waiting_for_debugger() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Tells inspected instance to run if it was waiting for debugger to attach. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runIfWaitingForDebugger', + } + json = yield cmd_dict + + +def run_script( + script_id: ScriptId, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + silent: typing.Optional[bool] = None, + include_command_line_api: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Runs script with given id in a given context. + + :param script_id: Id of the script to run. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :param await_promise: *(Optional)* Whether execution should ````await``` for resulting value and return once awaited promise is resolved. + :returns: A tuple with the following items: + + 0. **result** - Run result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['scriptId'] = script_id.to_json() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if silent is not None: + params['silent'] = silent + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if await_promise is not None: + params['awaitPromise'] = await_promise + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runScript', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def set_async_call_stack_depth( + max_depth: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables or disables async call stacks tracking. + + :param max_depth: Maximum depth of async call stacks. Setting to ```0``` will effectively disable collecting async call stacks (default). + ''' + params: T_JSON_DICT = dict() + params['maxDepth'] = max_depth + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setAsyncCallStackDepth', + 'params': params, + } + json = yield cmd_dict + + +def set_custom_object_formatter_enabled( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setCustomObjectFormatterEnabled', + 'params': params, + } + json = yield cmd_dict + + +def set_max_call_stack_size_to_capture( + size: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param size: + ''' + params: T_JSON_DICT = dict() + params['size'] = size + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setMaxCallStackSizeToCapture', + 'params': params, + } + json = yield cmd_dict + + +def terminate_execution() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Terminate current or next JavaScript execution. + Will cancel the termination when the outer-most script execution ends. + + **EXPERIMENTAL** + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.terminateExecution', + } + json = yield cmd_dict + + +def add_binding( + name: str, + execution_context_id: typing.Optional[ExecutionContextId] = None, + execution_context_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + If executionContextId is empty, adds binding with the given name on the + global objects of all inspected contexts, including those created later, + bindings survive reloads. + Binding function takes exactly one argument, this argument should be string, + in case of any other input, function throws an exception. + Each binding function call produces Runtime.bindingCalled notification. + + :param name: + :param execution_context_id: **(EXPERIMENTAL)** *(Optional)* If specified, the binding would only be exposed to the specified execution context. If omitted and ```executionContextName```` is not set, the binding is exposed to all execution contexts of the target. This parameter is mutually exclusive with ````executionContextName````. Deprecated in favor of ````executionContextName```` due to an unclear use case and bugs in implementation (crbug.com/1169639). ````executionContextId```` will be removed in the future. + :param execution_context_name: *(Optional)* If specified, the binding is exposed to the executionContext with matching name, even for contexts created after the binding is added. See also ````ExecutionContext.name```` and ````worldName```` parameter to ````Page.addScriptToEvaluateOnNewDocument````. This parameter is mutually exclusive with ````executionContextId```. + ''' + params: T_JSON_DICT = dict() + params['name'] = name + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if execution_context_name is not None: + params['executionContextName'] = execution_context_name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.addBinding', + 'params': params, + } + json = yield cmd_dict + + +def remove_binding( + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + This method does not remove binding function from global object but + unsubscribes current runtime agent from Runtime.bindingCalled notifications. + + :param name: + ''' + params: T_JSON_DICT = dict() + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.removeBinding', + 'params': params, + } + json = yield cmd_dict + + +def get_exception_details( + error_object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Optional[ExceptionDetails]]: + ''' + This method tries to lookup and populate exception details for a + JavaScript Error object. + Note that the stackTrace portion of the resulting exceptionDetails will + only be populated if the Runtime domain was enabled at the time when the + Error was thrown. + + **EXPERIMENTAL** + + :param error_object_id: The error object for which to resolve the exception details. + :returns: + ''' + params: T_JSON_DICT = dict() + params['errorObjectId'] = error_object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getExceptionDetails', + 'params': params, + } + json = yield cmd_dict + return ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + + +@event_class('Runtime.bindingCalled') +@dataclass +class BindingCalled: + ''' + **EXPERIMENTAL** + + Notification is issued every time when binding is called. + ''' + name: str + payload: str + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BindingCalled: + return cls( + name=str(json['name']), + payload=str(json['payload']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) + ) + + +@event_class('Runtime.consoleAPICalled') +@dataclass +class ConsoleAPICalled: + ''' + Issued when console API was called. + ''' + #: Type of the call. + type_: str + #: Call arguments. + args: typing.List[RemoteObject] + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + #: Call timestamp. + timestamp: Timestamp + #: Stack trace captured when the call was made. The async stack chain is automatically reported for + #: the following call types: ``assert``, ``error``, ``trace``, ``warning``. For other types the async call + #: chain can be retrieved using ``Debugger.getStackTrace`` and ``stackTrace.parentId`` field. + stack_trace: typing.Optional[StackTrace] + #: Console context descriptor for calls on non-default console context (not console.*): + #: 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call + #: on named context. + context: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleAPICalled: + return cls( + type_=str(json['type']), + args=[RemoteObject.from_json(i) for i in json['args']], + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + timestamp=Timestamp.from_json(json['timestamp']), + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + context=str(json['context']) if 'context' in json else None + ) + + +@event_class('Runtime.exceptionRevoked') +@dataclass +class ExceptionRevoked: + ''' + Issued when unhandled exception was revoked. + ''' + #: Reason describing why exception was revoked. + reason: str + #: The id of revoked exception, as reported in ``exceptionThrown``. + exception_id: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionRevoked: + return cls( + reason=str(json['reason']), + exception_id=int(json['exceptionId']) + ) + + +@event_class('Runtime.exceptionThrown') +@dataclass +class ExceptionThrown: + ''' + Issued when exception was thrown and unhandled. + ''' + #: Timestamp of the exception. + timestamp: Timestamp + exception_details: ExceptionDetails + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionThrown: + return cls( + timestamp=Timestamp.from_json(json['timestamp']), + exception_details=ExceptionDetails.from_json(json['exceptionDetails']) + ) + + +@event_class('Runtime.executionContextCreated') +@dataclass +class ExecutionContextCreated: + ''' + Issued when new execution context is created. + ''' + #: A newly created execution context. + context: ExecutionContextDescription + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextCreated: + return cls( + context=ExecutionContextDescription.from_json(json['context']) + ) + + +@event_class('Runtime.executionContextDestroyed') +@dataclass +class ExecutionContextDestroyed: + ''' + Issued when execution context is destroyed. + ''' + #: Id of the destroyed context + execution_context_id: ExecutionContextId + #: Unique Id of the destroyed context + execution_context_unique_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextDestroyed: + return cls( + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + execution_context_unique_id=str(json['executionContextUniqueId']) + ) + + +@event_class('Runtime.executionContextsCleared') +@dataclass +class ExecutionContextsCleared: + ''' + Issued when all executionContexts were cleared in browser + ''' + + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextsCleared: + return cls( + + ) + + +@event_class('Runtime.inspectRequested') +@dataclass +class InspectRequested: + ''' + Issued when object should be inspected (for example, as a result of inspect() command line API + call). + ''' + object_: RemoteObject + hints: dict + #: Identifier of the context where the call was made. + execution_context_id: typing.Optional[ExecutionContextId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InspectRequested: + return cls( + object_=RemoteObject.from_json(json['object']), + hints=dict(json['hints']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/schema.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/schema.py new file mode 100755 index 0000000..5077f78 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/schema.py @@ -0,0 +1,48 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Schema +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class Domain: + ''' + Description of the protocol domain. + ''' + #: Domain name. + name: str + + #: Domain version. + version: str + + def to_json(self): + json = dict() + json['name'] = self.name + json['version'] = self.version + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + version=str(json['version']), + ) + + +def get_domains() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Domain]]: + ''' + Returns supported domains. + + :returns: List of supported domains. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Schema.getDomains', + } + json = yield cmd_dict + return [Domain.from_json(i) for i in json['domains']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/security.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/security.py new file mode 100755 index 0000000..e7714fe --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/security.py @@ -0,0 +1,507 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Security +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import network + + +class CertificateId(int): + ''' + An internal certificate ID value. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> CertificateId: + return cls(json) + + def __repr__(self): + return 'CertificateId({})'.format(super().__repr__()) + + +class MixedContentType(enum.Enum): + ''' + A description of mixed content (HTTP resources on HTTPS pages), as defined by + https://www.w3.org/TR/mixed-content/#categories + ''' + BLOCKABLE = "blockable" + OPTIONALLY_BLOCKABLE = "optionally-blockable" + NONE = "none" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SecurityState(enum.Enum): + ''' + The security level of a page or resource. + ''' + UNKNOWN = "unknown" + NEUTRAL = "neutral" + INSECURE = "insecure" + SECURE = "secure" + INFO = "info" + INSECURE_BROKEN = "insecure-broken" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class CertificateSecurityState: + ''' + Details about the security state of the page certificate. + ''' + #: Protocol name (e.g. "TLS 1.2" or "QUIC"). + protocol: str + + #: Key Exchange used by the connection, or the empty string if not applicable. + key_exchange: str + + #: Cipher name. + cipher: str + + #: Page certificate. + certificate: typing.List[str] + + #: Certificate subject name. + subject_name: str + + #: Name of the issuing CA. + issuer: str + + #: Certificate valid from date. + valid_from: network.TimeSinceEpoch + + #: Certificate valid to (expiration) date + valid_to: network.TimeSinceEpoch + + #: True if the certificate uses a weak signature algorithm. + certificate_has_weak_signature: bool + + #: True if the certificate has a SHA1 signature in the chain. + certificate_has_sha1_signature: bool + + #: True if modern SSL + modern_ssl: bool + + #: True if the connection is using an obsolete SSL protocol. + obsolete_ssl_protocol: bool + + #: True if the connection is using an obsolete SSL key exchange. + obsolete_ssl_key_exchange: bool + + #: True if the connection is using an obsolete SSL cipher. + obsolete_ssl_cipher: bool + + #: True if the connection is using an obsolete SSL signature. + obsolete_ssl_signature: bool + + #: (EC)DH group used by the connection, if applicable. + key_exchange_group: typing.Optional[str] = None + + #: TLS MAC. Note that AEAD ciphers do not have separate MACs. + mac: typing.Optional[str] = None + + #: The highest priority network error code, if the certificate has an error. + certificate_network_error: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol + json['keyExchange'] = self.key_exchange + json['cipher'] = self.cipher + json['certificate'] = [i for i in self.certificate] + json['subjectName'] = self.subject_name + json['issuer'] = self.issuer + json['validFrom'] = self.valid_from.to_json() + json['validTo'] = self.valid_to.to_json() + json['certificateHasWeakSignature'] = self.certificate_has_weak_signature + json['certificateHasSha1Signature'] = self.certificate_has_sha1_signature + json['modernSSL'] = self.modern_ssl + json['obsoleteSslProtocol'] = self.obsolete_ssl_protocol + json['obsoleteSslKeyExchange'] = self.obsolete_ssl_key_exchange + json['obsoleteSslCipher'] = self.obsolete_ssl_cipher + json['obsoleteSslSignature'] = self.obsolete_ssl_signature + if self.key_exchange_group is not None: + json['keyExchangeGroup'] = self.key_exchange_group + if self.mac is not None: + json['mac'] = self.mac + if self.certificate_network_error is not None: + json['certificateNetworkError'] = self.certificate_network_error + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=str(json['protocol']), + key_exchange=str(json['keyExchange']), + cipher=str(json['cipher']), + certificate=[str(i) for i in json['certificate']], + subject_name=str(json['subjectName']), + issuer=str(json['issuer']), + valid_from=network.TimeSinceEpoch.from_json(json['validFrom']), + valid_to=network.TimeSinceEpoch.from_json(json['validTo']), + certificate_has_weak_signature=bool(json['certificateHasWeakSignature']), + certificate_has_sha1_signature=bool(json['certificateHasSha1Signature']), + modern_ssl=bool(json['modernSSL']), + obsolete_ssl_protocol=bool(json['obsoleteSslProtocol']), + obsolete_ssl_key_exchange=bool(json['obsoleteSslKeyExchange']), + obsolete_ssl_cipher=bool(json['obsoleteSslCipher']), + obsolete_ssl_signature=bool(json['obsoleteSslSignature']), + key_exchange_group=str(json['keyExchangeGroup']) if 'keyExchangeGroup' in json else None, + mac=str(json['mac']) if 'mac' in json else None, + certificate_network_error=str(json['certificateNetworkError']) if 'certificateNetworkError' in json else None, + ) + + +class SafetyTipStatus(enum.Enum): + BAD_REPUTATION = "badReputation" + LOOKALIKE = "lookalike" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SafetyTipInfo: + #: Describes whether the page triggers any safety tips or reputation warnings. Default is unknown. + safety_tip_status: SafetyTipStatus + + #: The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches. + safe_url: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['safetyTipStatus'] = self.safety_tip_status.to_json() + if self.safe_url is not None: + json['safeUrl'] = self.safe_url + return json + + @classmethod + def from_json(cls, json): + return cls( + safety_tip_status=SafetyTipStatus.from_json(json['safetyTipStatus']), + safe_url=str(json['safeUrl']) if 'safeUrl' in json else None, + ) + + +@dataclass +class VisibleSecurityState: + ''' + Security state information about the page. + ''' + #: The security level of the page. + security_state: SecurityState + + #: Array of security state issues ids. + security_state_issue_ids: typing.List[str] + + #: Security state details about the page certificate. + certificate_security_state: typing.Optional[CertificateSecurityState] = None + + #: The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown. + safety_tip_info: typing.Optional[SafetyTipInfo] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['securityStateIssueIds'] = [i for i in self.security_state_issue_ids] + if self.certificate_security_state is not None: + json['certificateSecurityState'] = self.certificate_security_state.to_json() + if self.safety_tip_info is not None: + json['safetyTipInfo'] = self.safety_tip_info.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + security_state_issue_ids=[str(i) for i in json['securityStateIssueIds']], + certificate_security_state=CertificateSecurityState.from_json(json['certificateSecurityState']) if 'certificateSecurityState' in json else None, + safety_tip_info=SafetyTipInfo.from_json(json['safetyTipInfo']) if 'safetyTipInfo' in json else None, + ) + + +@dataclass +class SecurityStateExplanation: + ''' + An explanation of an factor contributing to the security state. + ''' + #: Security state representing the severity of the factor being explained. + security_state: SecurityState + + #: Title describing the type of factor. + title: str + + #: Short phrase describing the type of factor. + summary: str + + #: Full text explanation of the factor. + description: str + + #: The type of mixed content described by the explanation. + mixed_content_type: MixedContentType + + #: Page certificate. + certificate: typing.List[str] + + #: Recommendations to fix any issues. + recommendations: typing.Optional[typing.List[str]] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['title'] = self.title + json['summary'] = self.summary + json['description'] = self.description + json['mixedContentType'] = self.mixed_content_type.to_json() + json['certificate'] = [i for i in self.certificate] + if self.recommendations is not None: + json['recommendations'] = [i for i in self.recommendations] + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + title=str(json['title']), + summary=str(json['summary']), + description=str(json['description']), + mixed_content_type=MixedContentType.from_json(json['mixedContentType']), + certificate=[str(i) for i in json['certificate']], + recommendations=[str(i) for i in json['recommendations']] if 'recommendations' in json else None, + ) + + +@dataclass +class InsecureContentStatus: + ''' + Information about insecure content on the page. + ''' + #: Always false. + ran_mixed_content: bool + + #: Always false. + displayed_mixed_content: bool + + #: Always false. + contained_mixed_form: bool + + #: Always false. + ran_content_with_cert_errors: bool + + #: Always false. + displayed_content_with_cert_errors: bool + + #: Always set to unknown. + ran_insecure_content_style: SecurityState + + #: Always set to unknown. + displayed_insecure_content_style: SecurityState + + def to_json(self): + json = dict() + json['ranMixedContent'] = self.ran_mixed_content + json['displayedMixedContent'] = self.displayed_mixed_content + json['containedMixedForm'] = self.contained_mixed_form + json['ranContentWithCertErrors'] = self.ran_content_with_cert_errors + json['displayedContentWithCertErrors'] = self.displayed_content_with_cert_errors + json['ranInsecureContentStyle'] = self.ran_insecure_content_style.to_json() + json['displayedInsecureContentStyle'] = self.displayed_insecure_content_style.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + ran_mixed_content=bool(json['ranMixedContent']), + displayed_mixed_content=bool(json['displayedMixedContent']), + contained_mixed_form=bool(json['containedMixedForm']), + ran_content_with_cert_errors=bool(json['ranContentWithCertErrors']), + displayed_content_with_cert_errors=bool(json['displayedContentWithCertErrors']), + ran_insecure_content_style=SecurityState.from_json(json['ranInsecureContentStyle']), + displayed_insecure_content_style=SecurityState.from_json(json['displayedInsecureContentStyle']), + ) + + +class CertificateErrorAction(enum.Enum): + ''' + The action to take when a certificate error occurs. continue will continue processing the + request and cancel will cancel the request. + ''' + CONTINUE = "continue" + CANCEL = "cancel" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.enable', + } + json = yield cmd_dict + + +def set_ignore_certificate_errors( + ignore: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable whether all certificate errors should be ignored. + + :param ignore: If true, all certificate errors will be ignored. + ''' + params: T_JSON_DICT = dict() + params['ignore'] = ignore + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setIgnoreCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +def handle_certificate_error( + event_id: int, + action: CertificateErrorAction + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Handles a certificate error that fired a certificateError event. + + :param event_id: The ID of the event. + :param action: The action to take on the certificate error. + ''' + params: T_JSON_DICT = dict() + params['eventId'] = event_id + params['action'] = action.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Security.handleCertificateError', + 'params': params, + } + json = yield cmd_dict + + +def set_override_certificate_errors( + override: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable overriding certificate errors. If enabled, all certificate error events need to + be handled by the DevTools client and should be answered with ``handleCertificateError`` commands. + + :param override: If true, certificate errors will be overridden. + ''' + params: T_JSON_DICT = dict() + params['override'] = override + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setOverrideCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Security.certificateError') +@dataclass +class CertificateError: + ''' + There is a certificate error. If overriding certificate errors is enabled, then it should be + handled with the ``handleCertificateError`` command. Note: this event does not fire if the + certificate error has been allowed internally. Only one client per target should override + certificate errors at the same time. + ''' + #: The ID of the event. + event_id: int + #: The type of the error. + error_type: str + #: The url that was requested. + request_url: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CertificateError: + return cls( + event_id=int(json['eventId']), + error_type=str(json['errorType']), + request_url=str(json['requestURL']) + ) + + +@event_class('Security.visibleSecurityStateChanged') +@dataclass +class VisibleSecurityStateChanged: + ''' + **EXPERIMENTAL** + + The security state of the page changed. + ''' + #: Security state information about the page. + visible_security_state: VisibleSecurityState + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> VisibleSecurityStateChanged: + return cls( + visible_security_state=VisibleSecurityState.from_json(json['visibleSecurityState']) + ) + + +@event_class('Security.securityStateChanged') +@dataclass +class SecurityStateChanged: + ''' + The security state of the page changed. No longer being sent. + ''' + #: Security state. + security_state: SecurityState + #: True if the page was loaded over cryptographic transport such as HTTPS. + scheme_is_cryptographic: bool + #: Previously a list of explanations for the security state. Now always + #: empty. + explanations: typing.List[SecurityStateExplanation] + #: Information about insecure content on the page. + insecure_content_status: InsecureContentStatus + #: Overrides user-visible description of the state. Always omitted. + summary: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SecurityStateChanged: + return cls( + security_state=SecurityState.from_json(json['securityState']), + scheme_is_cryptographic=bool(json['schemeIsCryptographic']), + explanations=[SecurityStateExplanation.from_json(i) for i in json['explanations']], + insecure_content_status=InsecureContentStatus.from_json(json['insecureContentStatus']), + summary=str(json['summary']) if 'summary' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/service_worker.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/service_worker.py new file mode 100755 index 0000000..9dd80b1 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/service_worker.py @@ -0,0 +1,414 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: ServiceWorker (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +class RegistrationID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RegistrationID: + return cls(json) + + def __repr__(self): + return 'RegistrationID({})'.format(super().__repr__()) + + +@dataclass +class ServiceWorkerRegistration: + ''' + ServiceWorker registration. + ''' + registration_id: RegistrationID + + scope_url: str + + is_deleted: bool + + def to_json(self): + json = dict() + json['registrationId'] = self.registration_id.to_json() + json['scopeURL'] = self.scope_url + json['isDeleted'] = self.is_deleted + return json + + @classmethod + def from_json(cls, json): + return cls( + registration_id=RegistrationID.from_json(json['registrationId']), + scope_url=str(json['scopeURL']), + is_deleted=bool(json['isDeleted']), + ) + + +class ServiceWorkerVersionRunningStatus(enum.Enum): + STOPPED = "stopped" + STARTING = "starting" + RUNNING = "running" + STOPPING = "stopping" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ServiceWorkerVersionStatus(enum.Enum): + NEW = "new" + INSTALLING = "installing" + INSTALLED = "installed" + ACTIVATING = "activating" + ACTIVATED = "activated" + REDUNDANT = "redundant" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ServiceWorkerVersion: + ''' + ServiceWorker version. + ''' + version_id: str + + registration_id: RegistrationID + + script_url: str + + running_status: ServiceWorkerVersionRunningStatus + + status: ServiceWorkerVersionStatus + + #: The Last-Modified header value of the main script. + script_last_modified: typing.Optional[float] = None + + #: The time at which the response headers of the main script were received from the server. + #: For cached script it is the last time the cache entry was validated. + script_response_time: typing.Optional[float] = None + + controlled_clients: typing.Optional[typing.List[target.TargetID]] = None + + target_id: typing.Optional[target.TargetID] = None + + router_rules: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['versionId'] = self.version_id + json['registrationId'] = self.registration_id.to_json() + json['scriptURL'] = self.script_url + json['runningStatus'] = self.running_status.to_json() + json['status'] = self.status.to_json() + if self.script_last_modified is not None: + json['scriptLastModified'] = self.script_last_modified + if self.script_response_time is not None: + json['scriptResponseTime'] = self.script_response_time + if self.controlled_clients is not None: + json['controlledClients'] = [i.to_json() for i in self.controlled_clients] + if self.target_id is not None: + json['targetId'] = self.target_id.to_json() + if self.router_rules is not None: + json['routerRules'] = self.router_rules + return json + + @classmethod + def from_json(cls, json): + return cls( + version_id=str(json['versionId']), + registration_id=RegistrationID.from_json(json['registrationId']), + script_url=str(json['scriptURL']), + running_status=ServiceWorkerVersionRunningStatus.from_json(json['runningStatus']), + status=ServiceWorkerVersionStatus.from_json(json['status']), + script_last_modified=float(json['scriptLastModified']) if 'scriptLastModified' in json else None, + script_response_time=float(json['scriptResponseTime']) if 'scriptResponseTime' in json else None, + controlled_clients=[target.TargetID.from_json(i) for i in json['controlledClients']] if 'controlledClients' in json else None, + target_id=target.TargetID.from_json(json['targetId']) if 'targetId' in json else None, + router_rules=str(json['routerRules']) if 'routerRules' in json else None, + ) + + +@dataclass +class ServiceWorkerErrorMessage: + ''' + ServiceWorker error message. + ''' + error_message: str + + registration_id: RegistrationID + + version_id: str + + source_url: str + + line_number: int + + column_number: int + + def to_json(self): + json = dict() + json['errorMessage'] = self.error_message + json['registrationId'] = self.registration_id.to_json() + json['versionId'] = self.version_id + json['sourceURL'] = self.source_url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + error_message=str(json['errorMessage']), + registration_id=RegistrationID.from_json(json['registrationId']), + version_id=str(json['versionId']), + source_url=str(json['sourceURL']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +def deliver_push_message( + origin: str, + registration_id: RegistrationID, + data: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param data: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['data'] = data + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.deliverPushMessage', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.disable', + } + json = yield cmd_dict + + +def dispatch_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str, + last_chance: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + :param last_chance: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + params['lastChance'] = last_chance + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def dispatch_periodic_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchPeriodicSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.enable', + } + json = yield cmd_dict + + +def inspect_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.inspectWorker', + 'params': params, + } + json = yield cmd_dict + + +def set_force_update_on_page_load( + force_update_on_page_load: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param force_update_on_page_load: + ''' + params: T_JSON_DICT = dict() + params['forceUpdateOnPageLoad'] = force_update_on_page_load + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.setForceUpdateOnPageLoad', + 'params': params, + } + json = yield cmd_dict + + +def skip_waiting( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.skipWaiting', + 'params': params, + } + json = yield cmd_dict + + +def start_worker( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.startWorker', + 'params': params, + } + json = yield cmd_dict + + +def stop_all_workers() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopAllWorkers', + } + json = yield cmd_dict + + +def stop_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopWorker', + 'params': params, + } + json = yield cmd_dict + + +def unregister( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.unregister', + 'params': params, + } + json = yield cmd_dict + + +def update_registration( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.updateRegistration', + 'params': params, + } + json = yield cmd_dict + + +@event_class('ServiceWorker.workerErrorReported') +@dataclass +class WorkerErrorReported: + error_message: ServiceWorkerErrorMessage + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerErrorReported: + return cls( + error_message=ServiceWorkerErrorMessage.from_json(json['errorMessage']) + ) + + +@event_class('ServiceWorker.workerRegistrationUpdated') +@dataclass +class WorkerRegistrationUpdated: + registrations: typing.List[ServiceWorkerRegistration] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerRegistrationUpdated: + return cls( + registrations=[ServiceWorkerRegistration.from_json(i) for i in json['registrations']] + ) + + +@event_class('ServiceWorker.workerVersionUpdated') +@dataclass +class WorkerVersionUpdated: + versions: typing.List[ServiceWorkerVersion] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerVersionUpdated: + return cls( + versions=[ServiceWorkerVersion.from_json(i) for i in json['versions']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/storage.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/storage.py new file mode 100755 index 0000000..09f476e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/storage.py @@ -0,0 +1,2090 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Storage (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import network +from . import page + + +class SerializedStorageKey(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SerializedStorageKey: + return cls(json) + + def __repr__(self): + return 'SerializedStorageKey({})'.format(super().__repr__()) + + +class StorageType(enum.Enum): + ''' + Enum of possible storage types. + ''' + APPCACHE = "appcache" + COOKIES = "cookies" + FILE_SYSTEMS = "file_systems" + INDEXEDDB = "indexeddb" + LOCAL_STORAGE = "local_storage" + SHADER_CACHE = "shader_cache" + WEBSQL = "websql" + SERVICE_WORKERS = "service_workers" + CACHE_STORAGE = "cache_storage" + INTEREST_GROUPS = "interest_groups" + SHARED_STORAGE = "shared_storage" + STORAGE_BUCKETS = "storage_buckets" + ALL_ = "all" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class UsageForType: + ''' + Usage for a storage type. + ''' + #: Name of storage type. + storage_type: StorageType + + #: Storage usage (bytes). + usage: float + + def to_json(self): + json = dict() + json['storageType'] = self.storage_type.to_json() + json['usage'] = self.usage + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_type=StorageType.from_json(json['storageType']), + usage=float(json['usage']), + ) + + +@dataclass +class TrustTokens: + ''' + Pair of issuer origin and number of available (signed, but not used) Trust + Tokens from that issuer. + ''' + issuer_origin: str + + count: float + + def to_json(self): + json = dict() + json['issuerOrigin'] = self.issuer_origin + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + issuer_origin=str(json['issuerOrigin']), + count=float(json['count']), + ) + + +class InterestGroupAuctionId(str): + ''' + Protected audience interest group auction identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> InterestGroupAuctionId: + return cls(json) + + def __repr__(self): + return 'InterestGroupAuctionId({})'.format(super().__repr__()) + + +class InterestGroupAccessType(enum.Enum): + ''' + Enum of interest group access types. + ''' + JOIN = "join" + LEAVE = "leave" + UPDATE = "update" + LOADED = "loaded" + BID = "bid" + WIN = "win" + ADDITIONAL_BID = "additionalBid" + ADDITIONAL_BID_WIN = "additionalBidWin" + TOP_LEVEL_BID = "topLevelBid" + TOP_LEVEL_ADDITIONAL_BID = "topLevelAdditionalBid" + CLEAR = "clear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionEventType(enum.Enum): + ''' + Enum of auction events. + ''' + STARTED = "started" + CONFIG_RESOLVED = "configResolved" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionFetchType(enum.Enum): + ''' + Enum of network fetches auctions can do. + ''' + BIDDER_JS = "bidderJs" + BIDDER_WASM = "bidderWasm" + SELLER_JS = "sellerJs" + BIDDER_TRUSTED_SIGNALS = "bidderTrustedSignals" + SELLER_TRUSTED_SIGNALS = "sellerTrustedSignals" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SharedStorageAccessType(enum.Enum): + ''' + Enum of shared storage access types. + ''' + DOCUMENT_ADD_MODULE = "documentAddModule" + DOCUMENT_SELECT_URL = "documentSelectURL" + DOCUMENT_RUN = "documentRun" + DOCUMENT_SET = "documentSet" + DOCUMENT_APPEND = "documentAppend" + DOCUMENT_DELETE = "documentDelete" + DOCUMENT_CLEAR = "documentClear" + DOCUMENT_GET = "documentGet" + WORKLET_SET = "workletSet" + WORKLET_APPEND = "workletAppend" + WORKLET_DELETE = "workletDelete" + WORKLET_CLEAR = "workletClear" + WORKLET_GET = "workletGet" + WORKLET_KEYS = "workletKeys" + WORKLET_ENTRIES = "workletEntries" + WORKLET_LENGTH = "workletLength" + WORKLET_REMAINING_BUDGET = "workletRemainingBudget" + HEADER_SET = "headerSet" + HEADER_APPEND = "headerAppend" + HEADER_DELETE = "headerDelete" + HEADER_CLEAR = "headerClear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SharedStorageEntry: + ''' + Struct for a single key-value pair in an origin's shared storage. + ''' + key: str + + value: str + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=str(json['value']), + ) + + +@dataclass +class SharedStorageMetadata: + ''' + Details for an origin's shared storage. + ''' + #: Time when the origin's shared storage was last created. + creation_time: network.TimeSinceEpoch + + #: Number of key-value pairs stored in origin's shared storage. + length: int + + #: Current amount of bits of entropy remaining in the navigation budget. + remaining_budget: float + + #: Total number of bytes stored as key-value pairs in origin's shared + #: storage. + bytes_used: int + + def to_json(self): + json = dict() + json['creationTime'] = self.creation_time.to_json() + json['length'] = self.length + json['remainingBudget'] = self.remaining_budget + json['bytesUsed'] = self.bytes_used + return json + + @classmethod + def from_json(cls, json): + return cls( + creation_time=network.TimeSinceEpoch.from_json(json['creationTime']), + length=int(json['length']), + remaining_budget=float(json['remainingBudget']), + bytes_used=int(json['bytesUsed']), + ) + + +@dataclass +class SharedStorageReportingMetadata: + ''' + Pair of reporting metadata details for a candidate URL for ``selectURL()``. + ''' + event_type: str + + reporting_url: str + + def to_json(self): + json = dict() + json['eventType'] = self.event_type + json['reportingUrl'] = self.reporting_url + return json + + @classmethod + def from_json(cls, json): + return cls( + event_type=str(json['eventType']), + reporting_url=str(json['reportingUrl']), + ) + + +@dataclass +class SharedStorageUrlWithMetadata: + ''' + Bundles a candidate URL with its reporting metadata. + ''' + #: Spec of candidate URL. + url: str + + #: Any associated reporting metadata. + reporting_metadata: typing.List[SharedStorageReportingMetadata] + + def to_json(self): + json = dict() + json['url'] = self.url + json['reportingMetadata'] = [i.to_json() for i in self.reporting_metadata] + return json + + @classmethod + def from_json(cls, json): + return cls( + url=str(json['url']), + reporting_metadata=[SharedStorageReportingMetadata.from_json(i) for i in json['reportingMetadata']], + ) + + +@dataclass +class SharedStorageAccessParams: + ''' + Bundles the parameters for shared storage access events whose + presence/absence can vary according to SharedStorageAccessType. + ''' + #: Spec of the module script URL. + #: Present only for SharedStorageAccessType.documentAddModule. + script_source_url: typing.Optional[str] = None + + #: Name of the registered operation to be run. + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + operation_name: typing.Optional[str] = None + + #: The operation's serialized data in bytes (converted to a string). + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + serialized_data: typing.Optional[str] = None + + #: Array of candidate URLs' specs, along with any associated metadata. + #: Present only for SharedStorageAccessType.documentSelectURL. + urls_with_metadata: typing.Optional[typing.List[SharedStorageUrlWithMetadata]] = None + + #: Key for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.documentDelete, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.workletDelete, + #: SharedStorageAccessType.workletGet, + #: SharedStorageAccessType.headerSet, + #: SharedStorageAccessType.headerAppend, and + #: SharedStorageAccessType.headerDelete. + key: typing.Optional[str] = None + + #: Value for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.headerSet, and + #: SharedStorageAccessType.headerAppend. + value: typing.Optional[str] = None + + #: Whether or not to set an entry for a key if that key is already present. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.workletSet, and + #: SharedStorageAccessType.headerSet. + ignore_if_present: typing.Optional[bool] = None + + def to_json(self): + json = dict() + if self.script_source_url is not None: + json['scriptSourceUrl'] = self.script_source_url + if self.operation_name is not None: + json['operationName'] = self.operation_name + if self.serialized_data is not None: + json['serializedData'] = self.serialized_data + if self.urls_with_metadata is not None: + json['urlsWithMetadata'] = [i.to_json() for i in self.urls_with_metadata] + if self.key is not None: + json['key'] = self.key + if self.value is not None: + json['value'] = self.value + if self.ignore_if_present is not None: + json['ignoreIfPresent'] = self.ignore_if_present + return json + + @classmethod + def from_json(cls, json): + return cls( + script_source_url=str(json['scriptSourceUrl']) if 'scriptSourceUrl' in json else None, + operation_name=str(json['operationName']) if 'operationName' in json else None, + serialized_data=str(json['serializedData']) if 'serializedData' in json else None, + urls_with_metadata=[SharedStorageUrlWithMetadata.from_json(i) for i in json['urlsWithMetadata']] if 'urlsWithMetadata' in json else None, + key=str(json['key']) if 'key' in json else None, + value=str(json['value']) if 'value' in json else None, + ignore_if_present=bool(json['ignoreIfPresent']) if 'ignoreIfPresent' in json else None, + ) + + +class StorageBucketsDurability(enum.Enum): + RELAXED = "relaxed" + STRICT = "strict" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class StorageBucket: + storage_key: SerializedStorageKey + + #: If not specified, it is the default bucket of the storageKey. + name: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['storageKey'] = self.storage_key.to_json() + if self.name is not None: + json['name'] = self.name + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_key=SerializedStorageKey.from_json(json['storageKey']), + name=str(json['name']) if 'name' in json else None, + ) + + +@dataclass +class StorageBucketInfo: + bucket: StorageBucket + + id_: str + + expiration: network.TimeSinceEpoch + + #: Storage quota (bytes). + quota: float + + persistent: bool + + durability: StorageBucketsDurability + + def to_json(self): + json = dict() + json['bucket'] = self.bucket.to_json() + json['id'] = self.id_ + json['expiration'] = self.expiration.to_json() + json['quota'] = self.quota + json['persistent'] = self.persistent + json['durability'] = self.durability.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + bucket=StorageBucket.from_json(json['bucket']), + id_=str(json['id']), + expiration=network.TimeSinceEpoch.from_json(json['expiration']), + quota=float(json['quota']), + persistent=bool(json['persistent']), + durability=StorageBucketsDurability.from_json(json['durability']), + ) + + +class AttributionReportingSourceType(enum.Enum): + NAVIGATION = "navigation" + EVENT = "event" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class UnsignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'UnsignedInt64AsBase10({})'.format(super().__repr__()) + + +class UnsignedInt128AsBase16(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt128AsBase16: + return cls(json) + + def __repr__(self): + return 'UnsignedInt128AsBase16({})'.format(super().__repr__()) + + +class SignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'SignedInt64AsBase10({})'.format(super().__repr__()) + + +@dataclass +class AttributionReportingFilterDataEntry: + key: str + + values: typing.List[str] + + def to_json(self): + json = dict() + json['key'] = self.key + json['values'] = [i for i in self.values] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + values=[str(i) for i in json['values']], + ) + + +@dataclass +class AttributionReportingFilterConfig: + filter_values: typing.List[AttributionReportingFilterDataEntry] + + #: duration in seconds + lookback_window: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['filterValues'] = [i.to_json() for i in self.filter_values] + if self.lookback_window is not None: + json['lookbackWindow'] = self.lookback_window + return json + + @classmethod + def from_json(cls, json): + return cls( + filter_values=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterValues']], + lookback_window=int(json['lookbackWindow']) if 'lookbackWindow' in json else None, + ) + + +@dataclass +class AttributionReportingFilterPair: + filters: typing.List[AttributionReportingFilterConfig] + + not_filters: typing.List[AttributionReportingFilterConfig] + + def to_json(self): + json = dict() + json['filters'] = [i.to_json() for i in self.filters] + json['notFilters'] = [i.to_json() for i in self.not_filters] + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=[AttributionReportingFilterConfig.from_json(i) for i in json['filters']], + not_filters=[AttributionReportingFilterConfig.from_json(i) for i in json['notFilters']], + ) + + +@dataclass +class AttributionReportingAggregationKeysEntry: + key: str + + value: UnsignedInt128AsBase16 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=UnsignedInt128AsBase16.from_json(json['value']), + ) + + +@dataclass +class AttributionReportingEventReportWindows: + #: duration in seconds + start: int + + #: duration in seconds + ends: typing.List[int] + + def to_json(self): + json = dict() + json['start'] = self.start + json['ends'] = [i for i in self.ends] + return json + + @classmethod + def from_json(cls, json): + return cls( + start=int(json['start']), + ends=[int(i) for i in json['ends']], + ) + + +@dataclass +class AttributionReportingTriggerSpec: + #: number instead of integer because not all uint32 can be represented by + #: int + trigger_data: typing.List[float] + + event_report_windows: AttributionReportingEventReportWindows + + def to_json(self): + json = dict() + json['triggerData'] = [i for i in self.trigger_data] + json['eventReportWindows'] = self.event_report_windows.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + trigger_data=[float(i) for i in json['triggerData']], + event_report_windows=AttributionReportingEventReportWindows.from_json(json['eventReportWindows']), + ) + + +class AttributionReportingTriggerDataMatching(enum.Enum): + EXACT = "exact" + MODULUS = "modulus" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableDebugReportingData: + key_piece: UnsignedInt128AsBase16 + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + types: typing.List[str] + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['value'] = self.value + json['types'] = [i for i in self.types] + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + value=float(json['value']), + types=[str(i) for i in json['types']], + ) + + +@dataclass +class AttributionReportingAggregatableDebugReportingConfig: + key_piece: UnsignedInt128AsBase16 + + debug_data: typing.List[AttributionReportingAggregatableDebugReportingData] + + #: number instead of integer because not all uint32 can be represented by + #: int, only present for source registrations + budget: typing.Optional[float] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['debugData'] = [i.to_json() for i in self.debug_data] + if self.budget is not None: + json['budget'] = self.budget + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + debug_data=[AttributionReportingAggregatableDebugReportingData.from_json(i) for i in json['debugData']], + budget=float(json['budget']) if 'budget' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + ) + + +@dataclass +class AttributionScopesData: + values: typing.List[str] + + #: number instead of integer because not all uint32 can be represented by + #: int + limit: float + + max_event_states: float + + def to_json(self): + json = dict() + json['values'] = [i for i in self.values] + json['limit'] = self.limit + json['maxEventStates'] = self.max_event_states + return json + + @classmethod + def from_json(cls, json): + return cls( + values=[str(i) for i in json['values']], + limit=float(json['limit']), + max_event_states=float(json['maxEventStates']), + ) + + +@dataclass +class AttributionReportingSourceRegistration: + time: network.TimeSinceEpoch + + #: duration in seconds + expiry: int + + trigger_specs: typing.List[AttributionReportingTriggerSpec] + + #: duration in seconds + aggregatable_report_window: int + + type_: AttributionReportingSourceType + + source_origin: str + + reporting_origin: str + + destination_sites: typing.List[str] + + event_id: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filter_data: typing.List[AttributionReportingFilterDataEntry] + + aggregation_keys: typing.List[AttributionReportingAggregationKeysEntry] + + trigger_data_matching: AttributionReportingTriggerDataMatching + + destination_limit_priority: SignedInt64AsBase10 + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + scopes_data: typing.Optional[AttributionScopesData] = None + + def to_json(self): + json = dict() + json['time'] = self.time.to_json() + json['expiry'] = self.expiry + json['triggerSpecs'] = [i.to_json() for i in self.trigger_specs] + json['aggregatableReportWindow'] = self.aggregatable_report_window + json['type'] = self.type_.to_json() + json['sourceOrigin'] = self.source_origin + json['reportingOrigin'] = self.reporting_origin + json['destinationSites'] = [i for i in self.destination_sites] + json['eventId'] = self.event_id.to_json() + json['priority'] = self.priority.to_json() + json['filterData'] = [i.to_json() for i in self.filter_data] + json['aggregationKeys'] = [i.to_json() for i in self.aggregation_keys] + json['triggerDataMatching'] = self.trigger_data_matching.to_json() + json['destinationLimitPriority'] = self.destination_limit_priority.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + if self.scopes_data is not None: + json['scopesData'] = self.scopes_data.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + time=network.TimeSinceEpoch.from_json(json['time']), + expiry=int(json['expiry']), + trigger_specs=[AttributionReportingTriggerSpec.from_json(i) for i in json['triggerSpecs']], + aggregatable_report_window=int(json['aggregatableReportWindow']), + type_=AttributionReportingSourceType.from_json(json['type']), + source_origin=str(json['sourceOrigin']), + reporting_origin=str(json['reportingOrigin']), + destination_sites=[str(i) for i in json['destinationSites']], + event_id=UnsignedInt64AsBase10.from_json(json['eventId']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filter_data=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterData']], + aggregation_keys=[AttributionReportingAggregationKeysEntry.from_json(i) for i in json['aggregationKeys']], + trigger_data_matching=AttributionReportingTriggerDataMatching.from_json(json['triggerDataMatching']), + destination_limit_priority=SignedInt64AsBase10.from_json(json['destinationLimitPriority']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + scopes_data=AttributionScopesData.from_json(json['scopesData']) if 'scopesData' in json else None, + ) + + +class AttributionReportingSourceRegistrationResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + INSUFFICIENT_SOURCE_CAPACITY = "insufficientSourceCapacity" + INSUFFICIENT_UNIQUE_DESTINATION_CAPACITY = "insufficientUniqueDestinationCapacity" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + SUCCESS_NOISED = "successNoised" + DESTINATION_REPORTING_LIMIT_REACHED = "destinationReportingLimitReached" + DESTINATION_GLOBAL_LIMIT_REACHED = "destinationGlobalLimitReached" + DESTINATION_BOTH_LIMITS_REACHED = "destinationBothLimitsReached" + REPORTING_ORIGINS_PER_SITE_LIMIT_REACHED = "reportingOriginsPerSiteLimitReached" + EXCEEDS_MAX_CHANNEL_CAPACITY = "exceedsMaxChannelCapacity" + EXCEEDS_MAX_SCOPES_CHANNEL_CAPACITY = "exceedsMaxScopesChannelCapacity" + EXCEEDS_MAX_TRIGGER_STATE_CARDINALITY = "exceedsMaxTriggerStateCardinality" + EXCEEDS_MAX_EVENT_STATES_LIMIT = "exceedsMaxEventStatesLimit" + DESTINATION_PER_DAY_REPORTING_LIMIT_REACHED = "destinationPerDayReportingLimitReached" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingSourceRegistrationTimeConfig(enum.Enum): + INCLUDE = "include" + EXCLUDE = "exclude" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableValueDictEntry: + key: str + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + filtering_id: UnsignedInt64AsBase10 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + json['filteringId'] = self.filtering_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=float(json['value']), + filtering_id=UnsignedInt64AsBase10.from_json(json['filteringId']), + ) + + +@dataclass +class AttributionReportingAggregatableValueEntry: + values: typing.List[AttributionReportingAggregatableValueDictEntry] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['values'] = [i.to_json() for i in self.values] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + values=[AttributionReportingAggregatableValueDictEntry.from_json(i) for i in json['values']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingEventTriggerData: + data: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['data'] = self.data.to_json() + json['priority'] = self.priority.to_json() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + data=UnsignedInt64AsBase10.from_json(json['data']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingAggregatableTriggerData: + key_piece: UnsignedInt128AsBase16 + + source_keys: typing.List[str] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['sourceKeys'] = [i for i in self.source_keys] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + source_keys=[str(i) for i in json['sourceKeys']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingAggregatableDedupKey: + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingTriggerRegistration: + filters: AttributionReportingFilterPair + + aggregatable_dedup_keys: typing.List[AttributionReportingAggregatableDedupKey] + + event_trigger_data: typing.List[AttributionReportingEventTriggerData] + + aggregatable_trigger_data: typing.List[AttributionReportingAggregatableTriggerData] + + aggregatable_values: typing.List[AttributionReportingAggregatableValueEntry] + + aggregatable_filtering_id_max_bytes: int + + debug_reporting: bool + + source_registration_time_config: AttributionReportingSourceRegistrationTimeConfig + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + scopes: typing.List[str] + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + trigger_context_id: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + json['aggregatableDedupKeys'] = [i.to_json() for i in self.aggregatable_dedup_keys] + json['eventTriggerData'] = [i.to_json() for i in self.event_trigger_data] + json['aggregatableTriggerData'] = [i.to_json() for i in self.aggregatable_trigger_data] + json['aggregatableValues'] = [i.to_json() for i in self.aggregatable_values] + json['aggregatableFilteringIdMaxBytes'] = self.aggregatable_filtering_id_max_bytes + json['debugReporting'] = self.debug_reporting + json['sourceRegistrationTimeConfig'] = self.source_registration_time_config.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + json['scopes'] = [i for i in self.scopes] + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + if self.trigger_context_id is not None: + json['triggerContextId'] = self.trigger_context_id + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + aggregatable_dedup_keys=[AttributionReportingAggregatableDedupKey.from_json(i) for i in json['aggregatableDedupKeys']], + event_trigger_data=[AttributionReportingEventTriggerData.from_json(i) for i in json['eventTriggerData']], + aggregatable_trigger_data=[AttributionReportingAggregatableTriggerData.from_json(i) for i in json['aggregatableTriggerData']], + aggregatable_values=[AttributionReportingAggregatableValueEntry.from_json(i) for i in json['aggregatableValues']], + aggregatable_filtering_id_max_bytes=int(json['aggregatableFilteringIdMaxBytes']), + debug_reporting=bool(json['debugReporting']), + source_registration_time_config=AttributionReportingSourceRegistrationTimeConfig.from_json(json['sourceRegistrationTimeConfig']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + scopes=[str(i) for i in json['scopes']], + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + trigger_context_id=str(json['triggerContextId']) if 'triggerContextId' in json else None, + ) + + +class AttributionReportingEventLevelResult(enum.Enum): + SUCCESS = "success" + SUCCESS_DROPPED_LOWER_PRIORITY = "successDroppedLowerPriority" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + DEDUPLICATED = "deduplicated" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + PRIORITY_TOO_LOW = "priorityTooLow" + NEVER_ATTRIBUTED_SOURCE = "neverAttributedSource" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + NO_MATCHING_CONFIGURATIONS = "noMatchingConfigurations" + EXCESSIVE_REPORTS = "excessiveReports" + FALSELY_ATTRIBUTED_SOURCE = "falselyAttributedSource" + REPORT_WINDOW_PASSED = "reportWindowPassed" + NOT_REGISTERED = "notRegistered" + REPORT_WINDOW_NOT_STARTED = "reportWindowNotStarted" + NO_MATCHING_TRIGGER_DATA = "noMatchingTriggerData" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingAggregatableResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_HISTOGRAMS = "noHistograms" + INSUFFICIENT_BUDGET = "insufficientBudget" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + NOT_REGISTERED = "notRegistered" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + DEDUPLICATED = "deduplicated" + REPORT_WINDOW_PASSED = "reportWindowPassed" + EXCESSIVE_REPORTS = "excessiveReports" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class RelatedWebsiteSet: + ''' + A single Related Website Set object. + ''' + #: The primary site of this set, along with the ccTLDs if there is any. + primary_sites: typing.List[str] + + #: The associated sites of this set, along with the ccTLDs if there is any. + associated_sites: typing.List[str] + + #: The service sites of this set, along with the ccTLDs if there is any. + service_sites: typing.List[str] + + def to_json(self): + json = dict() + json['primarySites'] = [i for i in self.primary_sites] + json['associatedSites'] = [i for i in self.associated_sites] + json['serviceSites'] = [i for i in self.service_sites] + return json + + @classmethod + def from_json(cls, json): + return cls( + primary_sites=[str(i) for i in json['primarySites']], + associated_sites=[str(i) for i in json['associatedSites']], + service_sites=[str(i) for i in json['serviceSites']], + ) + + +def get_storage_key_for_frame( + frame_id: page.FrameId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SerializedStorageKey]: + ''' + Returns a storage key given a frame id. + + :param frame_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['frameId'] = frame_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getStorageKeyForFrame', + 'params': params, + } + json = yield cmd_dict + return SerializedStorageKey.from_json(json['storageKey']) + + +def clear_data_for_origin( + origin: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for origin. + + :param origin: Security origin. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def clear_data_for_storage_key( + storage_key: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for storage key. + + :param storage_key: Storage key. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[network.Cookie]]: + ''' + Returns all browser cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + :returns: Array of cookie objects. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getCookies', + 'params': params, + } + json = yield cmd_dict + return [network.Cookie.from_json(i) for i in json['cookies']] + + +def set_cookies( + cookies: typing.List[network.CookieParam], + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets given cookies. + + :param cookies: Cookies to be set. + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + params['cookies'] = [i.to_json() for i in cookies] + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setCookies', + 'params': params, + } + json = yield cmd_dict + + +def clear_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearCookies', + 'params': params, + } + json = yield cmd_dict + + +def get_usage_and_quota( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float, bool, typing.List[UsageForType]]]: + ''' + Returns usage and quota in bytes. + + :param origin: Security origin. + :returns: A tuple with the following items: + + 0. **usage** - Storage usage (bytes). + 1. **quota** - Storage quota (bytes). + 2. **overrideActive** - Whether or not the origin has an active storage quota override + 3. **usageBreakdown** - Storage usage per type (bytes). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getUsageAndQuota', + 'params': params, + } + json = yield cmd_dict + return ( + float(json['usage']), + float(json['quota']), + bool(json['overrideActive']), + [UsageForType.from_json(i) for i in json['usageBreakdown']] + ) + + +def override_quota_for_origin( + origin: str, + quota_size: typing.Optional[float] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Override quota for the specified origin + + **EXPERIMENTAL** + + :param origin: Security origin. + :param quota_size: *(Optional)* The quota size (in bytes) to override the original quota with. If this is called multiple times, the overridden quota will be equal to the quotaSize provided in the final call. If this is called without specifying a quotaSize, the quota will be reset to the default value for the specified origin. If this is called multiple times with different origins, the override will be maintained for each origin until it is disabled (called without a quotaSize). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + if quota_size is not None: + params['quotaSize'] = quota_size + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.overrideQuotaForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its cache storage list. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its cache storage list. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for cache storage. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for cache storage. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_trust_tokens() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TrustTokens]]: + ''' + Returns the number of stored Trust Tokens per issuer for the + current browsing context. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getTrustTokens', + } + json = yield cmd_dict + return [TrustTokens.from_json(i) for i in json['tokens']] + + +def clear_trust_tokens( + issuer_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Removes all Trust Tokens issued by the provided issuerOrigin. + Leaves other stored data, including the issuer's Redemption Records, intact. + + **EXPERIMENTAL** + + :param issuer_origin: + :returns: True if any tokens were deleted, false otherwise. + ''' + params: T_JSON_DICT = dict() + params['issuerOrigin'] = issuer_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearTrustTokens', + 'params': params, + } + json = yield cmd_dict + return bool(json['didDeleteTokens']) + + +def get_interest_group_details( + owner_origin: str, + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,dict]: + ''' + Gets details for a named interest group. + + **EXPERIMENTAL** + + :param owner_origin: + :param name: + :returns: This largely corresponds to: https://wicg.github.io/turtledove/#dictdef-generatebidinterestgroup but has absolute expirationTime instead of relative lifetimeMs and also adds joiningOrigin. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getInterestGroupDetails', + 'params': params, + } + json = yield cmd_dict + return dict(json['details']) + + +def set_interest_group_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_interest_group_auction_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAuctionEventOccurred and + interestGroupAuctionNetworkRequestCreated. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupAuctionTracking', + 'params': params, + } + json = yield cmd_dict + + +def get_shared_storage_metadata( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SharedStorageMetadata]: + ''' + Gets metadata for an origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageMetadata', + 'params': params, + } + json = yield cmd_dict + return SharedStorageMetadata.from_json(json['metadata']) + + +def get_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[SharedStorageEntry]]: + ''' + Gets the entries in an given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + return [SharedStorageEntry.from_json(i) for i in json['entries']] + + +def set_shared_storage_entry( + owner_origin: str, + key: str, + value: str, + ignore_if_present: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets entry with ``key`` and ``value`` for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + :param value: + :param ignore_if_present: *(Optional)* If ```ignoreIfPresent```` is included and true, then only sets the entry if ````key``` doesn't already exist. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + params['value'] = value + if ignore_if_present is not None: + params['ignoreIfPresent'] = ignore_if_present + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def delete_shared_storage_entry( + owner_origin: str, + key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes entry for ``key`` (if it exists) for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def clear_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all entries for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + + +def reset_shared_storage_budget( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets the budget for ``ownerOrigin`` by clearing all budget withdrawals. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.resetSharedStorageBudget', + 'params': params, + } + json = yield cmd_dict + + +def set_shared_storage_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of sharedStorageAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_storage_bucket_tracking( + storage_key: str, + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Set tracking for a storage key's buckets. + + **EXPERIMENTAL** + + :param storage_key: + :param enable: + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setStorageBucketTracking', + 'params': params, + } + json = yield cmd_dict + + +def delete_storage_bucket( + bucket: StorageBucket + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes the Storage Bucket with the given storage key and bucket name. + + **EXPERIMENTAL** + + :param bucket: + ''' + params: T_JSON_DICT = dict() + params['bucket'] = bucket.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteStorageBucket', + 'params': params, + } + json = yield cmd_dict + + +def run_bounce_tracking_mitigations() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Deletes state for sites identified as potential bounce trackers, immediately. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.runBounceTrackingMitigations', + } + json = yield cmd_dict + return [str(i) for i in json['deletedSites']] + + +def set_attribution_reporting_local_testing_mode( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + https://wicg.github.io/attribution-reporting-api/ + + **EXPERIMENTAL** + + :param enabled: If enabled, noise is suppressed and reports are sent immediately. + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingLocalTestingMode', + 'params': params, + } + json = yield cmd_dict + + +def set_attribution_reporting_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of Attribution Reporting events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingTracking', + 'params': params, + } + json = yield cmd_dict + + +def send_pending_attribution_reports() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,int]: + ''' + Sends all pending Attribution Reports immediately, regardless of their + scheduled report time. + + **EXPERIMENTAL** + + :returns: The number of reports that were sent. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.sendPendingAttributionReports', + } + json = yield cmd_dict + return int(json['numSent']) + + +def get_related_website_sets() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[RelatedWebsiteSet]]: + ''' + Returns the effective Related Website Sets in use by this profile for the browser + session. The effective Related Website Sets will not change during a browser session. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getRelatedWebsiteSets', + } + json = yield cmd_dict + return [RelatedWebsiteSet.from_json(i) for i in json['sets']] + + +@event_class('Storage.cacheStorageContentUpdated') +@dataclass +class CacheStorageContentUpdated: + ''' + A cache's contents have been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Name of cache in origin. + cache_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + cache_name=str(json['cacheName']) + ) + + +@event_class('Storage.cacheStorageListUpdated') +@dataclass +class CacheStorageListUpdated: + ''' + A cache has been added/deleted. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.indexedDBContentUpdated') +@dataclass +class IndexedDBContentUpdated: + ''' + The origin's IndexedDB object store has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Database to update. + database_name: str + #: ObjectStore to update. + object_store_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + database_name=str(json['databaseName']), + object_store_name=str(json['objectStoreName']) + ) + + +@event_class('Storage.indexedDBListUpdated') +@dataclass +class IndexedDBListUpdated: + ''' + The origin's IndexedDB database list has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.interestGroupAccessed') +@dataclass +class InterestGroupAccessed: + ''' + One of the interest groups was accessed. Note that these events are global + to all targets sharing an interest group store. + ''' + access_time: network.TimeSinceEpoch + type_: InterestGroupAccessType + owner_origin: str + name: str + #: For topLevelBid/topLevelAdditionalBid, and when appropriate, + #: win and additionalBidWin + component_seller_origin: typing.Optional[str] + #: For bid or somethingBid event, if done locally and not on a server. + bid: typing.Optional[float] + bid_currency: typing.Optional[str] + #: For non-global events --- links to interestGroupAuctionEvent + unique_auction_id: typing.Optional[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=InterestGroupAccessType.from_json(json['type']), + owner_origin=str(json['ownerOrigin']), + name=str(json['name']), + component_seller_origin=str(json['componentSellerOrigin']) if 'componentSellerOrigin' in json else None, + bid=float(json['bid']) if 'bid' in json else None, + bid_currency=str(json['bidCurrency']) if 'bidCurrency' in json else None, + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']) if 'uniqueAuctionId' in json else None + ) + + +@event_class('Storage.interestGroupAuctionEventOccurred') +@dataclass +class InterestGroupAuctionEventOccurred: + ''' + An auction involving interest groups is taking place. These events are + target-specific. + ''' + event_time: network.TimeSinceEpoch + type_: InterestGroupAuctionEventType + unique_auction_id: InterestGroupAuctionId + #: Set for child auctions. + parent_auction_id: typing.Optional[InterestGroupAuctionId] + #: Set for started and configResolved + auction_config: typing.Optional[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionEventOccurred: + return cls( + event_time=network.TimeSinceEpoch.from_json(json['eventTime']), + type_=InterestGroupAuctionEventType.from_json(json['type']), + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']), + parent_auction_id=InterestGroupAuctionId.from_json(json['parentAuctionId']) if 'parentAuctionId' in json else None, + auction_config=dict(json['auctionConfig']) if 'auctionConfig' in json else None + ) + + +@event_class('Storage.interestGroupAuctionNetworkRequestCreated') +@dataclass +class InterestGroupAuctionNetworkRequestCreated: + ''' + Specifies which auctions a particular network fetch may be related to, and + in what role. Note that it is not ordered with respect to + Network.requestWillBeSent (but will happen before loadingFinished + loadingFailed). + ''' + type_: InterestGroupAuctionFetchType + request_id: network.RequestId + #: This is the set of the auctions using the worklet that issued this + #: request. In the case of trusted signals, it's possible that only some of + #: them actually care about the keys being queried. + auctions: typing.List[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionNetworkRequestCreated: + return cls( + type_=InterestGroupAuctionFetchType.from_json(json['type']), + request_id=network.RequestId.from_json(json['requestId']), + auctions=[InterestGroupAuctionId.from_json(i) for i in json['auctions']] + ) + + +@event_class('Storage.sharedStorageAccessed') +@dataclass +class SharedStorageAccessed: + ''' + Shared storage was accessed by the associated page. + The following parameters are included in all events. + ''' + #: Time of the access. + access_time: network.TimeSinceEpoch + #: Enum value indicating the Shared Storage API method invoked. + type_: SharedStorageAccessType + #: DevTools Frame Token for the primary frame tree's root. + main_frame_id: page.FrameId + #: Serialized origin for the context that invoked the Shared Storage API. + owner_origin: str + #: The sub-parameters wrapped by ``params`` are all optional and their + #: presence/absence depends on ``type``. + params: SharedStorageAccessParams + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SharedStorageAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=SharedStorageAccessType.from_json(json['type']), + main_frame_id=page.FrameId.from_json(json['mainFrameId']), + owner_origin=str(json['ownerOrigin']), + params=SharedStorageAccessParams.from_json(json['params']) + ) + + +@event_class('Storage.storageBucketCreatedOrUpdated') +@dataclass +class StorageBucketCreatedOrUpdated: + bucket_info: StorageBucketInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketCreatedOrUpdated: + return cls( + bucket_info=StorageBucketInfo.from_json(json['bucketInfo']) + ) + + +@event_class('Storage.storageBucketDeleted') +@dataclass +class StorageBucketDeleted: + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketDeleted: + return cls( + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.attributionReportingSourceRegistered') +@dataclass +class AttributionReportingSourceRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingSourceRegistration + result: AttributionReportingSourceRegistrationResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingSourceRegistered: + return cls( + registration=AttributionReportingSourceRegistration.from_json(json['registration']), + result=AttributionReportingSourceRegistrationResult.from_json(json['result']) + ) + + +@event_class('Storage.attributionReportingTriggerRegistered') +@dataclass +class AttributionReportingTriggerRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingTriggerRegistration + event_level: AttributionReportingEventLevelResult + aggregatable: AttributionReportingAggregatableResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingTriggerRegistered: + return cls( + registration=AttributionReportingTriggerRegistration.from_json(json['registration']), + event_level=AttributionReportingEventLevelResult.from_json(json['eventLevel']), + aggregatable=AttributionReportingAggregatableResult.from_json(json['aggregatable']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/system_info.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/system_info.py new file mode 100755 index 0000000..d1b2f6b --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/system_info.py @@ -0,0 +1,366 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: SystemInfo (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class GPUDevice: + ''' + Describes a single graphics processor (GPU). + ''' + #: PCI ID of the GPU vendor, if available; 0 otherwise. + vendor_id: float + + #: PCI ID of the GPU device, if available; 0 otherwise. + device_id: float + + #: String description of the GPU vendor, if the PCI ID is not available. + vendor_string: str + + #: String description of the GPU device, if the PCI ID is not available. + device_string: str + + #: String description of the GPU driver vendor. + driver_vendor: str + + #: String description of the GPU driver version. + driver_version: str + + #: Sub sys ID of the GPU, only available on Windows. + sub_sys_id: typing.Optional[float] = None + + #: Revision of the GPU, only available on Windows. + revision: typing.Optional[float] = None + + def to_json(self): + json = dict() + json['vendorId'] = self.vendor_id + json['deviceId'] = self.device_id + json['vendorString'] = self.vendor_string + json['deviceString'] = self.device_string + json['driverVendor'] = self.driver_vendor + json['driverVersion'] = self.driver_version + if self.sub_sys_id is not None: + json['subSysId'] = self.sub_sys_id + if self.revision is not None: + json['revision'] = self.revision + return json + + @classmethod + def from_json(cls, json): + return cls( + vendor_id=float(json['vendorId']), + device_id=float(json['deviceId']), + vendor_string=str(json['vendorString']), + device_string=str(json['deviceString']), + driver_vendor=str(json['driverVendor']), + driver_version=str(json['driverVersion']), + sub_sys_id=float(json['subSysId']) if 'subSysId' in json else None, + revision=float(json['revision']) if 'revision' in json else None, + ) + + +@dataclass +class Size: + ''' + Describes the width and height dimensions of an entity. + ''' + #: Width in pixels. + width: int + + #: Height in pixels. + height: int + + def to_json(self): + json = dict() + json['width'] = self.width + json['height'] = self.height + return json + + @classmethod + def from_json(cls, json): + return cls( + width=int(json['width']), + height=int(json['height']), + ) + + +@dataclass +class VideoDecodeAcceleratorCapability: + ''' + Describes a supported video decoding profile with its associated minimum and + maximum resolutions. + ''' + #: Video codec profile that is supported, e.g. VP9 Profile 2. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Minimum video dimensions in pixels supported for this ``profile``. + min_resolution: Size + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['minResolution'] = self.min_resolution.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + min_resolution=Size.from_json(json['minResolution']), + ) + + +@dataclass +class VideoEncodeAcceleratorCapability: + ''' + Describes a supported video encoding profile with its associated maximum + resolution and maximum framerate. + ''' + #: Video codec profile that is supported, e.g H264 Main. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Maximum encoding framerate in frames per second supported for this + #: ``profile``, as fraction's numerator and denominator, e.g. 24/1 fps, + #: 24000/1001 fps, etc. + max_framerate_numerator: int + + max_framerate_denominator: int + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['maxFramerateNumerator'] = self.max_framerate_numerator + json['maxFramerateDenominator'] = self.max_framerate_denominator + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + max_framerate_numerator=int(json['maxFramerateNumerator']), + max_framerate_denominator=int(json['maxFramerateDenominator']), + ) + + +class SubsamplingFormat(enum.Enum): + ''' + YUV subsampling type of the pixels of a given image. + ''' + YUV420 = "yuv420" + YUV422 = "yuv422" + YUV444 = "yuv444" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ImageType(enum.Enum): + ''' + Image format of a given image. + ''' + JPEG = "jpeg" + WEBP = "webp" + UNKNOWN = "unknown" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ImageDecodeAcceleratorCapability: + ''' + Describes a supported image decoding profile with its associated minimum and + maximum resolutions and subsampling. + ''' + #: Image coded, e.g. Jpeg. + image_type: ImageType + + #: Maximum supported dimensions of the image in pixels. + max_dimensions: Size + + #: Minimum supported dimensions of the image in pixels. + min_dimensions: Size + + #: Optional array of supported subsampling formats, e.g. 4:2:0, if known. + subsamplings: typing.List[SubsamplingFormat] + + def to_json(self): + json = dict() + json['imageType'] = self.image_type.to_json() + json['maxDimensions'] = self.max_dimensions.to_json() + json['minDimensions'] = self.min_dimensions.to_json() + json['subsamplings'] = [i.to_json() for i in self.subsamplings] + return json + + @classmethod + def from_json(cls, json): + return cls( + image_type=ImageType.from_json(json['imageType']), + max_dimensions=Size.from_json(json['maxDimensions']), + min_dimensions=Size.from_json(json['minDimensions']), + subsamplings=[SubsamplingFormat.from_json(i) for i in json['subsamplings']], + ) + + +@dataclass +class GPUInfo: + ''' + Provides information about the GPU(s) on the system. + ''' + #: The graphics devices on the system. Element 0 is the primary GPU. + devices: typing.List[GPUDevice] + + #: An optional array of GPU driver bug workarounds. + driver_bug_workarounds: typing.List[str] + + #: Supported accelerated video decoding capabilities. + video_decoding: typing.List[VideoDecodeAcceleratorCapability] + + #: Supported accelerated video encoding capabilities. + video_encoding: typing.List[VideoEncodeAcceleratorCapability] + + #: Supported accelerated image decoding capabilities. + image_decoding: typing.List[ImageDecodeAcceleratorCapability] + + #: An optional dictionary of additional GPU related attributes. + aux_attributes: typing.Optional[dict] = None + + #: An optional dictionary of graphics features and their status. + feature_status: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['devices'] = [i.to_json() for i in self.devices] + json['driverBugWorkarounds'] = [i for i in self.driver_bug_workarounds] + json['videoDecoding'] = [i.to_json() for i in self.video_decoding] + json['videoEncoding'] = [i.to_json() for i in self.video_encoding] + json['imageDecoding'] = [i.to_json() for i in self.image_decoding] + if self.aux_attributes is not None: + json['auxAttributes'] = self.aux_attributes + if self.feature_status is not None: + json['featureStatus'] = self.feature_status + return json + + @classmethod + def from_json(cls, json): + return cls( + devices=[GPUDevice.from_json(i) for i in json['devices']], + driver_bug_workarounds=[str(i) for i in json['driverBugWorkarounds']], + video_decoding=[VideoDecodeAcceleratorCapability.from_json(i) for i in json['videoDecoding']], + video_encoding=[VideoEncodeAcceleratorCapability.from_json(i) for i in json['videoEncoding']], + image_decoding=[ImageDecodeAcceleratorCapability.from_json(i) for i in json['imageDecoding']], + aux_attributes=dict(json['auxAttributes']) if 'auxAttributes' in json else None, + feature_status=dict(json['featureStatus']) if 'featureStatus' in json else None, + ) + + +@dataclass +class ProcessInfo: + ''' + Represents process info. + ''' + #: Specifies process type. + type_: str + + #: Specifies process id. + id_: int + + #: Specifies cumulative CPU usage in seconds across all threads of the + #: process since the process start. + cpu_time: float + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['id'] = self.id_ + json['cpuTime'] = self.cpu_time + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + id_=int(json['id']), + cpu_time=float(json['cpuTime']), + ) + + +def get_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[GPUInfo, str, str, str]]: + ''' + Returns information about the system. + + :returns: A tuple with the following items: + + 0. **gpu** - Information about the GPUs on the system. + 1. **modelName** - A platform-dependent description of the model of the machine. On Mac OS, this is, for example, 'MacBookPro'. Will be the empty string if not supported. + 2. **modelVersion** - A platform-dependent description of the version of the machine. On Mac OS, this is, for example, '10.1'. Will be the empty string if not supported. + 3. **commandLine** - The command line string used to launch the browser. Will be the empty string if not supported. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getInfo', + } + json = yield cmd_dict + return ( + GPUInfo.from_json(json['gpu']), + str(json['modelName']), + str(json['modelVersion']), + str(json['commandLine']) + ) + + +def get_feature_state( + feature_state: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Returns information about the feature state. + + :param feature_state: + :returns: + ''' + params: T_JSON_DICT = dict() + params['featureState'] = feature_state + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getFeatureState', + 'params': params, + } + json = yield cmd_dict + return bool(json['featureEnabled']) + + +def get_process_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ProcessInfo]]: + ''' + Returns information about all running processes. + + :returns: An array of process info blocks. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getProcessInfo', + } + json = yield cmd_dict + return [ProcessInfo.from_json(i) for i in json['processInfo']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/target.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/target.py new file mode 100755 index 0000000..2a59a9e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/target.py @@ -0,0 +1,713 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Target +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import page + + +class TargetID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> TargetID: + return cls(json) + + def __repr__(self): + return 'TargetID({})'.format(super().__repr__()) + + +class SessionID(str): + ''' + Unique identifier of attached debugging session. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SessionID: + return cls(json) + + def __repr__(self): + return 'SessionID({})'.format(super().__repr__()) + + +@dataclass +class TargetInfo: + target_id: TargetID + + #: List of types: https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypeTab%5B%5D%22 + type_: str + + title: str + + url: str + + #: Whether the target has an attached client. + attached: bool + + #: Whether the target has access to the originating window. + can_access_opener: bool + + #: Opener target Id + opener_id: typing.Optional[TargetID] = None + + #: Frame id of originating window (is only set if target has an opener). + opener_frame_id: typing.Optional[page.FrameId] = None + + browser_context_id: typing.Optional[browser.BrowserContextID] = None + + #: Provides additional details for specific target types. For example, for + #: the type of "page", this may be set to "prerender". + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['targetId'] = self.target_id.to_json() + json['type'] = self.type_ + json['title'] = self.title + json['url'] = self.url + json['attached'] = self.attached + json['canAccessOpener'] = self.can_access_opener + if self.opener_id is not None: + json['openerId'] = self.opener_id.to_json() + if self.opener_frame_id is not None: + json['openerFrameId'] = self.opener_frame_id.to_json() + if self.browser_context_id is not None: + json['browserContextId'] = self.browser_context_id.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + target_id=TargetID.from_json(json['targetId']), + type_=str(json['type']), + title=str(json['title']), + url=str(json['url']), + attached=bool(json['attached']), + can_access_opener=bool(json['canAccessOpener']), + opener_id=TargetID.from_json(json['openerId']) if 'openerId' in json else None, + opener_frame_id=page.FrameId.from_json(json['openerFrameId']) if 'openerFrameId' in json else None, + browser_context_id=browser.BrowserContextID.from_json(json['browserContextId']) if 'browserContextId' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class FilterEntry: + ''' + A filter used by target query/discovery/auto-attach operations. + ''' + #: If set, causes exclusion of matching targets from the list. + exclude: typing.Optional[bool] = None + + #: If not present, matches any type. + type_: typing.Optional[str] = None + + def to_json(self): + json = dict() + if self.exclude is not None: + json['exclude'] = self.exclude + if self.type_ is not None: + json['type'] = self.type_ + return json + + @classmethod + def from_json(cls, json): + return cls( + exclude=bool(json['exclude']) if 'exclude' in json else None, + type_=str(json['type']) if 'type' in json else None, + ) + + +class TargetFilter(list): + ''' + The entries in TargetFilter are matched sequentially against targets and + the first entry that matches determines if the target is included or not, + depending on the value of ``exclude`` field in the entry. + If filter is not specified, the one assumed is + [{type: "browser", exclude: true}, {type: "tab", exclude: true}, {}] + (i.e. include everything but ``browser`` and ``tab``). + ''' + def to_json(self) -> typing.List[FilterEntry]: + return self + + @classmethod + def from_json(cls, json: typing.List[FilterEntry]) -> TargetFilter: + return cls(json) + + def __repr__(self): + return 'TargetFilter({})'.format(super().__repr__()) + + +@dataclass +class RemoteLocation: + host: str + + port: int + + def to_json(self): + json = dict() + json['host'] = self.host + json['port'] = self.port + return json + + @classmethod + def from_json(cls, json): + return cls( + host=str(json['host']), + port=int(json['port']), + ) + + +def activate_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Activates (focuses) the target. + + :param target_id: + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.activateTarget', + 'params': params, + } + json = yield cmd_dict + + +def attach_to_target( + target_id: TargetID, + flatten: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the target with given id. + + :param target_id: + :param flatten: *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :returns: Id assigned to the session. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if flatten is not None: + params['flatten'] = flatten + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToTarget', + 'params': params, + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def attach_to_browser_target() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the browser target, only uses flat sessionId mode. + + **EXPERIMENTAL** + + :returns: Id assigned to the session. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToBrowserTarget', + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def close_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Closes the target. If the target is a page that gets closed too. + + :param target_id: + :returns: Always set to true. If an error occurs, the response indicates protocol error. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.closeTarget', + 'params': params, + } + json = yield cmd_dict + return bool(json['success']) + + +def expose_dev_tools_protocol( + target_id: TargetID, + binding_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Inject object to the target's main frame that provides a communication + channel with browser target. + + Injected object will be available as ``window[bindingName]``. + + The object has the following API: + - ``binding.send(json)`` - a method to send messages over the remote debugging protocol + - ``binding.onmessage = json => handleMessage(json)`` - a callback that will be called for the protocol notifications and command responses. + + **EXPERIMENTAL** + + :param target_id: + :param binding_name: *(Optional)* Binding name, 'cdp' if not specified. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if binding_name is not None: + params['bindingName'] = binding_name + cmd_dict: T_JSON_DICT = { + 'method': 'Target.exposeDevToolsProtocol', + 'params': params, + } + json = yield cmd_dict + + +def create_browser_context( + dispose_on_detach: typing.Optional[bool] = None, + proxy_server: typing.Optional[str] = None, + proxy_bypass_list: typing.Optional[str] = None, + origins_with_universal_network_access: typing.Optional[typing.List[str]] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,browser.BrowserContextID]: + ''' + Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than + one. + + :param dispose_on_detach: **(EXPERIMENTAL)** *(Optional)* If specified, disposes this context when debugging session disconnects. + :param proxy_server: **(EXPERIMENTAL)** *(Optional)* Proxy server, similar to the one passed to --proxy-server + :param proxy_bypass_list: **(EXPERIMENTAL)** *(Optional)* Proxy bypass list, similar to the one passed to --proxy-bypass-list + :param origins_with_universal_network_access: **(EXPERIMENTAL)** *(Optional)* An optional list of origins to grant unlimited cross-origin access to. Parts of the URL other than those constituting origin are ignored. + :returns: The id of the context created. + ''' + params: T_JSON_DICT = dict() + if dispose_on_detach is not None: + params['disposeOnDetach'] = dispose_on_detach + if proxy_server is not None: + params['proxyServer'] = proxy_server + if proxy_bypass_list is not None: + params['proxyBypassList'] = proxy_bypass_list + if origins_with_universal_network_access is not None: + params['originsWithUniversalNetworkAccess'] = [i for i in origins_with_universal_network_access] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createBrowserContext', + 'params': params, + } + json = yield cmd_dict + return browser.BrowserContextID.from_json(json['browserContextId']) + + +def get_browser_contexts() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[browser.BrowserContextID]]: + ''' + Returns all browser contexts created with ``Target.createBrowserContext`` method. + + :returns: An array of browser context ids. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getBrowserContexts', + } + json = yield cmd_dict + return [browser.BrowserContextID.from_json(i) for i in json['browserContextIds']] + + +def create_target( + url: str, + width: typing.Optional[int] = None, + height: typing.Optional[int] = None, + browser_context_id: typing.Optional[browser.BrowserContextID] = None, + enable_begin_frame_control: typing.Optional[bool] = None, + new_window: typing.Optional[bool] = None, + background: typing.Optional[bool] = None, + for_tab: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetID]: + ''' + Creates a new page. + + :param url: The initial URL the page will be navigated to. An empty string indicates about:blank. + :param width: *(Optional)* Frame width in DIP (headless chrome only). + :param height: *(Optional)* Frame height in DIP (headless chrome only). + :param browser_context_id: **(EXPERIMENTAL)** *(Optional)* The browser context to create the page in. + :param enable_begin_frame_control: **(EXPERIMENTAL)** *(Optional)* Whether BeginFrames for this target will be controlled via DevTools (headless chrome only, not supported on MacOS yet, false by default). + :param new_window: *(Optional)* Whether to create a new Window or Tab (chrome-only, false by default). + :param background: *(Optional)* Whether to create the target in background or foreground (chrome-only, false by default). + :param for_tab: **(EXPERIMENTAL)** *(Optional)* Whether to create the target of type "tab". + :returns: The id of the page opened. + ''' + params: T_JSON_DICT = dict() + params['url'] = url + if width is not None: + params['width'] = width + if height is not None: + params['height'] = height + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + if enable_begin_frame_control is not None: + params['enableBeginFrameControl'] = enable_begin_frame_control + if new_window is not None: + params['newWindow'] = new_window + if background is not None: + params['background'] = background + if for_tab is not None: + params['forTab'] = for_tab + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createTarget', + 'params': params, + } + json = yield cmd_dict + return TargetID.from_json(json['targetId']) + + +def detach_from_target( + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Detaches session with given id. + + :param session_id: *(Optional)* Session to detach. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.detachFromTarget', + 'params': params, + } + json = yield cmd_dict + + +def dispose_browser_context( + browser_context_id: browser.BrowserContextID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes a BrowserContext. All the belonging pages will be closed without calling their + beforeunload hooks. + + :param browser_context_id: + ''' + params: T_JSON_DICT = dict() + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.disposeBrowserContext', + 'params': params, + } + json = yield cmd_dict + + +def get_target_info( + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetInfo]: + ''' + Returns information about a target. + + **EXPERIMENTAL** + + :param target_id: *(Optional)* + :returns: + ''' + params: T_JSON_DICT = dict() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargetInfo', + 'params': params, + } + json = yield cmd_dict + return TargetInfo.from_json(json['targetInfo']) + + +def get_targets( + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TargetInfo]]: + ''' + Retrieves a list of available targets. + + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be reported. If filter is not specified and target discovery is currently enabled, a filter used for target discovery is used for consistency. + :returns: The list of targets. + ''' + params: T_JSON_DICT = dict() + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargets', + 'params': params, + } + json = yield cmd_dict + return [TargetInfo.from_json(i) for i in json['targetInfos']] + + +def send_message_to_target( + message: str, + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sends protocol message over session with given id. + Consider using flat mode instead; see commands attachToTarget, setAutoAttach, + and crbug.com/991325. + + :param message: + :param session_id: *(Optional)* Identifier of the session. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + params['message'] = message + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.sendMessageToTarget', + 'params': params, + } + json = yield cmd_dict + + +def set_auto_attach( + auto_attach: bool, + wait_for_debugger_on_start: bool, + flatten: typing.Optional[bool] = None, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to automatically attach to new targets which are considered to be related to + this one. When turned on, attaches to all existing related targets as well. When turned off, + automatically detaches from all currently attached targets. + This also clears all targets added by ``autoAttachRelated`` from the list of targets to watch + for creation of related targets. + + :param auto_attach: Whether to auto-attach to related targets. + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param flatten: **(EXPERIMENTAL)** *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['autoAttach'] = auto_attach + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if flatten is not None: + params['flatten'] = flatten + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setAutoAttach', + 'params': params, + } + json = yield cmd_dict + + +def auto_attach_related( + target_id: TargetID, + wait_for_debugger_on_start: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the specified target to the list of targets that will be monitored for any related target + creation (such as child frames, child workers and new versions of service worker) and reported + through ``attachedToTarget``. The specified target is also auto-attached. + This cancels the effect of any previous ``setAutoAttach`` and is also cancelled by subsequent + ``setAutoAttach``. Only available at the Browser target. + + **EXPERIMENTAL** + + :param target_id: + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.autoAttachRelated', + 'params': params, + } + json = yield cmd_dict + + +def set_discover_targets( + discover: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to discover available targets and notify via + ``targetCreated/targetInfoChanged/targetDestroyed`` events. + + :param discover: Whether to discover available targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. If ```discover```` is false, ````filter``` must be omitted or empty. + ''' + params: T_JSON_DICT = dict() + params['discover'] = discover + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setDiscoverTargets', + 'params': params, + } + json = yield cmd_dict + + +def set_remote_locations( + locations: typing.List[RemoteLocation] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables target discovery for the specified locations, when ``setDiscoverTargets`` was set to + ``true``. + + **EXPERIMENTAL** + + :param locations: List of remote locations. + ''' + params: T_JSON_DICT = dict() + params['locations'] = [i.to_json() for i in locations] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setRemoteLocations', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Target.attachedToTarget') +@dataclass +class AttachedToTarget: + ''' + **EXPERIMENTAL** + + Issued when attached to target because of auto-attach or ``attachToTarget`` command. + ''' + #: Identifier assigned to the session used to send/receive messages. + session_id: SessionID + target_info: TargetInfo + waiting_for_debugger: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttachedToTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_info=TargetInfo.from_json(json['targetInfo']), + waiting_for_debugger=bool(json['waitingForDebugger']) + ) + + +@event_class('Target.detachedFromTarget') +@dataclass +class DetachedFromTarget: + ''' + **EXPERIMENTAL** + + Issued when detached from target for any reason (including ``detachFromTarget`` command). Can be + issued multiple times per target if multiple sessions have been attached to it. + ''' + #: Detached session identifier. + session_id: SessionID + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DetachedFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.receivedMessageFromTarget') +@dataclass +class ReceivedMessageFromTarget: + ''' + Notifies about a new protocol message received from the session (as reported in + ``attachedToTarget`` event). + ''' + #: Identifier of a session which sends a message. + session_id: SessionID + message: str + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ReceivedMessageFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + message=str(json['message']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.targetCreated') +@dataclass +class TargetCreated: + ''' + Issued when a possible inspection target is created. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCreated: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) + + +@event_class('Target.targetDestroyed') +@dataclass +class TargetDestroyed: + ''' + Issued when a target is destroyed. + ''' + target_id: TargetID + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetDestroyed: + return cls( + target_id=TargetID.from_json(json['targetId']) + ) + + +@event_class('Target.targetCrashed') +@dataclass +class TargetCrashed: + ''' + Issued when a target has crashed. + ''' + target_id: TargetID + #: Termination status type. + status: str + #: Termination error code. + error_code: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCrashed: + return cls( + target_id=TargetID.from_json(json['targetId']), + status=str(json['status']), + error_code=int(json['errorCode']) + ) + + +@event_class('Target.targetInfoChanged') +@dataclass +class TargetInfoChanged: + ''' + Issued when some information about a target has changed. This only happens between + ``targetCreated`` and ``targetDestroyed``. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetInfoChanged: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tethering.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tethering.py new file mode 100755 index 0000000..af358ad --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tethering.py @@ -0,0 +1,63 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tethering (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +def bind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port binding. + + :param port: Port number to bind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.bind', + 'params': params, + } + json = yield cmd_dict + + +def unbind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port unbinding. + + :param port: Port number to unbind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.unbind', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tethering.accepted') +@dataclass +class Accepted: + ''' + Informs that port was successfully bound and got a specified connection id. + ''' + #: Port number that was successfully bound. + port: int + #: Connection id to be used. + connection_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> Accepted: + return cls( + port=int(json['port']), + connection_id=str(json['connectionId']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tracing.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tracing.py new file mode 100755 index 0000000..9952697 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/tracing.py @@ -0,0 +1,360 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tracing +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import io + + +class MemoryDumpConfig(dict): + ''' + Configuration for memory dump. Used only when "memory-infra" category is enabled. + ''' + def to_json(self) -> dict: + return self + + @classmethod + def from_json(cls, json: dict) -> MemoryDumpConfig: + return cls(json) + + def __repr__(self): + return 'MemoryDumpConfig({})'.format(super().__repr__()) + + +@dataclass +class TraceConfig: + #: Controls how the trace buffer stores data. + record_mode: typing.Optional[str] = None + + #: Size of the trace buffer in kilobytes. If not specified or zero is passed, a default value + #: of 200 MB would be used. + trace_buffer_size_in_kb: typing.Optional[float] = None + + #: Turns on JavaScript stack sampling. + enable_sampling: typing.Optional[bool] = None + + #: Turns on system tracing. + enable_systrace: typing.Optional[bool] = None + + #: Turns on argument filter. + enable_argument_filter: typing.Optional[bool] = None + + #: Included category filters. + included_categories: typing.Optional[typing.List[str]] = None + + #: Excluded category filters. + excluded_categories: typing.Optional[typing.List[str]] = None + + #: Configuration to synthesize the delays in tracing. + synthetic_delays: typing.Optional[typing.List[str]] = None + + #: Configuration for memory dump triggers. Used only when "memory-infra" category is enabled. + memory_dump_config: typing.Optional[MemoryDumpConfig] = None + + def to_json(self): + json = dict() + if self.record_mode is not None: + json['recordMode'] = self.record_mode + if self.trace_buffer_size_in_kb is not None: + json['traceBufferSizeInKb'] = self.trace_buffer_size_in_kb + if self.enable_sampling is not None: + json['enableSampling'] = self.enable_sampling + if self.enable_systrace is not None: + json['enableSystrace'] = self.enable_systrace + if self.enable_argument_filter is not None: + json['enableArgumentFilter'] = self.enable_argument_filter + if self.included_categories is not None: + json['includedCategories'] = [i for i in self.included_categories] + if self.excluded_categories is not None: + json['excludedCategories'] = [i for i in self.excluded_categories] + if self.synthetic_delays is not None: + json['syntheticDelays'] = [i for i in self.synthetic_delays] + if self.memory_dump_config is not None: + json['memoryDumpConfig'] = self.memory_dump_config.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + record_mode=str(json['recordMode']) if 'recordMode' in json else None, + trace_buffer_size_in_kb=float(json['traceBufferSizeInKb']) if 'traceBufferSizeInKb' in json else None, + enable_sampling=bool(json['enableSampling']) if 'enableSampling' in json else None, + enable_systrace=bool(json['enableSystrace']) if 'enableSystrace' in json else None, + enable_argument_filter=bool(json['enableArgumentFilter']) if 'enableArgumentFilter' in json else None, + included_categories=[str(i) for i in json['includedCategories']] if 'includedCategories' in json else None, + excluded_categories=[str(i) for i in json['excludedCategories']] if 'excludedCategories' in json else None, + synthetic_delays=[str(i) for i in json['syntheticDelays']] if 'syntheticDelays' in json else None, + memory_dump_config=MemoryDumpConfig.from_json(json['memoryDumpConfig']) if 'memoryDumpConfig' in json else None, + ) + + +class StreamFormat(enum.Enum): + ''' + Data format of a trace. Can be either the legacy JSON format or the + protocol buffer format. Note that the JSON format will be deprecated soon. + ''' + JSON = "json" + PROTO = "proto" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class StreamCompression(enum.Enum): + ''' + Compression type to use for traces returned via streams. + ''' + NONE = "none" + GZIP = "gzip" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class MemoryDumpLevelOfDetail(enum.Enum): + ''' + Details exposed when memory request explicitly declared. + Keep consistent with memory_dump_request_args.h and + memory_instrumentation.mojom + ''' + BACKGROUND = "background" + LIGHT = "light" + DETAILED = "detailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class TracingBackend(enum.Enum): + ''' + Backend type to use for tracing. ``chrome`` uses the Chrome-integrated + tracing service and is supported on all platforms. ``system`` is only + supported on Chrome OS and uses the Perfetto system tracing service. + ``auto`` chooses ``system`` when the perfettoConfig provided to Tracing.start + specifies at least one non-Chrome data source; otherwise uses ``chrome``. + ''' + AUTO = "auto" + CHROME = "chrome" + SYSTEM = "system" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def end() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Stop trace events collection. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.end', + } + json = yield cmd_dict + + +def get_categories() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Gets supported tracing categories. + + **EXPERIMENTAL** + + :returns: A list of supported tracing categories. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.getCategories', + } + json = yield cmd_dict + return [str(i) for i in json['categories']] + + +def record_clock_sync_marker( + sync_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Record a clock sync marker in the trace. + + **EXPERIMENTAL** + + :param sync_id: The ID of this clock sync marker + ''' + params: T_JSON_DICT = dict() + params['syncId'] = sync_id + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.recordClockSyncMarker', + 'params': params, + } + json = yield cmd_dict + + +def request_memory_dump( + deterministic: typing.Optional[bool] = None, + level_of_detail: typing.Optional[MemoryDumpLevelOfDetail] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[str, bool]]: + ''' + Request a global memory dump. + + **EXPERIMENTAL** + + :param deterministic: *(Optional)* Enables more deterministic results by forcing garbage collection + :param level_of_detail: *(Optional)* Specifies level of details in memory dump. Defaults to "detailed". + :returns: A tuple with the following items: + + 0. **dumpGuid** - GUID of the resulting global memory dump. + 1. **success** - True iff the global memory dump succeeded. + ''' + params: T_JSON_DICT = dict() + if deterministic is not None: + params['deterministic'] = deterministic + if level_of_detail is not None: + params['levelOfDetail'] = level_of_detail.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.requestMemoryDump', + 'params': params, + } + json = yield cmd_dict + return ( + str(json['dumpGuid']), + bool(json['success']) + ) + + +def start( + categories: typing.Optional[str] = None, + options: typing.Optional[str] = None, + buffer_usage_reporting_interval: typing.Optional[float] = None, + transfer_mode: typing.Optional[str] = None, + stream_format: typing.Optional[StreamFormat] = None, + stream_compression: typing.Optional[StreamCompression] = None, + trace_config: typing.Optional[TraceConfig] = None, + perfetto_config: typing.Optional[str] = None, + tracing_backend: typing.Optional[TracingBackend] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Start trace events collection. + + :param categories: **(EXPERIMENTAL)** *(Optional)* Category/tag filter + :param options: **(EXPERIMENTAL)** *(Optional)* Tracing options + :param buffer_usage_reporting_interval: **(EXPERIMENTAL)** *(Optional)* If set, the agent will issue bufferUsage events at this interval, specified in milliseconds + :param transfer_mode: *(Optional)* Whether to report trace events as series of dataCollected events or to save trace to a stream (defaults to ```ReportEvents````). + :param stream_format: *(Optional)* Trace data format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````json````). + :param stream_compression: **(EXPERIMENTAL)** *(Optional)* Compression format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````none````) + :param trace_config: *(Optional)* + :param perfetto_config: **(EXPERIMENTAL)** *(Optional)* Base64-encoded serialized perfetto.protos.TraceConfig protobuf message When specified, the parameters ````categories````, ````options````, ````traceConfig```` are ignored. + :param tracing_backend: **(EXPERIMENTAL)** *(Optional)* Backend type (defaults to ````auto```) + ''' + params: T_JSON_DICT = dict() + if categories is not None: + params['categories'] = categories + if options is not None: + params['options'] = options + if buffer_usage_reporting_interval is not None: + params['bufferUsageReportingInterval'] = buffer_usage_reporting_interval + if transfer_mode is not None: + params['transferMode'] = transfer_mode + if stream_format is not None: + params['streamFormat'] = stream_format.to_json() + if stream_compression is not None: + params['streamCompression'] = stream_compression.to_json() + if trace_config is not None: + params['traceConfig'] = trace_config.to_json() + if perfetto_config is not None: + params['perfettoConfig'] = perfetto_config + if tracing_backend is not None: + params['tracingBackend'] = tracing_backend.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.start', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tracing.bufferUsage') +@dataclass +class BufferUsage: + ''' + **EXPERIMENTAL** + + + ''' + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + percent_full: typing.Optional[float] + #: An approximate number of events in the trace log. + event_count: typing.Optional[float] + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + value: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BufferUsage: + return cls( + percent_full=float(json['percentFull']) if 'percentFull' in json else None, + event_count=float(json['eventCount']) if 'eventCount' in json else None, + value=float(json['value']) if 'value' in json else None + ) + + +@event_class('Tracing.dataCollected') +@dataclass +class DataCollected: + ''' + **EXPERIMENTAL** + + Contains a bucket of collected trace events. When tracing is stopped collected events will be + sent as a sequence of dataCollected events followed by tracingComplete event. + ''' + value: typing.List[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DataCollected: + return cls( + value=[dict(i) for i in json['value']] + ) + + +@event_class('Tracing.tracingComplete') +@dataclass +class TracingComplete: + ''' + Signals that tracing is stopped and there is no trace buffers pending flush, all data were + delivered via dataCollected events. + ''' + #: Indicates whether some trace data is known to have been lost, e.g. because the trace ring + #: buffer wrapped around. + data_loss_occurred: bool + #: A handle of the stream that holds resulting trace data. + stream: typing.Optional[io.StreamHandle] + #: Trace data format of returned stream. + trace_format: typing.Optional[StreamFormat] + #: Compression format of returned stream. + stream_compression: typing.Optional[StreamCompression] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TracingComplete: + return cls( + data_loss_occurred=bool(json['dataLossOccurred']), + stream=io.StreamHandle.from_json(json['stream']) if 'stream' in json else None, + trace_format=StreamFormat.from_json(json['traceFormat']) if 'traceFormat' in json else None, + stream_compression=StreamCompression.from_json(json['streamCompression']) if 'streamCompression' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/util.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/util.py new file mode 100755 index 0000000..93a39ef --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/util.py @@ -0,0 +1,20 @@ + +import typing + + +T_JSON_DICT = typing.Dict[str, typing.Any] +_event_parsers = dict() + + +def event_class(method): + ''' A decorator that registers a class as an event class. ''' + def decorate(cls): + _event_parsers[method] = cls + cls.event_class = method + return cls + return decorate + + +def parse_json_event(json: T_JSON_DICT) -> typing.Any: + ''' Parse a JSON dictionary into a CDP event. ''' + return _event_parsers[json['method']].from_json(json['params']) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_audio.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_audio.py new file mode 100755 index 0000000..0a23d7a --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_audio.py @@ -0,0 +1,603 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAudio (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class GraphObjectId(str): + ''' + An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> GraphObjectId: + return cls(json) + + def __repr__(self): + return 'GraphObjectId({})'.format(super().__repr__()) + + +class ContextType(enum.Enum): + ''' + Enum of BaseAudioContext types + ''' + REALTIME = "realtime" + OFFLINE = "offline" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ContextState(enum.Enum): + ''' + Enum of AudioContextState from the spec + ''' + SUSPENDED = "suspended" + RUNNING = "running" + CLOSED = "closed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class NodeType(str): + ''' + Enum of AudioNode types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> NodeType: + return cls(json) + + def __repr__(self): + return 'NodeType({})'.format(super().__repr__()) + + +class ChannelCountMode(enum.Enum): + ''' + Enum of AudioNode::ChannelCountMode from the spec + ''' + CLAMPED_MAX = "clamped-max" + EXPLICIT = "explicit" + MAX_ = "max" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ChannelInterpretation(enum.Enum): + ''' + Enum of AudioNode::ChannelInterpretation from the spec + ''' + DISCRETE = "discrete" + SPEAKERS = "speakers" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ParamType(str): + ''' + Enum of AudioParam types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ParamType: + return cls(json) + + def __repr__(self): + return 'ParamType({})'.format(super().__repr__()) + + +class AutomationRate(enum.Enum): + ''' + Enum of AudioParam::AutomationRate from the spec + ''' + A_RATE = "a-rate" + K_RATE = "k-rate" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ContextRealtimeData: + ''' + Fields in AudioContext that change in real-time. + ''' + #: The current context time in second in BaseAudioContext. + current_time: float + + #: The time spent on rendering graph divided by render quantum duration, + #: and multiplied by 100. 100 means the audio renderer reached the full + #: capacity and glitch may occur. + render_capacity: float + + #: A running mean of callback interval. + callback_interval_mean: float + + #: A running variance of callback interval. + callback_interval_variance: float + + def to_json(self): + json = dict() + json['currentTime'] = self.current_time + json['renderCapacity'] = self.render_capacity + json['callbackIntervalMean'] = self.callback_interval_mean + json['callbackIntervalVariance'] = self.callback_interval_variance + return json + + @classmethod + def from_json(cls, json): + return cls( + current_time=float(json['currentTime']), + render_capacity=float(json['renderCapacity']), + callback_interval_mean=float(json['callbackIntervalMean']), + callback_interval_variance=float(json['callbackIntervalVariance']), + ) + + +@dataclass +class BaseAudioContext: + ''' + Protocol object for BaseAudioContext + ''' + context_id: GraphObjectId + + context_type: ContextType + + context_state: ContextState + + #: Platform-dependent callback buffer size. + callback_buffer_size: float + + #: Number of output channels supported by audio hardware in use. + max_output_channel_count: float + + #: Context sample rate. + sample_rate: float + + realtime_data: typing.Optional[ContextRealtimeData] = None + + def to_json(self): + json = dict() + json['contextId'] = self.context_id.to_json() + json['contextType'] = self.context_type.to_json() + json['contextState'] = self.context_state.to_json() + json['callbackBufferSize'] = self.callback_buffer_size + json['maxOutputChannelCount'] = self.max_output_channel_count + json['sampleRate'] = self.sample_rate + if self.realtime_data is not None: + json['realtimeData'] = self.realtime_data.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + context_type=ContextType.from_json(json['contextType']), + context_state=ContextState.from_json(json['contextState']), + callback_buffer_size=float(json['callbackBufferSize']), + max_output_channel_count=float(json['maxOutputChannelCount']), + sample_rate=float(json['sampleRate']), + realtime_data=ContextRealtimeData.from_json(json['realtimeData']) if 'realtimeData' in json else None, + ) + + +@dataclass +class AudioListener: + ''' + Protocol object for AudioListener + ''' + listener_id: GraphObjectId + + context_id: GraphObjectId + + def to_json(self): + json = dict() + json['listenerId'] = self.listener_id.to_json() + json['contextId'] = self.context_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + listener_id=GraphObjectId.from_json(json['listenerId']), + context_id=GraphObjectId.from_json(json['contextId']), + ) + + +@dataclass +class AudioNode: + ''' + Protocol object for AudioNode + ''' + node_id: GraphObjectId + + context_id: GraphObjectId + + node_type: NodeType + + number_of_inputs: float + + number_of_outputs: float + + channel_count: float + + channel_count_mode: ChannelCountMode + + channel_interpretation: ChannelInterpretation + + def to_json(self): + json = dict() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['nodeType'] = self.node_type.to_json() + json['numberOfInputs'] = self.number_of_inputs + json['numberOfOutputs'] = self.number_of_outputs + json['channelCount'] = self.channel_count + json['channelCountMode'] = self.channel_count_mode.to_json() + json['channelInterpretation'] = self.channel_interpretation.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + node_type=NodeType.from_json(json['nodeType']), + number_of_inputs=float(json['numberOfInputs']), + number_of_outputs=float(json['numberOfOutputs']), + channel_count=float(json['channelCount']), + channel_count_mode=ChannelCountMode.from_json(json['channelCountMode']), + channel_interpretation=ChannelInterpretation.from_json(json['channelInterpretation']), + ) + + +@dataclass +class AudioParam: + ''' + Protocol object for AudioParam + ''' + param_id: GraphObjectId + + node_id: GraphObjectId + + context_id: GraphObjectId + + param_type: ParamType + + rate: AutomationRate + + default_value: float + + min_value: float + + max_value: float + + def to_json(self): + json = dict() + json['paramId'] = self.param_id.to_json() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['paramType'] = self.param_type.to_json() + json['rate'] = self.rate.to_json() + json['defaultValue'] = self.default_value + json['minValue'] = self.min_value + json['maxValue'] = self.max_value + return json + + @classmethod + def from_json(cls, json): + return cls( + param_id=GraphObjectId.from_json(json['paramId']), + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + param_type=ParamType.from_json(json['paramType']), + rate=AutomationRate.from_json(json['rate']), + default_value=float(json['defaultValue']), + min_value=float(json['minValue']), + max_value=float(json['maxValue']), + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables the WebAudio domain and starts sending context lifetime events. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables the WebAudio domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.disable', + } + json = yield cmd_dict + + +def get_realtime_data( + context_id: GraphObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,ContextRealtimeData]: + ''' + Fetch the realtime data from the registered contexts. + + :param context_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['contextId'] = context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.getRealtimeData', + 'params': params, + } + json = yield cmd_dict + return ContextRealtimeData.from_json(json['realtimeData']) + + +@event_class('WebAudio.contextCreated') +@dataclass +class ContextCreated: + ''' + Notifies that a new BaseAudioContext has been created. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextCreated: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.contextWillBeDestroyed') +@dataclass +class ContextWillBeDestroyed: + ''' + Notifies that an existing BaseAudioContext will be destroyed. + ''' + context_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']) + ) + + +@event_class('WebAudio.contextChanged') +@dataclass +class ContextChanged: + ''' + Notifies that existing BaseAudioContext has changed some properties (id stays the same).. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextChanged: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.audioListenerCreated') +@dataclass +class AudioListenerCreated: + ''' + Notifies that the construction of an AudioListener has finished. + ''' + listener: AudioListener + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerCreated: + return cls( + listener=AudioListener.from_json(json['listener']) + ) + + +@event_class('WebAudio.audioListenerWillBeDestroyed') +@dataclass +class AudioListenerWillBeDestroyed: + ''' + Notifies that a new AudioListener has been created. + ''' + context_id: GraphObjectId + listener_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + listener_id=GraphObjectId.from_json(json['listenerId']) + ) + + +@event_class('WebAudio.audioNodeCreated') +@dataclass +class AudioNodeCreated: + ''' + Notifies that a new AudioNode has been created. + ''' + node: AudioNode + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeCreated: + return cls( + node=AudioNode.from_json(json['node']) + ) + + +@event_class('WebAudio.audioNodeWillBeDestroyed') +@dataclass +class AudioNodeWillBeDestroyed: + ''' + Notifies that an existing AudioNode has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']) + ) + + +@event_class('WebAudio.audioParamCreated') +@dataclass +class AudioParamCreated: + ''' + Notifies that a new AudioParam has been created. + ''' + param: AudioParam + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamCreated: + return cls( + param=AudioParam.from_json(json['param']) + ) + + +@event_class('WebAudio.audioParamWillBeDestroyed') +@dataclass +class AudioParamWillBeDestroyed: + ''' + Notifies that an existing AudioParam has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + param_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']), + param_id=GraphObjectId.from_json(json['paramId']) + ) + + +@event_class('WebAudio.nodesConnected') +@dataclass +class NodesConnected: + ''' + Notifies that two AudioNodes are connected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodesDisconnected') +@dataclass +class NodesDisconnected: + ''' + Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamConnected') +@dataclass +class NodeParamConnected: + ''' + Notifies that an AudioNode is connected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamDisconnected') +@dataclass +class NodeParamDisconnected: + ''' + Notifies that an AudioNode is disconnected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_authn.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_authn.py new file mode 100755 index 0000000..c577b6e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/web_authn.py @@ -0,0 +1,579 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAuthn (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class AuthenticatorId(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AuthenticatorId: + return cls(json) + + def __repr__(self): + return 'AuthenticatorId({})'.format(super().__repr__()) + + +class AuthenticatorProtocol(enum.Enum): + U2F = "u2f" + CTAP2 = "ctap2" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class Ctap2Version(enum.Enum): + CTAP2_0 = "ctap2_0" + CTAP2_1 = "ctap2_1" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AuthenticatorTransport(enum.Enum): + USB = "usb" + NFC = "nfc" + BLE = "ble" + CABLE = "cable" + INTERNAL = "internal" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class VirtualAuthenticatorOptions: + protocol: AuthenticatorProtocol + + transport: AuthenticatorTransport + + #: Defaults to ctap2_0. Ignored if ``protocol`` == u2f. + ctap2_version: typing.Optional[Ctap2Version] = None + + #: Defaults to false. + has_resident_key: typing.Optional[bool] = None + + #: Defaults to false. + has_user_verification: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the largeBlob extension. + #: https://w3c.github.io/webauthn#largeBlob + #: Defaults to false. + has_large_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the credBlob extension. + #: https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html#sctn-credBlob-extension + #: Defaults to false. + has_cred_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the minPinLength extension. + #: https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#sctn-minpinlength-extension + #: Defaults to false. + has_min_pin_length: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the prf extension. + #: https://w3c.github.io/webauthn/#prf-extension + #: Defaults to false. + has_prf: typing.Optional[bool] = None + + #: If set to true, tests of user presence will succeed immediately. + #: Otherwise, they will not be resolved. Defaults to true. + automatic_presence_simulation: typing.Optional[bool] = None + + #: Sets whether User Verification succeeds or fails for an authenticator. + #: Defaults to false. + is_user_verified: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup + #: eligibility (BE) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_eligibility: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup state + #: (BS) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_state: typing.Optional[bool] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol.to_json() + json['transport'] = self.transport.to_json() + if self.ctap2_version is not None: + json['ctap2Version'] = self.ctap2_version.to_json() + if self.has_resident_key is not None: + json['hasResidentKey'] = self.has_resident_key + if self.has_user_verification is not None: + json['hasUserVerification'] = self.has_user_verification + if self.has_large_blob is not None: + json['hasLargeBlob'] = self.has_large_blob + if self.has_cred_blob is not None: + json['hasCredBlob'] = self.has_cred_blob + if self.has_min_pin_length is not None: + json['hasMinPinLength'] = self.has_min_pin_length + if self.has_prf is not None: + json['hasPrf'] = self.has_prf + if self.automatic_presence_simulation is not None: + json['automaticPresenceSimulation'] = self.automatic_presence_simulation + if self.is_user_verified is not None: + json['isUserVerified'] = self.is_user_verified + if self.default_backup_eligibility is not None: + json['defaultBackupEligibility'] = self.default_backup_eligibility + if self.default_backup_state is not None: + json['defaultBackupState'] = self.default_backup_state + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=AuthenticatorProtocol.from_json(json['protocol']), + transport=AuthenticatorTransport.from_json(json['transport']), + ctap2_version=Ctap2Version.from_json(json['ctap2Version']) if 'ctap2Version' in json else None, + has_resident_key=bool(json['hasResidentKey']) if 'hasResidentKey' in json else None, + has_user_verification=bool(json['hasUserVerification']) if 'hasUserVerification' in json else None, + has_large_blob=bool(json['hasLargeBlob']) if 'hasLargeBlob' in json else None, + has_cred_blob=bool(json['hasCredBlob']) if 'hasCredBlob' in json else None, + has_min_pin_length=bool(json['hasMinPinLength']) if 'hasMinPinLength' in json else None, + has_prf=bool(json['hasPrf']) if 'hasPrf' in json else None, + automatic_presence_simulation=bool(json['automaticPresenceSimulation']) if 'automaticPresenceSimulation' in json else None, + is_user_verified=bool(json['isUserVerified']) if 'isUserVerified' in json else None, + default_backup_eligibility=bool(json['defaultBackupEligibility']) if 'defaultBackupEligibility' in json else None, + default_backup_state=bool(json['defaultBackupState']) if 'defaultBackupState' in json else None, + ) + + +@dataclass +class Credential: + credential_id: str + + is_resident_credential: bool + + #: The ECDSA P-256 private key in PKCS#8 format. + private_key: str + + #: Signature counter. This is incremented by one for each successful + #: assertion. + #: See https://w3c.github.io/webauthn/#signature-counter + sign_count: int + + #: Relying Party ID the credential is scoped to. Must be set when adding a + #: credential. + rp_id: typing.Optional[str] = None + + #: An opaque byte sequence with a maximum size of 64 bytes mapping the + #: credential to a specific user. + user_handle: typing.Optional[str] = None + + #: The large blob associated with the credential. + #: See https://w3c.github.io/webauthn/#sctn-large-blob-extension + large_blob: typing.Optional[str] = None + + #: Assertions returned by this credential will have the backup eligibility + #: (BE) flag set to this value. Defaults to the authenticator's + #: defaultBackupEligibility value. + backup_eligibility: typing.Optional[bool] = None + + #: Assertions returned by this credential will have the backup state (BS) + #: flag set to this value. Defaults to the authenticator's + #: defaultBackupState value. + backup_state: typing.Optional[bool] = None + + #: The credential's user.name property. Equivalent to empty if not set. + #: https://w3c.github.io/webauthn/#dom-publickeycredentialentity-name + user_name: typing.Optional[str] = None + + #: The credential's user.displayName property. Equivalent to empty if + #: not set. + #: https://w3c.github.io/webauthn/#dom-publickeycredentialuserentity-displayname + user_display_name: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['credentialId'] = self.credential_id + json['isResidentCredential'] = self.is_resident_credential + json['privateKey'] = self.private_key + json['signCount'] = self.sign_count + if self.rp_id is not None: + json['rpId'] = self.rp_id + if self.user_handle is not None: + json['userHandle'] = self.user_handle + if self.large_blob is not None: + json['largeBlob'] = self.large_blob + if self.backup_eligibility is not None: + json['backupEligibility'] = self.backup_eligibility + if self.backup_state is not None: + json['backupState'] = self.backup_state + if self.user_name is not None: + json['userName'] = self.user_name + if self.user_display_name is not None: + json['userDisplayName'] = self.user_display_name + return json + + @classmethod + def from_json(cls, json): + return cls( + credential_id=str(json['credentialId']), + is_resident_credential=bool(json['isResidentCredential']), + private_key=str(json['privateKey']), + sign_count=int(json['signCount']), + rp_id=str(json['rpId']) if 'rpId' in json else None, + user_handle=str(json['userHandle']) if 'userHandle' in json else None, + large_blob=str(json['largeBlob']) if 'largeBlob' in json else None, + backup_eligibility=bool(json['backupEligibility']) if 'backupEligibility' in json else None, + backup_state=bool(json['backupState']) if 'backupState' in json else None, + user_name=str(json['userName']) if 'userName' in json else None, + user_display_name=str(json['userDisplayName']) if 'userDisplayName' in json else None, + ) + + +def enable( + enable_ui: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable the WebAuthn domain and start intercepting credential storage and + retrieval with a virtual authenticator. + + :param enable_ui: *(Optional)* Whether to enable the WebAuthn user interface. Enabling the UI is recommended for debugging and demo purposes, as it is closer to the real experience. Disabling the UI is recommended for automated testing. Supported at the embedder's discretion if UI is available. Defaults to false. + ''' + params: T_JSON_DICT = dict() + if enable_ui is not None: + params['enableUI'] = enable_ui + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.enable', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable the WebAuthn domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.disable', + } + json = yield cmd_dict + + +def add_virtual_authenticator( + options: VirtualAuthenticatorOptions + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,AuthenticatorId]: + ''' + Creates and adds a virtual authenticator. + + :param options: + :returns: + ''' + params: T_JSON_DICT = dict() + params['options'] = options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + return AuthenticatorId.from_json(json['authenticatorId']) + + +def set_response_override_bits( + authenticator_id: AuthenticatorId, + is_bogus_signature: typing.Optional[bool] = None, + is_bad_uv: typing.Optional[bool] = None, + is_bad_up: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets parameters isBogusSignature, isBadUV, isBadUP to false if they are not present. + + :param authenticator_id: + :param is_bogus_signature: *(Optional)* If isBogusSignature is set, overrides the signature in the authenticator response to be zero. Defaults to false. + :param is_bad_uv: *(Optional)* If isBadUV is set, overrides the UV bit in the flags in the authenticator response to be zero. Defaults to false. + :param is_bad_up: *(Optional)* If isBadUP is set, overrides the UP bit in the flags in the authenticator response to be zero. Defaults to false. + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + if is_bogus_signature is not None: + params['isBogusSignature'] = is_bogus_signature + if is_bad_uv is not None: + params['isBadUV'] = is_bad_uv + if is_bad_up is not None: + params['isBadUP'] = is_bad_up + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setResponseOverrideBits', + 'params': params, + } + json = yield cmd_dict + + +def remove_virtual_authenticator( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes the given authenticator. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + + +def add_credential( + authenticator_id: AuthenticatorId, + credential: Credential + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the credential to the specified authenticator. + + :param authenticator_id: + :param credential: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credential'] = credential.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addCredential', + 'params': params, + } + json = yield cmd_dict + + +def get_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Credential]: + ''' + Returns a single credential stored in the given virtual authenticator that + matches the credential ID. + + :param authenticator_id: + :param credential_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredential', + 'params': params, + } + json = yield cmd_dict + return Credential.from_json(json['credential']) + + +def get_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Credential]]: + ''' + Returns all the credentials stored in the given virtual authenticator. + + :param authenticator_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredentials', + 'params': params, + } + json = yield cmd_dict + return [Credential.from_json(i) for i in json['credentials']] + + +def remove_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes a credential from the authenticator. + + :param authenticator_id: + :param credential_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeCredential', + 'params': params, + } + json = yield cmd_dict + + +def clear_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all the credentials from the specified device. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.clearCredentials', + 'params': params, + } + json = yield cmd_dict + + +def set_user_verified( + authenticator_id: AuthenticatorId, + is_user_verified: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether User Verification succeeds or fails for an authenticator. + The default is true. + + :param authenticator_id: + :param is_user_verified: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['isUserVerified'] = is_user_verified + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setUserVerified', + 'params': params, + } + json = yield cmd_dict + + +def set_automatic_presence_simulation( + authenticator_id: AuthenticatorId, + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether tests of user presence will succeed immediately (if true) or fail to resolve (if false) for an authenticator. + The default is true. + + :param authenticator_id: + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setAutomaticPresenceSimulation', + 'params': params, + } + json = yield cmd_dict + + +def set_credential_properties( + authenticator_id: AuthenticatorId, + credential_id: str, + backup_eligibility: typing.Optional[bool] = None, + backup_state: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Allows setting credential properties. + https://w3c.github.io/webauthn/#sctn-automation-set-credential-properties + + :param authenticator_id: + :param credential_id: + :param backup_eligibility: *(Optional)* + :param backup_state: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + if backup_eligibility is not None: + params['backupEligibility'] = backup_eligibility + if backup_state is not None: + params['backupState'] = backup_state + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setCredentialProperties', + 'params': params, + } + json = yield cmd_dict + + +@event_class('WebAuthn.credentialAdded') +@dataclass +class CredentialAdded: + ''' + Triggered when a credential is added to an authenticator. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAdded: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) + + +@event_class('WebAuthn.credentialDeleted') +@dataclass +class CredentialDeleted: + ''' + Triggered when a credential is deleted, e.g. through + PublicKeyCredential.signalUnknownCredential(). + ''' + authenticator_id: AuthenticatorId + credential_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialDeleted: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential_id=str(json['credentialId']) + ) + + +@event_class('WebAuthn.credentialUpdated') +@dataclass +class CredentialUpdated: + ''' + Triggered when a credential is updated, e.g. through + PublicKeyCredential.signalCurrentUserDetails(). + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialUpdated: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) + + +@event_class('WebAuthn.credentialAsserted') +@dataclass +class CredentialAsserted: + ''' + Triggered when a credential is used in a webauthn assertion. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAsserted: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__init__.py new file mode 100755 index 0000000..6818e72 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__init__.py @@ -0,0 +1,51 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +from . import accessibility +from . import animation +from . import application_cache +from . import audits +from . import background_service +from . import browser +from . import css +from . import cache_storage +from . import cast +from . import console +from . import dom +from . import dom_debugger +from . import dom_snapshot +from . import dom_storage +from . import database +from . import debugger +from . import device_orientation +from . import emulation +from . import fetch +from . import headless_experimental +from . import heap_profiler +from . import io +from . import indexed_db +from . import input_ +from . import inspector +from . import layer_tree +from . import log +from . import media +from . import memory +from . import network +from . import overlay +from . import page +from . import performance +from . import profiler +from . import runtime +from . import schema +from . import security +from . import service_worker +from . import storage +from . import system_info +from . import target +from . import tethering +from . import tracing +from . import web_audio +from . import web_authn +from . import util + diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb7f4efda32ecebe4153390e683f1818104c7e5 GIT binary patch literal 1741 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/animation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/animation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45941edfe8d5782b1a1fbce8bb90a447dbe264c5 GIT binary patch literal 13779 zcmeHOU2qgfexKQ${a$@byZTs3DaN#l-`Yr+M2j+A@C4P~7vPue@-rS)78 z_f7bCPIB6~Bb?}dmlHi7!x!-Rn7z0Ozee=})whmXqfz}ptyxE{)u^>Vty@Q}6E}$U z?+O$3@NR&2gNI{(VxQOu=|*v**aYt;Bfnp4hIF%$-Xyj_xHDDZ7|W!^=gcGr441O0dzg(9T}`+WQc>%Sqe>FLD#MAA;gd z*hQNpi1ufJLSq7rIUvtzds2+4LMEP;RN+E4 zn^OH#@o8BSV^B0Fsotqnd`62qCR5pXPOZVL3-QF8F+xi~L6VChuT+0xnh@kOO*wKi zQ&Ma^ABJ}_b8+a@6pAFCI%o9g`N>Hskvp$CRsb!xyzc-(i&PY%Zog65U7GVpT&V{)2NzrF_!@N>QR{Zeg1IQq2KseMPEUYq@bf^?E1Ns*r!VWqnzlchDQE zpHMTfzSQ-)%K1=>>hdgqhKu;dRa;UdI2hH(H0lghC=Y56i~4m%I*oedp?Y){)ySu* z5lslFMI?v~IY1GPi4nglh{;5b)Ic8n0zs~j1`L`oXvP4?N3i>>t}B;~U6!*M(gs-% zY^oqjsYzA9EE&}#9RB*f=%s90il(P8#nb7y7#+(drqiI!a`Z?tcXawfbo;h#gJba- zdGOTa;Nh$&MWxJ@XexOjIyIBKl+ElI+CChWlR0T{3alf3QIezZ5h;_LPDigw7etc0 zB9Uk!n@(plQBk^*19Ow3SN80R#&we&nwlYf(3^aNVIxCY$9F=u{22su+;UyhPp{k* ziY;w-U%m6{P2uL*Ti#-@q5i%J9({PU)|64-P*V4>n(Qn+&i~$ZmDyd(z&hBIec^M zcI&P2Vu=o)Jic%ovV*ry7VDaB`qrTDT*7RUb&x@g_yjd#8yIEDkU^bzl$AaYSSU6N zMRUv4jO-SQ;TE7Z!9sChZ}0(%qbkK&mEy8c%-?aFDWYeVzrvB$oZ(I`d)Rl)A@spx zu9bmlMfB2|O_p(c&80r^eXKc}Gk|Z*sfd4^bifCgb%Ze1i9r_z-57*1=)nLji}XSe z@jjJBQA3J22zoPuk|gM5)H*|PnR8b?lO&s_rUzDMPo!kB3Cd|UM>b={0SNLzi(m%{Sk9@sH}38=7yQo$tT%dZD3rxvg_vyuV-R+FocIUJka; z@4W9*ItB{C!R7Yu`@;P|%`>y3+X#VW|txD%mAsAh5>zdEqKdE#N7ut3#H@4gs z=byQgDl~2=jvoEhm@@j(`v;er29&0OkIp{a{NRnxo1R^Kd7>EE_HgV$_xn3;=jM;x zxmIY}_+^W)-n+{AJl@r2?%-j*lqM1Ab;PT>V=hmi>0&TbPD7CSnRFocuJ$V zVlgqBfb6vaf)IdrL-UPO@M>-=2(6e56oeKew-$sTy!~}IUWC`SopUcN z`UeWa4rr)vGbX|XVbf!w*3rBg=9~?WY<`D#&928-m#`xV_!*C8q)&mJ5KqxLlj5nT zLs5RfPBl=!7H3A$Kj9SXAXQIO4H|X=45iO_6P_7=q={^W!ueh+YGP_^U?)mss_qaa zn9Ed;lo4YrS_jS_KoOuEgiIu-dW{TOb&J!CMok7#XOaN;fwHPFnM|crrxcd~CXMHN z%TW*@(xK;IN`ViJ!?bfuJg?Rv0K*SwAOpZrzN@^_acO3ffa=MoLFdk^wQuU_7=et+ zVCv7PA1-+uojv~#rkEOk4`2%6Sp|^wE%3|?w8(DgoazQ;7^C`FYv>%nERrK5KqmVz zKmye>sEZ-i@vSJ zzRgR0dz8LCOMRnC-)N!lIY2Spiob^z>Qa1Ni@q(i&~Bw~_fp?MrSD*&?~q;yu@3ct zm9Y+5*In4K_>Ne|j5MAU>zM0Uv5pxzS+S0pV#PXUN+qn*n-f5i^to)H9zBQSo)Z6b z=8VNum6}h1iKsF^2Yn%jF{rA{V@Q1-0>DI1WdNgC$4RFL28?i>sMc7VH=ViF8jF7> zgHX<5FBB8CmD`JfjDCXU{{{kvj2eUU!u%@>HHF6h$*!^}TG*Ac(E{A&V_bqPP zt@Q3Gg!VEBG@x`w3&Cy6Er^u7O2^hh%fND=ZN6{*ZKZu{AuwP8S4{yxJ4f&QsL<43 zJRM(@lFI4ihliI!gGy*{DYRP&?fy*oET-%^`FUu3F)J5OzP|W7qH$t;%6ZuPeV|`K>mgsCjidWw-khCcn3NPLOZ;5)Kka6P<_*lamdw>QceAhOq_3Kmd+ z3nb_;zxI%J_Q^rP822+J^E1Y*nYoRfU;1ov@=t|ZO~nZ z3i(ir?byJsL&C<>macLU`#5>qe2{4(=?ld)v{(qYGSo89AG897i&e5D3X zQaSuy=#bM523FM{p#pu2D?;O>7J3)^i+-x)it4u%gb28j-u}6L@*!Wm*z-p?N zuAu~DH3c!|+_13({ESDFFu#VF?i*YQuA#J@XmBGA$tgNbZp1a?ins|XbD0|nQ+ctq z4$4b)W+x|QDMx{$#Z6#G;K#4MOgr-AZo*{l0#q$~%w~#-n! ziu`&B+7`w+>t%`)Ump{T;8L|IXvw zPRIFt=E;Xi&{O8?4Inur(aLOy1dY}*EGHwAb3phUiRGi}TQ@558kDp61RN%n95&A+ zSJ^MJGH@xVrzuR7`XWV+`H)(xCtd!>L&=n=*nnDGh*RLhWi07MuPQR|`2m^Lta ztVUu${}=el2Oyvd_hlp3(fy15xfhB}fw>oM?!10trE#Fx*!sv}rwZt%3OF~m?5n@s zd^@c)^c8#?7ln;q$y6aXMXU;Gi0>KrKxM-#i4z59Mhu#GgnX9r`iPWcveD0a!gy$? z3kSA6=?M$vZz`DqzA_0J0(eO~Yh=|Xv!o;|Ih@UeO~RmxURp5?0ps-Ac)&zAzauzVGmkOK<8^lY1mls^)Cwj8efBLd}Xt^VDPoX zM;#C2R+|agfh^D{0JAx*DA_O>`>dUsj4%VpQOCcUiR3jCNx{}4y2UU|;TC-d*<`^v zhEv(hMTvwjNZ~Zt!qjvM7$)k%VCG`jh&&R;6@{f8FeciREJ<%_?$ukWknbp&2!RtZ z=!}selk>ohahU1QF5o;N0WU&L0&$_qE)b-mU1)~UsI>%J=Gu9;Oe84s-|&+UL%>X< zUNen<-n6~YG5pK?{hkjF-Ot0q6b$8AMQB}VjIOg3aMh1}TxiEvGGd>1>Z1G|&lcf> zmS`1u{s>BaM>mI)9DORCMqfs(QT9}IhwoYKjY#P%8rp@+u*t03o5A%eqJ@p*5%YZk zPyuAP$scCnd|#f*W<=Pj4qLvVi5)IqXyP~~=G#jjglgH;m6F`4*i}Dk;uP(rzD~mf zGSz>Y4uDbU!XYB4exq^dDN~YaezQUQU`aj5o6v3@EP~|Y5GiwuALBikNa@fm3(X!J$W)0pv|-9$!jEh20T!uxw`zj)X=Ff2m}AjlPvleL$5UV zK}0A78*j8i3&bmW5Zpe%c6Aq0hfS3fL?&q{(2E*!5+Y1Pn!m+=6iu45e$GWtQiGmk zjd_xt;7Ovw2kkrm@94^XO;_}Jn%@2i!|@fHrYp=D)s>mNponoD7m z3cDFH5`M}2RlRDK6{SK&5QW#0%*VvgKC8#35Q`2>J*f_Op_LeGo4f^;o_R{~2Rp%W z>`{c~mBvl$9ETx(l7XfzV89L;8*p`l3;3$;0l)wNEP7$dnD7mZJR?}9d9bYS0<|yN>ETy$6Ey&ZUOH{35=??Xw=+8~c!0uu#@IV_IY zN#)_ne`+-;SdQRqN!J-A*9x#pH1KX2#HuzAvts%=@<@10J5ko>cVl|A7#TgAhQfF{ zSfwPn2xDW1gu5YDW@WILfdN>p?6Rdo`CMG?X{nVlK9Fgsc@E|I97LErTlMve;Y^Ed zJs{Z;MF~OMY#D_VAle3qLWocF%ARV6O~s{=hdi>*(67ykhbp&G4@nEaVfjNXf{*a(!K#z z!A$APMlWtryR2fZCDCa^EQ#(Hz<0S9T4Tl<=w1p$lmISL-d48kD+HeXCZlD-eFth+ z6fPxTfcLEB9*C4IvL5e^RWnJf1Djo_I$v+o4kC|88N42qCFe{R@CU+{#CSF%o!589 zsB@%EY=4R-=r#58+Q-R{u_FQnkzd!FPek!6+KMM?*7p>>@ z^~g`4d3GHcZ%CRxsjXKiodVW6D_sLjWwqR-)X{xdfzol>W-)55bV!|e>2PuyHb~*p zA%XdXQ-$eVGDUDJg}H2>@xKp}OkA{tl$lPePBwUzBX|Nya7oTobSuW_*%oft)7@{n zSxmPj>7E(gg`taWx}Kt_nu0hw^E3BOeFoJnt20sE&$3IB2gn~l^PqE_{C5zp+IgP; z&svV(@UPsKFSwpxbG~15HD7QIUvPM1(dPTDZItI>V#09E4jHQ~;{_Wf9z+@h8VQqQ zj1oW!1R4dC!?a2Z5+KkB7~AIJ+t->QSZ%K7`-?U8t9E#=c=oJ0;Jw!Gd~t>k}4xgsst8<9`6`^!$7P literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/application_cache.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/application_cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8189889d58ca0755f7119f3526753d1143bab4e GIT binary patch literal 7976 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 WmSg*9H78aBlCQS?J`Y*yum1&+`z3n- literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/audits.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/audits.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..616e442baaa69307a362bab25a13d2f6c9540442 GIT binary patch literal 24595 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/cast.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/cast.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..143ce5f889c21f02395d0dfea691ab85bc9b6f1d GIT binary patch literal 5108 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 N0LiX<0u-rt{tx6END}}6 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2088e2d2f6fbfccb49c509b237d2189772e7fdf0 GIT binary patch literal 48509 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

    P& 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 PLtvEa`ow`prr!TA9z@0a literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/device_orientation.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/device_orientation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0659bf4d3ec45976b904f2e0f19c188d51b4e69b GIT binary patch literal 1422 zcmaJ>OK%iM5bmDWzOaGCCXNa5AR?qivBv}@K?tEJUI9szT_iXypiz6e?VT`>Rd>&# zwbqh1$|1Sr7!JuFh@$)eegl^rtwB+cxP;qACK7O>y2p#wvP6%j=Ig4O?yvf*na49T zRRm+?-`#vmbX7p>3|_^SiEQGKqqYT&#^k|dQxhG`<6W92jQ8tbz}`awj5 z$ZNO#uWz+me)Frf+mK(OL=qio1!{@OP}I*Ng!euG@D0L>KBh*9x6u&&f*;~-JTU(> zAK-?yb+PKgSc@3p!j)a-rhUeFNGVI)ChLa*bK5)w3Yyl6&d!~f$!NV3Ki(zNsT@U4rY~8!C zy1LvX1F_uRSYAsh^H|dNqHx{o4S-H^apl4%o(Lsd?vda=*<`{KEMiHR#ohz9PI(9{ zydaI^H1R0w%QTII*T3|snn0m`I#pDU^~ImAj+(CoG#L86dISe1fXPr;OLY@KA(d3h>+#3_bK4xEp-J%- zm=7@^Ln8x_sSvdQ*}oav*3i=O+5<<+TiP0F!6wIFC|sy>P*$CGxkosOT@v-WU$Ft_!3xuw!`TL-pQ3J%kaBbYqoobYZKyaILRjwUEt z(EFC^pN7MafuA2&rmoBhWopVC0V5nRs=r;AE1B{o*yWvq&O_FF>dh~}XhB~rpi@h~ zp4+*$d-BxIwI4qpwRh*=2k_ab_15#W{^f3c;Xm8dl9vxk{?R!MJ@0TPGoHL&m4jZG zY_42q3FAbj{La)j{jqys(n=F{uTj=D=JrOE5?PeG0OX2#H9D!LiglxwSABmYgPoY~ zbJbkAmB}#Twn|Z_k=Ne-G??HeoxzeU&YgmoZfUNLfvbPx9^9xnyYiJdrCG$T@+I)8 zCKXLEV-sWi|1831|3T;fMrWR&+7mRhXO-~ccy10a?jD^RoA7)(dtz+E6TXOJ^W&02 OWmLWNq5_Dk&*u$2VutDf literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73e4ce7eb8b7413aa20d17017f37bc1d89f50bef GIT binary patch literal 63490 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 VPu7akFj=Xdu9ECsO2%i&|34rS;LiX6 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_debugger.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_debugger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93f0c9a2c10884dcd3da7bc2384533cecedb32e7 GIT binary patch literal 9752 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 Bi}C;f literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_snapshot.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_snapshot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ca12efae0a15ce428fc16766419b8a6adadae71 GIT binary patch literal 38957 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_storage.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/dom_storage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2f914af17ba88467194eb1ddf360b74dc0ee2b6 GIT binary patch literal 7502 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/fetch.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/fetch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adc025b508615d730644d6158b5c429d549415e2 GIT binary patch literal 18377 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/headless_experimental.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/headless_experimental.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea2f94e9126e293da5156e340ee4f87b67fc926 GIT binary patch literal 5591 zcmbVQTWlOx8J^jlz55o&CHMNcCQa6{cjF{=t0XN-<1`6K4m7DKn?$Se&ROrYvoqT> zvvzmoNJ$ltBPvlOL>hrqc#Kjc-smIZ5gxE*Bv#WRg5ZI^Idu`VPkjHG*^8aB&6R5`u*GKch2c=#Iid+r43ot&*--8 zc)Djgw)-hj$wvGPU*xt|ELpni`k5=mZ(hDMSDd|g_6pXg4BgY^%v>orGiam1OWmAB z=dQw)f@&y*$ZJqkA!ay}iXi>Q%Y;Fxc`TMeJ zs3bmSwchnXU+#LsckGJDUFu~e8=dpxfhZz_ZP}==8D_~7G7$WUV2ks;BFp=aNDd`^Gkf*5auEm`I1wuI(FXRi=N|HZhrBF z=kgV<8y0unB7eKag-M6%R<73Y6P{Bf7Mr`bTRa!e>;~^HNq$rLWN_yX7gw}aX7ER+ z@0?!EjJFPqeQ@pGwUycTcHf!n`TX=VA6WM+eBN{CQfqMMN@f%Ll~S*f68Ip^T0!To z5`j4kby;0h#6Z`?WU4)wZwHwT&o&}*)lQEbLq24h-c=t)+W~kPkkC8IYIC9=dqNv+ zu~!rx>PO*+_alC^WVvDp3q#9^9q9Y1vT&+_w)Q@zts4MX`sre^>KJv4`hCSBMNBx8C>9N;R4huV{J~F^8GNS2VivT`f7tSoEoz{5zzC@RA+f>8t` ziEGQzTRWGdZ*)8YWW%RT4J%``&xoU!_<7_;Y&rH*^{#p&?h!ZgS&kdYUOzHY%W?SQ zphv#iUXkiuQI5dFRBC?}T~f1Yy@A_GBH(3i8!pq?%Y4DKUjc%0<~hu(;H8TN?lIjq znBZPr*e+YDa9hrm<-#T1WeDP$#XWB1SQ|pE1}o_`?BF0Q59z`#BlnXeFk81gf@n!B z$6n=c)lJ&tRdlbH19^<#Iu2n=rdMIy*5@s5NYY)t&pNgz94p6Wxoa-iSWK8-cX_aB zYD(1YDc!QBh-C-p7Ha0huiAOPOvMOz|qwjbIOp^ zbbHlr+E9gUaKVLKc!dbC!&TF=OqZ7&vKO}1abZ1GT$1b%R_s9W1PgW=m#*yk*ba# zQr2N?>~`R4Ge-mc(4|1)bPmMM9M3U*-l=1FG)%W<>5XE&hKz%6 zSMql&01oIdoMp%n>XspO1%=S%V|pY2IXGF~W^kau^+Uor_6i&UR&FpOkU(nN6Lmg` z#qe|2G&tksGA}_mX-nRtt&aBLdGM=xslpI3;F#p2V|Cj^mO**dB%7Dt8f?*Y0hJxD zt9ql&GG zu2C1X6z&~_hiRLhiA=01l?dZN4^qpZ`#2wzmUc}dA*~Y>A;O(xXP8&VSpjB{fMv(B zoFzII`ApS48N@k7($O57n5gLPtX>6*OiZvT*7iBt*hMB%65Kyfnju${`6*oMu)NM} zz7&K63n4Xh&F${^YCGr%*$h)(upJlpLeUL6F!z0(Ft%J|gg0Z#aGp)pq)x?3;X!g&e(`%#C z>!aAZvb>hu|8V$tYk2pgSoA>r<^`lh!+Y<%baVC}$-b2<} zedFEe%IxZnv9-Qu)|2BKv1nf$NnR}e@Z81j;0u>(+;`55of%h4=ye{-m!Tnbb3Zyk zo@5}`HPsu)mSy&$Hli}~(3;02h{MKohr6tu@H1IZx-#A=dV=gD@E7qc$Ts&s(e^+= zA~Yu$*4&SXDZC!fh!f#5F^%c(;NN{3jnw-_T1o9#9X`4djYuuUrIv2Zez8fJ;5+HQ z|6kN;De5_yt$YV zZn#|pbI(?Edx0BUtRBU7JnAMn^W*hA4>Mq@;tlP#*3NJXas0TD@ORBU`H1EprPeOG zZXGbv$vDGo6j_s?t5z`Ab80S-lgl!{htZI6x`cFbiq0XGH=o+Rj4p)h65pF+ z+vhHKen$#^b-FI7{%l?e*PZ7!7di@zt3AJrO|mV6aOoAwHm=fHNC%$qQ`GhA*+@YA z=vN>x9GTjIu4CIj+z%AX&6eU`7g}-A@TqK literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/heap_profiler.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/heap_profiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..365abaf69d7f2743e155289c05ac7ea5dd336d7b GIT binary patch literal 14474 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 O%46I4fX2oY)c*iW_-IQ2 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/indexed_db.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/indexed_db.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bda0638feb59769679588013b1a4af0c1c238584 GIT binary patch literal 16554 zcmd5@Yj7OLao)Y#dmmnhH*gS^Bn0vx-~jL?5hN(Xg!qsszJb+aD=}G?L(s8{kSi&ZrsGhqR4m(-Dk+szImsWKPAZ_*bcHGBNBj>WluD>y z>F(Lx+j{{dOLk>Zn4OuPnVp&L`KG&P?%ygZyc|5QMP53s^>f^BF=0Fo7U5Tyd5*in zNu0z_a&dl)=Q+tH*(Ysr`OsP zwFanxB5Jixtp#db5w*s{<^M^KNcC?DV*zWf)GjqZUad9Hh)bf>2(&tBgVY4?dU!X( zyTQXr8;vrh-_jpN1i@5IuaQ^wC^~S_ejxHlqe&Raw*e^ zR4gt}=-i~2ohA6y{Sdjr$=nz(abvdUK$6Dnl1&yQ`yQZ30>m5?b3)8TG54F?m_v3- zAPuI3xMsW|pVl-CA3hmXNH>GB#Vu{n?!!b2=!t$YUt%9`_ zVJ%JIY#9%(8W=af`u7mI!lg`_F^cp2EO%CyeWMb-XL*Uokpoq*=Ce3ZZ93IiOdaOF zWt*^_<|b_80ggLwo3)+w6qho3aM|`&od9K_9M3o~%O8U@PkFC$Az?)ELv^JR0?p6H z%BDEv&;%(qk;>7PDlFtmB_n6mWa5Th6I6NflqO(G<6|ny05IjVZ}gr?#^v7l^qFWp z9+i5BlM~Z%5H7X%KrD4|`ebi^UtiB~bVltNJ=L=>DapNZ;#}`!>}2oMOzKQBu`S%c zwO5U$gNkd+v!Hy|IKO ze^r(u(#i1Dj8Y5zNt-fKC_-U<9FIUL^*IPGaJQ>!zj^MWu-w>sW#;nCMd9M}bN=O) zN3L~W?S{mQb5+Ybb}j8V@ZpXF+4h5(9S3gl3;Yi~?|A;&x47d#ru`rk`bx$fT&}9U z=(~5<&WVS36@}zyjYAE>gjEm_ib-_73y~|F4MZU)J}4f|kbhGbsFc3ANN{Xc3NjVb z7NKZFp-7oxb=C#sf@judv<%|W%*5lz!cF}vdE())h=)=G?S$+F@(>afALJ_)5NJNj z($PGplw{lx75l`bsx)9h=pbi^iqeERtq`O)8f&?TPi8ZZV$CBET;TqrDsa1|?$Yu3 z&dV=lYc}4lYo70zpSjwbt?ODI9C|k@xuT?Otl_%e400s`oLZqzX}ey{UbNrnmZCfkcdPyZzK{=O4E}V_eUbHOh+em ziYpS4k`s_!6^U5TG!h}H(|m-MaT&x}qVe6}R-xk@8!&QT!2lPOx)Xvw;XV;;4)=4vX|oC;3cn*LGdq_5Izq{F#+N1=Ezt5Cc{Xn1r-Y5@t;?DA|4~n04ILp*as` zojS~hp>s+v2E;(Y!aI{~AqQJxTd){Hr_u$1R&C)Lts5l>+4<}xpslwQ44c?`01Kal zpcq^0gG=?DnflI!)b&H}d_7zL`0dvA1z{nQ5qD%;cP{Vw!u!p?7|qrl{`u&wS3atL zbg8~KQ{Q`w|G0kZd!w1U!=HK_2(}IcTQ^t#ECbtL28Y@!M-<$A6~uK0Wwae2yb#9V zY^W%C1?cGHsv5FFJ-}mqb5>}AcjaSQq3f>T1emNQaCDk52{G0-Hv753Br30Nf=N(X zNqGghG*&Obq%Y)Gz{uj#ZACCC5}Fl)r9$kaRZ8r1PA6ioOv{=tK0TR=MF1t0nLPYM zkf(+46Nr3%%IEJ3|8NNzI2JOr3KI8i(0|QK!+Z)ySq8SSn6e#$8#bjL&dkBK=P%GyM@#|lC3<| z4z+P&%%4N#4~0;9*hN@nVAqc=h!e`g8Jba4K0t-T{aPXEGw0b*?DBC2X1@)~7R^3k zOH0x0n*ehbYN==(-VeakHqHz4FI=t6)^5Jt6r4Z4(4A@P%{KMru!QElG=AW^qs51+ zqPiD?viMO^^TuI-j{w5SI`Dz5mWB@;*;-oGm_u>^TsR3XgfXY&GQmRt-wD!~#wCCU z#S1APmGlF!cx0~xehw2@d^19*QnQ0zm98XUftUqJGzTbBa%3dkpet0PQ)uHyCr^;M zJFYns)A5tC@>yLW9V}y@LI_4Mn0?WdoZe7aMo*K84Bs6e*BoSS=fM*0vn2gT!Fc)n zVCl80hq0BZRtXy#_jdv#?yR|kL%;QhYL&=0A*`f=_u6C7L$A?B?p;FhLsO~XF*uy3 z_>rHaz+QKbXaX=oRtBL31vf|K3m6PR5OOhv4~JHY&h)=BTAvR^NjHfvLIdh$2=cHp zeK`%thbFPF>RY?#b}#xi0wi8LarMN-;Y&?(BWq;un%lML6PH`tQRRcu4ReRF^uXM} zqHn|U)}24=`e|1-IQVYY^&|5~uDy8m#qXcE)s+bjLea*#XH9#$jj4tI=xF?6N4{E! z_(fvpCb3)Fo|eEFat>S`NjlIC|_p3DX|Eq8B!Psnudd3(ov-TaxWk9<_S<^7K3uC2GE zOxM8M+b*T%4_^M-N41^r3(H%=w>oZAzFiM_`!COaRMYX^@bZ)Uf7S8xuU|iYYx9rB zvw__=#;@~lZ@V&hd2pfTt6t0(%lUwCTK2S)$4yMhn2*%s1fU8Xh*F{aJp*CycKd_el~ z;a6XPaEHhjqAy zi}kfOfbtUC##)Y6%a&4N6QCAL6nj4FptXN;JHrQ!k|GQZ1ECf014~o}DuZ{xtpUAkIm-ACO6o>q$uRgsL3}=Gj zY_Ly)Dp1Xwr{P03+CfJj0 z4BxgUmbdPD@A$jDZ*RKNbGZkM`7ggy@lhcBeyT)%HW1FK-79YHAb*(8Wf1Q|-tuT_ zj&&UjMbkjRU;+MBoQ52R*3@T(I)F;!y=gO|WP4WVgv?yxuHXj9tSjdLz{X2MCQ|MT zG7&uW(<|NVhx1KCcLTHE9r9=%bYznyo31B>#I#5TJcGz|oqm88J}SqPDVf0am&U_iQJ3!@4@(KY(Q&{o<2cF*%@#cC)HHC^T~G~@>(pc_ zIQTX35DINI&8v?dkG<7dE?aVaoyp?+IaOUwt*`}v&2bz}xotZ%AQlKvr=(|;S>-4*A*}#*z z(;ot_(oO_CI#DqAXY9li5ai&<`$$%31LO&GW`#%LjhbBhI)^maRB7-*pVS)QBdp;* zK;L7rmL`OJ>)xSvX{u>#@uqJCshDmcp_uq z&nHk;9fu%?KXAN!Ken`P9dGIWTkns&+2FPt-i7|}9=Yz#1h*C1#oJW`?hmRwLt?&N z?1gM%(shWer%0K0aao1RVi#{fjkmy-1&a~Ro^!RW2Ow3&=ggoYl|6MXV1b=ktLE&7 zcyMP&bxiFXs z^yeT1mj5&SD4)x~6Xn{ibnO3=z)+QcE#1f*&N{l$7U(xE>EGfgQ2KIUq}!KyCZ*Mi zbb(3~Fb<4Y3yzMl;R%or^TGHgw6_qip5b_qnH)b2ec`-)mYcQfIs*?erUTd@reE@b znB#l4^TMp~7yK3eyko}sH}+TgkSqNQf~0+ua#T^p=;S2nMKM_wkx_VoCuzC26ZTT+ zfvKnxjf<*0F|EW>Gm)ecI~_|5h{yB{k!3J^(+f-by&*ctA29ELh@DhRa9?R{oeWxEYiJ0g8&oH2q%1MtKQ_pdg;7n{o`6s1w7w&?ylh zk0^NJbi<)YSV6`B*`%DtfH>rUn1w-AtdWQ@4CQ5@w;*>0Ai}s)w-$Hq1iH(!qtVMu~0lL0D$HpjE@OQ$j0=GTBr{${G7btcBOgD?i9+83&=&=LWP=1Q*bS5vaI#x=8a3uU76;tY;!jt!9Yf6xD(h}Ue+Gp#ZSOT z%m=+Mn{ZRX-I~do1P-_ue;%&Akwow_c9IAoy_rcwOpTtLgjG$KQuW>8BwPlR6OyjS z{t>j5uCdH9t1?2j3E-46x6bhM#uT|ER!mVK^B_(K-aw$~0H?91W-;*Sirq$-2Kqh2 zv{k}1um9l()k%YTDsf+9s?Lo`rW$NW$}7-Os}D$XGO{ua1Uzjk8cIjeP!tu)PN3iz z4{j608$38Eivupe0hfsbE)xe_`Z<~%sLWX@K#ZMRIUq)7p0m!^YG<8mB8AJi2@G{S zfE4aoH_3%()+2d!CDW_ldc_Nl-gPcGdT+vL@G&nqdQ%>j1IIWX$!9gMPua}7INnz| zl0$!V3Z#a(c2tII7-~wT?S-i+Y<=kpLQ*j=B1bT_0zh*Kw2$4%_O-w$4P= zXW>3NRX%h|OexcHw+MYuWVnhhi*cZtn;C2zG+K}sEFzwUYs?AjkP7z_53!H5OAk)$ zKAd>XjZ=CIW>krTM5pU>aG|pd2Sq!J)=+w=noIAt;a|g@hnyYEL(>IG@F5gzMBbb* zY2KV5XdaWrN&?%7Vql^#yYB0QJe)KAVH&Al?=NXQ%GaUDONe5>fC$^4`tEmsYUzM& zX?I3wT+YRsH|kr}va5R01xjq^Qd>CF7S6WyU36Yd!~LB*fl$#Nc47EVsAn;}|HIIM ztovXlbYNlVt>z_9Fyjf%ANknRz8E@?aUZJR=JgKf>H^K%^|@KCqExInIWIJuAZHQCwCEVjt7R zqW=JsPY`xM2DAh7BuY2{>$|`#TT=o1LtAAJ4+HvwrbR{T7uTeoDH6ufY@o=}QU_c* zASYxc3O^}%9v$;$C9q2ss3?-V9sv=Gil>dTfCowOBtT?bre&XyznTIFP-P`0OH?$L zfD-t1D+-52_()6=W5#b;2(ZF=*L=kofG$9et`eE138|u1WH>FSp4A!3kil;qy;f5+ zHbW<+I{>K6k%NgXUw!pLn-N1wlsBNrMO?jSA;MO#c%Q4c^fLTUcg02N(%wwv#;kkO zZA>iIc4jI!XWd&YD~{YOuRl4&=i8g8u+aiTzjxUMcAxgwuP(I3e+859&^9|;wcscP$vK&>J|{t)E~&l{LrHLN99cLF^nF#Wb~(~_?zMi+%q-CMEq2|mxUZK}kx@XfN)13&FD9NFkMmF%Flf_s_NR`6Ar7skOK zOFz~^->6^#V&NtX3m;HXnQv4u)lflKLmlaFmyseA9WaYPb7R6|_>4?n*h7d>v2^6V zVs){RJft5fD+;KvFw-{Yx}rP-R8SiL)r0hlD8vi3g#yP&L!nfVLaQosP!%^VI^AQk z5h#|8JAthwBm!UH1~@Wmfur$i+PEWWI`T?%NsNs z1ug$6w){;9z=>RnZho0*Ui-0lu8z$T=SM=->okGV&YbG!A*R`3S5m%)d2eBWs$IId z@JcA?27Sd z$gaq)#ftRs1AM}O*utN)jl*$Lj+e--^qvQ3);d#kFc)gYU#Xp%24e_*rKZ@SK~0!W z#U>S8Mhb$N=0jMfU!=jpMC)G@WVi{eIazBOM~Aiai!}P-1>K%z*H1{M=rEKHA<$z? zj!E(-kr##h52U`67NC3si{RQMPYfNgGIV$EVZWu@t9%=%h<>Uctn3v#&-4FX$?=>1 zo$LAyx8c{E@7G+#Z#evYht2mtwpJc4^+5n<7dGDtCHD}a9SIQV1WXR|>rl2}9SHO~ zn0%hq*?<%XbP6WHKZG4mhxD-L+WID+jf zE{wT3?-Q#YjD>6Tg7Bt-@P>jwc42HwqfUl5k>RbkgE2Q(7hLgR%!^fg5L?~uf}jq9 zm5p5A_LZs-@1&lM?lf1+)sacUO z@9HVv|DW!j?!kbh6uHW=M?&|1?zjJZ|K*(KpSQKOO8C8-dgIF9z9dQiivsp9CwZbPC8?6?%St)lg3l+Zezhg*&$TSHKeYTwprkCLMHtBLEug?2lyI-s^+4=i-pVf(EP+SH@H)$M8r>g}Z5>WQJ425T))?yHK**&ZEj|H+tMd;btvy{BE@eWqR#0?zcMZ4m}#J?ooSD-!_q3 z-P^pB`k1;6x%w)>S_@2 zAuAN*P}mBEI25r$VGc#DP=rIR9Ex2B+iR^V7}VJYu}UD>X12~3%IT$-3z>Y$3@&C1 zO3CzHGkulWFSeB`#Z3On`1v9YS;@Z6sh7-%uBe%^k-Fwk6*Hk*Gm}#CSF##vD(Gp= zY{{spG)6QHtjnsgW&8HHk;5fYlR*F>gt3t4Tac1+7wXZwU%s%DHM7lLxG7pUy_0hJGiowo2GmTtR4=PjLwY+sI_N<; z^)5WH3j&6gT{Hu48Q2-LcC!4%dlO5AoHmgwFDbd4qE1W~(&ZesiZO8}Q+mF9d1CU= zp@Y*(#W;9=@!+X~s!eG5s}tGG<%wdYv{cAHK0bMP!pM}ggGD9%wsJ)?CeVnM&y;f$ z%i3jC&s^2?iF6^CE956s?P{q|$Qlz@k3KPx$rsC|)OfLChD(JM^=YN6&g0`&++*mb z@d+Ml(qFZAfA8vzK((j;*69yU-w528yBYNcV(s5Qe)ITxY;SdF_~YD1xf|2(58OOo z-7@;K*w997XgxMs-8=Hx-lsP9K7|syHsZUf$g!Kp)?>S?JLHdF_~-@1_uV{4(MN9{ zU61Xm4($B6|D%3H_uPD;+TML5b`O1&((WBWE6IB(!F$M$JyG9BSbN_9GJI<7EKiEx zouam^`mRcP!jq%Log)uiQUgtL1vcdhHpvy-lq=LES7=kNFz4#_^egPn^`pqAVVV_5 znu8MH4ke>5Zr4e&>%H{YMi1uLK2XWefhCT?|;%$99XfwK~7jlBV zdR*+~#6Cd3_6${Z*p-{pk<8KRA0QG32JJ6G#7KdSl|bA6)$K$S2W{p8Z+x zfj?E7M}Fgl|E6wy#x319i9Bi{OyS!JoaJW!&g3P`&rk% zKPgooOa5^F_uu$I@O|~eBOknVr(^g1_DDx-O^QTYYYFM-Gxeap6Fp4E%}6ShS8`e^ zWwxeLxq@2G5*<&azExJTR!Vyc;O?2y*JjsyM(+eBk@8q_Z3bKF zPGAIqJ^R;Atw(p=3GDkkkO=nFWGU47bAL40dauQ%L^r4hY5X}qYmfQvjU%cqmsQ^a zq%x#%%R*2MK#qnq$XS;hjZ{L(u-SP=GfHJ$n=6zd`Q|G{%?zvBqEgO6u9ir~n!#M5 zY-k>NNV}BxGV#|fl5S3S>cpIM+c$gLX9lk-*|K)qr_*LIsHiL^ljeJ6U{eQdtUH6` zdxRQm5+LRKD>qlxBLh4M9$Y~`L|+KiZ%KqJt3De?<|Lh_Mc+@4U3j=R126B&_RSq| zcEbxOVRZq!;r%1utE@-*xeK$&s6I@U?xDwCJk0R)%;~9%FU_05`STY~J#PljoxeCY z!(65Bqg=#Iq9??@Vh)l-(c>ikj8QzUOVvc*+L>y+du@gvp9g%wL9hrhgfBQ?F$5^V z5LCE1LmWfORt&KK6%2MqXd$A8EhP(6t4_B{Ogt!p;msd0JL<^{a4-SfvScSf9jW6PI+mdSdg(E0p^%J!m?= zR-Wi}H|KD}0=0F-Zg4gkZ{&c$?D^RlGw{;P>3K7B?(FpROEYHh!r3#=&zpghQ>R`u z!>7+*cxCFs^h229X=;NW=kaF{0j7v`u1$+aTkqOw!5$n(-0~0}p(;E)LYoFZ-#t?9 z{&^#p1XVxmn}8NnLu$+QfWsA`8`2`w$m@}X@D1sjZy^FjEo>&{GdXQ8lTT|i#X@>% z<(XC)zl-yyZzOoOwt) zCYbST=cbIZ&D$B9S7`7CNngg28?mpSW%?T$cDQB{t=755Gd}VfU?qI_PJsAVKKKoM zZxKE={7Q}*brWXBzk~#^SELSeN&hVLMbAQveEXebvc(KxTjpRM1&wl1(@A9NT2W7> zl70qcGnx{1U@9fBaZLadvEE9bx5jb1EWy1&@cj##&pn^Dk8ZS&{^*I@Pi-9d#+?Jl z@3fy-kDTB+hMFDHHAt8|>m|tmt0YY8-$VuaSv;CxX)2`_(rAtvaiJ&m%51ZGoYt~g zjKinDj97+@=S1JBPOdmb2?y}_#dYcDet$4>FXV%8B`p2i!O|L0e}{x;YZ4v;RjG<} zJ0A8g0AdfV)k&<-i;@rgSXcGz^>_y++iJUI^7-C{dWn!Q*8J~wulnDz_MKfRz3sBd zDGan0lxsmq7+wK{0tg9%Du_@JAz>(m5DFp0hV*I}p)f*hNUuf^iXg;>^lB8LC_*vX z@2jl{wIUSfPz<3MLTwz1BNRs{!J#&U+7N2zPy%B}OiSPINc*no*m`+b~eS^9CyvM<@K9E6q1dwx1&6qQnX zNi$?cep{=^?46KH1-Z1O$wgREa&T(B6`jlDxc>NiXpz z#JCITbXnIm)mw>nt<+c^QLtwh_K0KUsFH|{iO{JPDZPEYI63sxNjI~%&u4?jSP0M>nL_C0=hz@5K<$S?eAVXf( zba05ZZX?>Yv{uB@Vh9GUN^)GjXlRS&tQA$zOX+e+9#PVO4w|!qp5)0{!T_^0XZ1zI zP&^BOE~GLlaSCx%!%|$#XTDYDZp!sM@`yHmWqeHDfAPSfLq{g}Cm&Edtxoegr_Z00 z!C9F+*2XC5)JfK-c}SW9&M7Wcj7-{EX1h%+)6@f7#CX1BgQ{kv^~`1J0j)_+Q}RT+ zb|6GOr9jxza#M7X0rdrL*rj=RNUv%St9O=jeTiz7GCVgx8BJ;2zOO97#?*Az#$WbqX4a9YIDr(3 zySQgj$r_rMJu?PPMNv^37WI)@v9=gWKeQ2}VwAKTwe?61DY7WQyG+1aeFd5fBU?zb zr}~j9=NY2DlT9LH)3Y@q8`y#_u4LdCmnVdP}1&Yqi@ou7IsIXdbUBQt7-<%V5?Bo<_eDqz-{R7;rI`;xqY>C#j->*4a(F9E9N zApju|0BE|FWjsfHmw{JsUdS4GG_2jl{gcVPVaTx0R8p}CkD)QKvvOR!rllZVG1NR10?xp&8RJ)4KwNpS0n;+%tT%0%u~1xoO;%QZ8JbvVYVRB z?6sieSA>wnw49=}9svXmv8}WbFYrDzBN+pkv02Pm#+c*%fUp^{dDo2C46(B9EO~Xu zRZGD^wi!Bjfp;z>JWOVYRT|^AU+;(B#OiLc8=e&WY+!Wkwx5G21}acfEd@+DOxb3>(vz!EkeGioNdaZR|!g z8GsEx*38W=dny>X84z?G1@iba4nVX1-(*tUf8Hl;-}SHe!OZO)TswW^$#-X~;g0q2 zj_T0<8=)KD-iT~>!k-OIYz$4@8JctwV(Z~PIHVE2dNWZCZ(9!!SN9yg5n6BGwGol4 z;okM|?&|O%q}Kq?T{CRl~d1!w0IPC#m$ljmZ9LcxXL5T1`Gj z5sz&|_Ep1O>*1m5u2B?N-H7b4`n7W(!Ydn*!D_f?JuFw{g9yK~5!qP{x37n{S9d<< zq*M4Wl9P9K9=_fG$<%KvKkVPwiQaPQyIrHzuKu3~TXu%l$idh(c=N=&)4%*YCJjCQ zOM@Ia+mMVe9@DGfj?{Q1?{mgTaaasZRc-kwZN(*2Rv);eo!sY-2JP5*4$ev z0oK=pEB~2QyZNPz0ohOPQCZ8C38)MJkfG^}g)I14sZ$G@k>6jUjjRcSUnuvit&MSA zq^N1vpc!X@dwEn>cq>y^5RiySfUl+fkB++0cy!cj6R>^>2$e+-3Ra&4a_F>wRyxFP z6rCk>&{agkMag>)rYYrOw${Hz6tgqgeZ zZr9#sD|nBpeQ$7wFC7D6|D4tO1!A^btr%7-X4{yc{IqVXeo(^F6!v4xu^+ov0}r%2 zV~%avy&8N-PPg3|^Vpp+kKGyb*qt$t-5C>hr`m=dC%|d()i`rno5gAE%7>U8W)P2M z$ZqJbU>my1c{KWK$K+SRodq2d5L|4l3_?p`5lpJ9WrgMx2-!tgpW1!{>Yuh;gfT&a z_te~+T+Ce4vWBN}s7J4Tt(D7%pcX8`mbH6SDirN5JN+R^{~CIg)-}Z-a~fN-By2)W zrIO^I#T(n?asgi5Tw@KMF*stjK^y!3(0qm(1s`_9IM~Tc8WxgV`rt4*x*M!Nk*U#- zFeT^9xy#VuNuMIc73Pqz=B@m!&DrKD8lj07?6|xHJ6Ev+g5`j#u$P(e=P%i8GdV`{@YT1&K!Y=aoR$hg*ig@qVV7<;6xR$k*;;mdJqUuHy zLOhk(exB)SPfn0+azR>kz=Vo>|yS>%@F!Upl$sicDAmhnISQIX4qPNvz6!Y z6s>?6;xWByy;<$A;VHA<-9L8q6_qSHYh zuaHet%(#2>jgl^b3P{q`e?sQkhX<nM7bM635Grq zhub)rv^FlE&uiA$aa_WkOT#^Q1xUzM$sb>m0gg?r*1{;QkN=Ex8iJYYlJpYjexd)hI}}zkc?Fj0@`*o zLfc;)K5=Kqvp*gC;Wt10=Etvn^xE&f{*$qd9nS*pj&B42OOI%+Zh=3acS}2;^ZnAG z1E}|UriOgK)i*T|`0*sDG>-qApJOmo5w#^AMS(|A8;?NQ21C>~7#@fxQ44tjIQ)6A zArW;92|A>TdJd_g9%CWuF&3i2SWsgq69;0ouC_8_#VSEIJ=>Hd2Ff@!V_TfOUe-Q! z{D4Bk5Sx(wDjFm`^l~oxVDpjuE#4y~S7jbp*}`lP*%=~OA(W@jzU(Qtg+=htazdFn zCZD6b7?!q5D3z_qLQ@@+hsgmtj5j+#hgs{yX)l>5jmJn|@hr-v4)NhszQn4d*9UE> z8x2~OOCiLReC?XxSE%zJ27tOWwT2n{e^k#ITk9GsYlpMKjreWAgifd?ka7joiY#zY$FT@r6pFzGIrjlc937(8UPoDvXBn;BR6 z!0VQxc>|?}2#x<3gh1mXjc8ogFC9g*Z|AM=eDIw+eft5)M>hgJ4kT}O7(Ps8Y{YV} z$M0^}kq4-dBU7V)e;&E_7}(BU$-~7?PB{3Q1tj83786JZpF)*V%GOZ@9j0T`ayiRP z%y98za?@&D$H{E58X7h}&gJ#8rE8fXQGR7mun{tdia5ypV+c2!Uc&mp$@VYsYUB*B zldTVxq(rqT9+cn&L;oI%&Jrt3IIPfNvqIlaYoYIUjW=5l{VK|&t?zU|^35Be%oB%g zDLjJ^o+eBCsQ6OGH#U9bxj$1FqBhq!wPz82HsexiW$QwlLDy}v2aB_LvAgXqGcb{exqI%guchVb^uWF3f$Z7$(>^iYG7#G0v; zI8$rpb$CTw{~(_OX4kWc>HJTt8xO8__FJBl{cJ3OFJNrw8OxPZ#5BRRo?}@{E+<$T z@EnrKBC00`hcy*-Ibp_lT2J$2&*BRUYqsZTa?DO^AoY8~D?50Lj~fn`zDyi?Mlh&H zQzsv{_>v>;UQv90W3?ex!0c`^Ta8e$S&8qj_aMcaBxO~j|0dc^5nj9vLWqvNHeNV_ z!Xb8yINE#T5z*j!cwcqj)1U2|+SoUBXWuD0{Tbef?77=@s2SE+?gMGc?@N==vwx1d z{(lg&CE~<^IB^GY;x^*28zAnu0SI;C4(iYyvA9S5j(gPaxJUhtJL-4$YUF{+f8688 zk9++1anJp+xVS&2CeV*|;9A>i8!PdNN((FT9ZCk^%Yw&?Yq(TW$Y%eE0oyekm;wvo zA83G`d2ClZi6pHxJ4&_yaHGBas;pdtM`5H`z-LC*0fm)`tN<^$4tYnNiZ0~2rsgU&m1-4g{6g?oq!#H`S;M5fEYf67b749uRo&bBpU6;~i`aqnqjUfdfe1wj8kM3xy70~RM5&=BZe z+B8keIm7IA_4ynRbQS|z+1aQi%rV|?RukImT{c_m_-MA)LClQ1vBr#7T>IT@^XxhO zx6xnyH>lHbYsL8_%xt$p_WGNBu70~$s8R7CU!2=|bqv@6m;ND8&{07CEy}Es0`fmW z2nFOh=W2_icsNA3b3MGXIy8dA3311zG3-6OsD>NEeAi_6ILd!#BQjJC$JfLC)xli| zFW+phhPP5}xQ0yCxr?_dGuJgs-`!_3N01E%lx)EG^c1 z@Ch5+UE*%T*I{i5tt47M0`Y1kC8g*<$v+KSOD*FoKk6-{R&hCrQGgKtpEhuNr63+2l=Awu*RU5=)& z6_3f2Ug6oqmS`B-KNQPr){NMbZ$>aChF1n$$E)JlSo2D8GjvAk(5e3rTMXAC?RjPh zY=pASHqn_|@0JMeA#1GURxRXJ{oj26u3uue=NG#gljzfn`WI`L_~O^*3Q+YWJ%fSk|DGQ7 z(UYL~o+Zb<;lz=NssETBS%=Dj`l7e7@yqz;|B_BO9`&Elqu@}NiQ+oapjLJ_mbAhz zL7Kl#ox8-JP1@2WQqDL%nBt46+)?)Z{yRz_SMbV?#xAoP`6OSlxx`l##Q4}f%oVWTxQ!}UqX$#( z62jHreXx)~_MYN}qd1<_U`UF!7RbZ#Q(XURRLEne1^@N2A2Q`+*}y9_4?a z92r*U4WDtFk!NtIgnxbDg#KTU1%N3Te~muYT6{j=-zFsAp1+nx|GTvNFQwRD zN^N(2t$*jA^xd>s8KdS3#0f3VFr@c!Og$q$nEC6M>! zxbNBbFW#5%strpACaO<7jej(udgw@X;&CGOj#QsMUOoCu_26U`sfbJ-tUh_Hw(GRd zH&|`&sR&Z$Nn+YS96!2YBDzcCZ%2nrCIn5c-3*J1Fc%ut_J8EH~BE%6u^X;Sx#1z263kKNbGJkq~r% literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/inspector.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/inspector.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe5ff1b58d331206d61daa02c7d9feac85d9300d GIT binary patch literal 2634 zcmbVO&2Jk;6rb5$ufO7axTP(jg>72ex-{M<6%t5Q1xlbPm0XFIivg`RJCkH#Kf>%f zm8}-FkRG_f0m8o!1+M%PTq@;KZ9#yzv^NKX_&D+2tQ{w*BNaySn~(S2%=`GgxBk9V zDi9cVt@jqc(+T+%H@yLS9JKQY=o(>!QIGhvPAOpuQ$593>#DESHP{oTc^O}?>vEm( zvh^&SWxQNH$Hthxs@3x_XJIZVgsUvKLFMIy>k7F{SbmkT!iJKbZKMS!?V{PrAy|3u^0R zT}g6|&n)ITaiVX zei)dHuf$>KMdr#YFPqz5RhOGdwri^x0kcZ*i=GGai2QYjvF(^`9SuZ2DGbs79p@<-x;KKS53|U_o2}7)jJZ^<39KJc1kw$x7>0GCr)*J% z&0%Ej_3GpkUWrkVYnA&iFb;TH;%t|fDhR=#ohr~Z!bzPnQdiyqOx0DUaE+-Kfx|OQ zXWFW^T|zoQJDcQYyLYx68G$!l!I^P$i3f(@ei(Cu@%hH$q8lt4P8b9LK7haBMut5f zHew?Vjd^awT=;Ha$DCD-nJ|a}nGq5)d8;q%C1-8#ED=Ao(AF_sr>mkefs9}3uPS&zm=)m!aW$kDya8Q&TBQ0Su4mYNN zLaU?;@)b#r!%<`axkt8iC6jCCNNM!bt3PK(e^b;H(%!Nkm@3gV$gt6(G;{wkZ{ie2M>fa7nVZ^MDH*KC@Ys9W6GWdY(4aMz00Xz~}DZzt=pXljh@+&7l3Ta(S2uWjiJCNiqrk&)H zn1)NR5k_AEX{(gdKZXfC@e?`wBRT$%6d#gON6XUj&Osns2Z>U;Upl@?CmztkpGuKJ y7Xt##K`A0R(bizQbySL-+N7tYSOLX=Y>S;~Yp~rKmts?!bb7GZg)J15q5T(~NNJz| literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/io.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/io.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3da569f50c9babbd90cae5a614dbb3d8128ce4c1 GIT binary patch literal 4034 zcmbVP-ESMm5#Qr|kQDV5#b2^zWc@9wl4v`L?aGc@*Q!7IAp?;E6m$*hc)PUDz7J;a zD48s6$cBnaX#=N;CWE^@vSIB$lvgz_2}_L+58wLj|n48afqwr6@{<_Q=NpX=2chA zYw%5&=IE}GH{@J*lKCX8=}s!2g1v^5cDwRj3Q3U5ge4aVOYzK8HI|?6PLuc_>t^Xi zE#HG*OpYxIeD|`hMLpl!T48-G1AF_bdba;_6qHq>jOlrPXoj}$1)nRpmWVQZj(cIj za?BuzGS>^=o4z(xn7n%NI_ys~Gc+Y-3ciw};)S-$tyryiZ0e|No`dh7!7Xr-R~X4B zn37kS&Jv)5#&u>eby0iTo@gDwis z^;tWh@Soe^EEm)-hNkUtMoYqXsR`ELs>{P!pHW}Xpv*111avc?Gc!fUFHRhF!n2i% z&5qs*&(6%yd0^mD^vp~f2`F%i>CyMzyE;kz5;f^}fO}l-wD7K456;1AWz&GkV^Sy6 zIma&M%2lw&dvpB6$y{KEe5`C*cg$Nn$boe3*%dc8&x=ghb6n&s-*tU2 z$M{_6`%aLXJM(tV_Q%WBC>i>N+kx-ZcC_E>cyo0J=olnnSRm_tuP4NnVD1f`-6UQrsI6f3c-Ly4{R-LNe{ zNekq!eFKl)`gwIFwMV=L3msREi6(V950hUhkZQ{9c9*~^KH--B%SxSmm?oqZa4+=E zCZ=lr?aB=QS-EdamN7@6|omqW!!!{HVY4wr=lN&Z@}>7BKabr>Z#3?qVH%J#CYu=2}K{= zRAJV@*}n`$f2ToUkTyx~4kuzj9m2f%5lp^M6bPzt%ZV*V-2=zn#+}=q7QL=81(Aj& zV5a^iaW7F%e55>9?x|Jn_v*Zo)oT@*vKJjc;1tk-!i@r`j8bL?mMH)kyebX3TlR%1 zsGb9+xgFw(#a?g5iC-!OJe;5-!`I4KTumoCLZ>;ugFzxgMwTTT>QcOw7CGPz zrzi=dZ`dwTsAbLaWm}w$(z5U^4jl7P`C4ox-*NnTsZu~S2zWSvzh8kOWSfp;3_8pR>>A%@#1GB8wp($jS84@tSN3iiCei}k~^pQ)(PBWV}5C@WP|>e?=f4N>|0hvpxH(=gKYTZVIXu9!LfC@jnaQMPerK5Zxa!HU9FnK9R{om!I4M+g2+JU4ABYN$( zO$@<8z11dSlL%euZEkI4FZjM#1(*@s^+Vnw+5j0+KnpV@Pr+sr^jgerBRT+IyU2NA zmZ2Zno;9r|wG&%jG^|l7R_Q9M^~&%Hd}od$J&rOB8{(|`BBJ70(xPpVI{Ba zYW`g{{;mv|I2x|9`25@}oDZ^ZX8W-@EL9*#p*a*P91v-h&~^k?Sb@nEWe`+kXUGGA zr8Uwx0DNS`XGKJ$aPJTf^186|5C|F4)3WQ2n>^X(r_RN_=y~xi*n%xx@DPTEswm1o zdx>)BFJ$C1a^O>v`IPj0Ms_|odX#q_z4@HLt3i8}z3cr$4He!S>C>A!yci(I0al|G AoB#j- literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/layer_tree.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/layer_tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a66a8bf994be1712b5a0bafb9cae239fb4bc877b GIT binary patch literal 19211 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 MSnp#2NrtBX7Y(pM2><{9 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/log.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/log.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db51c7271e00653f36ef2dbe92b9336574ab2a0e GIT binary patch literal 6763 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/media.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/media.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a2b28c0548cffbe29470cceeb9b4a3d560d5154 GIT binary patch literal 10106 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 CIaIs= literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/network.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/network.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72278092a385263ec2d3a2f0fa3373208e64feb2 GIT binary patch literal 101184 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/overlay.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/overlay.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09193a100d6c5a28d1cde6f557a254db34fc2849 GIT binary patch literal 26268 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/performance.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/performance.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3455cea2ea5aa5eff8582e2425e8cbf481a9ca8c GIT binary patch literal 4035 zcmb_f>rWil6~A{L`{uQPjWID}8x!v;u-I0dm|96=gB_!8uFbAfetcIcg1 z++Bf$6IaD)s>W3mNL#7-XzI2~`xo?kznG#ZXyU3={nC6}LaNsJ)N}3(%i>3sN}1K1 zIrnw$xxe$cXaC&L5F_y1)Zd)6HVG)pNlB~va)mYkI> zC96Q2m`XvlLfMeu)j~KMhCa0r$wpX6B4>#ix<$%x0GxwO3dac z!JpY;MsKOvxZi?y(u~23gxPAw;oBe)CYy?t`NA=e(UmVeg&Yd2G`BBqw4KXs3^Y`?r?0@Ly zNnjQUBUx&atn^)gDJz>2Q%o60Oa(YqZ~#G8Wg#|ozXjsfsCknRVdg_c(D6w3CiBJsHgO_ez5$d_M zv8}D==q$M&*h8!c$SgG}stcn^eZSAcs3b<|Ws;IdcpSQU1CW&LDP}(B*7Zo9;;_Pm zr(AacYurlHzWQ-y%C=a>Doq)dWtf>EJ6Ey*d?#}@@4i|Z&m0*T=o>Q1PT$3ezSFkJ zGORe0Ddfj9(`9$cE*|SYax~-QUDh{kljmm`&*W^&vWpp$ z&A7H*a56J5KA)Lpe8T3IQOvRa>9QAgZ5H2UE82kj2f(>V-eo;+x3{mIONvbKBg zV);&aL0PzRJF(W$_3PM&F=$-9-LTfwx)9%lxg=MQWEeUG_Gf@uBobh`jX&bM2l}@> z*bN*B5C?4QM}8}Bc{E_H)MG8xqs%dcc>)M{vYab8yao6GZ=M9+i%xLc@=x0woVM1p z4<|nhWS;!JDfytK?Y+^Z-aBuuwj6kn+`XhMUH!0OHQD>6DmTZfM2^OI8_XR^MZAcv zqYvu37t?jiHcJKM6T1F`l2Hgo!n$tSIp}WE^}4vzb>514#YJ3!b5GeO-wi#>M2Ht! z^C)x(g8t?71NjlzP$V@{jgWZb+vlnwl4yDR{1=L%wp9}()UqKdYHU;9;(SpkB?oWq zK}#LP$mjy*JA`6x1LX5`4(#*+U8HlgEdNfvK~qZQn25Ncykm?Pn3l5(1(tL3#YxR5 zni^-*HWw{FJe?puL;is(t*_U4oaxIL;fOaFDw4BIT?EWy)(Qu6`2m>P3$KG~{z?8b zPpUBzZMmO(wkk`{gyvrb1d^S%U%EN;(7{-JE0&;-B>{2NZ^Nj6)NMzsPXssBS>b*d z+NKPSsQgNrlV&9Whg_xt4z=|INCY^bs@S7fKTy7oQATxf>>WiHGi!c-D)@(xoezNw6ENcaN(%gl8I z`riP?w#zhk%5Z_?9nC5^t~L%~VL(`zz=7G|(n7Q`M1r8G8PYEHYo}oj9dS@P;A6iTG-Oc}|do_Myx%;D6-aYeaqH875we-d(iSE1I zEAbQel@kyD55-$v)V4hb;pu(9IWN>DQ?jnQBI$Y*x1N zbT(8DL#-GNFsU3CP(K1N*uo!g|b+|V9xnw9L-fhsCYo;Q!AcrXT;h^XnPD6fd_2!^0qgKqkv27f;l30 zbBw|rP9Z9cN=txWf2{(tapKEBLTs_l@_jeA<3!rTx%H#wYEE zKhCVQoqCXLf6rWc;f}SM?Afl09(rx3M1FXu>syhLl;W#^@#}^BVBklgkqUFHFF69q zJCW=~(uL$1BW9btNX9>oVKGeVi(z1isD&Pu(r|`tlhe~ufe~NF(H;8hw)&VUyR~r zey_iA<>mil<0m-lSgHw&%!v}*08nIdj3rNjzeWX)zQhI2@!B6X=5Q>*J%trZmKX8` z`mTZ{mAJn-W^0id1hkJ}?nO@e741tL?^(>1&QF0?|SrwO%>YJo+Ng5RAu;zPWW!7 hV{~w%lSmEs8xE|}gKH?d5k&(LqLK7$D9{ux@?QuA&2Inz literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/profiler.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/profiler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e77793caa73e5bf2295772e56fda54cd96ff7ca GIT binary patch literal 22695 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 F{|_B>r9S`w literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/schema.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..543d01a5fb0e4fd628313657cf3762ea32df5728 GIT binary patch literal 1816 zcmZuy-ES0C6u)=o?(D~GKenwR2y~T*ENOQDBe8^F3@ZgCCEAK%flQ`zZ`-N!vEDmd zvJFitU{WH9;)5+u_z0r@Bffx*u^DRA_#$tM#V9^`?#ymoh&P$D=bm%s%sIdFvEOxd zfL;M&YKe{rLra5zV$xYriCa zFJg*i$e@L~J$*o{#9BO#O6nNb!GPz1l+=h&#|}FrN<;*6ry?>d0B`xJV)36##!TQb z!>i9&o@Y^`64-SQ3LuP8Cp=!CH1_Y?H(aqAV))e5@X>%WgZXoY>r5K8MmQ7ruax&6 zFoYAb;hJTCU`;b&z(<(x)IH+@o21+UGz>fNyuddon+t=$6~^3auNuOhVV+g4HKKGF zm@=mM?gaaC>;4>sDE0tZMC(2MpUf?hwJpytH?B99$kOSn`L%63Zw}oUg3Fn!J!?Jv zOZo=bBD)jBGzenYj{&oc6oBzR=q0pUL4K!Ij3+cor{-(5-OvCt>4aJ702p&QW6;B@ z?F!xtd<$h>06xl2@xV(G?QJExDcLEFUk0*>e(mX7FARJ(v9kO6xz)mp>jPU>$jX@; zJ*xwI9;MXYTob9;9PbC)F=*F}Y09QE%_wJ@UO?-vMmS9`3E7X zfo2|Qg@+1Be%kMp*70=w$~lK#9J<%NXVXQ&kqBf<9Gj zWf}^5ehWeiO1SA{7E1f{xu~?ud0n}-mB3pI$~aIQa~IGz>IGaP^JDSYzRSWo_eD|E zYqfxfjJAealykBE5Kjya6;C=MlpElGEajevv;@ET!g$iw(=1GCETVL>C`3s~z?2Zf zcxG&mn(>IrPKmH1WH#U{=@uP4K-uIj5*(01yWtUU0{I>Ny@;CKC|kJO_fk_;c4&*o zp$dK5t{z#etd)juIbRK~>La%YzkK7`u^;o>@8!3zyz@hT@YdixedI0~dHlUT@>s|v zajEwp{(Sp>@@?iIhPKs`Z0BDO8#TwDE{`&waVre?*^V_lRD9ynGL`V0O%gtTzNE`$ zoT>x1(2QKB6_I-AxLp3za9R3D-(2NPa5<$BVSe3K7t_fgj`IQN(G42GEj0zIkdO?iE^FNY7sKK})S CF12X@ literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/security.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/security.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e51b44eda5a0955b63a8df411724906d969ff712 GIT binary patch literal 20574 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

    6H}6 zH$cfvbd59KsuwJV)-;WqFciWq1h*03R$KUE1n(gr9OVZXB8MR?5Hg*iXx&sb8jv+D zV*)uaeju-9Xx38H42Y4mZ!p_83BDrz5Apz9L)G;9{6{EJel7AvNSTE@xSt*cO=`3=T+_{)01bV=U&b9h8_%!WdQ@7;J z?HQ&G;$5m;+BcM81|i-toMDFG-8%xl#K(*a#BTjoVi!LZfq(tMbqf!@F$^#-cJmHH z*jqE|jv6j%XsmJG35I8fY`h6Wn9^8;?5E!)auZLt!|oYP&A4L@U*y@#i#*t!jfZeq z9*=&pi3r?g5{HREjmB3XXEX+PwSe!D7@S>=@S;dI--|q{UEp6|;l(5yj>FB5Fr2N8 zsb!Qfieoj4dd}CW)dq)pNgk72!!>5bfoLKF0p?kF7e3ler~yC}KNR1F{8_zzW*8BT z@8KtZP5w;dp*7=|^%ZjtzwN=6*8m6>*BNE!#7uB55Ih5i;wQ#}6I0XMI8W|kg$Q0j z3Lb<&{sKl-lX~WT8_y;d-$a#NI2kQ~IYH4tnH(_EDE%hv(!NjMq~D}ht^dM$nf5X2 zO^V5=h!=507Oq7^E+UEvif(_7i(0mgmP77wvsz?r&bSJ1*w0I^c6S6!QWCHyPMYg$II zgeWp|s5mJzmlt^&_dpd9MJDD!=Okx+4-ZmX$jn+-88WlB)Q=23_N!x#90ZoOz`|9l z&1^(u#l^%*46b$YES!N&2s}4jLTc&npL*%}sndazQ^C2h>HdBtb#yr_gqPH;qig`~ z2?#4ZTo5Z>IpImhs^Qou3#a|bmr`B&IE#ETK++1Cfe4;uoDdsJZ=*d*I4R zL+jd+Yx^Xo?qSW|^%~D3o0U+f(@dRBEwt%ar9PJnP~(hFyq!MRx;zvs*TLJJ@uDlu8sjq$E93MP9zt@N%mY6Cf1B59FHZ}kkuJi z=T^Cy9OXt?6i0C3SG^3PX2s!Eb1I@r$yXq@)a@N^z0^@x#FolU9Hg=UC)<^Bsdk+d z;1&t=rH~GUe*>cx1b6y*coPQev&l}aslq3iT0je^-(h1_V(=&xZzcrcQ^@#Fkq!<+ zpnwiMEYQJziE#r(-2C>9Z)X~Mb;8(Pj4(vPwub!luWONq-O$ux>pTJXo`oofoP5); zgPs6ORbf}$7OPdE1(A*OKq|=u`2;LoW!UiEC)u!1@|WiDMl~CWMd6MqQ6};%Bpeqn z^GIsA@n&Cpt@vcV_8RCZVBL>%AYI6JRDx2wz#ACL=B_A83$#ql&GB(fU(w2^x^;2_ z7BHg>%qE%=6`~UUElfM`lm7&-LK-sjlXm1M+BY^6k|_LVsN$cQIZBPjQ5rjda7HDj z{$b7jVuU07dnlZ0)EjQ-I9aL@Ku*60k_fB@2=D0?Avr4C7P%EN*>;ejB69~MaFg$|j0jl>AiK$fpSIKyl( zkpwzPE@JigTM8_f01gO0v_P008znc`NcD!1RCQ;#B?bZy73)|maT&-}`>li6>M%PK zkFCNDXt?;MP&jy(Kou9x^Ln#25-46fjFWn&4sM~aNw~&4FW0E>T-{=JYgdL`myEgDe7`Mgn%+j^POe#W$r*g=96XYuBIQLfHdFmHj9= znXDXIdeG2xYvfL;)I6AJ7*Z_AEmF&H#^ZnDV9?mhxD=yk5SA^c?a zZlZ;dQV*6+dG!^1smK|l383}!JQsnS`lHTG;f}I!F_WM3U`z|w20O~;Vh(%tGpVD5 zM2o9(DBVS~%5S>%skBt3-8E>fT(9=1;1rTc1;Uwt4$&KjA@EI(YJ8+0#86Hm))gB@ z_(6s=)DHx>1}|kkixXh?Q-&u`iw|(lyPztC7Q6OlyT+uhu}{3|qi3b@S2JCqCsqqm zo@Hyw`yben|Bj%5vIqi!gkR}^08$nMlvPHx?#wVd2t8SKdV-KbPgo|^s?(D;S>%M# zQwiw>DEO76LjIC--uka!Z3cp?0L#DO_hZ2FUn$pV4KlVPwUbcV*Pu#m=N54div2KeJ#L^s7B>R)Ym&w#KFBQ za+0+a`bHjTiOC}Rk^Mu}5=xwuhM2)M=}=sgaIB5YQ9zt9&XDjoP_yjT23xhQD;^;- z%5V;e%=2GEK9X6;VhG*%aMF#?0b$7}F%=zMWcn1j5`$>5b4n&cP*+2KLH`5Hp!hBn z-O^!cvUsisPJR~uJa9JC_^K2*`^nh-rd`>l15(q0d#C=o>A7^^tkn4G1MmKmETJapV{|^@%g1o5A*38~`}3A@ zx~z!&x{tjt#zhDM!7s3D&q4sXh;ko;oI!es7bVF3i+vep@59zz8D`hRa!e!q#i8>T z2r2vpYXcUFwwPb-P#4)zKF$kaIKcCY;YXn)w%)_7enX8z37)qSF(-Kp=da zOhY+hb=5(39#DR2=#cOWK*01+;*SC5tTavkLj^^5{ZFd@Z>f%-QKdhl%Kw&fKe3n5 zhu)cZLc!}vTLs!6!9>Hy^Gs_3Tms=AyN-Va@SH*E0E^;AP*jXP(B z_rt25oDJS!=quT`;lNN|C8FzdR(O*#@P<22mhyCYUxxOr(|J&|6?O~!2kdN literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/service_worker.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/service_worker.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c78b73eddc16fcd3a4eb7b9a3e354956d8ce29b GIT binary patch literal 14699 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/system_info.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/system_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6aaae4e97e94d97e6ac59200535184d40e46853 GIT binary patch literal 14397 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

    ?}%orCM;6Q6t!aAf%=$sg`qzdHR zpQq+BjhaUZG5eirGzwp)+8!d7Bm^l07`zox?uq9SoCQ#*PKY<`)nt=yXV73TN)-U| zc1Bn4KYD)Q$u;c#x#xEGZ1>GwbG!cPmHQsK0VC`fdGFad-!uH6XE?WYMD7{B9r{~3 z+cPY09l`L^W|?hX*s*(l$IycvLpkoSykqEo<*mw}*8imbQ(tz+kjx#{4$`<^IUN1iC$Vf|0S=-ymiz{7mO zI0Kc;7n|w=>zFS+bpapq<<7bQS7-_$@q_lEmwrbKaLlgIjU5vcs0IjhRiCFdKwu_f z2$^Pr02r7uX!eumg4t~G8e)VPM5a;CX#lNiO0oL;pW#bL{>O?n8G+oVor$+=`5_nz zBoC~zAcKVDhp1U3)hTnYf-I7I>|HHFN%BKXwWk#U`F@aKMTCJk4GR)82>uAc1q2rn zV6@NgP&=*3zt9Q8wd%zVE}mSQh_7LZm{W~diUTNQa$+-L#u6GJ9foOGj%@BGYz}dz zg}z;%`F|12)g1VF@IL*?+w-+8a&61)%5Q47-4Dt&2Nrr?&h8p{(0e4e`Ka7`0q|^h`jme!svrIH|Kmi9(!2~yt0t7Qcj(uzendAo+vd3o+z7- zK2dxT{ZGOz{FBE0o7umw+TY^(!qvFH-Sb6f~ z#JF$A(n|<91W6tI7ZfD)2lChNn02xlOx_LcIi?Lw-vK(u^cO9(ch3xGYy4mm13F)M z#JC|I+(3eLP9q)+C3OY(^5XXKAYh)=KGtr<;C4(85WuaN%kNg)VBv-#pOo0VFOks8 zcZDQeTVdLso@`32U(;2UVgs8_2$IYR#Twy*ByUP#!^w0o1zvbTcmwTvB3)6_J&W;% zG8nCO2q1%*wfsT3s$uQRaU@OCd>gJXxM0NsS*i|LJB?Old6u%d$ zHtmwGeOr+&@uD=Zed~NTGS@SpBadJ8EY#NDIC=dfRE}MBEx_$}`&_%GgG=0H{~^p- z@`eX@l{~l)1#Wp>uPnRGS$;?T$1q;}0fH+4;7Yo1EA%_+F6@CKew7@VTJzo*LaQ5h zXFH5CrONEM9?ey4eppd`EihYi{qUcAAJ#TN&YE-X)m-hir@Djw0GENlr*D3qBejGW zSJ|aQkXPodxinJZ1{&uH!=Le>F4>HBz>lEtIz_`N@UXiP`XbQaU(z?|i!{=(`V`f5 z%XZwP9-t_|6lPVL&#yoyPB5d?-&xPoen;p73q@(X3O*BLlNEPQb%&I6-7N~F z?{2Q2OQn-~at%7J6NzXvaURTANVO4S(ryKbMS#QaDjNFC-x~83YYPbTQ$b@FUA*TK+PJNN9!Mn40#R=5;7&xMQEpry-nkG9bqx<<*+=DB|q-aQpdINTe zEch54tJcQB{T~D;NQO9#d2#R^2DIE|xMJfx^?DddahmkV-+C|aU{(OQE4>R`h$K1lM>SLENa@CK6SEnbJd z_)i5=2nzpA{ceU@Tu(VGvsGIbt(Fb;nM0s%s~WEEn+g0U>z!xoA>caOJe!`|mSeX( zWZmFm_+-z99J^7iY?M7*j@_hIHprf)9Lp^_Z5}&Z2ixpVNF4RUerLa%E)W{1e2CD% zk0>rQKtvZe=3#{T6cr|Bw?K<#n!Q{i3Yg595^^8}93ZCSapdl#s_O-*L*;OjNPwu8 zD2AqyaJ61Urf}oYMEET9N7fKOg4M#EY{6-pq`%_Uh9U((GBpZVVpzcuU&C_oSgBHh zN2(1~kM8vBE&6V^lF&HqNV{)*c4OUnIAs_fUa>$jFZ8jO1Y zOIFI_UL@5d4aMJDY7qlK!(g?GAbf}bpdqljhaff~0)U2q(&IyP8C^fi+;q-4A5&0# z%mKK@+;Co3>x$>B%<+DNPps;lTi3;+#-)d>}|av4i|YH0i84i~+jCZ_uT0l|!u AKL7v# literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/target.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/target.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f95849578723feae113be34464fcac68d405103 GIT binary patch literal 22950 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 a+Ru6$NXvt)Hy;g(z#eqyse&ZagZ>|;7Pp-M literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tethering.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tethering.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb5f37882c0c1f0b01eb89e4433a1128a3ef50b5 GIT binary patch literal 1982 zcmcIlOK%)S5bmDWzPx^Hf|YDYGPaS$BJ6Pz0g)A1Lb2=^qzy`(%Mvu2oo?F$^VoFH z*xHpX*^o$Z3l|&-4qPq6FX006#hL_R#D(0}Y!HtV)idk0kpkjEuco@Hx~8hDYQEZU zip4yFwPoI2mNbNZ62j2}SuEUn2y`0}M6ioIT*DXp9(J(DK5}e>W8N7TAas)Mf0uOH>>9C!u3V4&k-xMl9Q_4 z4Vw6ufsToEuL1Km!jN*5YJa;P}MxmnZXy$#lbFmY1AN>+gtjKl18e8wQExWMUO7;?-9F zA`Mq46K@MIJ5sE9pb1E~Ke6Ik+L~0}^L#kC;LmEAMkCk^)L`y+0oq zD}hH1FIurY&mzWbU`HO*jT`e$cq6JCm!_sBX00ZlxVbcOJs{Me{;J_Rb)(UQu>O_F zOP3Aqgmj`|*&kTTlpCD7)ORA!Sfh2qoK?yUJMg@~Hwaw~gTUp+>ebhbu$M@q87m?g zb_#A)gojT8`5FDbiJlFja~D4!-<;cj;q2zz$FFZy4@#r^r89@Bd|unU(axe$`IDKg z**`iWqYuk3;{UCmxBj`Gk^kR2n%bs4O&Zi1JZ@=v$OIm%OjLpm0O@s$l|YKMuGKII z7sTy;YM7v!bO(k&O(qgmh@4D& z_*k}G&W3>J;%2&@b~U%e0?!oSY?Y4cHQCcm3-gzOY@#0rN>7GPKU{n?{^{Mlq0uMh z^N+}vGv8gfyjQ;ROqB=oZ6xRN9k4~!ijo9kVvNTcqhZ8+b_Rq>CeE6sZ+X--?52smg>h0TT-d-K$%%nAec z?unWHs{S{j8u;|RN}tGVDT1USGbWlDD^cjUOa(TrNul>gKsgg1N32kozOj}DOC}N% zKuc2+9XL)i&R$FFHp2u2#aF|ZfwX0e@vr>|kNtpN`5uitMuo?y*jD;+dB1G4vD&)JZA`GIj{Q(qjDuRuJ)O literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tracing.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/tracing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e372159e75efc196872a4b07815ebae33672e2f8 GIT binary patch literal 12555 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/web_audio.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/__pycache__/web_audio.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a25be442984cfaa25821514fe195a81a8b974c46 GIT binary patch literal 24975 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/accessibility.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/accessibility.py new file mode 100755 index 0000000..f9cb611 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v85/accessibility.py @@ -0,0 +1,455 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Accessibility (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import dom +from . import runtime + + +class AXNodeId(str): + ''' + Unique accessibility node identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AXNodeId: + return cls(json) + + def __repr__(self): + return 'AXNodeId({})'.format(super().__repr__()) + + +class AXValueType(enum.Enum): + ''' + Enum of possible property types. + ''' + BOOLEAN = "boolean" + TRISTATE = "tristate" + BOOLEAN_OR_UNDEFINED = "booleanOrUndefined" + IDREF = "idref" + IDREF_LIST = "idrefList" + INTEGER = "integer" + NODE = "node" + NODE_LIST = "nodeList" + NUMBER = "number" + STRING = "string" + COMPUTED_STRING = "computedString" + TOKEN = "token" + TOKEN_LIST = "tokenList" + DOM_RELATION = "domRelation" + ROLE = "role" + INTERNAL_ROLE = "internalRole" + VALUE_UNDEFINED = "valueUndefined" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueSourceType(enum.Enum): + ''' + Enum of possible property sources. + ''' + ATTRIBUTE = "attribute" + IMPLICIT = "implicit" + STYLE = "style" + CONTENTS = "contents" + PLACEHOLDER = "placeholder" + RELATED_ELEMENT = "relatedElement" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueNativeSourceType(enum.Enum): + ''' + Enum of possible native property sources (as a subtype of a particular AXValueSourceType). + ''' + FIGCAPTION = "figcaption" + LABEL = "label" + LABELFOR = "labelfor" + LABELWRAPPED = "labelwrapped" + LEGEND = "legend" + TABLECAPTION = "tablecaption" + TITLE = "title" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AXValueSource: + ''' + A single source for a computed AX property. + ''' + #: What type of source this is. + type_: AXValueSourceType + + #: The value of this property source. + value: typing.Optional[AXValue] = None + + #: The name of the relevant attribute, if any. + attribute: typing.Optional[str] = None + + #: The value of the relevant attribute, if any. + attribute_value: typing.Optional[AXValue] = None + + #: Whether this source is superseded by a higher priority source. + superseded: typing.Optional[bool] = None + + #: The native markup source for this value, e.g. a

    3i)7aRBVMUj>&QQx0%Nj((dB#Juiwz-idW$8? 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�tSVr=0wfymohy#zE+F{}BWtc<;mDT=^EsId) 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%0DP0g%$n9?HttOnxmB|b5fD@n4b%%uQ>a|y&Rfm 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

    &Hg$y}^7AyKw6;X(+%O1B>my{=p?Lp@}Kd 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%0D%mQyqqKDKERe#Uj{~9K~ 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

    $l-9TjLepug*|1Ur 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%0DpzKu@1Wt4$TWh8YJ|u=1sBV z%)wEeJ@d*)${5KEm0+`Hq`3-Hh4snx=Y75OMLoWij#+35bX5Q(|)l@;&aJvrcL}NF|(arvzoBBVlr1wqdvEfU_F!AL1nY(+CevKr|A*L@84&) zl&KTlOVi|p`hIek`W{V8Wb|Klfz_#(x5Z66;y!qUP)>E=Ikp2{}AxIL+ZwE;{9-B8@#L^-XeLyxp zc>)RGkW^xp7d*`I8rOJ6d21n&WnKb}=vYgx70Ytw4p0*Y*0dU(DI zFPuyZpK&3V2bk|0vY7eRocnHJczgBi&$YYOP{KckGwkx)x$ba8!P>&{7mK^Z@_v@{ zKxuAD-{3&;7l6rXH-ADXAOLKyc{3#V-&`>(R1<^0P5>y+=Eq^#%TwlY%r*-~cM5w&((4becKOFl-~fP#@T|G$ zR}m&5=p|HTw>`R_pPi3g&lhhJS-BZ-ULfv|J9;9Ltl(-Ob zXN*GZIY|LLQ)r6{55@FyoDSq24En$=r=AxJX6tz-_ew!xoL7eL%yL~B4rU>KRAe0k zVRQKw1*3EeV4IsXTPt=LP>9_CG!$a5~ zKQLor(G*5&5MBy**gbnR`o7zYcmd-PmM!2p$@a==MN2*u$c-?k;Zhvv6#yBFn7YHU^>49h6`nz zkb?-9*}&BxiObN3Lzg6tM*pM3^0=KD@b1uDGmZi-Nx5O9PiWjz~43}6L_F(^olpZeAsYj}ENt(Uc z^i67u$M$utVUdS^CCiB5D_lj%T&akW@A{K-Az3cD%myZdOJ0?K5HZxNi3vF%*82h=cwjL!z=ah8_tbh+~Dj6&ee4FZy#^nYJ9|C%2 zQn-F`+?#V`A;FLT6EJR&i9{QqBGV*n^_fD(jmpGlT<$YwIYo~$y5vJSS^$W*%{Q;_ z&n(g-85C*{@RfBT5-AcY-;?3A`h~+65<|cnWTO+JQ4VKalL(rixZud5wBekbX{FV? zjfw+8PjA6uUNkR}vwrMAxvp@Uwkm{Q$pjAZ8IXy8$p)OwZ3ap(_L-To%gLb<2;&DB zA|kt(oE3UpRV!TQ1ka7-6Yf5U&6jn?HT%+3?D5c@p7fMpuh=<=ZhDemL}qu-q}3ya|t||6I(iAPkiw z8u!?ItQ(MjG;M4&Uw&FjrVq`}_Z^R;>w}yS6OBMp^_63(;@f+y&5CLGp3SQ7U^c7S zIUKW4uZaLfEth=D<3jBqYVY_;)=OwJJ}cu=_LUM3ua$-@-A}H>LW&qH*oY+HOB0WIr1D#+Dz-)LSnTxftchziYf^{UIyOSFISc2St5yC+nVUXB zE6le@5M>t)bBM68Z659;LMU3KZyn3O$*jxkT>gKeltLh&Ob9|K9y>)anQDRFGoO^& zqECH>N*}C_VjI#Ovl5|{UZaoY=%ZId!0259R zV`3cW(-&SKWD*tvBO~Z;r*-uaF$Yh`%$%?#teR zNMeL=-!)$ldY)2GQ2JY08iI@PQv9cC5mYI`LB#RNHx5uCaS)00$$a8GUhnlN^$y7` ziL&&q+S4vCp+}Wh9KHfdE(Wy|_LLpJ#8&Puk)D@g9XDM}=n$lp+fn>JYnI(J!t%QVqp)R7h5Bd;;q2!L8JLORNnK|lpYdz<3 z+*oGsZes%k^JQ7b(pkV`Q(_L5Z{9h62vH?!qkZP*$wPoQGacR)D{IX7jyu@Kd;H_$ z@y5xSNpMrngz6M%*@#Vz;ulP@u_)qN{z;e;Y_`6670<5Qf$B&k>SpnNE|(9?C) z){UO7*>6qHVQu|nFt|_lN0ROG@GL0lGisKFYz`pa(4Ddp7;38-&<86exK_PT1icns z%C#P8$jjFpy~~VOYWE~FrJTZYHdg)6ZcFG0-gdP8D;|I4?^h(*9&95hRNTK{uP^eF zM-qr0@6&wWdKa}n2Zon57RBBhD(>dbmk$Z}_9wU@weR;BXE~3ZR12;BIzg40d z56JayeAXcnnw|QCzP95MwJeg7t2?gZGvQ*(Grc7g*yFqLn<+@rrbb2$dRe^rWUF~l zZ##y}b`WuH{e08&KKE%8x9T^x{{jT?+Yx_%oD^8RYoYhXe~F2B`B3j{B^)aMfft4^ zC{hH*C{LiCUqs=oDS0iHrxJN8m8V7Wr$Q7FEAWg*5iz$s-8+%%^7D~+86uOi|BwmCL%W`arbH~pb8!9Q>gi0_i7I}t=Y6Q4IbP6X2AZQ&yJ+z zXx)Xig`O1tr!^LOdQY#rg2z7mckz1qMf!%E#6MZ&1Ip;dkeoT*7e$l-&;-PXx%(o; zQ@+r9bw@&ZZ|~LWi;4*1K~`;L^cin9c)62)s?@^#c z=&;m40UY3Fs|PD@-=0OaM7G21uHAC=%dgszlV2P3^w-u~gon%3g1xwoXg*Sv$~gkM zIpqTo9k39pm^58BHnz7-=6?8IZ)iN>5Pt$v=;3E9@)*9)B9Dn1jS_^$`Xtv1d}$?TZj`w{DftY>eCC|;!O=9f zMxF=FiN;w6|7+EkFPwK$n`cT29W&Im2Z{a-R=0yaOcf8S~6hBZLWR*Nw~J zBO52XQlOPxZ^=F0l6t(^t!M!?@fAM^_7{fCGtm<4oQ|PT%z>AeIxk+mnMh2@*ha`H zsO(H>tp#~HjKeG!Xdhkh?s23A-3}>eUKfGb@cy!0?-A;*8!st3EL&wW2~HW5ge<7` zn7nckVzu%uS2jBLdW7RBqpbKG+xYY*zp^D)$uCvZ@(a}lav7UTFwa2QrJP^L@_=Na z=p+2ve4R&53e`!9-7fV#!y`W;`4XS%MN)?GFBW}rm_;jwS6WpW^th94V0~0bHrB@q zmHiouJE3WdFaZOxYS8z39+6)|j61J?k7lJE)hWd>(;^)ZuYrgo^rbLZ zSVD@+SJUK7a@ovVUp*5e`T0W0-MrgGTOE%+sVHesq(ms@glWj)K&e$ z1&jn@_n!Hq0}LYaWFqiDo4KBMx~o;Us*WHldfRM#n2t!=UX@mD1vCI+B7u_g6Ng~j z^Bc>@%{G&yK2E_mOFe9U#=qpP)T)((meM4eL8*}|+>CcPu)=yCG{>tPT&T02?kUFe z3H5+Ayk%G=Ea&-BJo(>qTrB^4lzCljF*Uh)WFth{C(h$1&ph1yfK8lifC z@xwi(d=@4dn2E`-n&DzTfw!utGU&}XB+!;qn3z7ps7ZF6?_@;jWwviSvlEojMxhCu z6t1HF)!$RUt*icLTfV>k2dF=Kv(zhRoX^agpR%hF%UCK|toxJ@e6RTzd#WwgPgnLN zbgl})9(EUv7ORSk7)BN0byySw1c+4Q@p1%Lb_;iUO6Am&WA6DvFu=l#=n-LQJ6D?^ zj~nEX!|RG*k*u*t1PH9Lzm^gq6Hy>2D-#u{L6;6wNaxt;MbeoqK_IFV`B}AOiXP*S zpy=29!ZV9B5FOX`Ebyix!6nq(*CWfOGin($P0DeT*f=RSSx2_wXYDGa2$i{bc~sTu zN7@G9fBUvf?4&HSZf+7nHLYecldHLyY2}sA*z;A-d?->ai^k8)<#TW>;|qPZ`e!-g zcl7xhuq5L6LMs05b(xhT%rm&;H*V=#n0p$}q~@2b!6$lcIup&6N`BU*_y@t?SIFwy z!{7tP%1kZGY8@GI5m~Hm`HZ3*(a!iIV=wkc9`$6AStiUP6=;uGF2MF6h7Ky z2a;_D(km+Sx$X2hSyh*&`YC!7HBl#qp1 z76D}QIF7hVx`Bn#J4~QbkB$3Gq&?^Ojm0c@B$Vk0Zmh@?{jebnZPB|8P%3#|Rf1;v z9WkK~GJBWaBVKeXqsUHl^iPPzHj;-DU0n$LZ{I!4~P(yS2Uo0O>KlGyF?GFo0L=d+q` zIL-t!5iF22v(Ljv<71QawfnZ_AK%(hm^+t?QR^qgE;6sHV--gnQ*bKoEOYd?-%%#U zZO%QrQJy*943B7!hupTt{1hgmg6+iO2mQthS9wZF)r+!x7}gfHZ22Z56_$eyi4CX3 znRqR=HHIXo9pPAB!6L1?Mm|IeN-!9Mc)^N_E;?JNN@zg|WeZBJq6-#*u2d)Jzy1Tr zJoA^MG%PB%3&BNFJOK<*;9xtb9+hwsOj>d^e>0XAiR`}I?VT6EFj>c{mHUPEnY(v` za0uaJQGEkFk$+XPmjG2{TurHJ5`c2CdFMU^A{^zX%XyvUecUX6hl_1$Z}Q-FBkngM z*0KT$i9|stVtDs1LE?{j7A9hU;k z|6%p&;Y&pzg1szSo+(s$hg%O{l?B@56s}z`vT*IA@@~rtfw`tPf3OP-$kYlIId?*`rmT)+TW2#j? zpTVfuV=8!HC+5h_L#DU(7I#tY4a16RZ#jD{8<4kl@;Q(*@0+DIUN!cw_4VaR-nrZ; zYIbZ1T9!3j8TL+kAYiEH7m=i_SXb~0F)6}&_yQ01RCfF(5Y)SUk(qJ*c}`IBFHIlD zC2lS;Wz;62JgRq#=>7{rv|^7z+44p6&3Ch8Lu0)ru#pHjJl4{X+;q-z*uS$>fvB){ zu^OcyCZCw!1zAv<9OiMgJ2zX68Nfi+k(=O^?<%b*Z$t;eMCW(*}8F7 zp()GEah9syF<#!9953>f>7;=R|9KSO?<}>F`{`lFV)L-S*m@56Y; zUPzzVAo1Rf$Wiy9H|Tm|^?$ei^xxz%8_(c;6mh)rUzNzF&*ptriO7FdV!{qeTxXTI z`oAhML)yrpL^rhzm&&IsnFHMc(HEl~L4_J#=?X+{Q2Z#D6cVW6qi?vpr7z^x5#Jd| zz8=CZP6_^D&8%++yDpcsy&(>z;@jQEEiv1Iz1R-o84pAF^~fD=bJcrr1Ccv&&8&3h zAuN-)w6qhh(UQB;m>s0sle0KX=Ey-ZgBwG7ko70j%!o;r9+{bgTrdkYevbLYC)}dK zsUiaP^M!Bbaw5ddqnK_zJcU*Y7GbGt5BB3W9kxkCu<3|_xttz`w4O@_BRC^4moD>; zs-tm<5(wQ6Q+Y8+D#<@>6}AOciy)mFqRQOE`7RO~Qz1ll1@G1(RYy_!sOVNW0I4uk zmqU3rOqBAxn0~D1TdQ}hJvgYe%To1dzLb&pdH|a|bvW+N$GZ!A!3fua$0=J67#_9mwMyH6=EAiAS{)e9fTE` zut4YokaJ#Xq_?Akmc0sNjrC$WX@;G01CAQ6J$Q}`fV@nw`M0S z7B$P5SW#m71slR-QSR2=)SVmF$q6emT6CjkP0JwL!bYnK`$9c5cDQ`C1#`UNRhecn zbEgqJlzHn{I@JFa*Y;xsvRZH*htVLpP z_`*ZIYj1JV!Lh?1pxDCjC{^72oym)C46#!4YcEjAv10GqshPRkf){G*kC;!hToS^OMa_I+#~jYOv6pdR7|>*^7N_*`k+? zP87WXCc%4rKy0vPx~If!DHMu2Za8V?14G*4o3A1!X3l(b(b?^B zwGV^ex>E_0(6Jagyi949&3LbSoJ;s?q#6*CV-S%N2wrKt7!|B2>a?1Vgo*0LcH_b4 zh3j64*u7l~jTUZFT(n6G-|7~wiH-S(P@*Dw+~@OsFdPd~)<6p5&4?w;>mNVU=3N`e ztp6x^qb(`f_SOO6q!6O-GtZ?eFG!po2zxkB?K5Zp=}a^r$8c^0e@j8%>#04H-$ncm zmL;Dh3tiZrQL;8OWjT-LVJN?2rKCkAgmAHkqIW)OW;}ri;0@NFHyq#qKoyFCYBl@P zx-Tqzn`ndbOs)Dua!HL9$~H?JIRoJ$7cj-U&a3@B-J{j?71)Fw>ke}$sA<<~`tc4C zB6z0^1#!I`nSVf{FAVUxO(WF&O(1eX3N{uT3FXA7{FSysV&o3FN{z($j2wY`^=}k) zY0}mQJp%+9p9rK`oG?bM<{eYz{B=A!MrC^EJ0LpZM2MyV{r^{p=CG!^L-eXAf#?Jh zPlV`8^eupXO+nO`caR-PEmUAGHVfd;O)~N7-2B0EOdDXVGW|vtXmfG+JeFO$2VnaI zqb!>xSh+_&7fL8Tn@}|QM1g%~{rWR)u~jFwKlY^d`+R5n^Ln=b)Y|W8-+jvVOP`ga z=Su!pI?b_OjqL~m&}#1X_p?Rs2Nz_i=E(RM9F&(+6013W5xOqpP{3$6pNt%Z!Ikw^ zIo=P)4^p<7pZ`s29UuGADN8@qRr==6(m^~I!FBTih91MhC2=$^{j=0Gf$H&a!BF`_ zQ%o+g#ISa>xXxzNW=?7bwqk|W1Q#&+KaDU(o4*!+z*1yK@gxqnD?0fTg5-DLrEF#j zFQdKSg_(|kvDNHb1|>7h=!d9Oxt7m7uHM^6*_pQi(T_yY8X0%3G%@OQpIa?toVj73B9!+VFp7>nDsBb z5>ZDs_J|&9W}%fXf8OVKT^pN3Y|lH$hqRa@hcSiYU=Ml431I!v-cy0~PYRtKmEFNQ z7z8{Ktkb^>tnq2-@SRO*LL*1k-!s_>FBMEkE+%s?kH|gpahwrvcE@E>i{-jJfXvB~ zH=*v1o=Il&v4w3gyOkd|7Npo??{n@=XwTO(y;76;`w`+r>)85*nq_8K!j39iG$eQ; zQo;@$9IE`N`(V3{--eh9<4j)wQzk}u1(`7)Q#0Z-wZ)qk-pj%bPvrv}xL8Azm!PGD zQv${A7Ze+uC}(}^2cBhuV?+4w7Cghwa2}>XEKd8EX76QU*EU<}oy>a-A&Cyp{_Y(Y z`_JiDkv~oC5jTJ#3;~l-r)5MJLWCd(7lc`vu+DDT(bTesBE@(5Fp0n|os&qM`0Vdu z=7qNcX9kz4oq@Gacs$QevuH>%s{d6v$y)XM%u$yog)e+}1v`prE!`K{C@<#TU*WYK z-YA~fzVP}INjfrED%-e%XMf(lAQo!tt0ev9{>QksapO99?tdnEA{$%eIaQvi!eQkf zD)sPeMkIfD<076(s*t4LQgtA*Du?9SMD}#Pt&?we@eSc0-r9`MERn9$7!b08#fCOY z!2YD5^jx0I%g6!Ui)Zvw-ZBL)HLyWq4`mUN4%4^jfCoF=q7$ZYD&T9ECB_vuir00* zrTao&m;&a=a_PQ(P?t;hi~YJ>x?cn2dIXp5GWwxMUKCc*oFmUYUAo_2B$fAY>0UXh z-+%4WUBX@fo-r0Ntm+ae-mR)dq^Kl_E7TiCTGQa(BqU>#1heXRhpp@O&hxc7T_1CM zd<^?^^{#w|dYo28hG>}|7OuVFoWixM-T7;88CJOVma`KE+=aCZJ^sSlJ3YE^biP9V zT*)DBiVZIik%6I95tpl6BseABs&7-Y>g_;F3Z!}EaP+?4*lgAeCxCt=A;B{2ggz>) zz1Bt4gQ``|Bz!9()%iBgJ3?ZMiSbpJTsx8NCbKMb9ZQnNL}&Q=2$5E)s7Umgyw#p6 z`8C*;GIoQp!hyg_^V+AT9OI+NGfE_*8(1Y^ts5$Hlh)_<{|K+5156cAvtmS+w1T{8QYPzDezV;C zHcran`<-Y(~VIn7AKqRI#Dd z#F3sE8!xO|aW}LQy8LtKG9a+Zv-9KkWtDgIQ{_deEE~frHSzu41{q|kLx7~HI*y$s zWLhVm!jpVBuF9U6Gxtj9kn>A1#37iX{-s!s9_azM%GuY?zu29BjDpHKs`PKfFUgs_yXk{)*ui&Wszi8DnI2CK(YEjTq}8yiE$(`5b)dpa}} zoDHrNK;&X5+Afgjs@K-DUJxR|hysO(<9EA|*ePHLI?l{AYp5Dogb?Iz41Et`UCWS_ zaXJ!#$u719IAz33+{6f`%gJ7ZVCtxb>k75YwDq}dr7Zl9i6Wx}4^tT20+|O(?%y+1 zmk38HW9`DbtyE{g&&;-+4#C}xS^xD=iPJ>%qATH2~J8MnxAyMY27>F3`K4tB_CSoEG6 z98Deg9_drAy7AwGqfGUva+RDUMaTMg4A1_r@R-%n-uJ-cqdWc!c$m@ehX+DLg`gs`YO90iH0M$cICiOgh3#CGVotGAhDnNx6sMVIrD$ca-08N;G~5tJZfD^~ z95+9#^!MthC=vq|VeSKS=j-%2ad6`w!E2mCnvY7=)@5|EK^nlAS8iIMbA zsmG?j)vTXZ08SL-2J*gM);nPTDprPL4pGKN7BC4Pn!g}snkb<4k(j0|$Onp}JlGio zviJMB-ZJ!QJNojaXG{x^y4XK*sVZ?TCHx~VMWW`6?e&H}Nuy;wJPHA#3Iy~ssgU+i zqvcy{a5t;%@X*j5E_)>x@!pZymD(>2ViKO$MK z5RzLFtsN;>l+Wxf(i4H!puvM}vU`UMoS`xH%E8auUj6l$>|G;Uxi`CLSH5z%ro1S3pG5)qQZG>AxA}RDC{F0}Ny2B571hKJ+j`o*orn)d1l4|9; zl?g&eUAUPy$h95H^hwrwCMi4MXW|p+2@dSilOlET@?qseDymwi1mzLpOXGlw*ysj+ zSH_Y|>7j9OWb4T7@r-|NS!ffn=D+BHy5B?;y6O&LPRViquy$SDEqX4Wm3rq%9_s9O zJN`r15;@OZ@-Gb1h3^?GW0s8;?c7cD4}p9Y;6WtKi!{y6S_CHN zuR!$NnraWGi;gEN7GU%-T`H-djukXQf-;)LYPS`$-aYawE0qc^f?_eQRg7y=CPLbb zQQKrZL8o%NVl1KnT(d={u-isbZ0^2_^GHLpTWlW);fy&~FQhf`;rDM}C^r2FC=|0n zO^7wb=nx}PZ%ZpiMCx7(Jq)=N2Na12BTNu$`2ty>P+Ynq6!*1%o+rjL7t?ZA#OS}B z1s#J(pm6RHul3htmRx)i7bx+{QT2ysx^;;}Z!|_Pb;sjt9gTpU@I%p>YtdVClbQs0 zBT}0qV=1OV8M9;f@1TLF+a>IVY}4wLfa9H5?H0;RCBm6)ur9&OR1+z7DI+MMxsv5hw=m*0wf|(C|1^@z^O)JjtD`g5 zo|!PsA$k-SNvH#H8v$9+L^$D^kP})K?8Y`T4ll1{=ibm*k3Bd^*%FWeP9N?mp7C@8 zQ$(Zd+4KBHj^8K+PfA<}MUSxqUqGug2`JrykaD+tbdMqSb1Z7voL>9_EDKKvPa5@v zORIT#Qat{ITdQ&0gTBocjuVF?e7R!dUd5r?ES(D)KM&E6e;6Nat4v~sEThvURHQKZ z$3N$a>;*1pWO#DQX8SBxG(rkjsO`NqnT_Qt%pXFVv8MaDonQL;p?RNd*B}vV0=tlU zr?^>S)D&6O9v{B6aiJ|f{Kx$5Qq70<7b8tZYbwUm;(L3UFI1Le6XX6WI_5J5idYvH zj|RdkZS%5Z11wixUISZFgV&fOlpvmwT`!WazW(f}&o0UZ!gctwkI1vjhdrb>RECpw zs4P>S+_s3$=9#A56QKd%TJbu})Pi&?-Z%DQIpQ>zt?IRJg;a6yf`Mm3kS%U9A8$S$ z_f}1?RYJvC7O@LqEiXb=nG`!iNi0wIh9{LaB@1A=doK0^5^YV%vgyY9!}EvzsMyb8 z9y{f=#hugzF!?>{LIO~9Tj$&rj|tZ$`ddR&bB8p?GIY+k5RsoHwt$^ip?F9Cx~|k_ zj&27FjF$4=vk&W!t<{T_{QEEmVrD)~xzasT)BKTCh-Qt~|iZJ3gW);WhJl zbh2`I)PZ}kz`cZc14LY_`J!AaDL*ui*qFe6_mAmE1&f49Os8*9#B`2Dr~8ddm4Xu} zg|_4)=@Or97%Z`F6?mkZSKCjtCoE*ULr@4317l%m5eI+G?i&cBM6X~9q3FlWKfWTu zx1|t-LxJo=OBP6^z<`~;U||~=QRxz&(gB7XR#0Od5PM!WBq}s@ffMS&KyoF8Ws6b) zC$JO^aB$mXND7% zQlg;{P)f82w&h*%X2+@RQGK#(4)1zdcG51>#lE;sf(r$74FNa&R`-i$5@ceZd0$iz zq#e%*0D(w;H86G~mDnCkj$iAvyn?|sbfTCYu@i`d9?RK!vFSoWN{Lj-j6y;J<6Py` zM;_HjHt4-}Rc3JI1RqIPp1|=^_@-6PIN)kTQ>=%@p)<%1b%zr#8>SdbC+EoR@W;~9 z6jx=cD#i|nDHVR_vQ8+_mv{pAOtGAc<50xNxTL><=Vu)iYA3i)pt|izR%a^@NeOfh z(oMEAtmELzZg3rw9!EuvDWVR?yMHakTx0X*Vv}_VW4J#PiKXHI6`{w?BQkn7dDN0? zB2t_Ay9;4fL`WPSs+{@7><*{x^Vd3V-VM=q%_q*vORQB|9}MYJHjI&s?bN|6C{eBX zZAn`kexTen&m3vecWyTg609QQQOP8MU(NT(p`3@0zcL;IGIIOK`uOlqU%(ALo^cr@ zF6^w?F7~2T+O&q*mNttXK{X@eK3se*z4gwMNIxGE2E>Wl!5e?4rvA2m=0*spgtqw9 z*i>kI9ZNDc5k$x86?+JmV^<3lY%{oTzKbxg+22k}>O^pJsV_1&u8*1TT6(UJUjGBG zbruxO7g`M=P_{3a>AK<>Kc|n;aeUEg@esd$Oe&xqyTuDbyyv$}Oe7P<^|ch=OvrdP9*^ zynvFiWItz_P?X?L_euNV>K2I!8~YWfnoLeLy0LPDR*gptpJutAmoDhW{bG6IH?FVq zMeuS}?L7C8N4jNv(C}HZucK4UE!)D#_|&|cTAVQcP1@umL^Z(Zs6D@m_yEmp({18D zf_ISeZT&zGeNIojG&e2$=vS&IzX^oT^AQq9aMLK-z%Te)v{N55w30R7X66nQur^`Y zgz$3lYZZP24lz7q1LVvp4?E>S6i*$|WL&c(?88LtF3o^P3B8uSf^u8NYm9VX;;{R|7gtRXc%* z{FBNE2<4iV#h+QZ{F$#q^l4M4$zob8Q4N-mNPE*3!7D8)YpN1JqCPR65YYM!w`JX1 z0%Zs=Dtxb-yl$zV-z*@7-!;PYHCqJvIyc6-n|-WjBe0Enfm@)SU*Hx%{ndoL_?zC# zF7O+V6@vkKQ%wm!QX#gT4lVSAs=B6>L>Wl*F`0bh-76!bTKw6Ew7a*GNVpM*L=%Kz z!0Wv7Jx~|VnDN{~+ce|JucY716Y#6CQH#JKU(2p(VU~G5X&$m4hCzsH+4t{MKaqO% zQ&Y!}Z*gOVFET0xJ3}r_YpT!}�@2XY60ks=1qX6RRWga4zl8eY|n9P7}ze?gK}5 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 z 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

    ix|$mvgkQcS;&1< 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 PE;H`FMKAnh5#)aXl3_?W literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/system_info.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/system_info.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2ce202cd31494ce0ee6c4ae2a66c7306041eb4e GIT binary patch literal 14957 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 AHvj+t literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/target.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/target.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deccc8b612c8c3b690fc8e282c25e935561297b0 GIT binary patch literal 28922 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 ImW9Xv3)Z0SV*mgE literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/tethering.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/tethering.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb0b2b265015bc3b57c92d021bf3df8d836a16ba GIT binary patch literal 1983 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/util.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e96027d8ba71824a2ef87195f678b121876d32f GIT binary patch literal 1114 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 a0^b?~*@r-CXx5vew-#>J_Yj*A{rrF3*C`DE literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/accessibility.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/accessibility.py new file mode 100755 index 0000000..7977f09 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/accessibility.py @@ -0,0 +1,647 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Accessibility (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import dom +from . import page +from . import runtime + + +class AXNodeId(str): + ''' + Unique accessibility node identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AXNodeId: + return cls(json) + + def __repr__(self): + return 'AXNodeId({})'.format(super().__repr__()) + + +class AXValueType(enum.Enum): + ''' + Enum of possible property types. + ''' + BOOLEAN = "boolean" + TRISTATE = "tristate" + BOOLEAN_OR_UNDEFINED = "booleanOrUndefined" + IDREF = "idref" + IDREF_LIST = "idrefList" + INTEGER = "integer" + NODE = "node" + NODE_LIST = "nodeList" + NUMBER = "number" + STRING = "string" + COMPUTED_STRING = "computedString" + TOKEN = "token" + TOKEN_LIST = "tokenList" + DOM_RELATION = "domRelation" + ROLE = "role" + INTERNAL_ROLE = "internalRole" + VALUE_UNDEFINED = "valueUndefined" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueSourceType(enum.Enum): + ''' + Enum of possible property sources. + ''' + ATTRIBUTE = "attribute" + IMPLICIT = "implicit" + STYLE = "style" + CONTENTS = "contents" + PLACEHOLDER = "placeholder" + RELATED_ELEMENT = "relatedElement" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AXValueNativeSourceType(enum.Enum): + ''' + Enum of possible native property sources (as a subtype of a particular AXValueSourceType). + ''' + DESCRIPTION = "description" + FIGCAPTION = "figcaption" + LABEL = "label" + LABELFOR = "labelfor" + LABELWRAPPED = "labelwrapped" + LEGEND = "legend" + RUBYANNOTATION = "rubyannotation" + TABLECAPTION = "tablecaption" + TITLE = "title" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AXValueSource: + ''' + A single source for a computed AX property. + ''' + #: What type of source this is. + type_: AXValueSourceType + + #: The value of this property source. + value: typing.Optional[AXValue] = None + + #: The name of the relevant attribute, if any. + attribute: typing.Optional[str] = None + + #: The value of the relevant attribute, if any. + attribute_value: typing.Optional[AXValue] = None + + #: Whether this source is superseded by a higher priority source. + superseded: typing.Optional[bool] = None + + #: The native markup source for this value, e.g. a `` or elements that triggered the + attempt (in the case of attempts triggered by a document rule). It is + possible for multiple rule sets and links to trigger a single attempt. + ''' + key: PreloadingAttemptKey + + rule_set_ids: typing.List[RuleSetId] + + node_ids: typing.List[dom.BackendNodeId] + + def to_json(self): + json = dict() + json['key'] = self.key.to_json() + json['ruleSetIds'] = [i.to_json() for i in self.rule_set_ids] + json['nodeIds'] = [i.to_json() for i in self.node_ids] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + rule_set_ids=[RuleSetId.from_json(i) for i in json['ruleSetIds']], + node_ids=[dom.BackendNodeId.from_json(i) for i in json['nodeIds']], + ) + + +class PrerenderFinalStatus(enum.Enum): + ''' + List of FinalStatus reasons for Prerender2. + ''' + ACTIVATED = "Activated" + DESTROYED = "Destroyed" + LOW_END_DEVICE = "LowEndDevice" + INVALID_SCHEME_REDIRECT = "InvalidSchemeRedirect" + INVALID_SCHEME_NAVIGATION = "InvalidSchemeNavigation" + NAVIGATION_REQUEST_BLOCKED_BY_CSP = "NavigationRequestBlockedByCsp" + MAIN_FRAME_NAVIGATION = "MainFrameNavigation" + MOJO_BINDER_POLICY = "MojoBinderPolicy" + RENDERER_PROCESS_CRASHED = "RendererProcessCrashed" + RENDERER_PROCESS_KILLED = "RendererProcessKilled" + DOWNLOAD = "Download" + TRIGGER_DESTROYED = "TriggerDestroyed" + NAVIGATION_NOT_COMMITTED = "NavigationNotCommitted" + NAVIGATION_BAD_HTTP_STATUS = "NavigationBadHttpStatus" + CLIENT_CERT_REQUESTED = "ClientCertRequested" + NAVIGATION_REQUEST_NETWORK_ERROR = "NavigationRequestNetworkError" + CANCEL_ALL_HOSTS_FOR_TESTING = "CancelAllHostsForTesting" + DID_FAIL_LOAD = "DidFailLoad" + STOP = "Stop" + SSL_CERTIFICATE_ERROR = "SslCertificateError" + LOGIN_AUTH_REQUESTED = "LoginAuthRequested" + UA_CHANGE_REQUIRES_RELOAD = "UaChangeRequiresReload" + BLOCKED_BY_CLIENT = "BlockedByClient" + AUDIO_OUTPUT_DEVICE_REQUESTED = "AudioOutputDeviceRequested" + MIXED_CONTENT = "MixedContent" + TRIGGER_BACKGROUNDED = "TriggerBackgrounded" + MEMORY_LIMIT_EXCEEDED = "MemoryLimitExceeded" + DATA_SAVER_ENABLED = "DataSaverEnabled" + TRIGGER_URL_HAS_EFFECTIVE_URL = "TriggerUrlHasEffectiveUrl" + ACTIVATED_BEFORE_STARTED = "ActivatedBeforeStarted" + INACTIVE_PAGE_RESTRICTION = "InactivePageRestriction" + START_FAILED = "StartFailed" + TIMEOUT_BACKGROUNDED = "TimeoutBackgrounded" + CROSS_SITE_REDIRECT_IN_INITIAL_NAVIGATION = "CrossSiteRedirectInInitialNavigation" + CROSS_SITE_NAVIGATION_IN_INITIAL_NAVIGATION = "CrossSiteNavigationInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInInitialNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_INITIAL_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInInitialNavigation" + ACTIVATION_NAVIGATION_PARAMETER_MISMATCH = "ActivationNavigationParameterMismatch" + ACTIVATED_IN_BACKGROUND = "ActivatedInBackground" + EMBEDDER_HOST_DISALLOWED = "EmbedderHostDisallowed" + ACTIVATION_NAVIGATION_DESTROYED_BEFORE_SUCCESS = "ActivationNavigationDestroyedBeforeSuccess" + TAB_CLOSED_BY_USER_GESTURE = "TabClosedByUserGesture" + TAB_CLOSED_WITHOUT_USER_GESTURE = "TabClosedWithoutUserGesture" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_CRASHED = "PrimaryMainFrameRendererProcessCrashed" + PRIMARY_MAIN_FRAME_RENDERER_PROCESS_KILLED = "PrimaryMainFrameRendererProcessKilled" + ACTIVATION_FRAME_POLICY_NOT_COMPATIBLE = "ActivationFramePolicyNotCompatible" + PRELOADING_DISABLED = "PreloadingDisabled" + BATTERY_SAVER_ENABLED = "BatterySaverEnabled" + ACTIVATED_DURING_MAIN_FRAME_NAVIGATION = "ActivatedDuringMainFrameNavigation" + PRELOADING_UNSUPPORTED_BY_WEB_CONTENTS = "PreloadingUnsupportedByWebContents" + CROSS_SITE_REDIRECT_IN_MAIN_FRAME_NAVIGATION = "CrossSiteRedirectInMainFrameNavigation" + CROSS_SITE_NAVIGATION_IN_MAIN_FRAME_NAVIGATION = "CrossSiteNavigationInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_REDIRECT_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginRedirectNotOptInInMainFrameNavigation" + SAME_SITE_CROSS_ORIGIN_NAVIGATION_NOT_OPT_IN_IN_MAIN_FRAME_NAVIGATION = "SameSiteCrossOriginNavigationNotOptInInMainFrameNavigation" + MEMORY_PRESSURE_ON_TRIGGER = "MemoryPressureOnTrigger" + MEMORY_PRESSURE_AFTER_TRIGGERED = "MemoryPressureAfterTriggered" + PRERENDERING_DISABLED_BY_DEV_TOOLS = "PrerenderingDisabledByDevTools" + SPECULATION_RULE_REMOVED = "SpeculationRuleRemoved" + ACTIVATED_WITH_AUXILIARY_BROWSING_CONTEXTS = "ActivatedWithAuxiliaryBrowsingContexts" + MAX_NUM_OF_RUNNING_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_NON_EAGER_PRERENDERS_EXCEEDED = "MaxNumOfRunningNonEagerPrerendersExceeded" + MAX_NUM_OF_RUNNING_EMBEDDER_PRERENDERS_EXCEEDED = "MaxNumOfRunningEmbedderPrerendersExceeded" + PRERENDERING_URL_HAS_EFFECTIVE_URL = "PrerenderingUrlHasEffectiveUrl" + REDIRECTED_PRERENDERING_URL_HAS_EFFECTIVE_URL = "RedirectedPrerenderingUrlHasEffectiveUrl" + ACTIVATION_URL_HAS_EFFECTIVE_URL = "ActivationUrlHasEffectiveUrl" + JAVA_SCRIPT_INTERFACE_ADDED = "JavaScriptInterfaceAdded" + JAVA_SCRIPT_INTERFACE_REMOVED = "JavaScriptInterfaceRemoved" + ALL_PRERENDERING_CANCELED = "AllPrerenderingCanceled" + WINDOW_CLOSED = "WindowClosed" + SLOW_NETWORK = "SlowNetwork" + OTHER_PRERENDERED_PAGE_ACTIVATED = "OtherPrerenderedPageActivated" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PreloadingStatus(enum.Enum): + ''' + Preloading status values, see also PreloadingTriggeringOutcome. This + status is shared by prefetchStatusUpdated and prerenderStatusUpdated. + ''' + PENDING = "Pending" + RUNNING = "Running" + READY = "Ready" + SUCCESS = "Success" + FAILURE = "Failure" + NOT_SUPPORTED = "NotSupported" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class PrefetchStatus(enum.Enum): + ''' + TODO(https://crbug.com/1384419): revisit the list of PrefetchStatus and + filter out the ones that aren't necessary to the developers. + ''' + PREFETCH_ALLOWED = "PrefetchAllowed" + PREFETCH_FAILED_INELIGIBLE_REDIRECT = "PrefetchFailedIneligibleRedirect" + PREFETCH_FAILED_INVALID_REDIRECT = "PrefetchFailedInvalidRedirect" + PREFETCH_FAILED_MIME_NOT_SUPPORTED = "PrefetchFailedMIMENotSupported" + PREFETCH_FAILED_NET_ERROR = "PrefetchFailedNetError" + PREFETCH_FAILED_NON2_XX = "PrefetchFailedNon2XX" + PREFETCH_EVICTED_AFTER_CANDIDATE_REMOVED = "PrefetchEvictedAfterCandidateRemoved" + PREFETCH_EVICTED_FOR_NEWER_PREFETCH = "PrefetchEvictedForNewerPrefetch" + PREFETCH_HELDBACK = "PrefetchHeldback" + PREFETCH_INELIGIBLE_RETRY_AFTER = "PrefetchIneligibleRetryAfter" + PREFETCH_IS_PRIVACY_DECOY = "PrefetchIsPrivacyDecoy" + PREFETCH_IS_STALE = "PrefetchIsStale" + PREFETCH_NOT_ELIGIBLE_BROWSER_CONTEXT_OFF_THE_RECORD = "PrefetchNotEligibleBrowserContextOffTheRecord" + PREFETCH_NOT_ELIGIBLE_DATA_SAVER_ENABLED = "PrefetchNotEligibleDataSaverEnabled" + PREFETCH_NOT_ELIGIBLE_EXISTING_PROXY = "PrefetchNotEligibleExistingProxy" + PREFETCH_NOT_ELIGIBLE_HOST_IS_NON_UNIQUE = "PrefetchNotEligibleHostIsNonUnique" + PREFETCH_NOT_ELIGIBLE_NON_DEFAULT_STORAGE_PARTITION = "PrefetchNotEligibleNonDefaultStoragePartition" + PREFETCH_NOT_ELIGIBLE_SAME_SITE_CROSS_ORIGIN_PREFETCH_REQUIRED_PROXY = "PrefetchNotEligibleSameSiteCrossOriginPrefetchRequiredProxy" + PREFETCH_NOT_ELIGIBLE_SCHEME_IS_NOT_HTTPS = "PrefetchNotEligibleSchemeIsNotHttps" + PREFETCH_NOT_ELIGIBLE_USER_HAS_COOKIES = "PrefetchNotEligibleUserHasCookies" + PREFETCH_NOT_ELIGIBLE_USER_HAS_SERVICE_WORKER = "PrefetchNotEligibleUserHasServiceWorker" + PREFETCH_NOT_ELIGIBLE_BATTERY_SAVER_ENABLED = "PrefetchNotEligibleBatterySaverEnabled" + PREFETCH_NOT_ELIGIBLE_PRELOADING_DISABLED = "PrefetchNotEligiblePreloadingDisabled" + PREFETCH_NOT_FINISHED_IN_TIME = "PrefetchNotFinishedInTime" + PREFETCH_NOT_STARTED = "PrefetchNotStarted" + PREFETCH_NOT_USED_COOKIES_CHANGED = "PrefetchNotUsedCookiesChanged" + PREFETCH_PROXY_NOT_AVAILABLE = "PrefetchProxyNotAvailable" + PREFETCH_RESPONSE_USED = "PrefetchResponseUsed" + PREFETCH_SUCCESSFUL_BUT_NOT_USED = "PrefetchSuccessfulButNotUsed" + PREFETCH_NOT_USED_PROBE_FAILED = "PrefetchNotUsedProbeFailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class PrerenderMismatchedHeaders: + ''' + Information of headers to be displayed when the header mismatch occurred. + ''' + header_name: str + + initial_value: typing.Optional[str] = None + + activation_value: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['headerName'] = self.header_name + if self.initial_value is not None: + json['initialValue'] = self.initial_value + if self.activation_value is not None: + json['activationValue'] = self.activation_value + return json + + @classmethod + def from_json(cls, json): + return cls( + header_name=str(json['headerName']), + initial_value=str(json['initialValue']) if 'initialValue' in json else None, + activation_value=str(json['activationValue']) if 'activationValue' in json else None, + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Preload.disable', + } + json = yield cmd_dict + + +@event_class('Preload.ruleSetUpdated') +@dataclass +class RuleSetUpdated: + ''' + Upsert. Currently, it is only emitted when a rule set added. + ''' + rule_set: RuleSet + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetUpdated: + return cls( + rule_set=RuleSet.from_json(json['ruleSet']) + ) + + +@event_class('Preload.ruleSetRemoved') +@dataclass +class RuleSetRemoved: + id_: RuleSetId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> RuleSetRemoved: + return cls( + id_=RuleSetId.from_json(json['id']) + ) + + +@event_class('Preload.preloadEnabledStateUpdated') +@dataclass +class PreloadEnabledStateUpdated: + ''' + Fired when a preload enabled state is updated. + ''' + disabled_by_preference: bool + disabled_by_data_saver: bool + disabled_by_battery_saver: bool + disabled_by_holdback_prefetch_speculation_rules: bool + disabled_by_holdback_prerender_speculation_rules: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadEnabledStateUpdated: + return cls( + disabled_by_preference=bool(json['disabledByPreference']), + disabled_by_data_saver=bool(json['disabledByDataSaver']), + disabled_by_battery_saver=bool(json['disabledByBatterySaver']), + disabled_by_holdback_prefetch_speculation_rules=bool(json['disabledByHoldbackPrefetchSpeculationRules']), + disabled_by_holdback_prerender_speculation_rules=bool(json['disabledByHoldbackPrerenderSpeculationRules']) + ) + + +@event_class('Preload.prefetchStatusUpdated') +@dataclass +class PrefetchStatusUpdated: + ''' + Fired when a prefetch attempt is updated. + ''' + key: PreloadingAttemptKey + #: The frame id of the frame initiating prefetch. + initiating_frame_id: page.FrameId + prefetch_url: str + status: PreloadingStatus + prefetch_status: PrefetchStatus + request_id: network.RequestId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrefetchStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + initiating_frame_id=page.FrameId.from_json(json['initiatingFrameId']), + prefetch_url=str(json['prefetchUrl']), + status=PreloadingStatus.from_json(json['status']), + prefetch_status=PrefetchStatus.from_json(json['prefetchStatus']), + request_id=network.RequestId.from_json(json['requestId']) + ) + + +@event_class('Preload.prerenderStatusUpdated') +@dataclass +class PrerenderStatusUpdated: + ''' + Fired when a prerender attempt is updated. + ''' + key: PreloadingAttemptKey + status: PreloadingStatus + prerender_status: typing.Optional[PrerenderFinalStatus] + #: This is used to give users more information about the name of Mojo interface + #: that is incompatible with prerender and has caused the cancellation of the attempt. + disallowed_mojo_interface: typing.Optional[str] + mismatched_headers: typing.Optional[typing.List[PrerenderMismatchedHeaders]] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PrerenderStatusUpdated: + return cls( + key=PreloadingAttemptKey.from_json(json['key']), + status=PreloadingStatus.from_json(json['status']), + prerender_status=PrerenderFinalStatus.from_json(json['prerenderStatus']) if 'prerenderStatus' in json else None, + disallowed_mojo_interface=str(json['disallowedMojoInterface']) if 'disallowedMojoInterface' in json else None, + mismatched_headers=[PrerenderMismatchedHeaders.from_json(i) for i in json['mismatchedHeaders']] if 'mismatchedHeaders' in json else None + ) + + +@event_class('Preload.preloadingAttemptSourcesUpdated') +@dataclass +class PreloadingAttemptSourcesUpdated: + ''' + Send a list of sources for all preloading attempts in a document. + ''' + loader_id: network.LoaderId + preloading_attempt_sources: typing.List[PreloadingAttemptSource] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreloadingAttemptSourcesUpdated: + return cls( + loader_id=network.LoaderId.from_json(json['loaderId']), + preloading_attempt_sources=[PreloadingAttemptSource.from_json(i) for i in json['preloadingAttemptSources']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/profiler.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/profiler.py new file mode 100755 index 0000000..ab2ff07 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/profiler.py @@ -0,0 +1,418 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Profiler +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import debugger +from . import runtime + + +@dataclass +class ProfileNode: + ''' + Profile node. Holds callsite information, execution statistics and child nodes. + ''' + #: Unique id of the node. + id_: int + + #: Function location. + call_frame: runtime.CallFrame + + #: Number of samples where this node was on top of the call stack. + hit_count: typing.Optional[int] = None + + #: Child node ids. + children: typing.Optional[typing.List[int]] = None + + #: The reason of being not optimized. The function may be deoptimized or marked as don't + #: optimize. + deopt_reason: typing.Optional[str] = None + + #: An array of source position ticks. + position_ticks: typing.Optional[typing.List[PositionTickInfo]] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + json['callFrame'] = self.call_frame.to_json() + if self.hit_count is not None: + json['hitCount'] = self.hit_count + if self.children is not None: + json['children'] = [i for i in self.children] + if self.deopt_reason is not None: + json['deoptReason'] = self.deopt_reason + if self.position_ticks is not None: + json['positionTicks'] = [i.to_json() for i in self.position_ticks] + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=int(json['id']), + call_frame=runtime.CallFrame.from_json(json['callFrame']), + hit_count=int(json['hitCount']) if 'hitCount' in json else None, + children=[int(i) for i in json['children']] if 'children' in json else None, + deopt_reason=str(json['deoptReason']) if 'deoptReason' in json else None, + position_ticks=[PositionTickInfo.from_json(i) for i in json['positionTicks']] if 'positionTicks' in json else None, + ) + + +@dataclass +class Profile: + ''' + Profile. + ''' + #: The list of profile nodes. First item is the root node. + nodes: typing.List[ProfileNode] + + #: Profiling start timestamp in microseconds. + start_time: float + + #: Profiling end timestamp in microseconds. + end_time: float + + #: Ids of samples top nodes. + samples: typing.Optional[typing.List[int]] = None + + #: Time intervals between adjacent samples in microseconds. The first delta is relative to the + #: profile startTime. + time_deltas: typing.Optional[typing.List[int]] = None + + def to_json(self): + json = dict() + json['nodes'] = [i.to_json() for i in self.nodes] + json['startTime'] = self.start_time + json['endTime'] = self.end_time + if self.samples is not None: + json['samples'] = [i for i in self.samples] + if self.time_deltas is not None: + json['timeDeltas'] = [i for i in self.time_deltas] + return json + + @classmethod + def from_json(cls, json): + return cls( + nodes=[ProfileNode.from_json(i) for i in json['nodes']], + start_time=float(json['startTime']), + end_time=float(json['endTime']), + samples=[int(i) for i in json['samples']] if 'samples' in json else None, + time_deltas=[int(i) for i in json['timeDeltas']] if 'timeDeltas' in json else None, + ) + + +@dataclass +class PositionTickInfo: + ''' + Specifies a number of samples attributed to a certain source position. + ''' + #: Source line number (1-based). + line: int + + #: Number of samples attributed to the source line. + ticks: int + + def to_json(self): + json = dict() + json['line'] = self.line + json['ticks'] = self.ticks + return json + + @classmethod + def from_json(cls, json): + return cls( + line=int(json['line']), + ticks=int(json['ticks']), + ) + + +@dataclass +class CoverageRange: + ''' + Coverage data for a source range. + ''' + #: JavaScript script source offset for the range start. + start_offset: int + + #: JavaScript script source offset for the range end. + end_offset: int + + #: Collected execution count of the source range. + count: int + + def to_json(self): + json = dict() + json['startOffset'] = self.start_offset + json['endOffset'] = self.end_offset + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + start_offset=int(json['startOffset']), + end_offset=int(json['endOffset']), + count=int(json['count']), + ) + + +@dataclass +class FunctionCoverage: + ''' + Coverage data for a JavaScript function. + ''' + #: JavaScript function name. + function_name: str + + #: Source ranges inside the function with coverage data. + ranges: typing.List[CoverageRange] + + #: Whether coverage data for this function has block granularity. + is_block_coverage: bool + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['ranges'] = [i.to_json() for i in self.ranges] + json['isBlockCoverage'] = self.is_block_coverage + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + ranges=[CoverageRange.from_json(i) for i in json['ranges']], + is_block_coverage=bool(json['isBlockCoverage']), + ) + + +@dataclass +class ScriptCoverage: + ''' + Coverage data for a JavaScript script. + ''' + #: JavaScript script id. + script_id: runtime.ScriptId + + #: JavaScript script name or url. + url: str + + #: Functions contained in the script that has coverage data. + functions: typing.List[FunctionCoverage] + + def to_json(self): + json = dict() + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['functions'] = [i.to_json() for i in self.functions] + return json + + @classmethod + def from_json(cls, json): + return cls( + script_id=runtime.ScriptId.from_json(json['scriptId']), + url=str(json['url']), + functions=[FunctionCoverage.from_json(i) for i in json['functions']], + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.enable', + } + json = yield cmd_dict + + +def get_best_effort_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ScriptCoverage]]: + ''' + Collect coverage data for the current isolate. The coverage data may be incomplete due to + garbage collection. + + :returns: Coverage data for the current isolate. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.getBestEffortCoverage', + } + json = yield cmd_dict + return [ScriptCoverage.from_json(i) for i in json['result']] + + +def set_sampling_interval( + interval: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes CPU profiler sampling interval. Must be called before CPU profiles recording started. + + :param interval: New sampling interval in microseconds. + ''' + params: T_JSON_DICT = dict() + params['interval'] = interval + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.setSamplingInterval', + 'params': params, + } + json = yield cmd_dict + + +def start() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.start', + } + json = yield cmd_dict + + +def start_precise_coverage( + call_count: typing.Optional[bool] = None, + detailed: typing.Optional[bool] = None, + allow_triggered_updates: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,float]: + ''' + Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code + coverage may be incomplete. Enabling prevents running optimized code and resets execution + counters. + + :param call_count: *(Optional)* Collect accurate call counts beyond simple 'covered' or 'not covered'. + :param detailed: *(Optional)* Collect block-based coverage. + :param allow_triggered_updates: *(Optional)* Allow the backend to send updates on its own initiative + :returns: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + params: T_JSON_DICT = dict() + if call_count is not None: + params['callCount'] = call_count + if detailed is not None: + params['detailed'] = detailed + if allow_triggered_updates is not None: + params['allowTriggeredUpdates'] = allow_triggered_updates + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.startPreciseCoverage', + 'params': params, + } + json = yield cmd_dict + return float(json['timestamp']) + + +def stop() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Profile]: + ''' + + + :returns: Recorded profile. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stop', + } + json = yield cmd_dict + return Profile.from_json(json['profile']) + + +def stop_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable precise code coverage. Disabling releases unnecessary execution count records and allows + executing optimized code. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.stopPreciseCoverage', + } + json = yield cmd_dict + + +def take_precise_coverage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[ScriptCoverage], float]]: + ''' + Collect coverage data for the current isolate, and resets execution counters. Precise code + coverage needs to have started. + + :returns: A tuple with the following items: + + 0. **result** - Coverage data for the current isolate. + 1. **timestamp** - Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Profiler.takePreciseCoverage', + } + json = yield cmd_dict + return ( + [ScriptCoverage.from_json(i) for i in json['result']], + float(json['timestamp']) + ) + + +@event_class('Profiler.consoleProfileFinished') +@dataclass +class ConsoleProfileFinished: + id_: str + #: Location of console.profileEnd(). + location: debugger.Location + profile: Profile + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileFinished: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + profile=Profile.from_json(json['profile']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.consoleProfileStarted') +@dataclass +class ConsoleProfileStarted: + ''' + Sent when new profile recording is started using console.profile() call. + ''' + id_: str + #: Location of console.profile(). + location: debugger.Location + #: Profile title passed as an argument to console.profile(). + title: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleProfileStarted: + return cls( + id_=str(json['id']), + location=debugger.Location.from_json(json['location']), + title=str(json['title']) if 'title' in json else None + ) + + +@event_class('Profiler.preciseCoverageDeltaUpdate') +@dataclass +class PreciseCoverageDeltaUpdate: + ''' + **EXPERIMENTAL** + + Reports coverage delta since the last poll (either from an event like this, or from + ``takePreciseCoverage`` for the current isolate. May only be sent if precise code + coverage has been started. This event can be trigged by the embedder to, for example, + trigger collection of coverage data immediately at a certain point in time. + ''' + #: Monotonically increasing time (in seconds) when the coverage update was taken in the backend. + timestamp: float + #: Identifier for distinguishing coverage events. + occasion: str + #: Coverage data for the current isolate. + result: typing.List[ScriptCoverage] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> PreciseCoverageDeltaUpdate: + return cls( + timestamp=float(json['timestamp']), + occasion=str(json['occasion']), + result=[ScriptCoverage.from_json(i) for i in json['result']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/pwa.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/pwa.py new file mode 100755 index 0000000..8def6e8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/pwa.py @@ -0,0 +1,260 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: PWA (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +@dataclass +class FileHandlerAccept: + ''' + The following types are the replica of + https://crsrc.org/c/chrome/browser/web_applications/proto/web_app_os_integration_state.proto;drc=9910d3be894c8f142c977ba1023f30a656bc13fc;l=67 + ''' + #: New name of the mimetype according to + #: https://www.iana.org/assignments/media-types/media-types.xhtml + media_type: str + + file_extensions: typing.List[str] + + def to_json(self): + json = dict() + json['mediaType'] = self.media_type + json['fileExtensions'] = [i for i in self.file_extensions] + return json + + @classmethod + def from_json(cls, json): + return cls( + media_type=str(json['mediaType']), + file_extensions=[str(i) for i in json['fileExtensions']], + ) + + +@dataclass +class FileHandler: + action: str + + accepts: typing.List[FileHandlerAccept] + + display_name: str + + def to_json(self): + json = dict() + json['action'] = self.action + json['accepts'] = [i.to_json() for i in self.accepts] + json['displayName'] = self.display_name + return json + + @classmethod + def from_json(cls, json): + return cls( + action=str(json['action']), + accepts=[FileHandlerAccept.from_json(i) for i in json['accepts']], + display_name=str(json['displayName']), + ) + + +class DisplayMode(enum.Enum): + ''' + If user prefers opening the app in browser or an app window. + ''' + STANDALONE = "standalone" + BROWSER = "browser" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def get_os_app_state( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[int, typing.List[FileHandler]]]: + ''' + Returns the following OS state for the given manifest id. + + :param manifest_id: The id from the webapp's manifest file, commonly it's the url of the site installing the webapp. See https://web.dev/learn/pwa/web-app-manifest. + :returns: A tuple with the following items: + + 0. **badgeCount** - + 1. **fileHandlers** - + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.getOsAppState', + 'params': params, + } + json = yield cmd_dict + return ( + int(json['badgeCount']), + [FileHandler.from_json(i) for i in json['fileHandlers']] + ) + + +def install( + manifest_id: str, + install_url_or_bundle_url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Installs the given manifest identity, optionally using the given install_url + or IWA bundle location. + + TODO(crbug.com/337872319) Support IWA to meet the following specific + requirement. + IWA-specific install description: If the manifest_id is isolated-app://, + install_url_or_bundle_url is required, and can be either an http(s) URL or + file:// URL pointing to a signed web bundle (.swbn). The .swbn file's + signing key must correspond to manifest_id. If Chrome is not in IWA dev + mode, the installation will fail, regardless of the state of the allowlist. + + :param manifest_id: + :param install_url_or_bundle_url: *(Optional)* The location of the app or bundle overriding the one derived from the manifestId. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if install_url_or_bundle_url is not None: + params['installUrlOrBundleUrl'] = install_url_or_bundle_url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.install', + 'params': params, + } + json = yield cmd_dict + + +def uninstall( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Uninstalls the given manifest_id and closes any opened app windows. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.uninstall', + 'params': params, + } + json = yield cmd_dict + + +def launch( + manifest_id: str, + url: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,target.TargetID]: + ''' + Launches the installed web app, or an url in the same web app instead of the + default start url if it is provided. Returns a page Target.TargetID which + can be used to attach to via Target.attachToTarget or similar APIs. + + :param manifest_id: + :param url: *(Optional)* + :returns: ID of the tab target created as a result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if url is not None: + params['url'] = url + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launch', + 'params': params, + } + json = yield cmd_dict + return target.TargetID.from_json(json['targetId']) + + +def launch_files_in_app( + manifest_id: str, + files: typing.List[str] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[target.TargetID]]: + ''' + Opens one or more local files from an installed web app identified by its + manifestId. The web app needs to have file handlers registered to process + the files. The API returns one or more page Target.TargetIDs which can be + used to attach to via Target.attachToTarget or similar APIs. + If some files in the parameters cannot be handled by the web app, they will + be ignored. If none of the files can be handled, this API returns an error. + If no files are provided as the parameter, this API also returns an error. + + According to the definition of the file handlers in the manifest file, one + Target.TargetID may represent a page handling one or more files. The order + of the returned Target.TargetIDs is not guaranteed. + + TODO(crbug.com/339454034): Check the existences of the input files. + + :param manifest_id: + :param files: + :returns: IDs of the tab targets created as the result. + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + params['files'] = [i for i in files] + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.launchFilesInApp', + 'params': params, + } + json = yield cmd_dict + return [target.TargetID.from_json(i) for i in json['targetIds']] + + +def open_current_page_in_app( + manifest_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Opens the current page in its web app identified by the manifest id, needs + to be called on a page target. This function returns immediately without + waiting for the app to finish loading. + + :param manifest_id: + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.openCurrentPageInApp', + 'params': params, + } + json = yield cmd_dict + + +def change_app_user_settings( + manifest_id: str, + link_capturing: typing.Optional[bool] = None, + display_mode: typing.Optional[DisplayMode] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Changes user settings of the web app identified by its manifestId. If the + app was not installed, this command returns an error. Unset parameters will + be ignored; unrecognized values will cause an error. + + Unlike the ones defined in the manifest files of the web apps, these + settings are provided by the browser and controlled by the users, they + impact the way the browser handling the web apps. + + See the comment of each parameter. + + :param manifest_id: + :param link_capturing: *(Optional)* If user allows the links clicked on by the user in the app's scope, or extended scope if the manifest has scope extensions and the flags ```DesktopPWAsLinkCapturingWithScopeExtensions```` and ````WebAppEnableScopeExtensions``` are enabled. Note, the API does not support resetting the linkCapturing to the initial value, uninstalling and installing the web app again will reset it. TODO(crbug.com/339453269): Setting this value on ChromeOS is not supported yet. + :param display_mode: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['manifestId'] = manifest_id + if link_capturing is not None: + params['linkCapturing'] = link_capturing + if display_mode is not None: + params['displayMode'] = display_mode.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'PWA.changeAppUserSettings', + 'params': params, + } + json = yield cmd_dict diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/py.typed b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/runtime.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/runtime.py new file mode 100755 index 0000000..c8b4957 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/runtime.py @@ -0,0 +1,1583 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Runtime +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class ScriptId(str): + ''' + Unique script identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ScriptId: + return cls(json) + + def __repr__(self): + return 'ScriptId({})'.format(super().__repr__()) + + +@dataclass +class SerializationOptions: + ''' + Represents options for serialization. Overrides ``generatePreview`` and ``returnByValue``. + ''' + serialization: str + + #: Deep serialization depth. Default is full depth. Respected only in ``deep`` serialization mode. + max_depth: typing.Optional[int] = None + + #: Embedder-specific parameters. For example if connected to V8 in Chrome these control DOM + #: serialization via ``maxNodeDepth: integer`` and ``includeShadowTree: "none" `` "open" `` "all"``. + #: Values can be only of type string or integer. + additional_parameters: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['serialization'] = self.serialization + if self.max_depth is not None: + json['maxDepth'] = self.max_depth + if self.additional_parameters is not None: + json['additionalParameters'] = self.additional_parameters + return json + + @classmethod + def from_json(cls, json): + return cls( + serialization=str(json['serialization']), + max_depth=int(json['maxDepth']) if 'maxDepth' in json else None, + additional_parameters=dict(json['additionalParameters']) if 'additionalParameters' in json else None, + ) + + +@dataclass +class DeepSerializedValue: + ''' + Represents deep serialized value. + ''' + type_: str + + value: typing.Optional[typing.Any] = None + + object_id: typing.Optional[str] = None + + #: Set if value reference met more then once during serialization. In such + #: case, value is provided only to one of the serialized values. Unique + #: per value in the scope of one CDP call. + weak_local_object_reference: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.object_id is not None: + json['objectId'] = self.object_id + if self.weak_local_object_reference is not None: + json['weakLocalObjectReference'] = self.weak_local_object_reference + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + value=json['value'] if 'value' in json else None, + object_id=str(json['objectId']) if 'objectId' in json else None, + weak_local_object_reference=int(json['weakLocalObjectReference']) if 'weakLocalObjectReference' in json else None, + ) + + +class RemoteObjectId(str): + ''' + Unique object identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RemoteObjectId: + return cls(json) + + def __repr__(self): + return 'RemoteObjectId({})'.format(super().__repr__()) + + +class UnserializableValue(str): + ''' + Primitive value which cannot be JSON-stringified. Includes values ``-0``, ``NaN``, ``Infinity``, + ``-Infinity``, and bigint literals. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnserializableValue: + return cls(json) + + def __repr__(self): + return 'UnserializableValue({})'.format(super().__repr__()) + + +@dataclass +class RemoteObject: + ''' + Mirror object referencing original JavaScript object. + ''' + #: Object type. + type_: str + + #: Object subtype hint. Specified for ``object`` type values only. + #: NOTE: If you change anything here, make sure to also update + #: ``subtype`` in ``ObjectPreview`` and ``PropertyPreview`` below. + subtype: typing.Optional[str] = None + + #: Object class (constructor) name. Specified for ``object`` type values only. + class_name: typing.Optional[str] = None + + #: Remote object value in case of primitive values or JSON values (if it was requested). + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified does not have ``value``, but gets this + #: property. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: Deep serialized value. + deep_serialized_value: typing.Optional[DeepSerializedValue] = None + + #: Unique object identifier (for non-primitive values). + object_id: typing.Optional[RemoteObjectId] = None + + #: Preview containing abbreviated property values. Specified for ``object`` type values only. + preview: typing.Optional[ObjectPreview] = None + + custom_preview: typing.Optional[CustomPreview] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + if self.subtype is not None: + json['subtype'] = self.subtype + if self.class_name is not None: + json['className'] = self.class_name + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.description is not None: + json['description'] = self.description + if self.deep_serialized_value is not None: + json['deepSerializedValue'] = self.deep_serialized_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + if self.preview is not None: + json['preview'] = self.preview.to_json() + if self.custom_preview is not None: + json['customPreview'] = self.custom_preview.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + subtype=str(json['subtype']) if 'subtype' in json else None, + class_name=str(json['className']) if 'className' in json else None, + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + description=str(json['description']) if 'description' in json else None, + deep_serialized_value=DeepSerializedValue.from_json(json['deepSerializedValue']) if 'deepSerializedValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + preview=ObjectPreview.from_json(json['preview']) if 'preview' in json else None, + custom_preview=CustomPreview.from_json(json['customPreview']) if 'customPreview' in json else None, + ) + + +@dataclass +class CustomPreview: + #: The JSON-stringified result of formatter.header(object, config) call. + #: It contains json ML array that represents RemoteObject. + header: str + + #: If formatter returns true as a result of formatter.hasBody call then bodyGetterId will + #: contain RemoteObjectId for the function that returns result of formatter.body(object, config) call. + #: The result value is json ML array. + body_getter_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + json['header'] = self.header + if self.body_getter_id is not None: + json['bodyGetterId'] = self.body_getter_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + header=str(json['header']), + body_getter_id=RemoteObjectId.from_json(json['bodyGetterId']) if 'bodyGetterId' in json else None, + ) + + +@dataclass +class ObjectPreview: + ''' + Object containing abbreviated remote object value. + ''' + #: Object type. + type_: str + + #: True iff some of the properties or entries of the original object did not fit. + overflow: bool + + #: List of the properties. + properties: typing.List[PropertyPreview] + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + #: String representation of the object. + description: typing.Optional[str] = None + + #: List of the entries. Specified for ``map`` and ``set`` subtype values only. + entries: typing.Optional[typing.List[EntryPreview]] = None + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['overflow'] = self.overflow + json['properties'] = [i.to_json() for i in self.properties] + if self.subtype is not None: + json['subtype'] = self.subtype + if self.description is not None: + json['description'] = self.description + if self.entries is not None: + json['entries'] = [i.to_json() for i in self.entries] + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + overflow=bool(json['overflow']), + properties=[PropertyPreview.from_json(i) for i in json['properties']], + subtype=str(json['subtype']) if 'subtype' in json else None, + description=str(json['description']) if 'description' in json else None, + entries=[EntryPreview.from_json(i) for i in json['entries']] if 'entries' in json else None, + ) + + +@dataclass +class PropertyPreview: + #: Property name. + name: str + + #: Object type. Accessor means that the property itself is an accessor property. + type_: str + + #: User-friendly property value string. + value: typing.Optional[str] = None + + #: Nested value preview. + value_preview: typing.Optional[ObjectPreview] = None + + #: Object subtype hint. Specified for ``object`` type values only. + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['type'] = self.type_ + if self.value is not None: + json['value'] = self.value + if self.value_preview is not None: + json['valuePreview'] = self.value_preview.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + type_=str(json['type']), + value=str(json['value']) if 'value' in json else None, + value_preview=ObjectPreview.from_json(json['valuePreview']) if 'valuePreview' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class EntryPreview: + #: Preview of the value. + value: ObjectPreview + + #: Preview of the key. Specified for map-like collection entries. + key: typing.Optional[ObjectPreview] = None + + def to_json(self): + json = dict() + json['value'] = self.value.to_json() + if self.key is not None: + json['key'] = self.key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=ObjectPreview.from_json(json['value']), + key=ObjectPreview.from_json(json['key']) if 'key' in json else None, + ) + + +@dataclass +class PropertyDescriptor: + ''' + Object property descriptor. + ''' + #: Property name or symbol description. + name: str + + #: True if the type of this property descriptor may be changed and if the property may be + #: deleted from the corresponding object. + configurable: bool + + #: True if this property shows up during enumeration of the properties on the corresponding + #: object. + enumerable: bool + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + #: True if the value associated with the property may be changed (data descriptors only). + writable: typing.Optional[bool] = None + + #: A function which serves as a getter for the property, or ``undefined`` if there is no getter + #: (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the property, or ``undefined`` if there is no setter + #: (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + #: True if the result was thrown during the evaluation. + was_thrown: typing.Optional[bool] = None + + #: True if the property is owned for the object. + is_own: typing.Optional[bool] = None + + #: Property symbol object, if the property is of the ``symbol`` type. + symbol: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + json['configurable'] = self.configurable + json['enumerable'] = self.enumerable + if self.value is not None: + json['value'] = self.value.to_json() + if self.writable is not None: + json['writable'] = self.writable + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + if self.was_thrown is not None: + json['wasThrown'] = self.was_thrown + if self.is_own is not None: + json['isOwn'] = self.is_own + if self.symbol is not None: + json['symbol'] = self.symbol.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + configurable=bool(json['configurable']), + enumerable=bool(json['enumerable']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + writable=bool(json['writable']) if 'writable' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + was_thrown=bool(json['wasThrown']) if 'wasThrown' in json else None, + is_own=bool(json['isOwn']) if 'isOwn' in json else None, + symbol=RemoteObject.from_json(json['symbol']) if 'symbol' in json else None, + ) + + +@dataclass +class InternalPropertyDescriptor: + ''' + Object internal property descriptor. This property isn't normally visible in JavaScript code. + ''' + #: Conventional property name. + name: str + + #: The value associated with the property. + value: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + ) + + +@dataclass +class PrivatePropertyDescriptor: + ''' + Object private field descriptor. + ''' + #: Private property name. + name: str + + #: The value associated with the private property. + value: typing.Optional[RemoteObject] = None + + #: A function which serves as a getter for the private property, + #: or ``undefined`` if there is no getter (accessor descriptors only). + get: typing.Optional[RemoteObject] = None + + #: A function which serves as a setter for the private property, + #: or ``undefined`` if there is no setter (accessor descriptors only). + set_: typing.Optional[RemoteObject] = None + + def to_json(self): + json = dict() + json['name'] = self.name + if self.value is not None: + json['value'] = self.value.to_json() + if self.get is not None: + json['get'] = self.get.to_json() + if self.set_ is not None: + json['set'] = self.set_.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + value=RemoteObject.from_json(json['value']) if 'value' in json else None, + get=RemoteObject.from_json(json['get']) if 'get' in json else None, + set_=RemoteObject.from_json(json['set']) if 'set' in json else None, + ) + + +@dataclass +class CallArgument: + ''' + Represents function call argument. Either remote object id ``objectId``, primitive ``value``, + unserializable primitive value or neither of (for undefined) them should be specified. + ''' + #: Primitive value or serializable javascript object. + value: typing.Optional[typing.Any] = None + + #: Primitive value which can not be JSON-stringified. + unserializable_value: typing.Optional[UnserializableValue] = None + + #: Remote object handle. + object_id: typing.Optional[RemoteObjectId] = None + + def to_json(self): + json = dict() + if self.value is not None: + json['value'] = self.value + if self.unserializable_value is not None: + json['unserializableValue'] = self.unserializable_value.to_json() + if self.object_id is not None: + json['objectId'] = self.object_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + value=json['value'] if 'value' in json else None, + unserializable_value=UnserializableValue.from_json(json['unserializableValue']) if 'unserializableValue' in json else None, + object_id=RemoteObjectId.from_json(json['objectId']) if 'objectId' in json else None, + ) + + +class ExecutionContextId(int): + ''' + Id of an execution context. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> ExecutionContextId: + return cls(json) + + def __repr__(self): + return 'ExecutionContextId({})'.format(super().__repr__()) + + +@dataclass +class ExecutionContextDescription: + ''' + Description of an isolated world. + ''' + #: Unique id of the execution context. It can be used to specify in which execution context + #: script evaluation should be performed. + id_: ExecutionContextId + + #: Execution context origin. + origin: str + + #: Human readable name describing given context. + name: str + + #: A system-unique execution context identifier. Unlike the id, this is unique across + #: multiple processes, so can be reliably used to identify specific context while backend + #: performs a cross-process navigation. + unique_id: str + + #: Embedder-specific auxiliary data likely matching {isDefault: boolean, type: 'default'``'isolated'``'worker', frameId: string} + aux_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['id'] = self.id_.to_json() + json['origin'] = self.origin + json['name'] = self.name + json['uniqueId'] = self.unique_id + if self.aux_data is not None: + json['auxData'] = self.aux_data + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=ExecutionContextId.from_json(json['id']), + origin=str(json['origin']), + name=str(json['name']), + unique_id=str(json['uniqueId']), + aux_data=dict(json['auxData']) if 'auxData' in json else None, + ) + + +@dataclass +class ExceptionDetails: + ''' + Detailed information about exception (or error) that was thrown during script compilation or + execution. + ''' + #: Exception id. + exception_id: int + + #: Exception text, which should be used together with exception object when available. + text: str + + #: Line number of the exception location (0-based). + line_number: int + + #: Column number of the exception location (0-based). + column_number: int + + #: Script ID of the exception location. + script_id: typing.Optional[ScriptId] = None + + #: URL of the exception location, to be used when the script was not reported. + url: typing.Optional[str] = None + + #: JavaScript stack trace if available. + stack_trace: typing.Optional[StackTrace] = None + + #: Exception object if available. + exception: typing.Optional[RemoteObject] = None + + #: Identifier of the context where exception happened. + execution_context_id: typing.Optional[ExecutionContextId] = None + + #: Dictionary with entries of meta data that the client associated + #: with this exception, such as information about associated network + #: requests, etc. + exception_meta_data: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['exceptionId'] = self.exception_id + json['text'] = self.text + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + if self.script_id is not None: + json['scriptId'] = self.script_id.to_json() + if self.url is not None: + json['url'] = self.url + if self.stack_trace is not None: + json['stackTrace'] = self.stack_trace.to_json() + if self.exception is not None: + json['exception'] = self.exception.to_json() + if self.execution_context_id is not None: + json['executionContextId'] = self.execution_context_id.to_json() + if self.exception_meta_data is not None: + json['exceptionMetaData'] = self.exception_meta_data + return json + + @classmethod + def from_json(cls, json): + return cls( + exception_id=int(json['exceptionId']), + text=str(json['text']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + script_id=ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + url=str(json['url']) if 'url' in json else None, + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + exception=RemoteObject.from_json(json['exception']) if 'exception' in json else None, + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None, + exception_meta_data=dict(json['exceptionMetaData']) if 'exceptionMetaData' in json else None, + ) + + +class Timestamp(float): + ''' + Number of milliseconds since epoch. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> Timestamp: + return cls(json) + + def __repr__(self): + return 'Timestamp({})'.format(super().__repr__()) + + +class TimeDelta(float): + ''' + Number of milliseconds. + ''' + def to_json(self) -> float: + return self + + @classmethod + def from_json(cls, json: float) -> TimeDelta: + return cls(json) + + def __repr__(self): + return 'TimeDelta({})'.format(super().__repr__()) + + +@dataclass +class CallFrame: + ''' + Stack entry for runtime errors and assertions. + ''' + #: JavaScript function name. + function_name: str + + #: JavaScript script id. + script_id: ScriptId + + #: JavaScript script name or url. + url: str + + #: JavaScript script line number (0-based). + line_number: int + + #: JavaScript script column number (0-based). + column_number: int + + def to_json(self): + json = dict() + json['functionName'] = self.function_name + json['scriptId'] = self.script_id.to_json() + json['url'] = self.url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + function_name=str(json['functionName']), + script_id=ScriptId.from_json(json['scriptId']), + url=str(json['url']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +@dataclass +class StackTrace: + ''' + Call frames for assertions or error messages. + ''' + #: JavaScript function name. + call_frames: typing.List[CallFrame] + + #: String label of this stack trace. For async traces this may be a name of the function that + #: initiated the async call. + description: typing.Optional[str] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent: typing.Optional[StackTrace] = None + + #: Asynchronous JavaScript stack trace that preceded this stack, if available. + parent_id: typing.Optional[StackTraceId] = None + + def to_json(self): + json = dict() + json['callFrames'] = [i.to_json() for i in self.call_frames] + if self.description is not None: + json['description'] = self.description + if self.parent is not None: + json['parent'] = self.parent.to_json() + if self.parent_id is not None: + json['parentId'] = self.parent_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + call_frames=[CallFrame.from_json(i) for i in json['callFrames']], + description=str(json['description']) if 'description' in json else None, + parent=StackTrace.from_json(json['parent']) if 'parent' in json else None, + parent_id=StackTraceId.from_json(json['parentId']) if 'parentId' in json else None, + ) + + +class UniqueDebuggerId(str): + ''' + Unique identifier of current debugger. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UniqueDebuggerId: + return cls(json) + + def __repr__(self): + return 'UniqueDebuggerId({})'.format(super().__repr__()) + + +@dataclass +class StackTraceId: + ''' + If ``debuggerId`` is set stack trace comes from another debugger and can be resolved there. This + allows to track cross-debugger calls. See ``Runtime.StackTrace`` and ``Debugger.paused`` for usages. + ''' + id_: str + + debugger_id: typing.Optional[UniqueDebuggerId] = None + + def to_json(self): + json = dict() + json['id'] = self.id_ + if self.debugger_id is not None: + json['debuggerId'] = self.debugger_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + id_=str(json['id']), + debugger_id=UniqueDebuggerId.from_json(json['debuggerId']) if 'debuggerId' in json else None, + ) + + +def await_promise( + promise_object_id: RemoteObjectId, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Add handler to promise with given promise object id. + + :param promise_object_id: Identifier of the promise. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :returns: A tuple with the following items: + + 0. **result** - Promise result. Will contain rejected value if promise was rejected. + 1. **exceptionDetails** - *(Optional)* Exception details if stack strace is available. + ''' + params: T_JSON_DICT = dict() + params['promiseObjectId'] = promise_object_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.awaitPromise', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def call_function_on( + function_declaration: str, + object_id: typing.Optional[RemoteObjectId] = None, + arguments: typing.Optional[typing.List[CallArgument]] = None, + silent: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + throw_on_side_effect: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Calls function with given declaration on the given object. Object group of the result is + inherited from the target object. + + :param function_declaration: Declaration of the function to call. + :param object_id: *(Optional)* Identifier of the object to call function on. Either objectId or executionContextId should be specified. + :param arguments: *(Optional)* Call arguments. All call arguments must belong to the same JavaScript world as the target object. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. Can be overriden by ````serializationOptions````. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param execution_context_id: *(Optional)* Specifies execution context which global object will be used to call function on. Either executionContextId or objectId should be specified. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. If objectGroup is not specified and objectId is, objectGroup will be inherited from object. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to call function on. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental function call in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````executionContextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Call result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['functionDeclaration'] = function_declaration + if object_id is not None: + params['objectId'] = object_id.to_json() + if arguments is not None: + params['arguments'] = [i.to_json() for i in arguments] + if silent is not None: + params['silent'] = silent + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.callFunctionOn', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def compile_script( + expression: str, + source_url: str, + persist_script: bool, + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.Optional[ScriptId], typing.Optional[ExceptionDetails]]]: + ''' + Compiles expression. + + :param expression: Expression to compile. + :param source_url: Source url to be set for the script. + :param persist_script: Specifies whether the compiled script should be persisted. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :returns: A tuple with the following items: + + 0. **scriptId** - *(Optional)* Id of the script. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + params['sourceURL'] = source_url + params['persistScript'] = persist_script + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.compileScript', + 'params': params, + } + json = yield cmd_dict + return ( + ScriptId.from_json(json['scriptId']) if 'scriptId' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables reporting of execution contexts creation. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.disable', + } + json = yield cmd_dict + + +def discard_console_entries() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Discards collected exceptions and console API calls. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.discardConsoleEntries', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables reporting of execution contexts creation by means of ``executionContextCreated`` event. + When the reporting gets enabled the event will be sent immediately for each existing execution + context. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.enable', + } + json = yield cmd_dict + + +def evaluate( + expression: str, + object_group: typing.Optional[str] = None, + include_command_line_api: typing.Optional[bool] = None, + silent: typing.Optional[bool] = None, + context_id: typing.Optional[ExecutionContextId] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + user_gesture: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None, + throw_on_side_effect: typing.Optional[bool] = None, + timeout: typing.Optional[TimeDelta] = None, + disable_breaks: typing.Optional[bool] = None, + repl_mode: typing.Optional[bool] = None, + allow_unsafe_eval_blocked_by_csp: typing.Optional[bool] = None, + unique_context_id: typing.Optional[str] = None, + serialization_options: typing.Optional[SerializationOptions] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Evaluates expression on global object. + + :param expression: Expression to evaluate. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param context_id: *(Optional)* Specifies in which execution context to perform evaluation. If the parameter is omitted the evaluation will be performed in the context of the inspected page. This is mutually exclusive with ````uniqueContextId````, which offers an alternative way to identify the execution context that is more reliable in a multi-process environment. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object that should be sent by value. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the result. + :param user_gesture: *(Optional)* Whether execution should be treated as initiated by user in the UI. + :param await_promise: *(Optional)* Whether execution should ````await```` for resulting value and return once awaited promise is resolved. + :param throw_on_side_effect: **(EXPERIMENTAL)** *(Optional)* Whether to throw an exception if side effect cannot be ruled out during evaluation. This implies ````disableBreaks```` below. + :param timeout: **(EXPERIMENTAL)** *(Optional)* Terminate execution after timing out (number of milliseconds). + :param disable_breaks: **(EXPERIMENTAL)** *(Optional)* Disable breakpoints during execution. + :param repl_mode: **(EXPERIMENTAL)** *(Optional)* Setting this flag to true enables ````let```` re-declaration and top-level ````await````. Note that ````let```` variables can only be re-declared if they originate from ````replMode```` themselves. + :param allow_unsafe_eval_blocked_by_csp: **(EXPERIMENTAL)** *(Optional)* The Content Security Policy (CSP) for the target might block 'unsafe-eval' which includes eval(), Function(), setTimeout() and setInterval() when called with non-callable arguments. This flag bypasses CSP for this evaluation and allows unsafe-eval. Defaults to true. + :param unique_context_id: **(EXPERIMENTAL)** *(Optional)* An alternative way to specify the execution context to evaluate in. Compared to contextId that may be reused across processes, this is guaranteed to be system-unique, so it can be used to prevent accidental evaluation of the expression in context different than intended (e.g. as a result of navigation across process boundaries). This is mutually exclusive with ````contextId````. + :param serialization_options: **(EXPERIMENTAL)** *(Optional)* Specifies the result serialization. If provided, overrides ````generatePreview```` and ````returnByValue```. + :returns: A tuple with the following items: + + 0. **result** - Evaluation result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['expression'] = expression + if object_group is not None: + params['objectGroup'] = object_group + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if silent is not None: + params['silent'] = silent + if context_id is not None: + params['contextId'] = context_id.to_json() + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if user_gesture is not None: + params['userGesture'] = user_gesture + if await_promise is not None: + params['awaitPromise'] = await_promise + if throw_on_side_effect is not None: + params['throwOnSideEffect'] = throw_on_side_effect + if timeout is not None: + params['timeout'] = timeout.to_json() + if disable_breaks is not None: + params['disableBreaks'] = disable_breaks + if repl_mode is not None: + params['replMode'] = repl_mode + if allow_unsafe_eval_blocked_by_csp is not None: + params['allowUnsafeEvalBlockedByCSP'] = allow_unsafe_eval_blocked_by_csp + if unique_context_id is not None: + params['uniqueContextId'] = unique_context_id + if serialization_options is not None: + params['serializationOptions'] = serialization_options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.evaluate', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def get_isolate_id() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,str]: + ''' + Returns the isolate id. + + **EXPERIMENTAL** + + :returns: The isolate id. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getIsolateId', + } + json = yield cmd_dict + return str(json['id']) + + +def get_heap_usage() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float]]: + ''' + Returns the JavaScript heap usage. + It is the total usage of the corresponding isolate not scoped to a particular Runtime. + + **EXPERIMENTAL** + + :returns: A tuple with the following items: + + 0. **usedSize** - Used heap size in bytes. + 1. **totalSize** - Allocated heap size in bytes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getHeapUsage', + } + json = yield cmd_dict + return ( + float(json['usedSize']), + float(json['totalSize']) + ) + + +def get_properties( + object_id: RemoteObjectId, + own_properties: typing.Optional[bool] = None, + accessor_properties_only: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + non_indexed_properties_only: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[typing.List[PropertyDescriptor], typing.Optional[typing.List[InternalPropertyDescriptor]], typing.Optional[typing.List[PrivatePropertyDescriptor]], typing.Optional[ExceptionDetails]]]: + ''' + Returns properties of a given object. Object group of the result is inherited from the target + object. + + :param object_id: Identifier of the object to return properties for. + :param own_properties: *(Optional)* If true, returns properties belonging only to the element itself, not to its prototype chain. + :param accessor_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns accessor properties (with getter/setter) only; internal properties are not returned either. + :param generate_preview: **(EXPERIMENTAL)** *(Optional)* Whether preview should be generated for the results. + :param non_indexed_properties_only: **(EXPERIMENTAL)** *(Optional)* If true, returns non-indexed properties only. + :returns: A tuple with the following items: + + 0. **result** - Object properties. + 1. **internalProperties** - *(Optional)* Internal object properties (only of the element itself). + 2. **privateProperties** - *(Optional)* Object private properties. + 3. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + if own_properties is not None: + params['ownProperties'] = own_properties + if accessor_properties_only is not None: + params['accessorPropertiesOnly'] = accessor_properties_only + if generate_preview is not None: + params['generatePreview'] = generate_preview + if non_indexed_properties_only is not None: + params['nonIndexedPropertiesOnly'] = non_indexed_properties_only + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getProperties', + 'params': params, + } + json = yield cmd_dict + return ( + [PropertyDescriptor.from_json(i) for i in json['result']], + [InternalPropertyDescriptor.from_json(i) for i in json['internalProperties']] if 'internalProperties' in json else None, + [PrivatePropertyDescriptor.from_json(i) for i in json['privateProperties']] if 'privateProperties' in json else None, + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def global_lexical_scope_names( + execution_context_id: typing.Optional[ExecutionContextId] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Returns all let, const and class variables from global scope. + + :param execution_context_id: *(Optional)* Specifies in which execution context to lookup global scope variables. + :returns: + ''' + params: T_JSON_DICT = dict() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.globalLexicalScopeNames', + 'params': params, + } + json = yield cmd_dict + return [str(i) for i in json['names']] + + +def query_objects( + prototype_object_id: RemoteObjectId, + object_group: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,RemoteObject]: + ''' + :param prototype_object_id: Identifier of the prototype to return objects for. + :param object_group: *(Optional)* Symbolic group name that can be used to release the results. + :returns: Array with objects. + ''' + params: T_JSON_DICT = dict() + params['prototypeObjectId'] = prototype_object_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.queryObjects', + 'params': params, + } + json = yield cmd_dict + return RemoteObject.from_json(json['objects']) + + +def release_object( + object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases remote object with given id. + + :param object_id: Identifier of the object to release. + ''' + params: T_JSON_DICT = dict() + params['objectId'] = object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObject', + 'params': params, + } + json = yield cmd_dict + + +def release_object_group( + object_group: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Releases all remote objects that belong to a given group. + + :param object_group: Symbolic object group name. + ''' + params: T_JSON_DICT = dict() + params['objectGroup'] = object_group + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.releaseObjectGroup', + 'params': params, + } + json = yield cmd_dict + + +def run_if_waiting_for_debugger() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Tells inspected instance to run if it was waiting for debugger to attach. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runIfWaitingForDebugger', + } + json = yield cmd_dict + + +def run_script( + script_id: ScriptId, + execution_context_id: typing.Optional[ExecutionContextId] = None, + object_group: typing.Optional[str] = None, + silent: typing.Optional[bool] = None, + include_command_line_api: typing.Optional[bool] = None, + return_by_value: typing.Optional[bool] = None, + generate_preview: typing.Optional[bool] = None, + await_promise: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[RemoteObject, typing.Optional[ExceptionDetails]]]: + ''' + Runs script with given id in a given context. + + :param script_id: Id of the script to run. + :param execution_context_id: *(Optional)* Specifies in which execution context to perform script run. If the parameter is omitted the evaluation will be performed in the context of the inspected page. + :param object_group: *(Optional)* Symbolic group name that can be used to release multiple objects. + :param silent: *(Optional)* In silent mode exceptions thrown during evaluation are not reported and do not pause execution. Overrides ```setPauseOnException```` state. + :param include_command_line_api: *(Optional)* Determines whether Command Line API should be available during the evaluation. + :param return_by_value: *(Optional)* Whether the result is expected to be a JSON object which should be sent by value. + :param generate_preview: *(Optional)* Whether preview should be generated for the result. + :param await_promise: *(Optional)* Whether execution should ````await``` for resulting value and return once awaited promise is resolved. + :returns: A tuple with the following items: + + 0. **result** - Run result. + 1. **exceptionDetails** - *(Optional)* Exception details. + ''' + params: T_JSON_DICT = dict() + params['scriptId'] = script_id.to_json() + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if object_group is not None: + params['objectGroup'] = object_group + if silent is not None: + params['silent'] = silent + if include_command_line_api is not None: + params['includeCommandLineAPI'] = include_command_line_api + if return_by_value is not None: + params['returnByValue'] = return_by_value + if generate_preview is not None: + params['generatePreview'] = generate_preview + if await_promise is not None: + params['awaitPromise'] = await_promise + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.runScript', + 'params': params, + } + json = yield cmd_dict + return ( + RemoteObject.from_json(json['result']), + ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + ) + + +def set_async_call_stack_depth( + max_depth: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables or disables async call stacks tracking. + + :param max_depth: Maximum depth of async call stacks. Setting to ```0``` will effectively disable collecting async call stacks (default). + ''' + params: T_JSON_DICT = dict() + params['maxDepth'] = max_depth + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setAsyncCallStackDepth', + 'params': params, + } + json = yield cmd_dict + + +def set_custom_object_formatter_enabled( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setCustomObjectFormatterEnabled', + 'params': params, + } + json = yield cmd_dict + + +def set_max_call_stack_size_to_capture( + size: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + + + **EXPERIMENTAL** + + :param size: + ''' + params: T_JSON_DICT = dict() + params['size'] = size + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.setMaxCallStackSizeToCapture', + 'params': params, + } + json = yield cmd_dict + + +def terminate_execution() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Terminate current or next JavaScript execution. + Will cancel the termination when the outer-most script execution ends. + + **EXPERIMENTAL** + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.terminateExecution', + } + json = yield cmd_dict + + +def add_binding( + name: str, + execution_context_id: typing.Optional[ExecutionContextId] = None, + execution_context_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + If executionContextId is empty, adds binding with the given name on the + global objects of all inspected contexts, including those created later, + bindings survive reloads. + Binding function takes exactly one argument, this argument should be string, + in case of any other input, function throws an exception. + Each binding function call produces Runtime.bindingCalled notification. + + :param name: + :param execution_context_id: **(EXPERIMENTAL)** *(Optional)* If specified, the binding would only be exposed to the specified execution context. If omitted and ```executionContextName```` is not set, the binding is exposed to all execution contexts of the target. This parameter is mutually exclusive with ````executionContextName````. Deprecated in favor of ````executionContextName```` due to an unclear use case and bugs in implementation (crbug.com/1169639). ````executionContextId```` will be removed in the future. + :param execution_context_name: *(Optional)* If specified, the binding is exposed to the executionContext with matching name, even for contexts created after the binding is added. See also ````ExecutionContext.name```` and ````worldName```` parameter to ````Page.addScriptToEvaluateOnNewDocument````. This parameter is mutually exclusive with ````executionContextId```. + ''' + params: T_JSON_DICT = dict() + params['name'] = name + if execution_context_id is not None: + params['executionContextId'] = execution_context_id.to_json() + if execution_context_name is not None: + params['executionContextName'] = execution_context_name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.addBinding', + 'params': params, + } + json = yield cmd_dict + + +def remove_binding( + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + This method does not remove binding function from global object but + unsubscribes current runtime agent from Runtime.bindingCalled notifications. + + :param name: + ''' + params: T_JSON_DICT = dict() + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.removeBinding', + 'params': params, + } + json = yield cmd_dict + + +def get_exception_details( + error_object_id: RemoteObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Optional[ExceptionDetails]]: + ''' + This method tries to lookup and populate exception details for a + JavaScript Error object. + Note that the stackTrace portion of the resulting exceptionDetails will + only be populated if the Runtime domain was enabled at the time when the + Error was thrown. + + **EXPERIMENTAL** + + :param error_object_id: The error object for which to resolve the exception details. + :returns: + ''' + params: T_JSON_DICT = dict() + params['errorObjectId'] = error_object_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Runtime.getExceptionDetails', + 'params': params, + } + json = yield cmd_dict + return ExceptionDetails.from_json(json['exceptionDetails']) if 'exceptionDetails' in json else None + + +@event_class('Runtime.bindingCalled') +@dataclass +class BindingCalled: + ''' + **EXPERIMENTAL** + + Notification is issued every time when binding is called. + ''' + name: str + payload: str + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BindingCalled: + return cls( + name=str(json['name']), + payload=str(json['payload']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) + ) + + +@event_class('Runtime.consoleAPICalled') +@dataclass +class ConsoleAPICalled: + ''' + Issued when console API was called. + ''' + #: Type of the call. + type_: str + #: Call arguments. + args: typing.List[RemoteObject] + #: Identifier of the context where the call was made. + execution_context_id: ExecutionContextId + #: Call timestamp. + timestamp: Timestamp + #: Stack trace captured when the call was made. The async stack chain is automatically reported for + #: the following call types: ``assert``, ``error``, ``trace``, ``warning``. For other types the async call + #: chain can be retrieved using ``Debugger.getStackTrace`` and ``stackTrace.parentId`` field. + stack_trace: typing.Optional[StackTrace] + #: Console context descriptor for calls on non-default console context (not console.*): + #: 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call + #: on named context. + context: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ConsoleAPICalled: + return cls( + type_=str(json['type']), + args=[RemoteObject.from_json(i) for i in json['args']], + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + timestamp=Timestamp.from_json(json['timestamp']), + stack_trace=StackTrace.from_json(json['stackTrace']) if 'stackTrace' in json else None, + context=str(json['context']) if 'context' in json else None + ) + + +@event_class('Runtime.exceptionRevoked') +@dataclass +class ExceptionRevoked: + ''' + Issued when unhandled exception was revoked. + ''' + #: Reason describing why exception was revoked. + reason: str + #: The id of revoked exception, as reported in ``exceptionThrown``. + exception_id: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionRevoked: + return cls( + reason=str(json['reason']), + exception_id=int(json['exceptionId']) + ) + + +@event_class('Runtime.exceptionThrown') +@dataclass +class ExceptionThrown: + ''' + Issued when exception was thrown and unhandled. + ''' + #: Timestamp of the exception. + timestamp: Timestamp + exception_details: ExceptionDetails + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExceptionThrown: + return cls( + timestamp=Timestamp.from_json(json['timestamp']), + exception_details=ExceptionDetails.from_json(json['exceptionDetails']) + ) + + +@event_class('Runtime.executionContextCreated') +@dataclass +class ExecutionContextCreated: + ''' + Issued when new execution context is created. + ''' + #: A newly created execution context. + context: ExecutionContextDescription + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextCreated: + return cls( + context=ExecutionContextDescription.from_json(json['context']) + ) + + +@event_class('Runtime.executionContextDestroyed') +@dataclass +class ExecutionContextDestroyed: + ''' + Issued when execution context is destroyed. + ''' + #: Id of the destroyed context + execution_context_id: ExecutionContextId + #: Unique Id of the destroyed context + execution_context_unique_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextDestroyed: + return cls( + execution_context_id=ExecutionContextId.from_json(json['executionContextId']), + execution_context_unique_id=str(json['executionContextUniqueId']) + ) + + +@event_class('Runtime.executionContextsCleared') +@dataclass +class ExecutionContextsCleared: + ''' + Issued when all executionContexts were cleared in browser + ''' + + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ExecutionContextsCleared: + return cls( + + ) + + +@event_class('Runtime.inspectRequested') +@dataclass +class InspectRequested: + ''' + Issued when object should be inspected (for example, as a result of inspect() command line API + call). + ''' + object_: RemoteObject + hints: dict + #: Identifier of the context where the call was made. + execution_context_id: typing.Optional[ExecutionContextId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InspectRequested: + return cls( + object_=RemoteObject.from_json(json['object']), + hints=dict(json['hints']), + execution_context_id=ExecutionContextId.from_json(json['executionContextId']) if 'executionContextId' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/schema.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/schema.py new file mode 100755 index 0000000..5077f78 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/schema.py @@ -0,0 +1,48 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Schema +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class Domain: + ''' + Description of the protocol domain. + ''' + #: Domain name. + name: str + + #: Domain version. + version: str + + def to_json(self): + json = dict() + json['name'] = self.name + json['version'] = self.version + return json + + @classmethod + def from_json(cls, json): + return cls( + name=str(json['name']), + version=str(json['version']), + ) + + +def get_domains() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Domain]]: + ''' + Returns supported domains. + + :returns: List of supported domains. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Schema.getDomains', + } + json = yield cmd_dict + return [Domain.from_json(i) for i in json['domains']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/security.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/security.py new file mode 100755 index 0000000..e7714fe --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/security.py @@ -0,0 +1,507 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Security +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import network + + +class CertificateId(int): + ''' + An internal certificate ID value. + ''' + def to_json(self) -> int: + return self + + @classmethod + def from_json(cls, json: int) -> CertificateId: + return cls(json) + + def __repr__(self): + return 'CertificateId({})'.format(super().__repr__()) + + +class MixedContentType(enum.Enum): + ''' + A description of mixed content (HTTP resources on HTTPS pages), as defined by + https://www.w3.org/TR/mixed-content/#categories + ''' + BLOCKABLE = "blockable" + OPTIONALLY_BLOCKABLE = "optionally-blockable" + NONE = "none" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SecurityState(enum.Enum): + ''' + The security level of a page or resource. + ''' + UNKNOWN = "unknown" + NEUTRAL = "neutral" + INSECURE = "insecure" + SECURE = "secure" + INFO = "info" + INSECURE_BROKEN = "insecure-broken" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class CertificateSecurityState: + ''' + Details about the security state of the page certificate. + ''' + #: Protocol name (e.g. "TLS 1.2" or "QUIC"). + protocol: str + + #: Key Exchange used by the connection, or the empty string if not applicable. + key_exchange: str + + #: Cipher name. + cipher: str + + #: Page certificate. + certificate: typing.List[str] + + #: Certificate subject name. + subject_name: str + + #: Name of the issuing CA. + issuer: str + + #: Certificate valid from date. + valid_from: network.TimeSinceEpoch + + #: Certificate valid to (expiration) date + valid_to: network.TimeSinceEpoch + + #: True if the certificate uses a weak signature algorithm. + certificate_has_weak_signature: bool + + #: True if the certificate has a SHA1 signature in the chain. + certificate_has_sha1_signature: bool + + #: True if modern SSL + modern_ssl: bool + + #: True if the connection is using an obsolete SSL protocol. + obsolete_ssl_protocol: bool + + #: True if the connection is using an obsolete SSL key exchange. + obsolete_ssl_key_exchange: bool + + #: True if the connection is using an obsolete SSL cipher. + obsolete_ssl_cipher: bool + + #: True if the connection is using an obsolete SSL signature. + obsolete_ssl_signature: bool + + #: (EC)DH group used by the connection, if applicable. + key_exchange_group: typing.Optional[str] = None + + #: TLS MAC. Note that AEAD ciphers do not have separate MACs. + mac: typing.Optional[str] = None + + #: The highest priority network error code, if the certificate has an error. + certificate_network_error: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol + json['keyExchange'] = self.key_exchange + json['cipher'] = self.cipher + json['certificate'] = [i for i in self.certificate] + json['subjectName'] = self.subject_name + json['issuer'] = self.issuer + json['validFrom'] = self.valid_from.to_json() + json['validTo'] = self.valid_to.to_json() + json['certificateHasWeakSignature'] = self.certificate_has_weak_signature + json['certificateHasSha1Signature'] = self.certificate_has_sha1_signature + json['modernSSL'] = self.modern_ssl + json['obsoleteSslProtocol'] = self.obsolete_ssl_protocol + json['obsoleteSslKeyExchange'] = self.obsolete_ssl_key_exchange + json['obsoleteSslCipher'] = self.obsolete_ssl_cipher + json['obsoleteSslSignature'] = self.obsolete_ssl_signature + if self.key_exchange_group is not None: + json['keyExchangeGroup'] = self.key_exchange_group + if self.mac is not None: + json['mac'] = self.mac + if self.certificate_network_error is not None: + json['certificateNetworkError'] = self.certificate_network_error + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=str(json['protocol']), + key_exchange=str(json['keyExchange']), + cipher=str(json['cipher']), + certificate=[str(i) for i in json['certificate']], + subject_name=str(json['subjectName']), + issuer=str(json['issuer']), + valid_from=network.TimeSinceEpoch.from_json(json['validFrom']), + valid_to=network.TimeSinceEpoch.from_json(json['validTo']), + certificate_has_weak_signature=bool(json['certificateHasWeakSignature']), + certificate_has_sha1_signature=bool(json['certificateHasSha1Signature']), + modern_ssl=bool(json['modernSSL']), + obsolete_ssl_protocol=bool(json['obsoleteSslProtocol']), + obsolete_ssl_key_exchange=bool(json['obsoleteSslKeyExchange']), + obsolete_ssl_cipher=bool(json['obsoleteSslCipher']), + obsolete_ssl_signature=bool(json['obsoleteSslSignature']), + key_exchange_group=str(json['keyExchangeGroup']) if 'keyExchangeGroup' in json else None, + mac=str(json['mac']) if 'mac' in json else None, + certificate_network_error=str(json['certificateNetworkError']) if 'certificateNetworkError' in json else None, + ) + + +class SafetyTipStatus(enum.Enum): + BAD_REPUTATION = "badReputation" + LOOKALIKE = "lookalike" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SafetyTipInfo: + #: Describes whether the page triggers any safety tips or reputation warnings. Default is unknown. + safety_tip_status: SafetyTipStatus + + #: The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches. + safe_url: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['safetyTipStatus'] = self.safety_tip_status.to_json() + if self.safe_url is not None: + json['safeUrl'] = self.safe_url + return json + + @classmethod + def from_json(cls, json): + return cls( + safety_tip_status=SafetyTipStatus.from_json(json['safetyTipStatus']), + safe_url=str(json['safeUrl']) if 'safeUrl' in json else None, + ) + + +@dataclass +class VisibleSecurityState: + ''' + Security state information about the page. + ''' + #: The security level of the page. + security_state: SecurityState + + #: Array of security state issues ids. + security_state_issue_ids: typing.List[str] + + #: Security state details about the page certificate. + certificate_security_state: typing.Optional[CertificateSecurityState] = None + + #: The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown. + safety_tip_info: typing.Optional[SafetyTipInfo] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['securityStateIssueIds'] = [i for i in self.security_state_issue_ids] + if self.certificate_security_state is not None: + json['certificateSecurityState'] = self.certificate_security_state.to_json() + if self.safety_tip_info is not None: + json['safetyTipInfo'] = self.safety_tip_info.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + security_state_issue_ids=[str(i) for i in json['securityStateIssueIds']], + certificate_security_state=CertificateSecurityState.from_json(json['certificateSecurityState']) if 'certificateSecurityState' in json else None, + safety_tip_info=SafetyTipInfo.from_json(json['safetyTipInfo']) if 'safetyTipInfo' in json else None, + ) + + +@dataclass +class SecurityStateExplanation: + ''' + An explanation of an factor contributing to the security state. + ''' + #: Security state representing the severity of the factor being explained. + security_state: SecurityState + + #: Title describing the type of factor. + title: str + + #: Short phrase describing the type of factor. + summary: str + + #: Full text explanation of the factor. + description: str + + #: The type of mixed content described by the explanation. + mixed_content_type: MixedContentType + + #: Page certificate. + certificate: typing.List[str] + + #: Recommendations to fix any issues. + recommendations: typing.Optional[typing.List[str]] = None + + def to_json(self): + json = dict() + json['securityState'] = self.security_state.to_json() + json['title'] = self.title + json['summary'] = self.summary + json['description'] = self.description + json['mixedContentType'] = self.mixed_content_type.to_json() + json['certificate'] = [i for i in self.certificate] + if self.recommendations is not None: + json['recommendations'] = [i for i in self.recommendations] + return json + + @classmethod + def from_json(cls, json): + return cls( + security_state=SecurityState.from_json(json['securityState']), + title=str(json['title']), + summary=str(json['summary']), + description=str(json['description']), + mixed_content_type=MixedContentType.from_json(json['mixedContentType']), + certificate=[str(i) for i in json['certificate']], + recommendations=[str(i) for i in json['recommendations']] if 'recommendations' in json else None, + ) + + +@dataclass +class InsecureContentStatus: + ''' + Information about insecure content on the page. + ''' + #: Always false. + ran_mixed_content: bool + + #: Always false. + displayed_mixed_content: bool + + #: Always false. + contained_mixed_form: bool + + #: Always false. + ran_content_with_cert_errors: bool + + #: Always false. + displayed_content_with_cert_errors: bool + + #: Always set to unknown. + ran_insecure_content_style: SecurityState + + #: Always set to unknown. + displayed_insecure_content_style: SecurityState + + def to_json(self): + json = dict() + json['ranMixedContent'] = self.ran_mixed_content + json['displayedMixedContent'] = self.displayed_mixed_content + json['containedMixedForm'] = self.contained_mixed_form + json['ranContentWithCertErrors'] = self.ran_content_with_cert_errors + json['displayedContentWithCertErrors'] = self.displayed_content_with_cert_errors + json['ranInsecureContentStyle'] = self.ran_insecure_content_style.to_json() + json['displayedInsecureContentStyle'] = self.displayed_insecure_content_style.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + ran_mixed_content=bool(json['ranMixedContent']), + displayed_mixed_content=bool(json['displayedMixedContent']), + contained_mixed_form=bool(json['containedMixedForm']), + ran_content_with_cert_errors=bool(json['ranContentWithCertErrors']), + displayed_content_with_cert_errors=bool(json['displayedContentWithCertErrors']), + ran_insecure_content_style=SecurityState.from_json(json['ranInsecureContentStyle']), + displayed_insecure_content_style=SecurityState.from_json(json['displayedInsecureContentStyle']), + ) + + +class CertificateErrorAction(enum.Enum): + ''' + The action to take when a certificate error occurs. continue will continue processing the + request and cancel will cancel the request. + ''' + CONTINUE = "continue" + CANCEL = "cancel" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.disable', + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables tracking security state changes. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Security.enable', + } + json = yield cmd_dict + + +def set_ignore_certificate_errors( + ignore: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable whether all certificate errors should be ignored. + + :param ignore: If true, all certificate errors will be ignored. + ''' + params: T_JSON_DICT = dict() + params['ignore'] = ignore + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setIgnoreCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +def handle_certificate_error( + event_id: int, + action: CertificateErrorAction + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Handles a certificate error that fired a certificateError event. + + :param event_id: The ID of the event. + :param action: The action to take on the certificate error. + ''' + params: T_JSON_DICT = dict() + params['eventId'] = event_id + params['action'] = action.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Security.handleCertificateError', + 'params': params, + } + json = yield cmd_dict + + +def set_override_certificate_errors( + override: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable/disable overriding certificate errors. If enabled, all certificate error events need to + be handled by the DevTools client and should be answered with ``handleCertificateError`` commands. + + :param override: If true, certificate errors will be overridden. + ''' + params: T_JSON_DICT = dict() + params['override'] = override + cmd_dict: T_JSON_DICT = { + 'method': 'Security.setOverrideCertificateErrors', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Security.certificateError') +@dataclass +class CertificateError: + ''' + There is a certificate error. If overriding certificate errors is enabled, then it should be + handled with the ``handleCertificateError`` command. Note: this event does not fire if the + certificate error has been allowed internally. Only one client per target should override + certificate errors at the same time. + ''' + #: The ID of the event. + event_id: int + #: The type of the error. + error_type: str + #: The url that was requested. + request_url: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CertificateError: + return cls( + event_id=int(json['eventId']), + error_type=str(json['errorType']), + request_url=str(json['requestURL']) + ) + + +@event_class('Security.visibleSecurityStateChanged') +@dataclass +class VisibleSecurityStateChanged: + ''' + **EXPERIMENTAL** + + The security state of the page changed. + ''' + #: Security state information about the page. + visible_security_state: VisibleSecurityState + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> VisibleSecurityStateChanged: + return cls( + visible_security_state=VisibleSecurityState.from_json(json['visibleSecurityState']) + ) + + +@event_class('Security.securityStateChanged') +@dataclass +class SecurityStateChanged: + ''' + The security state of the page changed. No longer being sent. + ''' + #: Security state. + security_state: SecurityState + #: True if the page was loaded over cryptographic transport such as HTTPS. + scheme_is_cryptographic: bool + #: Previously a list of explanations for the security state. Now always + #: empty. + explanations: typing.List[SecurityStateExplanation] + #: Information about insecure content on the page. + insecure_content_status: InsecureContentStatus + #: Overrides user-visible description of the state. Always omitted. + summary: typing.Optional[str] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SecurityStateChanged: + return cls( + security_state=SecurityState.from_json(json['securityState']), + scheme_is_cryptographic=bool(json['schemeIsCryptographic']), + explanations=[SecurityStateExplanation.from_json(i) for i in json['explanations']], + insecure_content_status=InsecureContentStatus.from_json(json['insecureContentStatus']), + summary=str(json['summary']) if 'summary' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/service_worker.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/service_worker.py new file mode 100755 index 0000000..9dd80b1 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/service_worker.py @@ -0,0 +1,414 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: ServiceWorker (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import target + + +class RegistrationID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> RegistrationID: + return cls(json) + + def __repr__(self): + return 'RegistrationID({})'.format(super().__repr__()) + + +@dataclass +class ServiceWorkerRegistration: + ''' + ServiceWorker registration. + ''' + registration_id: RegistrationID + + scope_url: str + + is_deleted: bool + + def to_json(self): + json = dict() + json['registrationId'] = self.registration_id.to_json() + json['scopeURL'] = self.scope_url + json['isDeleted'] = self.is_deleted + return json + + @classmethod + def from_json(cls, json): + return cls( + registration_id=RegistrationID.from_json(json['registrationId']), + scope_url=str(json['scopeURL']), + is_deleted=bool(json['isDeleted']), + ) + + +class ServiceWorkerVersionRunningStatus(enum.Enum): + STOPPED = "stopped" + STARTING = "starting" + RUNNING = "running" + STOPPING = "stopping" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ServiceWorkerVersionStatus(enum.Enum): + NEW = "new" + INSTALLING = "installing" + INSTALLED = "installed" + ACTIVATING = "activating" + ACTIVATED = "activated" + REDUNDANT = "redundant" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ServiceWorkerVersion: + ''' + ServiceWorker version. + ''' + version_id: str + + registration_id: RegistrationID + + script_url: str + + running_status: ServiceWorkerVersionRunningStatus + + status: ServiceWorkerVersionStatus + + #: The Last-Modified header value of the main script. + script_last_modified: typing.Optional[float] = None + + #: The time at which the response headers of the main script were received from the server. + #: For cached script it is the last time the cache entry was validated. + script_response_time: typing.Optional[float] = None + + controlled_clients: typing.Optional[typing.List[target.TargetID]] = None + + target_id: typing.Optional[target.TargetID] = None + + router_rules: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['versionId'] = self.version_id + json['registrationId'] = self.registration_id.to_json() + json['scriptURL'] = self.script_url + json['runningStatus'] = self.running_status.to_json() + json['status'] = self.status.to_json() + if self.script_last_modified is not None: + json['scriptLastModified'] = self.script_last_modified + if self.script_response_time is not None: + json['scriptResponseTime'] = self.script_response_time + if self.controlled_clients is not None: + json['controlledClients'] = [i.to_json() for i in self.controlled_clients] + if self.target_id is not None: + json['targetId'] = self.target_id.to_json() + if self.router_rules is not None: + json['routerRules'] = self.router_rules + return json + + @classmethod + def from_json(cls, json): + return cls( + version_id=str(json['versionId']), + registration_id=RegistrationID.from_json(json['registrationId']), + script_url=str(json['scriptURL']), + running_status=ServiceWorkerVersionRunningStatus.from_json(json['runningStatus']), + status=ServiceWorkerVersionStatus.from_json(json['status']), + script_last_modified=float(json['scriptLastModified']) if 'scriptLastModified' in json else None, + script_response_time=float(json['scriptResponseTime']) if 'scriptResponseTime' in json else None, + controlled_clients=[target.TargetID.from_json(i) for i in json['controlledClients']] if 'controlledClients' in json else None, + target_id=target.TargetID.from_json(json['targetId']) if 'targetId' in json else None, + router_rules=str(json['routerRules']) if 'routerRules' in json else None, + ) + + +@dataclass +class ServiceWorkerErrorMessage: + ''' + ServiceWorker error message. + ''' + error_message: str + + registration_id: RegistrationID + + version_id: str + + source_url: str + + line_number: int + + column_number: int + + def to_json(self): + json = dict() + json['errorMessage'] = self.error_message + json['registrationId'] = self.registration_id.to_json() + json['versionId'] = self.version_id + json['sourceURL'] = self.source_url + json['lineNumber'] = self.line_number + json['columnNumber'] = self.column_number + return json + + @classmethod + def from_json(cls, json): + return cls( + error_message=str(json['errorMessage']), + registration_id=RegistrationID.from_json(json['registrationId']), + version_id=str(json['versionId']), + source_url=str(json['sourceURL']), + line_number=int(json['lineNumber']), + column_number=int(json['columnNumber']), + ) + + +def deliver_push_message( + origin: str, + registration_id: RegistrationID, + data: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param data: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['data'] = data + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.deliverPushMessage', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.disable', + } + json = yield cmd_dict + + +def dispatch_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str, + last_chance: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + :param last_chance: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + params['lastChance'] = last_chance + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def dispatch_periodic_sync_event( + origin: str, + registration_id: RegistrationID, + tag: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param origin: + :param registration_id: + :param tag: + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['registrationId'] = registration_id.to_json() + params['tag'] = tag + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.dispatchPeriodicSyncEvent', + 'params': params, + } + json = yield cmd_dict + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.enable', + } + json = yield cmd_dict + + +def inspect_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.inspectWorker', + 'params': params, + } + json = yield cmd_dict + + +def set_force_update_on_page_load( + force_update_on_page_load: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param force_update_on_page_load: + ''' + params: T_JSON_DICT = dict() + params['forceUpdateOnPageLoad'] = force_update_on_page_load + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.setForceUpdateOnPageLoad', + 'params': params, + } + json = yield cmd_dict + + +def skip_waiting( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.skipWaiting', + 'params': params, + } + json = yield cmd_dict + + +def start_worker( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.startWorker', + 'params': params, + } + json = yield cmd_dict + + +def stop_all_workers() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopAllWorkers', + } + json = yield cmd_dict + + +def stop_worker( + version_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param version_id: + ''' + params: T_JSON_DICT = dict() + params['versionId'] = version_id + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.stopWorker', + 'params': params, + } + json = yield cmd_dict + + +def unregister( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.unregister', + 'params': params, + } + json = yield cmd_dict + + +def update_registration( + scope_url: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + :param scope_url: + ''' + params: T_JSON_DICT = dict() + params['scopeURL'] = scope_url + cmd_dict: T_JSON_DICT = { + 'method': 'ServiceWorker.updateRegistration', + 'params': params, + } + json = yield cmd_dict + + +@event_class('ServiceWorker.workerErrorReported') +@dataclass +class WorkerErrorReported: + error_message: ServiceWorkerErrorMessage + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerErrorReported: + return cls( + error_message=ServiceWorkerErrorMessage.from_json(json['errorMessage']) + ) + + +@event_class('ServiceWorker.workerRegistrationUpdated') +@dataclass +class WorkerRegistrationUpdated: + registrations: typing.List[ServiceWorkerRegistration] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerRegistrationUpdated: + return cls( + registrations=[ServiceWorkerRegistration.from_json(i) for i in json['registrations']] + ) + + +@event_class('ServiceWorker.workerVersionUpdated') +@dataclass +class WorkerVersionUpdated: + versions: typing.List[ServiceWorkerVersion] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> WorkerVersionUpdated: + return cls( + versions=[ServiceWorkerVersion.from_json(i) for i in json['versions']] + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/storage.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/storage.py new file mode 100755 index 0000000..09f476e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/storage.py @@ -0,0 +1,2090 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Storage (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import network +from . import page + + +class SerializedStorageKey(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SerializedStorageKey: + return cls(json) + + def __repr__(self): + return 'SerializedStorageKey({})'.format(super().__repr__()) + + +class StorageType(enum.Enum): + ''' + Enum of possible storage types. + ''' + APPCACHE = "appcache" + COOKIES = "cookies" + FILE_SYSTEMS = "file_systems" + INDEXEDDB = "indexeddb" + LOCAL_STORAGE = "local_storage" + SHADER_CACHE = "shader_cache" + WEBSQL = "websql" + SERVICE_WORKERS = "service_workers" + CACHE_STORAGE = "cache_storage" + INTEREST_GROUPS = "interest_groups" + SHARED_STORAGE = "shared_storage" + STORAGE_BUCKETS = "storage_buckets" + ALL_ = "all" + OTHER = "other" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class UsageForType: + ''' + Usage for a storage type. + ''' + #: Name of storage type. + storage_type: StorageType + + #: Storage usage (bytes). + usage: float + + def to_json(self): + json = dict() + json['storageType'] = self.storage_type.to_json() + json['usage'] = self.usage + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_type=StorageType.from_json(json['storageType']), + usage=float(json['usage']), + ) + + +@dataclass +class TrustTokens: + ''' + Pair of issuer origin and number of available (signed, but not used) Trust + Tokens from that issuer. + ''' + issuer_origin: str + + count: float + + def to_json(self): + json = dict() + json['issuerOrigin'] = self.issuer_origin + json['count'] = self.count + return json + + @classmethod + def from_json(cls, json): + return cls( + issuer_origin=str(json['issuerOrigin']), + count=float(json['count']), + ) + + +class InterestGroupAuctionId(str): + ''' + Protected audience interest group auction identifier. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> InterestGroupAuctionId: + return cls(json) + + def __repr__(self): + return 'InterestGroupAuctionId({})'.format(super().__repr__()) + + +class InterestGroupAccessType(enum.Enum): + ''' + Enum of interest group access types. + ''' + JOIN = "join" + LEAVE = "leave" + UPDATE = "update" + LOADED = "loaded" + BID = "bid" + WIN = "win" + ADDITIONAL_BID = "additionalBid" + ADDITIONAL_BID_WIN = "additionalBidWin" + TOP_LEVEL_BID = "topLevelBid" + TOP_LEVEL_ADDITIONAL_BID = "topLevelAdditionalBid" + CLEAR = "clear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionEventType(enum.Enum): + ''' + Enum of auction events. + ''' + STARTED = "started" + CONFIG_RESOLVED = "configResolved" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class InterestGroupAuctionFetchType(enum.Enum): + ''' + Enum of network fetches auctions can do. + ''' + BIDDER_JS = "bidderJs" + BIDDER_WASM = "bidderWasm" + SELLER_JS = "sellerJs" + BIDDER_TRUSTED_SIGNALS = "bidderTrustedSignals" + SELLER_TRUSTED_SIGNALS = "sellerTrustedSignals" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class SharedStorageAccessType(enum.Enum): + ''' + Enum of shared storage access types. + ''' + DOCUMENT_ADD_MODULE = "documentAddModule" + DOCUMENT_SELECT_URL = "documentSelectURL" + DOCUMENT_RUN = "documentRun" + DOCUMENT_SET = "documentSet" + DOCUMENT_APPEND = "documentAppend" + DOCUMENT_DELETE = "documentDelete" + DOCUMENT_CLEAR = "documentClear" + DOCUMENT_GET = "documentGet" + WORKLET_SET = "workletSet" + WORKLET_APPEND = "workletAppend" + WORKLET_DELETE = "workletDelete" + WORKLET_CLEAR = "workletClear" + WORKLET_GET = "workletGet" + WORKLET_KEYS = "workletKeys" + WORKLET_ENTRIES = "workletEntries" + WORKLET_LENGTH = "workletLength" + WORKLET_REMAINING_BUDGET = "workletRemainingBudget" + HEADER_SET = "headerSet" + HEADER_APPEND = "headerAppend" + HEADER_DELETE = "headerDelete" + HEADER_CLEAR = "headerClear" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class SharedStorageEntry: + ''' + Struct for a single key-value pair in an origin's shared storage. + ''' + key: str + + value: str + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=str(json['value']), + ) + + +@dataclass +class SharedStorageMetadata: + ''' + Details for an origin's shared storage. + ''' + #: Time when the origin's shared storage was last created. + creation_time: network.TimeSinceEpoch + + #: Number of key-value pairs stored in origin's shared storage. + length: int + + #: Current amount of bits of entropy remaining in the navigation budget. + remaining_budget: float + + #: Total number of bytes stored as key-value pairs in origin's shared + #: storage. + bytes_used: int + + def to_json(self): + json = dict() + json['creationTime'] = self.creation_time.to_json() + json['length'] = self.length + json['remainingBudget'] = self.remaining_budget + json['bytesUsed'] = self.bytes_used + return json + + @classmethod + def from_json(cls, json): + return cls( + creation_time=network.TimeSinceEpoch.from_json(json['creationTime']), + length=int(json['length']), + remaining_budget=float(json['remainingBudget']), + bytes_used=int(json['bytesUsed']), + ) + + +@dataclass +class SharedStorageReportingMetadata: + ''' + Pair of reporting metadata details for a candidate URL for ``selectURL()``. + ''' + event_type: str + + reporting_url: str + + def to_json(self): + json = dict() + json['eventType'] = self.event_type + json['reportingUrl'] = self.reporting_url + return json + + @classmethod + def from_json(cls, json): + return cls( + event_type=str(json['eventType']), + reporting_url=str(json['reportingUrl']), + ) + + +@dataclass +class SharedStorageUrlWithMetadata: + ''' + Bundles a candidate URL with its reporting metadata. + ''' + #: Spec of candidate URL. + url: str + + #: Any associated reporting metadata. + reporting_metadata: typing.List[SharedStorageReportingMetadata] + + def to_json(self): + json = dict() + json['url'] = self.url + json['reportingMetadata'] = [i.to_json() for i in self.reporting_metadata] + return json + + @classmethod + def from_json(cls, json): + return cls( + url=str(json['url']), + reporting_metadata=[SharedStorageReportingMetadata.from_json(i) for i in json['reportingMetadata']], + ) + + +@dataclass +class SharedStorageAccessParams: + ''' + Bundles the parameters for shared storage access events whose + presence/absence can vary according to SharedStorageAccessType. + ''' + #: Spec of the module script URL. + #: Present only for SharedStorageAccessType.documentAddModule. + script_source_url: typing.Optional[str] = None + + #: Name of the registered operation to be run. + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + operation_name: typing.Optional[str] = None + + #: The operation's serialized data in bytes (converted to a string). + #: Present only for SharedStorageAccessType.documentRun and + #: SharedStorageAccessType.documentSelectURL. + serialized_data: typing.Optional[str] = None + + #: Array of candidate URLs' specs, along with any associated metadata. + #: Present only for SharedStorageAccessType.documentSelectURL. + urls_with_metadata: typing.Optional[typing.List[SharedStorageUrlWithMetadata]] = None + + #: Key for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.documentDelete, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.workletDelete, + #: SharedStorageAccessType.workletGet, + #: SharedStorageAccessType.headerSet, + #: SharedStorageAccessType.headerAppend, and + #: SharedStorageAccessType.headerDelete. + key: typing.Optional[str] = None + + #: Value for a specific entry in an origin's shared storage. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.documentAppend, + #: SharedStorageAccessType.workletSet, + #: SharedStorageAccessType.workletAppend, + #: SharedStorageAccessType.headerSet, and + #: SharedStorageAccessType.headerAppend. + value: typing.Optional[str] = None + + #: Whether or not to set an entry for a key if that key is already present. + #: Present only for SharedStorageAccessType.documentSet, + #: SharedStorageAccessType.workletSet, and + #: SharedStorageAccessType.headerSet. + ignore_if_present: typing.Optional[bool] = None + + def to_json(self): + json = dict() + if self.script_source_url is not None: + json['scriptSourceUrl'] = self.script_source_url + if self.operation_name is not None: + json['operationName'] = self.operation_name + if self.serialized_data is not None: + json['serializedData'] = self.serialized_data + if self.urls_with_metadata is not None: + json['urlsWithMetadata'] = [i.to_json() for i in self.urls_with_metadata] + if self.key is not None: + json['key'] = self.key + if self.value is not None: + json['value'] = self.value + if self.ignore_if_present is not None: + json['ignoreIfPresent'] = self.ignore_if_present + return json + + @classmethod + def from_json(cls, json): + return cls( + script_source_url=str(json['scriptSourceUrl']) if 'scriptSourceUrl' in json else None, + operation_name=str(json['operationName']) if 'operationName' in json else None, + serialized_data=str(json['serializedData']) if 'serializedData' in json else None, + urls_with_metadata=[SharedStorageUrlWithMetadata.from_json(i) for i in json['urlsWithMetadata']] if 'urlsWithMetadata' in json else None, + key=str(json['key']) if 'key' in json else None, + value=str(json['value']) if 'value' in json else None, + ignore_if_present=bool(json['ignoreIfPresent']) if 'ignoreIfPresent' in json else None, + ) + + +class StorageBucketsDurability(enum.Enum): + RELAXED = "relaxed" + STRICT = "strict" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class StorageBucket: + storage_key: SerializedStorageKey + + #: If not specified, it is the default bucket of the storageKey. + name: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['storageKey'] = self.storage_key.to_json() + if self.name is not None: + json['name'] = self.name + return json + + @classmethod + def from_json(cls, json): + return cls( + storage_key=SerializedStorageKey.from_json(json['storageKey']), + name=str(json['name']) if 'name' in json else None, + ) + + +@dataclass +class StorageBucketInfo: + bucket: StorageBucket + + id_: str + + expiration: network.TimeSinceEpoch + + #: Storage quota (bytes). + quota: float + + persistent: bool + + durability: StorageBucketsDurability + + def to_json(self): + json = dict() + json['bucket'] = self.bucket.to_json() + json['id'] = self.id_ + json['expiration'] = self.expiration.to_json() + json['quota'] = self.quota + json['persistent'] = self.persistent + json['durability'] = self.durability.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + bucket=StorageBucket.from_json(json['bucket']), + id_=str(json['id']), + expiration=network.TimeSinceEpoch.from_json(json['expiration']), + quota=float(json['quota']), + persistent=bool(json['persistent']), + durability=StorageBucketsDurability.from_json(json['durability']), + ) + + +class AttributionReportingSourceType(enum.Enum): + NAVIGATION = "navigation" + EVENT = "event" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class UnsignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'UnsignedInt64AsBase10({})'.format(super().__repr__()) + + +class UnsignedInt128AsBase16(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> UnsignedInt128AsBase16: + return cls(json) + + def __repr__(self): + return 'UnsignedInt128AsBase16({})'.format(super().__repr__()) + + +class SignedInt64AsBase10(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SignedInt64AsBase10: + return cls(json) + + def __repr__(self): + return 'SignedInt64AsBase10({})'.format(super().__repr__()) + + +@dataclass +class AttributionReportingFilterDataEntry: + key: str + + values: typing.List[str] + + def to_json(self): + json = dict() + json['key'] = self.key + json['values'] = [i for i in self.values] + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + values=[str(i) for i in json['values']], + ) + + +@dataclass +class AttributionReportingFilterConfig: + filter_values: typing.List[AttributionReportingFilterDataEntry] + + #: duration in seconds + lookback_window: typing.Optional[int] = None + + def to_json(self): + json = dict() + json['filterValues'] = [i.to_json() for i in self.filter_values] + if self.lookback_window is not None: + json['lookbackWindow'] = self.lookback_window + return json + + @classmethod + def from_json(cls, json): + return cls( + filter_values=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterValues']], + lookback_window=int(json['lookbackWindow']) if 'lookbackWindow' in json else None, + ) + + +@dataclass +class AttributionReportingFilterPair: + filters: typing.List[AttributionReportingFilterConfig] + + not_filters: typing.List[AttributionReportingFilterConfig] + + def to_json(self): + json = dict() + json['filters'] = [i.to_json() for i in self.filters] + json['notFilters'] = [i.to_json() for i in self.not_filters] + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=[AttributionReportingFilterConfig.from_json(i) for i in json['filters']], + not_filters=[AttributionReportingFilterConfig.from_json(i) for i in json['notFilters']], + ) + + +@dataclass +class AttributionReportingAggregationKeysEntry: + key: str + + value: UnsignedInt128AsBase16 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=UnsignedInt128AsBase16.from_json(json['value']), + ) + + +@dataclass +class AttributionReportingEventReportWindows: + #: duration in seconds + start: int + + #: duration in seconds + ends: typing.List[int] + + def to_json(self): + json = dict() + json['start'] = self.start + json['ends'] = [i for i in self.ends] + return json + + @classmethod + def from_json(cls, json): + return cls( + start=int(json['start']), + ends=[int(i) for i in json['ends']], + ) + + +@dataclass +class AttributionReportingTriggerSpec: + #: number instead of integer because not all uint32 can be represented by + #: int + trigger_data: typing.List[float] + + event_report_windows: AttributionReportingEventReportWindows + + def to_json(self): + json = dict() + json['triggerData'] = [i for i in self.trigger_data] + json['eventReportWindows'] = self.event_report_windows.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + trigger_data=[float(i) for i in json['triggerData']], + event_report_windows=AttributionReportingEventReportWindows.from_json(json['eventReportWindows']), + ) + + +class AttributionReportingTriggerDataMatching(enum.Enum): + EXACT = "exact" + MODULUS = "modulus" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableDebugReportingData: + key_piece: UnsignedInt128AsBase16 + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + types: typing.List[str] + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['value'] = self.value + json['types'] = [i for i in self.types] + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + value=float(json['value']), + types=[str(i) for i in json['types']], + ) + + +@dataclass +class AttributionReportingAggregatableDebugReportingConfig: + key_piece: UnsignedInt128AsBase16 + + debug_data: typing.List[AttributionReportingAggregatableDebugReportingData] + + #: number instead of integer because not all uint32 can be represented by + #: int, only present for source registrations + budget: typing.Optional[float] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['debugData'] = [i.to_json() for i in self.debug_data] + if self.budget is not None: + json['budget'] = self.budget + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + debug_data=[AttributionReportingAggregatableDebugReportingData.from_json(i) for i in json['debugData']], + budget=float(json['budget']) if 'budget' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + ) + + +@dataclass +class AttributionScopesData: + values: typing.List[str] + + #: number instead of integer because not all uint32 can be represented by + #: int + limit: float + + max_event_states: float + + def to_json(self): + json = dict() + json['values'] = [i for i in self.values] + json['limit'] = self.limit + json['maxEventStates'] = self.max_event_states + return json + + @classmethod + def from_json(cls, json): + return cls( + values=[str(i) for i in json['values']], + limit=float(json['limit']), + max_event_states=float(json['maxEventStates']), + ) + + +@dataclass +class AttributionReportingSourceRegistration: + time: network.TimeSinceEpoch + + #: duration in seconds + expiry: int + + trigger_specs: typing.List[AttributionReportingTriggerSpec] + + #: duration in seconds + aggregatable_report_window: int + + type_: AttributionReportingSourceType + + source_origin: str + + reporting_origin: str + + destination_sites: typing.List[str] + + event_id: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filter_data: typing.List[AttributionReportingFilterDataEntry] + + aggregation_keys: typing.List[AttributionReportingAggregationKeysEntry] + + trigger_data_matching: AttributionReportingTriggerDataMatching + + destination_limit_priority: SignedInt64AsBase10 + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + scopes_data: typing.Optional[AttributionScopesData] = None + + def to_json(self): + json = dict() + json['time'] = self.time.to_json() + json['expiry'] = self.expiry + json['triggerSpecs'] = [i.to_json() for i in self.trigger_specs] + json['aggregatableReportWindow'] = self.aggregatable_report_window + json['type'] = self.type_.to_json() + json['sourceOrigin'] = self.source_origin + json['reportingOrigin'] = self.reporting_origin + json['destinationSites'] = [i for i in self.destination_sites] + json['eventId'] = self.event_id.to_json() + json['priority'] = self.priority.to_json() + json['filterData'] = [i.to_json() for i in self.filter_data] + json['aggregationKeys'] = [i.to_json() for i in self.aggregation_keys] + json['triggerDataMatching'] = self.trigger_data_matching.to_json() + json['destinationLimitPriority'] = self.destination_limit_priority.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + if self.scopes_data is not None: + json['scopesData'] = self.scopes_data.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + time=network.TimeSinceEpoch.from_json(json['time']), + expiry=int(json['expiry']), + trigger_specs=[AttributionReportingTriggerSpec.from_json(i) for i in json['triggerSpecs']], + aggregatable_report_window=int(json['aggregatableReportWindow']), + type_=AttributionReportingSourceType.from_json(json['type']), + source_origin=str(json['sourceOrigin']), + reporting_origin=str(json['reportingOrigin']), + destination_sites=[str(i) for i in json['destinationSites']], + event_id=UnsignedInt64AsBase10.from_json(json['eventId']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filter_data=[AttributionReportingFilterDataEntry.from_json(i) for i in json['filterData']], + aggregation_keys=[AttributionReportingAggregationKeysEntry.from_json(i) for i in json['aggregationKeys']], + trigger_data_matching=AttributionReportingTriggerDataMatching.from_json(json['triggerDataMatching']), + destination_limit_priority=SignedInt64AsBase10.from_json(json['destinationLimitPriority']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + scopes_data=AttributionScopesData.from_json(json['scopesData']) if 'scopesData' in json else None, + ) + + +class AttributionReportingSourceRegistrationResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + INSUFFICIENT_SOURCE_CAPACITY = "insufficientSourceCapacity" + INSUFFICIENT_UNIQUE_DESTINATION_CAPACITY = "insufficientUniqueDestinationCapacity" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + SUCCESS_NOISED = "successNoised" + DESTINATION_REPORTING_LIMIT_REACHED = "destinationReportingLimitReached" + DESTINATION_GLOBAL_LIMIT_REACHED = "destinationGlobalLimitReached" + DESTINATION_BOTH_LIMITS_REACHED = "destinationBothLimitsReached" + REPORTING_ORIGINS_PER_SITE_LIMIT_REACHED = "reportingOriginsPerSiteLimitReached" + EXCEEDS_MAX_CHANNEL_CAPACITY = "exceedsMaxChannelCapacity" + EXCEEDS_MAX_SCOPES_CHANNEL_CAPACITY = "exceedsMaxScopesChannelCapacity" + EXCEEDS_MAX_TRIGGER_STATE_CARDINALITY = "exceedsMaxTriggerStateCardinality" + EXCEEDS_MAX_EVENT_STATES_LIMIT = "exceedsMaxEventStatesLimit" + DESTINATION_PER_DAY_REPORTING_LIMIT_REACHED = "destinationPerDayReportingLimitReached" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingSourceRegistrationTimeConfig(enum.Enum): + INCLUDE = "include" + EXCLUDE = "exclude" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class AttributionReportingAggregatableValueDictEntry: + key: str + + #: number instead of integer because not all uint32 can be represented by + #: int + value: float + + filtering_id: UnsignedInt64AsBase10 + + def to_json(self): + json = dict() + json['key'] = self.key + json['value'] = self.value + json['filteringId'] = self.filtering_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key=str(json['key']), + value=float(json['value']), + filtering_id=UnsignedInt64AsBase10.from_json(json['filteringId']), + ) + + +@dataclass +class AttributionReportingAggregatableValueEntry: + values: typing.List[AttributionReportingAggregatableValueDictEntry] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['values'] = [i.to_json() for i in self.values] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + values=[AttributionReportingAggregatableValueDictEntry.from_json(i) for i in json['values']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingEventTriggerData: + data: UnsignedInt64AsBase10 + + priority: SignedInt64AsBase10 + + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['data'] = self.data.to_json() + json['priority'] = self.priority.to_json() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + data=UnsignedInt64AsBase10.from_json(json['data']), + priority=SignedInt64AsBase10.from_json(json['priority']), + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingAggregatableTriggerData: + key_piece: UnsignedInt128AsBase16 + + source_keys: typing.List[str] + + filters: AttributionReportingFilterPair + + def to_json(self): + json = dict() + json['keyPiece'] = self.key_piece.to_json() + json['sourceKeys'] = [i for i in self.source_keys] + json['filters'] = self.filters.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + key_piece=UnsignedInt128AsBase16.from_json(json['keyPiece']), + source_keys=[str(i) for i in json['sourceKeys']], + filters=AttributionReportingFilterPair.from_json(json['filters']), + ) + + +@dataclass +class AttributionReportingAggregatableDedupKey: + filters: AttributionReportingFilterPair + + dedup_key: typing.Optional[UnsignedInt64AsBase10] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + if self.dedup_key is not None: + json['dedupKey'] = self.dedup_key.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + dedup_key=UnsignedInt64AsBase10.from_json(json['dedupKey']) if 'dedupKey' in json else None, + ) + + +@dataclass +class AttributionReportingTriggerRegistration: + filters: AttributionReportingFilterPair + + aggregatable_dedup_keys: typing.List[AttributionReportingAggregatableDedupKey] + + event_trigger_data: typing.List[AttributionReportingEventTriggerData] + + aggregatable_trigger_data: typing.List[AttributionReportingAggregatableTriggerData] + + aggregatable_values: typing.List[AttributionReportingAggregatableValueEntry] + + aggregatable_filtering_id_max_bytes: int + + debug_reporting: bool + + source_registration_time_config: AttributionReportingSourceRegistrationTimeConfig + + aggregatable_debug_reporting_config: AttributionReportingAggregatableDebugReportingConfig + + scopes: typing.List[str] + + debug_key: typing.Optional[UnsignedInt64AsBase10] = None + + aggregation_coordinator_origin: typing.Optional[str] = None + + trigger_context_id: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['filters'] = self.filters.to_json() + json['aggregatableDedupKeys'] = [i.to_json() for i in self.aggregatable_dedup_keys] + json['eventTriggerData'] = [i.to_json() for i in self.event_trigger_data] + json['aggregatableTriggerData'] = [i.to_json() for i in self.aggregatable_trigger_data] + json['aggregatableValues'] = [i.to_json() for i in self.aggregatable_values] + json['aggregatableFilteringIdMaxBytes'] = self.aggregatable_filtering_id_max_bytes + json['debugReporting'] = self.debug_reporting + json['sourceRegistrationTimeConfig'] = self.source_registration_time_config.to_json() + json['aggregatableDebugReportingConfig'] = self.aggregatable_debug_reporting_config.to_json() + json['scopes'] = [i for i in self.scopes] + if self.debug_key is not None: + json['debugKey'] = self.debug_key.to_json() + if self.aggregation_coordinator_origin is not None: + json['aggregationCoordinatorOrigin'] = self.aggregation_coordinator_origin + if self.trigger_context_id is not None: + json['triggerContextId'] = self.trigger_context_id + return json + + @classmethod + def from_json(cls, json): + return cls( + filters=AttributionReportingFilterPair.from_json(json['filters']), + aggregatable_dedup_keys=[AttributionReportingAggregatableDedupKey.from_json(i) for i in json['aggregatableDedupKeys']], + event_trigger_data=[AttributionReportingEventTriggerData.from_json(i) for i in json['eventTriggerData']], + aggregatable_trigger_data=[AttributionReportingAggregatableTriggerData.from_json(i) for i in json['aggregatableTriggerData']], + aggregatable_values=[AttributionReportingAggregatableValueEntry.from_json(i) for i in json['aggregatableValues']], + aggregatable_filtering_id_max_bytes=int(json['aggregatableFilteringIdMaxBytes']), + debug_reporting=bool(json['debugReporting']), + source_registration_time_config=AttributionReportingSourceRegistrationTimeConfig.from_json(json['sourceRegistrationTimeConfig']), + aggregatable_debug_reporting_config=AttributionReportingAggregatableDebugReportingConfig.from_json(json['aggregatableDebugReportingConfig']), + scopes=[str(i) for i in json['scopes']], + debug_key=UnsignedInt64AsBase10.from_json(json['debugKey']) if 'debugKey' in json else None, + aggregation_coordinator_origin=str(json['aggregationCoordinatorOrigin']) if 'aggregationCoordinatorOrigin' in json else None, + trigger_context_id=str(json['triggerContextId']) if 'triggerContextId' in json else None, + ) + + +class AttributionReportingEventLevelResult(enum.Enum): + SUCCESS = "success" + SUCCESS_DROPPED_LOWER_PRIORITY = "successDroppedLowerPriority" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + DEDUPLICATED = "deduplicated" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + PRIORITY_TOO_LOW = "priorityTooLow" + NEVER_ATTRIBUTED_SOURCE = "neverAttributedSource" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + NO_MATCHING_CONFIGURATIONS = "noMatchingConfigurations" + EXCESSIVE_REPORTS = "excessiveReports" + FALSELY_ATTRIBUTED_SOURCE = "falselyAttributedSource" + REPORT_WINDOW_PASSED = "reportWindowPassed" + NOT_REGISTERED = "notRegistered" + REPORT_WINDOW_NOT_STARTED = "reportWindowNotStarted" + NO_MATCHING_TRIGGER_DATA = "noMatchingTriggerData" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AttributionReportingAggregatableResult(enum.Enum): + SUCCESS = "success" + INTERNAL_ERROR = "internalError" + NO_CAPACITY_FOR_ATTRIBUTION_DESTINATION = "noCapacityForAttributionDestination" + NO_MATCHING_SOURCES = "noMatchingSources" + EXCESSIVE_ATTRIBUTIONS = "excessiveAttributions" + EXCESSIVE_REPORTING_ORIGINS = "excessiveReportingOrigins" + NO_HISTOGRAMS = "noHistograms" + INSUFFICIENT_BUDGET = "insufficientBudget" + NO_MATCHING_SOURCE_FILTER_DATA = "noMatchingSourceFilterData" + NOT_REGISTERED = "notRegistered" + PROHIBITED_BY_BROWSER_POLICY = "prohibitedByBrowserPolicy" + DEDUPLICATED = "deduplicated" + REPORT_WINDOW_PASSED = "reportWindowPassed" + EXCESSIVE_REPORTS = "excessiveReports" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class RelatedWebsiteSet: + ''' + A single Related Website Set object. + ''' + #: The primary site of this set, along with the ccTLDs if there is any. + primary_sites: typing.List[str] + + #: The associated sites of this set, along with the ccTLDs if there is any. + associated_sites: typing.List[str] + + #: The service sites of this set, along with the ccTLDs if there is any. + service_sites: typing.List[str] + + def to_json(self): + json = dict() + json['primarySites'] = [i for i in self.primary_sites] + json['associatedSites'] = [i for i in self.associated_sites] + json['serviceSites'] = [i for i in self.service_sites] + return json + + @classmethod + def from_json(cls, json): + return cls( + primary_sites=[str(i) for i in json['primarySites']], + associated_sites=[str(i) for i in json['associatedSites']], + service_sites=[str(i) for i in json['serviceSites']], + ) + + +def get_storage_key_for_frame( + frame_id: page.FrameId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SerializedStorageKey]: + ''' + Returns a storage key given a frame id. + + :param frame_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['frameId'] = frame_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getStorageKeyForFrame', + 'params': params, + } + json = yield cmd_dict + return SerializedStorageKey.from_json(json['storageKey']) + + +def clear_data_for_origin( + origin: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for origin. + + :param origin: Security origin. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def clear_data_for_storage_key( + storage_key: str, + storage_types: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears storage for storage key. + + :param storage_key: Storage key. + :param storage_types: Comma separated list of StorageType to clear. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['storageTypes'] = storage_types + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearDataForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[network.Cookie]]: + ''' + Returns all browser cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + :returns: Array of cookie objects. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getCookies', + 'params': params, + } + json = yield cmd_dict + return [network.Cookie.from_json(i) for i in json['cookies']] + + +def set_cookies( + cookies: typing.List[network.CookieParam], + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets given cookies. + + :param cookies: Cookies to be set. + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + params['cookies'] = [i.to_json() for i in cookies] + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setCookies', + 'params': params, + } + json = yield cmd_dict + + +def clear_cookies( + browser_context_id: typing.Optional[browser.BrowserContextID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears cookies. + + :param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint. + ''' + params: T_JSON_DICT = dict() + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearCookies', + 'params': params, + } + json = yield cmd_dict + + +def get_usage_and_quota( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[float, float, bool, typing.List[UsageForType]]]: + ''' + Returns usage and quota in bytes. + + :param origin: Security origin. + :returns: A tuple with the following items: + + 0. **usage** - Storage usage (bytes). + 1. **quota** - Storage quota (bytes). + 2. **overrideActive** - Whether or not the origin has an active storage quota override + 3. **usageBreakdown** - Storage usage per type (bytes). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getUsageAndQuota', + 'params': params, + } + json = yield cmd_dict + return ( + float(json['usage']), + float(json['quota']), + bool(json['overrideActive']), + [UsageForType.from_json(i) for i in json['usageBreakdown']] + ) + + +def override_quota_for_origin( + origin: str, + quota_size: typing.Optional[float] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Override quota for the specified origin + + **EXPERIMENTAL** + + :param origin: Security origin. + :param quota_size: *(Optional)* The quota size (in bytes) to override the original quota with. If this is called multiple times, the overridden quota will be equal to the quotaSize provided in the final call. If this is called without specifying a quotaSize, the quota will be reset to the default value for the specified origin. If this is called multiple times with different origins, the override will be maintained for each origin until it is disabled (called without a quotaSize). + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + if quota_size is not None: + params['quotaSize'] = quota_size + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.overrideQuotaForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its cache storage list. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its cache storage list. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers origin to be notified when an update occurs to its IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def track_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Registers storage key to be notified when an update occurs to its IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.trackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for cache storage. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_cache_storage_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for cache storage. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackCacheStorageForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_origin( + origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters origin from receiving notifications for IndexedDB. + + :param origin: Security origin. + ''' + params: T_JSON_DICT = dict() + params['origin'] = origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForOrigin', + 'params': params, + } + json = yield cmd_dict + + +def untrack_indexed_db_for_storage_key( + storage_key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Unregisters storage key from receiving notifications for IndexedDB. + + :param storage_key: Storage key. + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.untrackIndexedDBForStorageKey', + 'params': params, + } + json = yield cmd_dict + + +def get_trust_tokens() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TrustTokens]]: + ''' + Returns the number of stored Trust Tokens per issuer for the + current browsing context. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getTrustTokens', + } + json = yield cmd_dict + return [TrustTokens.from_json(i) for i in json['tokens']] + + +def clear_trust_tokens( + issuer_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Removes all Trust Tokens issued by the provided issuerOrigin. + Leaves other stored data, including the issuer's Redemption Records, intact. + + **EXPERIMENTAL** + + :param issuer_origin: + :returns: True if any tokens were deleted, false otherwise. + ''' + params: T_JSON_DICT = dict() + params['issuerOrigin'] = issuer_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearTrustTokens', + 'params': params, + } + json = yield cmd_dict + return bool(json['didDeleteTokens']) + + +def get_interest_group_details( + owner_origin: str, + name: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,dict]: + ''' + Gets details for a named interest group. + + **EXPERIMENTAL** + + :param owner_origin: + :param name: + :returns: This largely corresponds to: https://wicg.github.io/turtledove/#dictdef-generatebidinterestgroup but has absolute expirationTime instead of relative lifetimeMs and also adds joiningOrigin. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['name'] = name + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getInterestGroupDetails', + 'params': params, + } + json = yield cmd_dict + return dict(json['details']) + + +def set_interest_group_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_interest_group_auction_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/Disables issuing of interestGroupAuctionEventOccurred and + interestGroupAuctionNetworkRequestCreated. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setInterestGroupAuctionTracking', + 'params': params, + } + json = yield cmd_dict + + +def get_shared_storage_metadata( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SharedStorageMetadata]: + ''' + Gets metadata for an origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageMetadata', + 'params': params, + } + json = yield cmd_dict + return SharedStorageMetadata.from_json(json['metadata']) + + +def get_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[SharedStorageEntry]]: + ''' + Gets the entries in an given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :returns: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + return [SharedStorageEntry.from_json(i) for i in json['entries']] + + +def set_shared_storage_entry( + owner_origin: str, + key: str, + value: str, + ignore_if_present: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets entry with ``key`` and ``value`` for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + :param value: + :param ignore_if_present: *(Optional)* If ```ignoreIfPresent```` is included and true, then only sets the entry if ````key``` doesn't already exist. + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + params['value'] = value + if ignore_if_present is not None: + params['ignoreIfPresent'] = ignore_if_present + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def delete_shared_storage_entry( + owner_origin: str, + key: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes entry for ``key`` (if it exists) for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + :param key: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + params['key'] = key + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteSharedStorageEntry', + 'params': params, + } + json = yield cmd_dict + + +def clear_shared_storage_entries( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all entries for a given origin's shared storage. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.clearSharedStorageEntries', + 'params': params, + } + json = yield cmd_dict + + +def reset_shared_storage_budget( + owner_origin: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets the budget for ``ownerOrigin`` by clearing all budget withdrawals. + + **EXPERIMENTAL** + + :param owner_origin: + ''' + params: T_JSON_DICT = dict() + params['ownerOrigin'] = owner_origin + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.resetSharedStorageBudget', + 'params': params, + } + json = yield cmd_dict + + +def set_shared_storage_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of sharedStorageAccessed events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setSharedStorageTracking', + 'params': params, + } + json = yield cmd_dict + + +def set_storage_bucket_tracking( + storage_key: str, + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Set tracking for a storage key's buckets. + + **EXPERIMENTAL** + + :param storage_key: + :param enable: + ''' + params: T_JSON_DICT = dict() + params['storageKey'] = storage_key + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setStorageBucketTracking', + 'params': params, + } + json = yield cmd_dict + + +def delete_storage_bucket( + bucket: StorageBucket + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes the Storage Bucket with the given storage key and bucket name. + + **EXPERIMENTAL** + + :param bucket: + ''' + params: T_JSON_DICT = dict() + params['bucket'] = bucket.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.deleteStorageBucket', + 'params': params, + } + json = yield cmd_dict + + +def run_bounce_tracking_mitigations() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Deletes state for sites identified as potential bounce trackers, immediately. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.runBounceTrackingMitigations', + } + json = yield cmd_dict + return [str(i) for i in json['deletedSites']] + + +def set_attribution_reporting_local_testing_mode( + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + https://wicg.github.io/attribution-reporting-api/ + + **EXPERIMENTAL** + + :param enabled: If enabled, noise is suppressed and reports are sent immediately. + ''' + params: T_JSON_DICT = dict() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingLocalTestingMode', + 'params': params, + } + json = yield cmd_dict + + +def set_attribution_reporting_tracking( + enable: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables/disables issuing of Attribution Reporting events. + + **EXPERIMENTAL** + + :param enable: + ''' + params: T_JSON_DICT = dict() + params['enable'] = enable + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.setAttributionReportingTracking', + 'params': params, + } + json = yield cmd_dict + + +def send_pending_attribution_reports() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,int]: + ''' + Sends all pending Attribution Reports immediately, regardless of their + scheduled report time. + + **EXPERIMENTAL** + + :returns: The number of reports that were sent. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.sendPendingAttributionReports', + } + json = yield cmd_dict + return int(json['numSent']) + + +def get_related_website_sets() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[RelatedWebsiteSet]]: + ''' + Returns the effective Related Website Sets in use by this profile for the browser + session. The effective Related Website Sets will not change during a browser session. + + **EXPERIMENTAL** + + :returns: + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Storage.getRelatedWebsiteSets', + } + json = yield cmd_dict + return [RelatedWebsiteSet.from_json(i) for i in json['sets']] + + +@event_class('Storage.cacheStorageContentUpdated') +@dataclass +class CacheStorageContentUpdated: + ''' + A cache's contents have been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Name of cache in origin. + cache_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + cache_name=str(json['cacheName']) + ) + + +@event_class('Storage.cacheStorageListUpdated') +@dataclass +class CacheStorageListUpdated: + ''' + A cache has been added/deleted. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CacheStorageListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.indexedDBContentUpdated') +@dataclass +class IndexedDBContentUpdated: + ''' + The origin's IndexedDB object store has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + #: Database to update. + database_name: str + #: ObjectStore to update. + object_store_name: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBContentUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']), + database_name=str(json['databaseName']), + object_store_name=str(json['objectStoreName']) + ) + + +@event_class('Storage.indexedDBListUpdated') +@dataclass +class IndexedDBListUpdated: + ''' + The origin's IndexedDB database list has been modified. + ''' + #: Origin to update. + origin: str + #: Storage key to update. + storage_key: str + #: Storage bucket to update. + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> IndexedDBListUpdated: + return cls( + origin=str(json['origin']), + storage_key=str(json['storageKey']), + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.interestGroupAccessed') +@dataclass +class InterestGroupAccessed: + ''' + One of the interest groups was accessed. Note that these events are global + to all targets sharing an interest group store. + ''' + access_time: network.TimeSinceEpoch + type_: InterestGroupAccessType + owner_origin: str + name: str + #: For topLevelBid/topLevelAdditionalBid, and when appropriate, + #: win and additionalBidWin + component_seller_origin: typing.Optional[str] + #: For bid or somethingBid event, if done locally and not on a server. + bid: typing.Optional[float] + bid_currency: typing.Optional[str] + #: For non-global events --- links to interestGroupAuctionEvent + unique_auction_id: typing.Optional[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=InterestGroupAccessType.from_json(json['type']), + owner_origin=str(json['ownerOrigin']), + name=str(json['name']), + component_seller_origin=str(json['componentSellerOrigin']) if 'componentSellerOrigin' in json else None, + bid=float(json['bid']) if 'bid' in json else None, + bid_currency=str(json['bidCurrency']) if 'bidCurrency' in json else None, + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']) if 'uniqueAuctionId' in json else None + ) + + +@event_class('Storage.interestGroupAuctionEventOccurred') +@dataclass +class InterestGroupAuctionEventOccurred: + ''' + An auction involving interest groups is taking place. These events are + target-specific. + ''' + event_time: network.TimeSinceEpoch + type_: InterestGroupAuctionEventType + unique_auction_id: InterestGroupAuctionId + #: Set for child auctions. + parent_auction_id: typing.Optional[InterestGroupAuctionId] + #: Set for started and configResolved + auction_config: typing.Optional[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionEventOccurred: + return cls( + event_time=network.TimeSinceEpoch.from_json(json['eventTime']), + type_=InterestGroupAuctionEventType.from_json(json['type']), + unique_auction_id=InterestGroupAuctionId.from_json(json['uniqueAuctionId']), + parent_auction_id=InterestGroupAuctionId.from_json(json['parentAuctionId']) if 'parentAuctionId' in json else None, + auction_config=dict(json['auctionConfig']) if 'auctionConfig' in json else None + ) + + +@event_class('Storage.interestGroupAuctionNetworkRequestCreated') +@dataclass +class InterestGroupAuctionNetworkRequestCreated: + ''' + Specifies which auctions a particular network fetch may be related to, and + in what role. Note that it is not ordered with respect to + Network.requestWillBeSent (but will happen before loadingFinished + loadingFailed). + ''' + type_: InterestGroupAuctionFetchType + request_id: network.RequestId + #: This is the set of the auctions using the worklet that issued this + #: request. In the case of trusted signals, it's possible that only some of + #: them actually care about the keys being queried. + auctions: typing.List[InterestGroupAuctionId] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> InterestGroupAuctionNetworkRequestCreated: + return cls( + type_=InterestGroupAuctionFetchType.from_json(json['type']), + request_id=network.RequestId.from_json(json['requestId']), + auctions=[InterestGroupAuctionId.from_json(i) for i in json['auctions']] + ) + + +@event_class('Storage.sharedStorageAccessed') +@dataclass +class SharedStorageAccessed: + ''' + Shared storage was accessed by the associated page. + The following parameters are included in all events. + ''' + #: Time of the access. + access_time: network.TimeSinceEpoch + #: Enum value indicating the Shared Storage API method invoked. + type_: SharedStorageAccessType + #: DevTools Frame Token for the primary frame tree's root. + main_frame_id: page.FrameId + #: Serialized origin for the context that invoked the Shared Storage API. + owner_origin: str + #: The sub-parameters wrapped by ``params`` are all optional and their + #: presence/absence depends on ``type``. + params: SharedStorageAccessParams + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> SharedStorageAccessed: + return cls( + access_time=network.TimeSinceEpoch.from_json(json['accessTime']), + type_=SharedStorageAccessType.from_json(json['type']), + main_frame_id=page.FrameId.from_json(json['mainFrameId']), + owner_origin=str(json['ownerOrigin']), + params=SharedStorageAccessParams.from_json(json['params']) + ) + + +@event_class('Storage.storageBucketCreatedOrUpdated') +@dataclass +class StorageBucketCreatedOrUpdated: + bucket_info: StorageBucketInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketCreatedOrUpdated: + return cls( + bucket_info=StorageBucketInfo.from_json(json['bucketInfo']) + ) + + +@event_class('Storage.storageBucketDeleted') +@dataclass +class StorageBucketDeleted: + bucket_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> StorageBucketDeleted: + return cls( + bucket_id=str(json['bucketId']) + ) + + +@event_class('Storage.attributionReportingSourceRegistered') +@dataclass +class AttributionReportingSourceRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingSourceRegistration + result: AttributionReportingSourceRegistrationResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingSourceRegistered: + return cls( + registration=AttributionReportingSourceRegistration.from_json(json['registration']), + result=AttributionReportingSourceRegistrationResult.from_json(json['result']) + ) + + +@event_class('Storage.attributionReportingTriggerRegistered') +@dataclass +class AttributionReportingTriggerRegistered: + ''' + **EXPERIMENTAL** + + + ''' + registration: AttributionReportingTriggerRegistration + event_level: AttributionReportingEventLevelResult + aggregatable: AttributionReportingAggregatableResult + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttributionReportingTriggerRegistered: + return cls( + registration=AttributionReportingTriggerRegistration.from_json(json['registration']), + event_level=AttributionReportingEventLevelResult.from_json(json['eventLevel']), + aggregatable=AttributionReportingAggregatableResult.from_json(json['aggregatable']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/system_info.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/system_info.py new file mode 100755 index 0000000..d1b2f6b --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/system_info.py @@ -0,0 +1,366 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: SystemInfo (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +@dataclass +class GPUDevice: + ''' + Describes a single graphics processor (GPU). + ''' + #: PCI ID of the GPU vendor, if available; 0 otherwise. + vendor_id: float + + #: PCI ID of the GPU device, if available; 0 otherwise. + device_id: float + + #: String description of the GPU vendor, if the PCI ID is not available. + vendor_string: str + + #: String description of the GPU device, if the PCI ID is not available. + device_string: str + + #: String description of the GPU driver vendor. + driver_vendor: str + + #: String description of the GPU driver version. + driver_version: str + + #: Sub sys ID of the GPU, only available on Windows. + sub_sys_id: typing.Optional[float] = None + + #: Revision of the GPU, only available on Windows. + revision: typing.Optional[float] = None + + def to_json(self): + json = dict() + json['vendorId'] = self.vendor_id + json['deviceId'] = self.device_id + json['vendorString'] = self.vendor_string + json['deviceString'] = self.device_string + json['driverVendor'] = self.driver_vendor + json['driverVersion'] = self.driver_version + if self.sub_sys_id is not None: + json['subSysId'] = self.sub_sys_id + if self.revision is not None: + json['revision'] = self.revision + return json + + @classmethod + def from_json(cls, json): + return cls( + vendor_id=float(json['vendorId']), + device_id=float(json['deviceId']), + vendor_string=str(json['vendorString']), + device_string=str(json['deviceString']), + driver_vendor=str(json['driverVendor']), + driver_version=str(json['driverVersion']), + sub_sys_id=float(json['subSysId']) if 'subSysId' in json else None, + revision=float(json['revision']) if 'revision' in json else None, + ) + + +@dataclass +class Size: + ''' + Describes the width and height dimensions of an entity. + ''' + #: Width in pixels. + width: int + + #: Height in pixels. + height: int + + def to_json(self): + json = dict() + json['width'] = self.width + json['height'] = self.height + return json + + @classmethod + def from_json(cls, json): + return cls( + width=int(json['width']), + height=int(json['height']), + ) + + +@dataclass +class VideoDecodeAcceleratorCapability: + ''' + Describes a supported video decoding profile with its associated minimum and + maximum resolutions. + ''' + #: Video codec profile that is supported, e.g. VP9 Profile 2. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Minimum video dimensions in pixels supported for this ``profile``. + min_resolution: Size + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['minResolution'] = self.min_resolution.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + min_resolution=Size.from_json(json['minResolution']), + ) + + +@dataclass +class VideoEncodeAcceleratorCapability: + ''' + Describes a supported video encoding profile with its associated maximum + resolution and maximum framerate. + ''' + #: Video codec profile that is supported, e.g H264 Main. + profile: str + + #: Maximum video dimensions in pixels supported for this ``profile``. + max_resolution: Size + + #: Maximum encoding framerate in frames per second supported for this + #: ``profile``, as fraction's numerator and denominator, e.g. 24/1 fps, + #: 24000/1001 fps, etc. + max_framerate_numerator: int + + max_framerate_denominator: int + + def to_json(self): + json = dict() + json['profile'] = self.profile + json['maxResolution'] = self.max_resolution.to_json() + json['maxFramerateNumerator'] = self.max_framerate_numerator + json['maxFramerateDenominator'] = self.max_framerate_denominator + return json + + @classmethod + def from_json(cls, json): + return cls( + profile=str(json['profile']), + max_resolution=Size.from_json(json['maxResolution']), + max_framerate_numerator=int(json['maxFramerateNumerator']), + max_framerate_denominator=int(json['maxFramerateDenominator']), + ) + + +class SubsamplingFormat(enum.Enum): + ''' + YUV subsampling type of the pixels of a given image. + ''' + YUV420 = "yuv420" + YUV422 = "yuv422" + YUV444 = "yuv444" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ImageType(enum.Enum): + ''' + Image format of a given image. + ''' + JPEG = "jpeg" + WEBP = "webp" + UNKNOWN = "unknown" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ImageDecodeAcceleratorCapability: + ''' + Describes a supported image decoding profile with its associated minimum and + maximum resolutions and subsampling. + ''' + #: Image coded, e.g. Jpeg. + image_type: ImageType + + #: Maximum supported dimensions of the image in pixels. + max_dimensions: Size + + #: Minimum supported dimensions of the image in pixels. + min_dimensions: Size + + #: Optional array of supported subsampling formats, e.g. 4:2:0, if known. + subsamplings: typing.List[SubsamplingFormat] + + def to_json(self): + json = dict() + json['imageType'] = self.image_type.to_json() + json['maxDimensions'] = self.max_dimensions.to_json() + json['minDimensions'] = self.min_dimensions.to_json() + json['subsamplings'] = [i.to_json() for i in self.subsamplings] + return json + + @classmethod + def from_json(cls, json): + return cls( + image_type=ImageType.from_json(json['imageType']), + max_dimensions=Size.from_json(json['maxDimensions']), + min_dimensions=Size.from_json(json['minDimensions']), + subsamplings=[SubsamplingFormat.from_json(i) for i in json['subsamplings']], + ) + + +@dataclass +class GPUInfo: + ''' + Provides information about the GPU(s) on the system. + ''' + #: The graphics devices on the system. Element 0 is the primary GPU. + devices: typing.List[GPUDevice] + + #: An optional array of GPU driver bug workarounds. + driver_bug_workarounds: typing.List[str] + + #: Supported accelerated video decoding capabilities. + video_decoding: typing.List[VideoDecodeAcceleratorCapability] + + #: Supported accelerated video encoding capabilities. + video_encoding: typing.List[VideoEncodeAcceleratorCapability] + + #: Supported accelerated image decoding capabilities. + image_decoding: typing.List[ImageDecodeAcceleratorCapability] + + #: An optional dictionary of additional GPU related attributes. + aux_attributes: typing.Optional[dict] = None + + #: An optional dictionary of graphics features and their status. + feature_status: typing.Optional[dict] = None + + def to_json(self): + json = dict() + json['devices'] = [i.to_json() for i in self.devices] + json['driverBugWorkarounds'] = [i for i in self.driver_bug_workarounds] + json['videoDecoding'] = [i.to_json() for i in self.video_decoding] + json['videoEncoding'] = [i.to_json() for i in self.video_encoding] + json['imageDecoding'] = [i.to_json() for i in self.image_decoding] + if self.aux_attributes is not None: + json['auxAttributes'] = self.aux_attributes + if self.feature_status is not None: + json['featureStatus'] = self.feature_status + return json + + @classmethod + def from_json(cls, json): + return cls( + devices=[GPUDevice.from_json(i) for i in json['devices']], + driver_bug_workarounds=[str(i) for i in json['driverBugWorkarounds']], + video_decoding=[VideoDecodeAcceleratorCapability.from_json(i) for i in json['videoDecoding']], + video_encoding=[VideoEncodeAcceleratorCapability.from_json(i) for i in json['videoEncoding']], + image_decoding=[ImageDecodeAcceleratorCapability.from_json(i) for i in json['imageDecoding']], + aux_attributes=dict(json['auxAttributes']) if 'auxAttributes' in json else None, + feature_status=dict(json['featureStatus']) if 'featureStatus' in json else None, + ) + + +@dataclass +class ProcessInfo: + ''' + Represents process info. + ''' + #: Specifies process type. + type_: str + + #: Specifies process id. + id_: int + + #: Specifies cumulative CPU usage in seconds across all threads of the + #: process since the process start. + cpu_time: float + + def to_json(self): + json = dict() + json['type'] = self.type_ + json['id'] = self.id_ + json['cpuTime'] = self.cpu_time + return json + + @classmethod + def from_json(cls, json): + return cls( + type_=str(json['type']), + id_=int(json['id']), + cpu_time=float(json['cpuTime']), + ) + + +def get_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[GPUInfo, str, str, str]]: + ''' + Returns information about the system. + + :returns: A tuple with the following items: + + 0. **gpu** - Information about the GPUs on the system. + 1. **modelName** - A platform-dependent description of the model of the machine. On Mac OS, this is, for example, 'MacBookPro'. Will be the empty string if not supported. + 2. **modelVersion** - A platform-dependent description of the version of the machine. On Mac OS, this is, for example, '10.1'. Will be the empty string if not supported. + 3. **commandLine** - The command line string used to launch the browser. Will be the empty string if not supported. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getInfo', + } + json = yield cmd_dict + return ( + GPUInfo.from_json(json['gpu']), + str(json['modelName']), + str(json['modelVersion']), + str(json['commandLine']) + ) + + +def get_feature_state( + feature_state: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Returns information about the feature state. + + :param feature_state: + :returns: + ''' + params: T_JSON_DICT = dict() + params['featureState'] = feature_state + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getFeatureState', + 'params': params, + } + json = yield cmd_dict + return bool(json['featureEnabled']) + + +def get_process_info() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[ProcessInfo]]: + ''' + Returns information about all running processes. + + :returns: An array of process info blocks. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'SystemInfo.getProcessInfo', + } + json = yield cmd_dict + return [ProcessInfo.from_json(i) for i in json['processInfo']] diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/target.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/target.py new file mode 100755 index 0000000..2a59a9e --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/target.py @@ -0,0 +1,713 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Target +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import browser +from . import page + + +class TargetID(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> TargetID: + return cls(json) + + def __repr__(self): + return 'TargetID({})'.format(super().__repr__()) + + +class SessionID(str): + ''' + Unique identifier of attached debugging session. + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> SessionID: + return cls(json) + + def __repr__(self): + return 'SessionID({})'.format(super().__repr__()) + + +@dataclass +class TargetInfo: + target_id: TargetID + + #: List of types: https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypeTab%5B%5D%22 + type_: str + + title: str + + url: str + + #: Whether the target has an attached client. + attached: bool + + #: Whether the target has access to the originating window. + can_access_opener: bool + + #: Opener target Id + opener_id: typing.Optional[TargetID] = None + + #: Frame id of originating window (is only set if target has an opener). + opener_frame_id: typing.Optional[page.FrameId] = None + + browser_context_id: typing.Optional[browser.BrowserContextID] = None + + #: Provides additional details for specific target types. For example, for + #: the type of "page", this may be set to "prerender". + subtype: typing.Optional[str] = None + + def to_json(self): + json = dict() + json['targetId'] = self.target_id.to_json() + json['type'] = self.type_ + json['title'] = self.title + json['url'] = self.url + json['attached'] = self.attached + json['canAccessOpener'] = self.can_access_opener + if self.opener_id is not None: + json['openerId'] = self.opener_id.to_json() + if self.opener_frame_id is not None: + json['openerFrameId'] = self.opener_frame_id.to_json() + if self.browser_context_id is not None: + json['browserContextId'] = self.browser_context_id.to_json() + if self.subtype is not None: + json['subtype'] = self.subtype + return json + + @classmethod + def from_json(cls, json): + return cls( + target_id=TargetID.from_json(json['targetId']), + type_=str(json['type']), + title=str(json['title']), + url=str(json['url']), + attached=bool(json['attached']), + can_access_opener=bool(json['canAccessOpener']), + opener_id=TargetID.from_json(json['openerId']) if 'openerId' in json else None, + opener_frame_id=page.FrameId.from_json(json['openerFrameId']) if 'openerFrameId' in json else None, + browser_context_id=browser.BrowserContextID.from_json(json['browserContextId']) if 'browserContextId' in json else None, + subtype=str(json['subtype']) if 'subtype' in json else None, + ) + + +@dataclass +class FilterEntry: + ''' + A filter used by target query/discovery/auto-attach operations. + ''' + #: If set, causes exclusion of matching targets from the list. + exclude: typing.Optional[bool] = None + + #: If not present, matches any type. + type_: typing.Optional[str] = None + + def to_json(self): + json = dict() + if self.exclude is not None: + json['exclude'] = self.exclude + if self.type_ is not None: + json['type'] = self.type_ + return json + + @classmethod + def from_json(cls, json): + return cls( + exclude=bool(json['exclude']) if 'exclude' in json else None, + type_=str(json['type']) if 'type' in json else None, + ) + + +class TargetFilter(list): + ''' + The entries in TargetFilter are matched sequentially against targets and + the first entry that matches determines if the target is included or not, + depending on the value of ``exclude`` field in the entry. + If filter is not specified, the one assumed is + [{type: "browser", exclude: true}, {type: "tab", exclude: true}, {}] + (i.e. include everything but ``browser`` and ``tab``). + ''' + def to_json(self) -> typing.List[FilterEntry]: + return self + + @classmethod + def from_json(cls, json: typing.List[FilterEntry]) -> TargetFilter: + return cls(json) + + def __repr__(self): + return 'TargetFilter({})'.format(super().__repr__()) + + +@dataclass +class RemoteLocation: + host: str + + port: int + + def to_json(self): + json = dict() + json['host'] = self.host + json['port'] = self.port + return json + + @classmethod + def from_json(cls, json): + return cls( + host=str(json['host']), + port=int(json['port']), + ) + + +def activate_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Activates (focuses) the target. + + :param target_id: + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.activateTarget', + 'params': params, + } + json = yield cmd_dict + + +def attach_to_target( + target_id: TargetID, + flatten: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the target with given id. + + :param target_id: + :param flatten: *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :returns: Id assigned to the session. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if flatten is not None: + params['flatten'] = flatten + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToTarget', + 'params': params, + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def attach_to_browser_target() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,SessionID]: + ''' + Attaches to the browser target, only uses flat sessionId mode. + + **EXPERIMENTAL** + + :returns: Id assigned to the session. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.attachToBrowserTarget', + } + json = yield cmd_dict + return SessionID.from_json(json['sessionId']) + + +def close_target( + target_id: TargetID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,bool]: + ''' + Closes the target. If the target is a page that gets closed too. + + :param target_id: + :returns: Always set to true. If an error occurs, the response indicates protocol error. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.closeTarget', + 'params': params, + } + json = yield cmd_dict + return bool(json['success']) + + +def expose_dev_tools_protocol( + target_id: TargetID, + binding_name: typing.Optional[str] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Inject object to the target's main frame that provides a communication + channel with browser target. + + Injected object will be available as ``window[bindingName]``. + + The object has the following API: + - ``binding.send(json)`` - a method to send messages over the remote debugging protocol + - ``binding.onmessage = json => handleMessage(json)`` - a callback that will be called for the protocol notifications and command responses. + + **EXPERIMENTAL** + + :param target_id: + :param binding_name: *(Optional)* Binding name, 'cdp' if not specified. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + if binding_name is not None: + params['bindingName'] = binding_name + cmd_dict: T_JSON_DICT = { + 'method': 'Target.exposeDevToolsProtocol', + 'params': params, + } + json = yield cmd_dict + + +def create_browser_context( + dispose_on_detach: typing.Optional[bool] = None, + proxy_server: typing.Optional[str] = None, + proxy_bypass_list: typing.Optional[str] = None, + origins_with_universal_network_access: typing.Optional[typing.List[str]] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,browser.BrowserContextID]: + ''' + Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than + one. + + :param dispose_on_detach: **(EXPERIMENTAL)** *(Optional)* If specified, disposes this context when debugging session disconnects. + :param proxy_server: **(EXPERIMENTAL)** *(Optional)* Proxy server, similar to the one passed to --proxy-server + :param proxy_bypass_list: **(EXPERIMENTAL)** *(Optional)* Proxy bypass list, similar to the one passed to --proxy-bypass-list + :param origins_with_universal_network_access: **(EXPERIMENTAL)** *(Optional)* An optional list of origins to grant unlimited cross-origin access to. Parts of the URL other than those constituting origin are ignored. + :returns: The id of the context created. + ''' + params: T_JSON_DICT = dict() + if dispose_on_detach is not None: + params['disposeOnDetach'] = dispose_on_detach + if proxy_server is not None: + params['proxyServer'] = proxy_server + if proxy_bypass_list is not None: + params['proxyBypassList'] = proxy_bypass_list + if origins_with_universal_network_access is not None: + params['originsWithUniversalNetworkAccess'] = [i for i in origins_with_universal_network_access] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createBrowserContext', + 'params': params, + } + json = yield cmd_dict + return browser.BrowserContextID.from_json(json['browserContextId']) + + +def get_browser_contexts() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[browser.BrowserContextID]]: + ''' + Returns all browser contexts created with ``Target.createBrowserContext`` method. + + :returns: An array of browser context ids. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getBrowserContexts', + } + json = yield cmd_dict + return [browser.BrowserContextID.from_json(i) for i in json['browserContextIds']] + + +def create_target( + url: str, + width: typing.Optional[int] = None, + height: typing.Optional[int] = None, + browser_context_id: typing.Optional[browser.BrowserContextID] = None, + enable_begin_frame_control: typing.Optional[bool] = None, + new_window: typing.Optional[bool] = None, + background: typing.Optional[bool] = None, + for_tab: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetID]: + ''' + Creates a new page. + + :param url: The initial URL the page will be navigated to. An empty string indicates about:blank. + :param width: *(Optional)* Frame width in DIP (headless chrome only). + :param height: *(Optional)* Frame height in DIP (headless chrome only). + :param browser_context_id: **(EXPERIMENTAL)** *(Optional)* The browser context to create the page in. + :param enable_begin_frame_control: **(EXPERIMENTAL)** *(Optional)* Whether BeginFrames for this target will be controlled via DevTools (headless chrome only, not supported on MacOS yet, false by default). + :param new_window: *(Optional)* Whether to create a new Window or Tab (chrome-only, false by default). + :param background: *(Optional)* Whether to create the target in background or foreground (chrome-only, false by default). + :param for_tab: **(EXPERIMENTAL)** *(Optional)* Whether to create the target of type "tab". + :returns: The id of the page opened. + ''' + params: T_JSON_DICT = dict() + params['url'] = url + if width is not None: + params['width'] = width + if height is not None: + params['height'] = height + if browser_context_id is not None: + params['browserContextId'] = browser_context_id.to_json() + if enable_begin_frame_control is not None: + params['enableBeginFrameControl'] = enable_begin_frame_control + if new_window is not None: + params['newWindow'] = new_window + if background is not None: + params['background'] = background + if for_tab is not None: + params['forTab'] = for_tab + cmd_dict: T_JSON_DICT = { + 'method': 'Target.createTarget', + 'params': params, + } + json = yield cmd_dict + return TargetID.from_json(json['targetId']) + + +def detach_from_target( + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Detaches session with given id. + + :param session_id: *(Optional)* Session to detach. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.detachFromTarget', + 'params': params, + } + json = yield cmd_dict + + +def dispose_browser_context( + browser_context_id: browser.BrowserContextID + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Deletes a BrowserContext. All the belonging pages will be closed without calling their + beforeunload hooks. + + :param browser_context_id: + ''' + params: T_JSON_DICT = dict() + params['browserContextId'] = browser_context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.disposeBrowserContext', + 'params': params, + } + json = yield cmd_dict + + +def get_target_info( + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,TargetInfo]: + ''' + Returns information about a target. + + **EXPERIMENTAL** + + :param target_id: *(Optional)* + :returns: + ''' + params: T_JSON_DICT = dict() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargetInfo', + 'params': params, + } + json = yield cmd_dict + return TargetInfo.from_json(json['targetInfo']) + + +def get_targets( + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[TargetInfo]]: + ''' + Retrieves a list of available targets. + + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be reported. If filter is not specified and target discovery is currently enabled, a filter used for target discovery is used for consistency. + :returns: The list of targets. + ''' + params: T_JSON_DICT = dict() + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.getTargets', + 'params': params, + } + json = yield cmd_dict + return [TargetInfo.from_json(i) for i in json['targetInfos']] + + +def send_message_to_target( + message: str, + session_id: typing.Optional[SessionID] = None, + target_id: typing.Optional[TargetID] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sends protocol message over session with given id. + Consider using flat mode instead; see commands attachToTarget, setAutoAttach, + and crbug.com/991325. + + :param message: + :param session_id: *(Optional)* Identifier of the session. + :param target_id: *(Optional)* Deprecated. + ''' + params: T_JSON_DICT = dict() + params['message'] = message + if session_id is not None: + params['sessionId'] = session_id.to_json() + if target_id is not None: + params['targetId'] = target_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.sendMessageToTarget', + 'params': params, + } + json = yield cmd_dict + + +def set_auto_attach( + auto_attach: bool, + wait_for_debugger_on_start: bool, + flatten: typing.Optional[bool] = None, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to automatically attach to new targets which are considered to be related to + this one. When turned on, attaches to all existing related targets as well. When turned off, + automatically detaches from all currently attached targets. + This also clears all targets added by ``autoAttachRelated`` from the list of targets to watch + for creation of related targets. + + :param auto_attach: Whether to auto-attach to related targets. + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param flatten: **(EXPERIMENTAL)** *(Optional)* Enables "flat" access to the session via specifying sessionId attribute in the commands. We plan to make this the default, deprecate non-flattened mode, and eventually retire it. See crbug.com/991325. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['autoAttach'] = auto_attach + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if flatten is not None: + params['flatten'] = flatten + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setAutoAttach', + 'params': params, + } + json = yield cmd_dict + + +def auto_attach_related( + target_id: TargetID, + wait_for_debugger_on_start: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the specified target to the list of targets that will be monitored for any related target + creation (such as child frames, child workers and new versions of service worker) and reported + through ``attachedToTarget``. The specified target is also auto-attached. + This cancels the effect of any previous ``setAutoAttach`` and is also cancelled by subsequent + ``setAutoAttach``. Only available at the Browser target. + + **EXPERIMENTAL** + + :param target_id: + :param wait_for_debugger_on_start: Whether to pause new targets when attaching to them. Use ```Runtime.runIfWaitingForDebugger``` to run paused targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. + ''' + params: T_JSON_DICT = dict() + params['targetId'] = target_id.to_json() + params['waitForDebuggerOnStart'] = wait_for_debugger_on_start + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.autoAttachRelated', + 'params': params, + } + json = yield cmd_dict + + +def set_discover_targets( + discover: bool, + filter_: typing.Optional[TargetFilter] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Controls whether to discover available targets and notify via + ``targetCreated/targetInfoChanged/targetDestroyed`` events. + + :param discover: Whether to discover available targets. + :param filter_: **(EXPERIMENTAL)** *(Optional)* Only targets matching filter will be attached. If ```discover```` is false, ````filter``` must be omitted or empty. + ''' + params: T_JSON_DICT = dict() + params['discover'] = discover + if filter_ is not None: + params['filter'] = filter_.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setDiscoverTargets', + 'params': params, + } + json = yield cmd_dict + + +def set_remote_locations( + locations: typing.List[RemoteLocation] + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables target discovery for the specified locations, when ``setDiscoverTargets`` was set to + ``true``. + + **EXPERIMENTAL** + + :param locations: List of remote locations. + ''' + params: T_JSON_DICT = dict() + params['locations'] = [i.to_json() for i in locations] + cmd_dict: T_JSON_DICT = { + 'method': 'Target.setRemoteLocations', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Target.attachedToTarget') +@dataclass +class AttachedToTarget: + ''' + **EXPERIMENTAL** + + Issued when attached to target because of auto-attach or ``attachToTarget`` command. + ''' + #: Identifier assigned to the session used to send/receive messages. + session_id: SessionID + target_info: TargetInfo + waiting_for_debugger: bool + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AttachedToTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_info=TargetInfo.from_json(json['targetInfo']), + waiting_for_debugger=bool(json['waitingForDebugger']) + ) + + +@event_class('Target.detachedFromTarget') +@dataclass +class DetachedFromTarget: + ''' + **EXPERIMENTAL** + + Issued when detached from target for any reason (including ``detachFromTarget`` command). Can be + issued multiple times per target if multiple sessions have been attached to it. + ''' + #: Detached session identifier. + session_id: SessionID + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DetachedFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.receivedMessageFromTarget') +@dataclass +class ReceivedMessageFromTarget: + ''' + Notifies about a new protocol message received from the session (as reported in + ``attachedToTarget`` event). + ''' + #: Identifier of a session which sends a message. + session_id: SessionID + message: str + #: Deprecated. + target_id: typing.Optional[TargetID] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ReceivedMessageFromTarget: + return cls( + session_id=SessionID.from_json(json['sessionId']), + message=str(json['message']), + target_id=TargetID.from_json(json['targetId']) if 'targetId' in json else None + ) + + +@event_class('Target.targetCreated') +@dataclass +class TargetCreated: + ''' + Issued when a possible inspection target is created. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCreated: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) + + +@event_class('Target.targetDestroyed') +@dataclass +class TargetDestroyed: + ''' + Issued when a target is destroyed. + ''' + target_id: TargetID + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetDestroyed: + return cls( + target_id=TargetID.from_json(json['targetId']) + ) + + +@event_class('Target.targetCrashed') +@dataclass +class TargetCrashed: + ''' + Issued when a target has crashed. + ''' + target_id: TargetID + #: Termination status type. + status: str + #: Termination error code. + error_code: int + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetCrashed: + return cls( + target_id=TargetID.from_json(json['targetId']), + status=str(json['status']), + error_code=int(json['errorCode']) + ) + + +@event_class('Target.targetInfoChanged') +@dataclass +class TargetInfoChanged: + ''' + Issued when some information about a target has changed. This only happens between + ``targetCreated`` and ``targetDestroyed``. + ''' + target_info: TargetInfo + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TargetInfoChanged: + return cls( + target_info=TargetInfo.from_json(json['targetInfo']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tethering.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tethering.py new file mode 100755 index 0000000..af358ad --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tethering.py @@ -0,0 +1,63 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tethering (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +def bind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port binding. + + :param port: Port number to bind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.bind', + 'params': params, + } + json = yield cmd_dict + + +def unbind( + port: int + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Request browser port unbinding. + + :param port: Port number to unbind. + ''' + params: T_JSON_DICT = dict() + params['port'] = port + cmd_dict: T_JSON_DICT = { + 'method': 'Tethering.unbind', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tethering.accepted') +@dataclass +class Accepted: + ''' + Informs that port was successfully bound and got a specified connection id. + ''' + #: Port number that was successfully bound. + port: int + #: Connection id to be used. + connection_id: str + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> Accepted: + return cls( + port=int(json['port']), + connection_id=str(json['connectionId']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tracing.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tracing.py new file mode 100755 index 0000000..9952697 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/tracing.py @@ -0,0 +1,360 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: Tracing +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing +from . import io + + +class MemoryDumpConfig(dict): + ''' + Configuration for memory dump. Used only when "memory-infra" category is enabled. + ''' + def to_json(self) -> dict: + return self + + @classmethod + def from_json(cls, json: dict) -> MemoryDumpConfig: + return cls(json) + + def __repr__(self): + return 'MemoryDumpConfig({})'.format(super().__repr__()) + + +@dataclass +class TraceConfig: + #: Controls how the trace buffer stores data. + record_mode: typing.Optional[str] = None + + #: Size of the trace buffer in kilobytes. If not specified or zero is passed, a default value + #: of 200 MB would be used. + trace_buffer_size_in_kb: typing.Optional[float] = None + + #: Turns on JavaScript stack sampling. + enable_sampling: typing.Optional[bool] = None + + #: Turns on system tracing. + enable_systrace: typing.Optional[bool] = None + + #: Turns on argument filter. + enable_argument_filter: typing.Optional[bool] = None + + #: Included category filters. + included_categories: typing.Optional[typing.List[str]] = None + + #: Excluded category filters. + excluded_categories: typing.Optional[typing.List[str]] = None + + #: Configuration to synthesize the delays in tracing. + synthetic_delays: typing.Optional[typing.List[str]] = None + + #: Configuration for memory dump triggers. Used only when "memory-infra" category is enabled. + memory_dump_config: typing.Optional[MemoryDumpConfig] = None + + def to_json(self): + json = dict() + if self.record_mode is not None: + json['recordMode'] = self.record_mode + if self.trace_buffer_size_in_kb is not None: + json['traceBufferSizeInKb'] = self.trace_buffer_size_in_kb + if self.enable_sampling is not None: + json['enableSampling'] = self.enable_sampling + if self.enable_systrace is not None: + json['enableSystrace'] = self.enable_systrace + if self.enable_argument_filter is not None: + json['enableArgumentFilter'] = self.enable_argument_filter + if self.included_categories is not None: + json['includedCategories'] = [i for i in self.included_categories] + if self.excluded_categories is not None: + json['excludedCategories'] = [i for i in self.excluded_categories] + if self.synthetic_delays is not None: + json['syntheticDelays'] = [i for i in self.synthetic_delays] + if self.memory_dump_config is not None: + json['memoryDumpConfig'] = self.memory_dump_config.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + record_mode=str(json['recordMode']) if 'recordMode' in json else None, + trace_buffer_size_in_kb=float(json['traceBufferSizeInKb']) if 'traceBufferSizeInKb' in json else None, + enable_sampling=bool(json['enableSampling']) if 'enableSampling' in json else None, + enable_systrace=bool(json['enableSystrace']) if 'enableSystrace' in json else None, + enable_argument_filter=bool(json['enableArgumentFilter']) if 'enableArgumentFilter' in json else None, + included_categories=[str(i) for i in json['includedCategories']] if 'includedCategories' in json else None, + excluded_categories=[str(i) for i in json['excludedCategories']] if 'excludedCategories' in json else None, + synthetic_delays=[str(i) for i in json['syntheticDelays']] if 'syntheticDelays' in json else None, + memory_dump_config=MemoryDumpConfig.from_json(json['memoryDumpConfig']) if 'memoryDumpConfig' in json else None, + ) + + +class StreamFormat(enum.Enum): + ''' + Data format of a trace. Can be either the legacy JSON format or the + protocol buffer format. Note that the JSON format will be deprecated soon. + ''' + JSON = "json" + PROTO = "proto" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class StreamCompression(enum.Enum): + ''' + Compression type to use for traces returned via streams. + ''' + NONE = "none" + GZIP = "gzip" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class MemoryDumpLevelOfDetail(enum.Enum): + ''' + Details exposed when memory request explicitly declared. + Keep consistent with memory_dump_request_args.h and + memory_instrumentation.mojom + ''' + BACKGROUND = "background" + LIGHT = "light" + DETAILED = "detailed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class TracingBackend(enum.Enum): + ''' + Backend type to use for tracing. ``chrome`` uses the Chrome-integrated + tracing service and is supported on all platforms. ``system`` is only + supported on Chrome OS and uses the Perfetto system tracing service. + ``auto`` chooses ``system`` when the perfettoConfig provided to Tracing.start + specifies at least one non-Chrome data source; otherwise uses ``chrome``. + ''' + AUTO = "auto" + CHROME = "chrome" + SYSTEM = "system" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +def end() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Stop trace events collection. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.end', + } + json = yield cmd_dict + + +def get_categories() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[str]]: + ''' + Gets supported tracing categories. + + **EXPERIMENTAL** + + :returns: A list of supported tracing categories. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.getCategories', + } + json = yield cmd_dict + return [str(i) for i in json['categories']] + + +def record_clock_sync_marker( + sync_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Record a clock sync marker in the trace. + + **EXPERIMENTAL** + + :param sync_id: The ID of this clock sync marker + ''' + params: T_JSON_DICT = dict() + params['syncId'] = sync_id + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.recordClockSyncMarker', + 'params': params, + } + json = yield cmd_dict + + +def request_memory_dump( + deterministic: typing.Optional[bool] = None, + level_of_detail: typing.Optional[MemoryDumpLevelOfDetail] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.Tuple[str, bool]]: + ''' + Request a global memory dump. + + **EXPERIMENTAL** + + :param deterministic: *(Optional)* Enables more deterministic results by forcing garbage collection + :param level_of_detail: *(Optional)* Specifies level of details in memory dump. Defaults to "detailed". + :returns: A tuple with the following items: + + 0. **dumpGuid** - GUID of the resulting global memory dump. + 1. **success** - True iff the global memory dump succeeded. + ''' + params: T_JSON_DICT = dict() + if deterministic is not None: + params['deterministic'] = deterministic + if level_of_detail is not None: + params['levelOfDetail'] = level_of_detail.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.requestMemoryDump', + 'params': params, + } + json = yield cmd_dict + return ( + str(json['dumpGuid']), + bool(json['success']) + ) + + +def start( + categories: typing.Optional[str] = None, + options: typing.Optional[str] = None, + buffer_usage_reporting_interval: typing.Optional[float] = None, + transfer_mode: typing.Optional[str] = None, + stream_format: typing.Optional[StreamFormat] = None, + stream_compression: typing.Optional[StreamCompression] = None, + trace_config: typing.Optional[TraceConfig] = None, + perfetto_config: typing.Optional[str] = None, + tracing_backend: typing.Optional[TracingBackend] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Start trace events collection. + + :param categories: **(EXPERIMENTAL)** *(Optional)* Category/tag filter + :param options: **(EXPERIMENTAL)** *(Optional)* Tracing options + :param buffer_usage_reporting_interval: **(EXPERIMENTAL)** *(Optional)* If set, the agent will issue bufferUsage events at this interval, specified in milliseconds + :param transfer_mode: *(Optional)* Whether to report trace events as series of dataCollected events or to save trace to a stream (defaults to ```ReportEvents````). + :param stream_format: *(Optional)* Trace data format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````json````). + :param stream_compression: **(EXPERIMENTAL)** *(Optional)* Compression format to use. This only applies when using ````ReturnAsStream```` transfer mode (defaults to ````none````) + :param trace_config: *(Optional)* + :param perfetto_config: **(EXPERIMENTAL)** *(Optional)* Base64-encoded serialized perfetto.protos.TraceConfig protobuf message When specified, the parameters ````categories````, ````options````, ````traceConfig```` are ignored. + :param tracing_backend: **(EXPERIMENTAL)** *(Optional)* Backend type (defaults to ````auto```) + ''' + params: T_JSON_DICT = dict() + if categories is not None: + params['categories'] = categories + if options is not None: + params['options'] = options + if buffer_usage_reporting_interval is not None: + params['bufferUsageReportingInterval'] = buffer_usage_reporting_interval + if transfer_mode is not None: + params['transferMode'] = transfer_mode + if stream_format is not None: + params['streamFormat'] = stream_format.to_json() + if stream_compression is not None: + params['streamCompression'] = stream_compression.to_json() + if trace_config is not None: + params['traceConfig'] = trace_config.to_json() + if perfetto_config is not None: + params['perfettoConfig'] = perfetto_config + if tracing_backend is not None: + params['tracingBackend'] = tracing_backend.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'Tracing.start', + 'params': params, + } + json = yield cmd_dict + + +@event_class('Tracing.bufferUsage') +@dataclass +class BufferUsage: + ''' + **EXPERIMENTAL** + + + ''' + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + percent_full: typing.Optional[float] + #: An approximate number of events in the trace log. + event_count: typing.Optional[float] + #: A number in range [0..1] that indicates the used size of event buffer as a fraction of its + #: total size. + value: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> BufferUsage: + return cls( + percent_full=float(json['percentFull']) if 'percentFull' in json else None, + event_count=float(json['eventCount']) if 'eventCount' in json else None, + value=float(json['value']) if 'value' in json else None + ) + + +@event_class('Tracing.dataCollected') +@dataclass +class DataCollected: + ''' + **EXPERIMENTAL** + + Contains a bucket of collected trace events. When tracing is stopped collected events will be + sent as a sequence of dataCollected events followed by tracingComplete event. + ''' + value: typing.List[dict] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> DataCollected: + return cls( + value=[dict(i) for i in json['value']] + ) + + +@event_class('Tracing.tracingComplete') +@dataclass +class TracingComplete: + ''' + Signals that tracing is stopped and there is no trace buffers pending flush, all data were + delivered via dataCollected events. + ''' + #: Indicates whether some trace data is known to have been lost, e.g. because the trace ring + #: buffer wrapped around. + data_loss_occurred: bool + #: A handle of the stream that holds resulting trace data. + stream: typing.Optional[io.StreamHandle] + #: Trace data format of returned stream. + trace_format: typing.Optional[StreamFormat] + #: Compression format of returned stream. + stream_compression: typing.Optional[StreamCompression] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> TracingComplete: + return cls( + data_loss_occurred=bool(json['dataLossOccurred']), + stream=io.StreamHandle.from_json(json['stream']) if 'stream' in json else None, + trace_format=StreamFormat.from_json(json['traceFormat']) if 'traceFormat' in json else None, + stream_compression=StreamCompression.from_json(json['streamCompression']) if 'streamCompression' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/util.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/util.py new file mode 100755 index 0000000..93a39ef --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/util.py @@ -0,0 +1,20 @@ + +import typing + + +T_JSON_DICT = typing.Dict[str, typing.Any] +_event_parsers = dict() + + +def event_class(method): + ''' A decorator that registers a class as an event class. ''' + def decorate(cls): + _event_parsers[method] = cls + cls.event_class = method + return cls + return decorate + + +def parse_json_event(json: T_JSON_DICT) -> typing.Any: + ''' Parse a JSON dictionary into a CDP event. ''' + return _event_parsers[json['method']].from_json(json['params']) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_audio.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_audio.py new file mode 100755 index 0000000..0a23d7a --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_audio.py @@ -0,0 +1,603 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAudio (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class GraphObjectId(str): + ''' + An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> GraphObjectId: + return cls(json) + + def __repr__(self): + return 'GraphObjectId({})'.format(super().__repr__()) + + +class ContextType(enum.Enum): + ''' + Enum of BaseAudioContext types + ''' + REALTIME = "realtime" + OFFLINE = "offline" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ContextState(enum.Enum): + ''' + Enum of AudioContextState from the spec + ''' + SUSPENDED = "suspended" + RUNNING = "running" + CLOSED = "closed" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class NodeType(str): + ''' + Enum of AudioNode types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> NodeType: + return cls(json) + + def __repr__(self): + return 'NodeType({})'.format(super().__repr__()) + + +class ChannelCountMode(enum.Enum): + ''' + Enum of AudioNode::ChannelCountMode from the spec + ''' + CLAMPED_MAX = "clamped-max" + EXPLICIT = "explicit" + MAX_ = "max" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ChannelInterpretation(enum.Enum): + ''' + Enum of AudioNode::ChannelInterpretation from the spec + ''' + DISCRETE = "discrete" + SPEAKERS = "speakers" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class ParamType(str): + ''' + Enum of AudioParam types + ''' + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> ParamType: + return cls(json) + + def __repr__(self): + return 'ParamType({})'.format(super().__repr__()) + + +class AutomationRate(enum.Enum): + ''' + Enum of AudioParam::AutomationRate from the spec + ''' + A_RATE = "a-rate" + K_RATE = "k-rate" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class ContextRealtimeData: + ''' + Fields in AudioContext that change in real-time. + ''' + #: The current context time in second in BaseAudioContext. + current_time: float + + #: The time spent on rendering graph divided by render quantum duration, + #: and multiplied by 100. 100 means the audio renderer reached the full + #: capacity and glitch may occur. + render_capacity: float + + #: A running mean of callback interval. + callback_interval_mean: float + + #: A running variance of callback interval. + callback_interval_variance: float + + def to_json(self): + json = dict() + json['currentTime'] = self.current_time + json['renderCapacity'] = self.render_capacity + json['callbackIntervalMean'] = self.callback_interval_mean + json['callbackIntervalVariance'] = self.callback_interval_variance + return json + + @classmethod + def from_json(cls, json): + return cls( + current_time=float(json['currentTime']), + render_capacity=float(json['renderCapacity']), + callback_interval_mean=float(json['callbackIntervalMean']), + callback_interval_variance=float(json['callbackIntervalVariance']), + ) + + +@dataclass +class BaseAudioContext: + ''' + Protocol object for BaseAudioContext + ''' + context_id: GraphObjectId + + context_type: ContextType + + context_state: ContextState + + #: Platform-dependent callback buffer size. + callback_buffer_size: float + + #: Number of output channels supported by audio hardware in use. + max_output_channel_count: float + + #: Context sample rate. + sample_rate: float + + realtime_data: typing.Optional[ContextRealtimeData] = None + + def to_json(self): + json = dict() + json['contextId'] = self.context_id.to_json() + json['contextType'] = self.context_type.to_json() + json['contextState'] = self.context_state.to_json() + json['callbackBufferSize'] = self.callback_buffer_size + json['maxOutputChannelCount'] = self.max_output_channel_count + json['sampleRate'] = self.sample_rate + if self.realtime_data is not None: + json['realtimeData'] = self.realtime_data.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + context_type=ContextType.from_json(json['contextType']), + context_state=ContextState.from_json(json['contextState']), + callback_buffer_size=float(json['callbackBufferSize']), + max_output_channel_count=float(json['maxOutputChannelCount']), + sample_rate=float(json['sampleRate']), + realtime_data=ContextRealtimeData.from_json(json['realtimeData']) if 'realtimeData' in json else None, + ) + + +@dataclass +class AudioListener: + ''' + Protocol object for AudioListener + ''' + listener_id: GraphObjectId + + context_id: GraphObjectId + + def to_json(self): + json = dict() + json['listenerId'] = self.listener_id.to_json() + json['contextId'] = self.context_id.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + listener_id=GraphObjectId.from_json(json['listenerId']), + context_id=GraphObjectId.from_json(json['contextId']), + ) + + +@dataclass +class AudioNode: + ''' + Protocol object for AudioNode + ''' + node_id: GraphObjectId + + context_id: GraphObjectId + + node_type: NodeType + + number_of_inputs: float + + number_of_outputs: float + + channel_count: float + + channel_count_mode: ChannelCountMode + + channel_interpretation: ChannelInterpretation + + def to_json(self): + json = dict() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['nodeType'] = self.node_type.to_json() + json['numberOfInputs'] = self.number_of_inputs + json['numberOfOutputs'] = self.number_of_outputs + json['channelCount'] = self.channel_count + json['channelCountMode'] = self.channel_count_mode.to_json() + json['channelInterpretation'] = self.channel_interpretation.to_json() + return json + + @classmethod + def from_json(cls, json): + return cls( + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + node_type=NodeType.from_json(json['nodeType']), + number_of_inputs=float(json['numberOfInputs']), + number_of_outputs=float(json['numberOfOutputs']), + channel_count=float(json['channelCount']), + channel_count_mode=ChannelCountMode.from_json(json['channelCountMode']), + channel_interpretation=ChannelInterpretation.from_json(json['channelInterpretation']), + ) + + +@dataclass +class AudioParam: + ''' + Protocol object for AudioParam + ''' + param_id: GraphObjectId + + node_id: GraphObjectId + + context_id: GraphObjectId + + param_type: ParamType + + rate: AutomationRate + + default_value: float + + min_value: float + + max_value: float + + def to_json(self): + json = dict() + json['paramId'] = self.param_id.to_json() + json['nodeId'] = self.node_id.to_json() + json['contextId'] = self.context_id.to_json() + json['paramType'] = self.param_type.to_json() + json['rate'] = self.rate.to_json() + json['defaultValue'] = self.default_value + json['minValue'] = self.min_value + json['maxValue'] = self.max_value + return json + + @classmethod + def from_json(cls, json): + return cls( + param_id=GraphObjectId.from_json(json['paramId']), + node_id=GraphObjectId.from_json(json['nodeId']), + context_id=GraphObjectId.from_json(json['contextId']), + param_type=ParamType.from_json(json['paramType']), + rate=AutomationRate.from_json(json['rate']), + default_value=float(json['defaultValue']), + min_value=float(json['minValue']), + max_value=float(json['maxValue']), + ) + + +def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enables the WebAudio domain and starts sending context lifetime events. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.enable', + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disables the WebAudio domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.disable', + } + json = yield cmd_dict + + +def get_realtime_data( + context_id: GraphObjectId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,ContextRealtimeData]: + ''' + Fetch the realtime data from the registered contexts. + + :param context_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['contextId'] = context_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAudio.getRealtimeData', + 'params': params, + } + json = yield cmd_dict + return ContextRealtimeData.from_json(json['realtimeData']) + + +@event_class('WebAudio.contextCreated') +@dataclass +class ContextCreated: + ''' + Notifies that a new BaseAudioContext has been created. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextCreated: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.contextWillBeDestroyed') +@dataclass +class ContextWillBeDestroyed: + ''' + Notifies that an existing BaseAudioContext will be destroyed. + ''' + context_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']) + ) + + +@event_class('WebAudio.contextChanged') +@dataclass +class ContextChanged: + ''' + Notifies that existing BaseAudioContext has changed some properties (id stays the same).. + ''' + context: BaseAudioContext + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> ContextChanged: + return cls( + context=BaseAudioContext.from_json(json['context']) + ) + + +@event_class('WebAudio.audioListenerCreated') +@dataclass +class AudioListenerCreated: + ''' + Notifies that the construction of an AudioListener has finished. + ''' + listener: AudioListener + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerCreated: + return cls( + listener=AudioListener.from_json(json['listener']) + ) + + +@event_class('WebAudio.audioListenerWillBeDestroyed') +@dataclass +class AudioListenerWillBeDestroyed: + ''' + Notifies that a new AudioListener has been created. + ''' + context_id: GraphObjectId + listener_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioListenerWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + listener_id=GraphObjectId.from_json(json['listenerId']) + ) + + +@event_class('WebAudio.audioNodeCreated') +@dataclass +class AudioNodeCreated: + ''' + Notifies that a new AudioNode has been created. + ''' + node: AudioNode + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeCreated: + return cls( + node=AudioNode.from_json(json['node']) + ) + + +@event_class('WebAudio.audioNodeWillBeDestroyed') +@dataclass +class AudioNodeWillBeDestroyed: + ''' + Notifies that an existing AudioNode has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioNodeWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']) + ) + + +@event_class('WebAudio.audioParamCreated') +@dataclass +class AudioParamCreated: + ''' + Notifies that a new AudioParam has been created. + ''' + param: AudioParam + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamCreated: + return cls( + param=AudioParam.from_json(json['param']) + ) + + +@event_class('WebAudio.audioParamWillBeDestroyed') +@dataclass +class AudioParamWillBeDestroyed: + ''' + Notifies that an existing AudioParam has been destroyed. + ''' + context_id: GraphObjectId + node_id: GraphObjectId + param_id: GraphObjectId + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> AudioParamWillBeDestroyed: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + node_id=GraphObjectId.from_json(json['nodeId']), + param_id=GraphObjectId.from_json(json['paramId']) + ) + + +@event_class('WebAudio.nodesConnected') +@dataclass +class NodesConnected: + ''' + Notifies that two AudioNodes are connected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodesDisconnected') +@dataclass +class NodesDisconnected: + ''' + Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + destination_input_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodesDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None, + destination_input_index=float(json['destinationInputIndex']) if 'destinationInputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamConnected') +@dataclass +class NodeParamConnected: + ''' + Notifies that an AudioNode is connected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamConnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) + + +@event_class('WebAudio.nodeParamDisconnected') +@dataclass +class NodeParamDisconnected: + ''' + Notifies that an AudioNode is disconnected to an AudioParam. + ''' + context_id: GraphObjectId + source_id: GraphObjectId + destination_id: GraphObjectId + source_output_index: typing.Optional[float] + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> NodeParamDisconnected: + return cls( + context_id=GraphObjectId.from_json(json['contextId']), + source_id=GraphObjectId.from_json(json['sourceId']), + destination_id=GraphObjectId.from_json(json['destinationId']), + source_output_index=float(json['sourceOutputIndex']) if 'sourceOutputIndex' in json else None + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_authn.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_authn.py new file mode 100755 index 0000000..a035e16 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v130/web_authn.py @@ -0,0 +1,528 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +# +# CDP domain: WebAuthn (experimental) +from __future__ import annotations +from .util import event_class, T_JSON_DICT +from dataclasses import dataclass +import enum +import typing + +class AuthenticatorId(str): + def to_json(self) -> str: + return self + + @classmethod + def from_json(cls, json: str) -> AuthenticatorId: + return cls(json) + + def __repr__(self): + return 'AuthenticatorId({})'.format(super().__repr__()) + + +class AuthenticatorProtocol(enum.Enum): + U2F = "u2f" + CTAP2 = "ctap2" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class Ctap2Version(enum.Enum): + CTAP2_0 = "ctap2_0" + CTAP2_1 = "ctap2_1" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +class AuthenticatorTransport(enum.Enum): + USB = "usb" + NFC = "nfc" + BLE = "ble" + CABLE = "cable" + INTERNAL = "internal" + + def to_json(self): + return self.value + + @classmethod + def from_json(cls, json): + return cls(json) + + +@dataclass +class VirtualAuthenticatorOptions: + protocol: AuthenticatorProtocol + + transport: AuthenticatorTransport + + #: Defaults to ctap2_0. Ignored if ``protocol`` == u2f. + ctap2_version: typing.Optional[Ctap2Version] = None + + #: Defaults to false. + has_resident_key: typing.Optional[bool] = None + + #: Defaults to false. + has_user_verification: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the largeBlob extension. + #: https://w3c.github.io/webauthn#largeBlob + #: Defaults to false. + has_large_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the credBlob extension. + #: https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html#sctn-credBlob-extension + #: Defaults to false. + has_cred_blob: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the minPinLength extension. + #: https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#sctn-minpinlength-extension + #: Defaults to false. + has_min_pin_length: typing.Optional[bool] = None + + #: If set to true, the authenticator will support the prf extension. + #: https://w3c.github.io/webauthn/#prf-extension + #: Defaults to false. + has_prf: typing.Optional[bool] = None + + #: If set to true, tests of user presence will succeed immediately. + #: Otherwise, they will not be resolved. Defaults to true. + automatic_presence_simulation: typing.Optional[bool] = None + + #: Sets whether User Verification succeeds or fails for an authenticator. + #: Defaults to false. + is_user_verified: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup + #: eligibility (BE) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_eligibility: typing.Optional[bool] = None + + #: Credentials created by this authenticator will have the backup state + #: (BS) flag set to this value. Defaults to false. + #: https://w3c.github.io/webauthn/#sctn-credential-backup + default_backup_state: typing.Optional[bool] = None + + def to_json(self): + json = dict() + json['protocol'] = self.protocol.to_json() + json['transport'] = self.transport.to_json() + if self.ctap2_version is not None: + json['ctap2Version'] = self.ctap2_version.to_json() + if self.has_resident_key is not None: + json['hasResidentKey'] = self.has_resident_key + if self.has_user_verification is not None: + json['hasUserVerification'] = self.has_user_verification + if self.has_large_blob is not None: + json['hasLargeBlob'] = self.has_large_blob + if self.has_cred_blob is not None: + json['hasCredBlob'] = self.has_cred_blob + if self.has_min_pin_length is not None: + json['hasMinPinLength'] = self.has_min_pin_length + if self.has_prf is not None: + json['hasPrf'] = self.has_prf + if self.automatic_presence_simulation is not None: + json['automaticPresenceSimulation'] = self.automatic_presence_simulation + if self.is_user_verified is not None: + json['isUserVerified'] = self.is_user_verified + if self.default_backup_eligibility is not None: + json['defaultBackupEligibility'] = self.default_backup_eligibility + if self.default_backup_state is not None: + json['defaultBackupState'] = self.default_backup_state + return json + + @classmethod + def from_json(cls, json): + return cls( + protocol=AuthenticatorProtocol.from_json(json['protocol']), + transport=AuthenticatorTransport.from_json(json['transport']), + ctap2_version=Ctap2Version.from_json(json['ctap2Version']) if 'ctap2Version' in json else None, + has_resident_key=bool(json['hasResidentKey']) if 'hasResidentKey' in json else None, + has_user_verification=bool(json['hasUserVerification']) if 'hasUserVerification' in json else None, + has_large_blob=bool(json['hasLargeBlob']) if 'hasLargeBlob' in json else None, + has_cred_blob=bool(json['hasCredBlob']) if 'hasCredBlob' in json else None, + has_min_pin_length=bool(json['hasMinPinLength']) if 'hasMinPinLength' in json else None, + has_prf=bool(json['hasPrf']) if 'hasPrf' in json else None, + automatic_presence_simulation=bool(json['automaticPresenceSimulation']) if 'automaticPresenceSimulation' in json else None, + is_user_verified=bool(json['isUserVerified']) if 'isUserVerified' in json else None, + default_backup_eligibility=bool(json['defaultBackupEligibility']) if 'defaultBackupEligibility' in json else None, + default_backup_state=bool(json['defaultBackupState']) if 'defaultBackupState' in json else None, + ) + + +@dataclass +class Credential: + credential_id: str + + is_resident_credential: bool + + #: The ECDSA P-256 private key in PKCS#8 format. + private_key: str + + #: Signature counter. This is incremented by one for each successful + #: assertion. + #: See https://w3c.github.io/webauthn/#signature-counter + sign_count: int + + #: Relying Party ID the credential is scoped to. Must be set when adding a + #: credential. + rp_id: typing.Optional[str] = None + + #: An opaque byte sequence with a maximum size of 64 bytes mapping the + #: credential to a specific user. + user_handle: typing.Optional[str] = None + + #: The large blob associated with the credential. + #: See https://w3c.github.io/webauthn/#sctn-large-blob-extension + large_blob: typing.Optional[str] = None + + #: Assertions returned by this credential will have the backup eligibility + #: (BE) flag set to this value. Defaults to the authenticator's + #: defaultBackupEligibility value. + backup_eligibility: typing.Optional[bool] = None + + #: Assertions returned by this credential will have the backup state (BS) + #: flag set to this value. Defaults to the authenticator's + #: defaultBackupState value. + backup_state: typing.Optional[bool] = None + + def to_json(self): + json = dict() + json['credentialId'] = self.credential_id + json['isResidentCredential'] = self.is_resident_credential + json['privateKey'] = self.private_key + json['signCount'] = self.sign_count + if self.rp_id is not None: + json['rpId'] = self.rp_id + if self.user_handle is not None: + json['userHandle'] = self.user_handle + if self.large_blob is not None: + json['largeBlob'] = self.large_blob + if self.backup_eligibility is not None: + json['backupEligibility'] = self.backup_eligibility + if self.backup_state is not None: + json['backupState'] = self.backup_state + return json + + @classmethod + def from_json(cls, json): + return cls( + credential_id=str(json['credentialId']), + is_resident_credential=bool(json['isResidentCredential']), + private_key=str(json['privateKey']), + sign_count=int(json['signCount']), + rp_id=str(json['rpId']) if 'rpId' in json else None, + user_handle=str(json['userHandle']) if 'userHandle' in json else None, + large_blob=str(json['largeBlob']) if 'largeBlob' in json else None, + backup_eligibility=bool(json['backupEligibility']) if 'backupEligibility' in json else None, + backup_state=bool(json['backupState']) if 'backupState' in json else None, + ) + + +def enable( + enable_ui: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Enable the WebAuthn domain and start intercepting credential storage and + retrieval with a virtual authenticator. + + :param enable_ui: *(Optional)* Whether to enable the WebAuthn user interface. Enabling the UI is recommended for debugging and demo purposes, as it is closer to the real experience. Disabling the UI is recommended for automated testing. Supported at the embedder's discretion if UI is available. Defaults to false. + ''' + params: T_JSON_DICT = dict() + if enable_ui is not None: + params['enableUI'] = enable_ui + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.enable', + 'params': params, + } + json = yield cmd_dict + + +def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Disable the WebAuthn domain. + ''' + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.disable', + } + json = yield cmd_dict + + +def add_virtual_authenticator( + options: VirtualAuthenticatorOptions + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,AuthenticatorId]: + ''' + Creates and adds a virtual authenticator. + + :param options: + :returns: + ''' + params: T_JSON_DICT = dict() + params['options'] = options.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + return AuthenticatorId.from_json(json['authenticatorId']) + + +def set_response_override_bits( + authenticator_id: AuthenticatorId, + is_bogus_signature: typing.Optional[bool] = None, + is_bad_uv: typing.Optional[bool] = None, + is_bad_up: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Resets parameters isBogusSignature, isBadUV, isBadUP to false if they are not present. + + :param authenticator_id: + :param is_bogus_signature: *(Optional)* If isBogusSignature is set, overrides the signature in the authenticator response to be zero. Defaults to false. + :param is_bad_uv: *(Optional)* If isBadUV is set, overrides the UV bit in the flags in the authenticator response to be zero. Defaults to false. + :param is_bad_up: *(Optional)* If isBadUP is set, overrides the UP bit in the flags in the authenticator response to be zero. Defaults to false. + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + if is_bogus_signature is not None: + params['isBogusSignature'] = is_bogus_signature + if is_bad_uv is not None: + params['isBadUV'] = is_bad_uv + if is_bad_up is not None: + params['isBadUP'] = is_bad_up + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setResponseOverrideBits', + 'params': params, + } + json = yield cmd_dict + + +def remove_virtual_authenticator( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes the given authenticator. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeVirtualAuthenticator', + 'params': params, + } + json = yield cmd_dict + + +def add_credential( + authenticator_id: AuthenticatorId, + credential: Credential + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Adds the credential to the specified authenticator. + + :param authenticator_id: + :param credential: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credential'] = credential.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.addCredential', + 'params': params, + } + json = yield cmd_dict + + +def get_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Credential]: + ''' + Returns a single credential stored in the given virtual authenticator that + matches the credential ID. + + :param authenticator_id: + :param credential_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredential', + 'params': params, + } + json = yield cmd_dict + return Credential.from_json(json['credential']) + + +def get_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Credential]]: + ''' + Returns all the credentials stored in the given virtual authenticator. + + :param authenticator_id: + :returns: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.getCredentials', + 'params': params, + } + json = yield cmd_dict + return [Credential.from_json(i) for i in json['credentials']] + + +def remove_credential( + authenticator_id: AuthenticatorId, + credential_id: str + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Removes a credential from the authenticator. + + :param authenticator_id: + :param credential_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.removeCredential', + 'params': params, + } + json = yield cmd_dict + + +def clear_credentials( + authenticator_id: AuthenticatorId + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Clears all the credentials from the specified device. + + :param authenticator_id: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.clearCredentials', + 'params': params, + } + json = yield cmd_dict + + +def set_user_verified( + authenticator_id: AuthenticatorId, + is_user_verified: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether User Verification succeeds or fails for an authenticator. + The default is true. + + :param authenticator_id: + :param is_user_verified: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['isUserVerified'] = is_user_verified + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setUserVerified', + 'params': params, + } + json = yield cmd_dict + + +def set_automatic_presence_simulation( + authenticator_id: AuthenticatorId, + enabled: bool + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Sets whether tests of user presence will succeed immediately (if true) or fail to resolve (if false) for an authenticator. + The default is true. + + :param authenticator_id: + :param enabled: + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['enabled'] = enabled + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setAutomaticPresenceSimulation', + 'params': params, + } + json = yield cmd_dict + + +def set_credential_properties( + authenticator_id: AuthenticatorId, + credential_id: str, + backup_eligibility: typing.Optional[bool] = None, + backup_state: typing.Optional[bool] = None + ) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]: + ''' + Allows setting credential properties. + https://w3c.github.io/webauthn/#sctn-automation-set-credential-properties + + :param authenticator_id: + :param credential_id: + :param backup_eligibility: *(Optional)* + :param backup_state: *(Optional)* + ''' + params: T_JSON_DICT = dict() + params['authenticatorId'] = authenticator_id.to_json() + params['credentialId'] = credential_id + if backup_eligibility is not None: + params['backupEligibility'] = backup_eligibility + if backup_state is not None: + params['backupState'] = backup_state + cmd_dict: T_JSON_DICT = { + 'method': 'WebAuthn.setCredentialProperties', + 'params': params, + } + json = yield cmd_dict + + +@event_class('WebAuthn.credentialAdded') +@dataclass +class CredentialAdded: + ''' + Triggered when a credential is added to an authenticator. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAdded: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) + + +@event_class('WebAuthn.credentialAsserted') +@dataclass +class CredentialAsserted: + ''' + Triggered when a credential is used in a webauthn assertion. + ''' + authenticator_id: AuthenticatorId + credential: Credential + + @classmethod + def from_json(cls, json: T_JSON_DICT) -> CredentialAsserted: + return cls( + authenticator_id=AuthenticatorId.from_json(json['authenticatorId']), + credential=Credential.from_json(json['credential']) + ) diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__init__.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__init__.py new file mode 100755 index 0000000..e825da8 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__init__.py @@ -0,0 +1,60 @@ +# DO NOT EDIT THIS FILE! +# +# This file is generated from the CDP specification. If you need to make +# changes, edit the generator and regenerate all of the modules. +from . import accessibility +from . import animation +from . import audits +from . import autofill +from . import background_service +from . import bluetooth_emulation +from . import browser +from . import css +from . import cache_storage +from . import cast +from . import console +from . import dom +from . import dom_debugger +from . import dom_snapshot +from . import dom_storage +from . import database +from . import debugger +from . import device_access +from . import device_orientation +from . import emulation +from . import event_breakpoints +from . import extensions +from . import fed_cm +from . import fetch +from . import file_system +from . import headless_experimental +from . import heap_profiler +from . import io +from . import indexed_db +from . import input_ +from . import inspector +from . import layer_tree +from . import log +from . import media +from . import memory +from . import network +from . import overlay +from . import pwa +from . import page +from . import performance +from . import performance_timeline +from . import preload +from . import profiler +from . import runtime +from . import schema +from . import security +from . import service_worker +from . import storage +from . import system_info +from . import target +from . import tethering +from . import tracing +from . import web_audio +from . import web_authn +from . import util + diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1836166b039f7fddc0b1f2e29b675863c1e3298b GIT binary patch literal 2055 zcmYk+Id9`e7zSX_sPauFkU@#YB)3I@6Bf2!skclhyEXvmh~4GUOp4g`1}j> zv*lZUA+(|b6$saS1L_NjwQp(xkWym#HkSz!j>9t8kU7;u>6|nz#% zya+GSqId~jq9yS%yiCjD6?lbK#H;Wst%}#+HChv|!|Svz-hek~L%a!Z(x!L|-l8q> zHoQ&S;vIO0cEr2zF71l<;62(C@5B4FFFt?|=s==~CQ?hDrNP5bTN1>Dni;ZxJ~Je6fZF9-uOL`BVwgUB_3 zj!`JPxgVGes=B$+4?!5ht)AfuFz?qV)L@p+Us@CsYf(9y;Qj$5*@^{3w8C; zs5rys@Pm{el<#=F&dCR5yaCX_7U9u`nNeK7I8d%1Vt*a=F;Qs{@vrd~HqnqcNy=L) zPc{)~RM&&pS06E}-$SV!#7S-(s20RoqCD&vcM9F1N*$9b*{M+XQ8^hYKX7?aq#~X2 zNmgQIo^<+wsUKB}VPG+N;%=p6y!Q<(>p`cH8_OXsyec{d>kWgLf2ES7D%7qIR$r~U zlIAh@LUlRAp+-D)HB(-mj&IZS^ZjsmA@ZP=FUQpw?~@b65B%_D zKUu}3t~X}wN%b7QlHC2dUt`1+!IWoLm= zodhoc+@H+ORH))0k8GTbp9Z*Pwx^>=$2R`M@G=N9`>}i7wH+LCU>xTn8Gfq1i?pAI z>V5hitK#=i_8a1#Vxds@w{8_SM%MDkS{PYNBWq`5?T)O)ku^86)<;(B#cLxAf2-05 z-Oz-d7_~jJR%GnFwC+pO>`Ns&pcPZ074u`-@ywVOQ|(C+v!QbQ>sSelCKNFiMlSzp JwbFN3@c+)?A!7gl literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/accessibility.cpython-312.pyc b/env/lib/python3.12/site-packages/selenium/webdriver/common/devtools/v131/__pycache__/accessibility.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6abea5d62090fc2dc3a7ccc6e18c8383c14b10da GIT binary patch literal 27449 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 z%0D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
    sY;+*yuYrC52 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%0A$6CQKBL`72Rdy% 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

    ?T5t@t*Oyqekhe+(x-LqC@Z)= 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¥nG_K&L4nj=ZvLasA#||%3fVmT*K|rVD_VL zCo$@0as0TxP8guBu#FuW@*ocqUc**j32oV1qQdyK0`%>+1d;{0a<>~ydR1C zgrGlwoe-0?pY@LS%=c7d2?vPck3&0~y7Mtv#webW+S%$x8^fGmsx!B#3okr1@>=lA zN6y}*f~=wy_v84A@dF}3rhCa?5WxuqRj

    QLjb?Eb3N9f%5aOjl%kr^q!SEwEBl% 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

    81QJ*xKg{11x3Z-C49b>z-TE)~G3I1B8 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%0D9i zv-A~PM(J*Mi?>?WemdrjzJ^Lw0F#X-p-918Mx_oQK!T3iEqTFLwdRMCqUqP^21qIS zZ7A<42^yaP1+B45OgqkSVLZ<7X(OJqVN1x;DBc<+PWU%(jF!2_kA6$H!pOL5aiB8dN_wrgXijWSS+FsVy#0dpxZ# zN%!bVl+w0tP-&o>Le)d7tTZqP6;Z%!`l1*Pfmw>3gBJ!FT+)rHm0>aQ^okOK^Wpi? zzwq~nStx}5>%2%(O*+*G2SKuA`plnQJiqxWxg~o>=A>yR1F^MGwdGggLBgq93d>1b z2jZod3~(Uh5HV7d*RhEwvJHT@*8PnqCNzoitmm1-u(I%ucg+W5 z=?7yC549aX<$TjIwD^)cG;|P5Z}ESR^(D$y9Zfq#n0m@fHNxY8Wh_pQSTtYJ z2fYt|`zFP2w8gD5qUr8MRv~J-(&u+FkL~K3@8!|8H6+kK6S;Q-$_coOMxA)EjVNRb zF1i1W!ZyP+5I(nvXYQMLJdhAt+17Fk#M7G!4?Ctz^`kRg{|_?hdC%xfJMSA+)9L>p zQ`*ASl@>ND2TIj=$LP#^St1jM2wNNS4R>kuDN2>j^fAV;T9Ttnn?F)o+b5#FJ*q4A z+voZm07FElyVsI8R*KA@!6M(h%YDn@TNs`vpddE@Bj&YbbKGK91$mSkuJm3leJ26K z{~=|3thGZa&6cEu6g9TrCXU-{nrKn4tK|x}`++d<>0+Q%(ufxDQgyHc{fc!LUAo{a zQy%edZ7iFbn2%C|0Wakd6R%rkeJ{O|#}_ujOaus)6%m^*CPa^~Mn3n{FpRHP$l7D^ z>7R~FBVdCm_F@91qWG{geAsUH9m#&(Kr@NHE!A7T6;Fq{00MhcHF3e)8#MzIQmQxa zCV&K5>s1oJ+m;PaPD&qR)Xak*L}F!rmgE1q@&WnBD1SrBDx(@p=sPj~x=pYF_Oe^( z!OIQOd^24u1Uz0bUqD zIYAEr-ro63b{EEY<`-cH{>Vo@wtMs)#pu<1NLFL&O%qG*}WFQK4#q(q*jA0h-CIxEF6ktj+cVF@dDJ0J>d|Ows%^y-;;3S^Vp2 zITf3hmI&VB{=2KZDet_JOPYAh%?-bVE}+YkOBzeOj#ZjDrhJZ*Fbdma=*WgfuZ=c5 z3F}|m=J${g@=``#GE3r_W2<8s?&U$KoN#ZL7Sr1o=o<9emw7jSo8nx1;qmIU1as~B zY4AB;4SrZDiSg~MqwVTk>655NjvmvJU2q`wB9TMd_K0@=?;@z=r6Sfu*NSBilAMNI zy()J%U)=FGB1Q66aHu9`Dk~12E(*T0zOmwUuVampByT`GAayhe=}+L!n&Z9~W>e$18G1t-yR1YivmFB&Kkb(+RdaWJHj+eW1sp$Rwk z3#A#;+Rh}Mt&ewRw5q`@${It1`kn%h@kwS3d{RsL-saAfICw4ThnqVyLILT=I=kOi z0h#_za|~$)nZH`lY!{?11z%N=Z`&pf)h-0;QyxScmz&eQQqDh+hfETO2(mUS(5A#9 zRXBO)y1et{RGy7kWDI2$rAcd!#3C)3Sw=buK8UVxXsaWaSF5z(3quaIe_v6)L5NLa zK;^A5;J`5`n`CT*2#4KXliUpBvx9N#E{ zuGSKgFX>fg#6;qtrMq+{Z#p$y{xvOs>`a}?7ugVNwG#qVuWdGx)v-;rxzmIzI(r&O z*xb45M5TA&3BLa{-%Ib&%pHZ-!}C)SpMe8Yk1qPWDRFtPZ8FEYyF6 z`I3$S$$Wvm{Y9=vnW>+@;h>UrVw&)>6gJ7J`3d|sY+GNN_}uP&=SsVt+t6tSgFFh2 z63f{+dNumN2Rb$EZDrV19Ak2;nr@>O1)IUbkA=j}wjlXO@dr3ety>-pCD^+_!Fadi}&Hrvz_f^G2O8m357e+A`Pd6pF-7t{fJFXhlegeqNBfw z9~-a-?objqlE_W4l1SCoYQ$d9iw}e%ljk?qS-yL$45VH{BoO*9iE+1&(mh|BwpEZ^`8wM+@A*VoIx-EC`Bwbrxr3B z?n>akwxq3DLwjy@lbJf2iRX@YLA!->Yrq62gkpv_j1-r+7t<5@L&NRs@hOkyj_jbN z!UENNG(iKI$)ahamVdZ@89HXlc)HAc(tn`ew%DzxJr1o!|Fr(hILyabjZhh(cs1mJ zvDIz;I7P-!_i>&`$?`+gFaIGd#iIIRK|9p#0?xRNWHw3R zz?AS-9Zn{rBxd@%q%O-uOE%i&qGFp^Z)002J9Za92iS)o(J3uLG>|X zfcVB~vBDn`uf^I=DQTBK`82r+zHwqfg_+G7z4H zd)@kIf48*lfOzKTA{}{W9pq0_n_kMl7;QiK$0R1xmCHkYai>!h{Zfab>GErdMS@(N zMal4I@S%SBG8{(~9e%kBnTMmlk)eqCQ%_c$P~nru5#yI1E&mk{P2=Xg1;Z2wW%x5{ zqW)KT!u`d1gjl9U*S}Pz{Z^vi$F!!`BioGNS7mGIRy1G?wKlwb%?qt#&#vI(>ZiFY z8Ro~w3Ye<9Khc-Fii!Zk(>(&NDXTnrfbZDl52@!!bx+~CyO9(BVF$V6ydFC*y-Sg7 z!iksS4bOTvPW+gFb761niU+_rZ52%R>njk->DMd>Uu~WU0JqspfGXbkQFU*%W)QqF z%^oI^4!Z^s_?3KWYPlPvdVIt;hJk!Wi%DG-><#Qo=XV9?pRQ*0s9G;|D+RFFa{ID2 z7tquF;rQ6`pGxpB=!jgf27VGzEq@I=5}Q$=1V_YsQLxjSRcdHvE&O? zmr!FoJ@u1h$(@7|0A^G49nGdxL|uubrs2~wMdzz^z9BfE#8o@r7Uxsn-}Jtc5m0$9 zxZRwd3QN;7s5EumS)6&^l1!g@Q@uDqKu+*xE47Qj?9>Qn`m4z=^5HXQ;ce)V*Xvm5 z;#3u9a)pJ1JoOw>aYyUh5TF(v8BNmCNDVa|7-Hb?4LM(GU$66Z zIbWaiWt}hUe7(*$=zI~%glF6fh)SdtwtppG$Q3U~174x(18kXGSwfU7pBMGMynbHH z`|`u{ye|!CGR~!-*quTE{3Ua9bQPT5nfvHIa&6*a2uE;$i&1aRmCLyq8l(cFpVo}i zQeC~t{GiaEnZJJkKg(&099<{-J%I}uvJm5o#MZwsE`P}A`yck@M)nle!RINa3GJw* zPcC>F8Um`5GBO&g;OBSc?6B00SksPu5p=7$ADPJn2ZD;|y5lbWa^mwBU-HH1lt(yT zkBhFmlsw)92pdjaQk8S~Wa^D5|nk z*iGNjM~E?fgCWRQ5Doe-AZC~*09>}T8#X0c1v+MN@v6Z~on?hcowFXI?xF(RUX6z; zz`10o|2CLT*zLo7)yD1Vj8Wl0E8*}mMATwG!gz&T^b)2q}3MqH^j7|k%Q zGqoQp1x9ED#~$5o+RmstVk7we2B!0xlm+qb7P$mA-1mEXTQi^=yDDNsU_%O@@ zyYnMkAWiRO2ornfzDUBRen>4~bKy$1qdv|@M*l>o_o(WHJm_D%a@4t*bDD3B3J(0h zW*~NDpQw7Xr+a4RBp8XS)kY?^avLY@z^}1`%aT-LZQI^6lh+?tn9SXoy}!C^M=tJ%P& zpxJlH< zY5(6Jy3ZWuU?*k)1Mw97KPDVGkd{Uc(RK7I+$;>aEn504WXamLmKip9f^XZY$c85{ z>AdII1n(WXneh+Df%$>79fK1sAo0LNp$jc5nM4c_7Dlf*(ux49xdV-pJ`8TB2u&>& zGp}i5^VG7$rE*G+1BY>Az|nA=&8K}StuJ}~xblB7r5aSL%iI(7iLl)3xTWtU8hqdJv^Q4oWCvj*&L0j*YUv7ZWyB(PPvg1_U(GZMQ(Yw z+w}mKdJKA@>OZ~?78^dFK+?3$*85P>!*ah2hs|lOoDi{QGUnSAzaAc=!jVEo$fMNs zqln4$&t(onO4Zmx-UT(E^O=wW9o`y2iVp7?c@6rrT$yfdx|E@~cqXM1gB4#;M~xVZ zH|+FMJ&bysOUq2Z@&q5Bsc7^8_=zs?HHI!oH4ox(h*+<-yHUNY?Ma%mVhbgDwX2L2 zt6g0}ZC-7E1g9B*)HpX&@7(T2=l0BY?uxn2T{YjitCP;{@51#`KV~iEUOcj-M3n0m zRTt?VGN-2mT<=9z2<3Z`RW;_Ut~aN@5vLgvX0~%PbDi5g-?=?W=dS2-?y6qruI|Hq zgN*$~wLn&>yLG9MT&s7!UaQ|u9U+X79l5&0bx9ge9vYvXn&=2IbVXWcl1; zpQft>-;nc_kQ`r$Ba`Z#FXDXjov+6EgbPSn?|ee-_!^y0=n~&-=M!ebH#dxPDd#(1 zjf+b<-xe3w<$Qh4*Xw*;&e!LBS$qsaDvKAY%tVCQZs6KDO1CmK!2H5z;HgZlbv^@K zWojip*28kt*t`iz*Nf{_cK4anlQn0>pgF6yn6rAwocR+gNnDsqk~i$KPY3?WRIl?H_$yO=&S&7SOl6(Vz+agfbUp(=Qj5-K z;IB*#IiG>QGF9UGY~ZKK&No|NtW4E7pMk$JRquQT{>oIN^BMRnQ?s4Vz+ah~>wE$~ zrObD}Ugt|XUqnMn|M0OB_R8_69tC=Wi?R<6&wI zz84xw+iWXu+{=UeGQ|3af0caVEJTOT!hg0iw9djmUZ#c_ugDr^gB?L8H6p!(G<=`d9TZY+c(yD9TP|#Yq+NR>KXi2T>WC}^bcSC94g~sHUD-<1yNc1 zlSlG#`Qui{*l!04PInu{lQBk=6b9_bk8NCoVH%z!8UXEP^p~0f=^jnFF5?I_Dj_D5N7C?|NHjvz>;RK9Ct``s1LFai<}ZVshgen$8NfeEcR zd_pVuv{EzCcX>-;54XG-kE9r7E5qw}mrnbue?-b=*9sO2-LzP$pF4Mhb1}O&=QC*a6Vy`*34;hiO}+I&D^M~C45@q?K=>f38muu zg%8-%OURJ;5)@lkQ4kB+``G%IYFZ~eOh24%Ajv1Gr|3UVaaqNjV)$CJZl;S*ntqev zttSD*TqokITw>Z0M%Q@b$CQ@j&f`%Q7I`NeqQs~6CZnJ z7GheRK-^3{^E$5LB9&X>?als0TwJvDQa4t?{^E6;gq?rpu>@un2>ewJPeQs)%AkEZ zy}hI>!IaGi7VQl@*#9`CO}Q_3Wt9qbN3Tq0lHA^!E;*g&cP4inxQ;KCmlWFZP_~us z9-;)lbI^sWWrh2groB48%vIA=|$1Oy|j`nh-=ktM`;WBdGb-=E&H{V)T7oT z)zv(Ge2aH$e7c_Xoi}}4)B3HEmI?Pa`6o?}t>0P;BB_W^cs%a?YGXyT;o-K!+g~kh zLPE-L&m}tKmJVXVzAclRBad&io!Mzvzhw;e3A|;E3g?Bhx9sD)q^S1GO2u`kA+#_M z=A7OX_uBUzo$l;zAJ`G&XbuWT)hs)j1=H#WxVhP-7@5Y}Fp;I%g# zP9(}dTvNP`AHnd9`>|S{_CyiK9edR@?8@`z9~Q@y`$i0Bj0i=Kn4ul9@;f5#Kk}vm zmNF0&j7Q|@H>UbDS{Bwd{FNR4>K*=?8-Bst0W=SjgTWc=-Kar}`$iP=5b@ako7&&4 z@^0G696Q}V?3*+E!@k>+{%bT-e&my0$*hZxT^TFAx2f<#x<`w$IsHU_PTCIY&0tJI z^09P}T7-8CPX5Gnj~b0PqS#|NT)0>@EPohY7dutm>8AANSi`%B7Ax~Om%bS+@2?&rf7D;2BTBUH&)%|Q=}vlc zRN7-?&yZ(T#fg(1ur#lG%PNRy_Dz&44tr_YcJLbrRlN$wKI$ho30idn-m)i!%N^4s zZJH#}-ry~}$3oSakt`L2vE;2BNlZ{a+LFC3ytiOv)bjf;*@iqr4c;IX$2_f zYzq~%N9x?JPNkjDxpKNoOpna>^c~ zZ^ZNnAg5VQn~$~*1$_7ymec9~6I6dnXgm#0a|?IuH+4G}9eYbw4rCz7<73l?4xJ_h z;zS1#XAlez#ba-YxIhDrZ$@!QIpj)lV6-O@1lG8e)}>Hfdh9LrF0haKa^KoVk0nR* zOF{iBDM}2HJ`xTyMwpHD^53|r4Mb&w|zovW)umf0q5KXzl8eeEEz%p|4) z%j_E@Z2G;5bs{9jEIR&LsJ?WM4j#z4FBfi4_w*WyU%V1Dt%xA?4XxGwM%RQkcoIF) zV)Y+a^;6;4U9e~M6Gy5)I2R!yPeD*837wKV9+baFV^%D(#`JQSr7_}p)0jRvuxn_H zB7*J6g2DcQ#d1Chklc|ULAWE2(H^4XI$TMoDtN_Z_}EJ3<1o_(X>#0OD{?zNeXVvg zOhM8s_3+JaDoMAJME#qmDGATmur?M?Ph!_?E0r0|c-m-nE^fFI50gdx6H250d8HLJ zMI8$cK2~uVBgWQhEcr{qH%=UnAjL|_IE&Q(%wl@#+rEe<@`~G)Dg=$!aRU27Zn`#y zB0ZKea*@kk+IJgDW_1ox4G8i=*MIMFWa?fQSkm3~tkNQ1bUouvB?{ufKJ>PI@|Nbo zaHZYGmQgGUVi2Ob>a!|qg)3{mt@yAM^SDy<8J41X{63`|tx`VkN-Erqm<)6>Xif;S4u>wZB+qX^YAO} zzeinVN_?axz88_u_et^hOG#1qnu)x`(>cc?_nIG~56=kDUh^RTyl68rD(=s!iA((5 zzavX!asNi!eEcgg1|A^Fmo?dEisz>VSl zSl6KrO}V=SE8IOMLiC!*xZB6bSmS&eX?(hQB~DWSUp+ob)8%YfS|gtnMr&*fAWhWe znC)`Rc0P?2adVtcgNSdgeCZXJxj>Bxf%7e}e~~$>lQ=AaPIG#?%;{flaj9POrB<5L z-Dl3~wQ@G5vN&oMpM&A&hSVm$N(s?9F>L;p@Dr>!ljHQA+KLNRlV#_Ifp-|t>o|jv zM;c_E+o;ifZs*BD)qgG|UAvu6+=G$1bhA)ZD@<)DM4}gcg{p%H2npq(SYcm~S;&uk z5lS1%T!c2X_gosoJQcH_IXYhh$ooPCW5<% zFCUz1LPl*p3BAb7MkJ3`vQ-(HqjEtYnn|n-{-kx{Zod!!ULkPMyXSEHef>|41@iPL z-7WK^bU+ggmO3`ce?~37NwfPIMLIr6I`b4MavO?m*#~GcVfRM(n+_8d{2h_Ed`;8u z&g2rNDQPmEaj)a|WI%%a9Wlt;Z!_Hm#jc&{b!e-P`8Qc#y*1wu71rc`Zy%g=_eE?N zcqW)fTZ&!dgk1=we`lS_3>suZLWiTr0ch3{UgVRL-(M=gM5!0jY}Z6JKAZ(MXaZ+2 zg+2_oJtYk(EuGd}2S?w4(3HNZR1HmkLsoQJ)3;i)lkc4AIn?fdPXWl1hiye}(MMlH z7Af$%DsCBrGB1=KaUK=KeP&ZOV#+WalY`lzk?J&=2Pi1|?PmmvGCStGqtOi)IS}$_;G%s>N)T`_1 zQg~f=5=Tcy?be#MIN_YKU9MXJ!7r1@+G@TLrIRO3akK95@ju-csn=ni#}{8`%8Y-F z6zrPhZ0rDITng8CHM5S*LzD4B9VH!hs3iEom z&Ny`*%nktWMP_(jgqkDgXqxpYs4mlMj^nxCn))EPh~&bA>rP<4(K;hUGOH&MQ>beG z3PM%4I*th=Z1ou1L6gGy=93OeXc4~AjY83*wfs7M=e56Az7W~4ZXGFNq*6^zw7%6} z)nz`rETL3&BAi$ZftEV2KPkh{s3d#OY2Znpv3Gg~b8NNdn0Kr7cwTzO=?p^`AsPnj zYOU*d2g`%bkjC|V`KI8sR0-RR=%RHUCy0+E-an`)w73~oBmo}Jq>NSFb{Y#{p6f^Glsd zcUN1W$uO~%*IHb0V%6g#-!w~-X*6Gd)SMNw6&OBy@IfjqH>bPT#cgqAu5>;P3Mu>KOZTjm^Uuf%=HD0? zlpz7}>J{PqJ9}@y`#zMzB_s$ZpeO>b<7F7Yx!3tYjI~yTA#BmM`Mg=F&;JK%9V>v2 z+P*ERnasKAaSdaL(cH`b;O&Pr+zw?Fv5Db*V{hBLdZ zF)5W;d=`p&ZX;`GJ4A4y>iqe%H;rDkO}E)4it!&E#fcJe(MoV$y_Du*?z)!&u6s=E zjC&5|DcQ9@y3uujbh_4KBN9haf~0RYc}r$VM4H=s#|&tnhIQ=t^tlxaKgJe#X668F zO~nU+MB88_|G}`p{k_7i z78CVjVN|$DHOH_^V@+{0gjH>e%CKC4*R3W5l>ZOj<>a|HAmGx zyzz%?b=TUhuCNL=>Vm<6vw0VTRYFZs-WOzM=?cNv?B0y^dM?`m4_%V(UTVFFtRXgn z*!sV~J--Lo!F@NQt`iUe+m&}dgIuWX-`>P@Zt~9(tGt&%XEC&N0bj=_Cot;*L;g7$ z^)@si#O-xRX)k4JO}1l-pyL(%PMM~m%W(9EmqS9;LGOf1;nfG^eHl8~7W~K&+&#|^ zKJbW^LBA~ngmcv{mnN8$V+Kpl)o%A=lC~|b4z4NQ=YHb&D|ss!Xa?~`C2VLXBb(m@KS^{k$rJ% zeRydeV`Eudnr)M!)1ws&KOnL;b3km=nw~gHAK5=yzQe1vSIf7#b4V9L%ne((sr9V1 z(S03Rv^nYg`Yk*l9=e5iZuCg*KMccd$R`Uwr?+)H72d-oPKFs2-1-v00r>Uq4CyeT zk>bV8G9+@tb&Zl3)@WgN4bMvTU}4k~n)k;mx#=&ciISHpHc`#>4EN{0Oj%$}EqKW8 zA$o()sIWS_>%mt-?}%^5-qtsQyk*y zq**-tx9^;IjT5Rb#mR`nB`)Qm{1M}#YbPfbE|~nK z%aM;OJ0hOB0l!r865@4-V{Ng)mc4L8#I;H5jYLpc(@-RYb5I;8LgnnL#f_D0%o z`oyAKorESNsHv=>pyprmqonGBes*V=|iUc4?qB5&ab zqj082byu1d(r*O68%OE5OBIx z{Qpf5u<(Yun^^mg1Odm>>`)vw6a?(47g~36oNqnOsBi*6+>e9ib@RlmauR@E#}_wg zLo%gSyiX@8H=7WcHIf8}cmMaVJzL1#&&0X2f}cC|YASe+Febsv@AB>!B)N6Dy#~G; zZ*bs`N&Z7p62J8o0utYUw&1dgmlkXwYyJiopv^c~t$-^@{RgG~o)uL!m_M`R4%HWY zob35oqY6kV{mH}a3pe~=mV!UT+IaH0L#TV=cXRe8`5UweUV;cGXY%^SADP;fNw$Nu zk4SRQy9A(!`+p%HxsTAYyeOBfuK~*is}2@`ih`IwCo{fmaCM_h4FLkK z5<-B7+*K?W^v@+{q3ZsNC~Vy5@d&xBw-5pPQ2F$#0&^fCmo>SNCQk@1=y8A^<~&Jh z8EFj0Ut4bt$_8(q>YAXlLVNaIQNGK%m9R)M*sEPyBb;BTI>{=f>9>dZLVXcDp=+yZ z&HR2+lyL({!4J8?kpURJr<-+YoZ}bkk4FPLWiK3pi9w5|%RfpCj1(P=cuVKuL(uCm z9F8LZROH04! zjF0+bsm|-z2I5jj26M0Q#mRmXc_~GoTlf^V;WH?Piji63%&8gSwb3e5AoBR{SgH*c zBt4dQ&XOKW?9ah{CCYByg6nREiDu6r$dugHvb?lSDj9l<4^0xs7xh+-w6m>TD0(p3 zew|b<8M^+%ToIOKgtglU;OhhF(DKT4-A#wW%_u_GJJB%cie zS0lyHOuwbeIAu0lencJywvzWGM6g1zbl^-g$@^C(K4~{P> zu^|Da+T&}q7GC^mc2?dPXslOQ`>kP|A=D^ZEXWDIOh$DKSgK=8Sm!vEY9pdAB&$~Z zS_ZsC|D@Ck-C$N{r07j&Ekq=3WZ~;j=DOKRw=p%xV)$gta;AG9i5Z!OyHEA76uh=J)OklWuL1P2^gx5{cSE zQ3Lu2;^{9%hT`e#BXBDYi;zUkiWayGc3?JA|aXn|bIjEc$*<&}%1i*LRf z-1Z^8jG@n~7YTq^rO_KPG;up2$tWs(Ths664+t@lV>hF*K`k>8(E|{80KaP#IeZNU zw;+}I{*7Yb-nUUj9kw*=kJpSe>^LMy@CJqGq{=+6RP5)IBr~H#94(!szM%Tnnny5yNG|?h9wsZ=HG;x3?KE&x5 zC|V56v*3!Yf+CmiyAN%*TR{J+mHyQufSh86=0*V7>00@m8|A3A()829B~t_P2Neg~ z;x<}b*w#+k`a#!Li}Xz&Z1DT%Y|wS>u}6#lRa3VlMw(iuF`qQtRIAyw7F%2!v4jjP zRd2pR&#O?~`xgj}%Lt%ZzHON=2KBTBT%@a5mUx$~VxEHP8F#oq_zoAxM=3=Av|2JZ zS`oHD;v;SHI*zAc-5e>>zc4Ah$8jha`1_04s$7oF4H285=H6K8GqJj7!+0H+RtzVR zA}Bi2OT!G8nI0lTeNrYDO0z*;SOX+mjmWnNXz7yoA@!);s`?q_Xd7fTXm{8a{AMK1 zMBa!CuY@f6+au9egjqu!YZl!$5*;r_3-_{T2HS~a^G`|fh!BTw`q1Ej4g?SWt=M&m zyt#g%$VHpDI}VbnGx!v9nDw?CNsJJ6@=j8~MsJdEteu@9vzMqegFUdkmjobD1BCTZ zigYg=o#Ovkico2l)#zrTt&HIKuxW`Uj8!jVI#=_+Uv1ODx9Jd^Lc>~7YvQl4$X$t~ zdrU|6Wj1?IX9J_wKEtVKyI*v=5kTQihXO=+MAWp2gu#NR5u$#1`)KNgDQX0TDajll zQK9ODIZ~1-Dxy$T!8ho4i>l%Eu^f(@N25ESBAz*VMg=M?(E7h|PPFhqn-^KS>@E?e-vr}qSb{Wma^b5ZK+Gdeis7zzEHDMVuF&3n`h zb9!t0*7u^B`RKa5VXg(n{nL2`dltLHX;2EYhVTb*2>JAB+vDkddHRg-z=j%hV9b}A zi$|Ka-NVj(k1m(OHeC;XlB?g3}XvAO|)mRbdRY-54>OgOy z3PVJtB?rX}oUp7jwmOBkWNC-?T{<_&!_&b{o zn7%<)QH-cU)j4NLy~dX&u|}qTpqw=_k@xtl5o=W2nNG9ID@DyN&&M*KwWM#BDJgHV zhm(3tahB98sA!cAn7^I)Ynv$;^%r-E z-81ew_$bvx4A5LsO5fmO=HRyAm9L6(Qe2w*K2cf{ok6@X2JNu*GHbe`Ls_rYT?me*5 zkI7KPN(=ZVkLFYGxlQD0AWv`tKe|sdHC$*T0qA+PP`rL)N$5`iF!;H>Z{XRK=w@c2Thg_N;iOEut);vlr z*m<%-(QC7X#~|Fm?sPBM!oz4IGuSDy)(COTi4!2=U0Vo;QK@ot%-9{*N&op^Y1=He zw@t&x&VScj!nx;!<8uZd(T%$MD9QEmgB9sNN^MPDi~dpT$sKDQTCeJ4DcMMJoVm0{ zTyy8B(P6X9s`RO|oRN%ESnr}(z@xAM((k!9`2e@1B|U`h*FsfGE0wonPXj%3GeJDp zMT(-yN989Ls(w9txNTPO4QFe7?ol&~YNl9nyPCxQDrsz*UZup~<<~ztv1AW@ww)9q z*thR!;>b1bW{8FdzV#&?~cx2Ui|24J0f2C1hF8vLXJKkIH%)It%$Cb4GSt{*@!nxk$w*={yU$G^;0Gsd5xs+b0dL+g? zQ*n|p5VH@kdX*)9>#x$$2DUKwye)ZFqraLC=^zSjlQdg8(TKupZ}}$ zc>@urav_o$NYW_tbm&8kh z)=W$FZE6hMfc%lh67Z-}gp@d>+s|T|MZsCq7%f73bC{>0;;Kwrx(_MJ2~CVti|QPGPB+t6=qH&u90tc&6!bL*2v7+ zxP7>Dh?~pzTD~vC&En3_-3zasM}or>KgLRn`LP2tJh(6r(VumUQuqj@7a zqU(P73->4UM{jNAwOtty{F5Mv+o+d9sS8QiAS^N(RHx+bK_7>12wmSkwl&RLh`m>Ur)PU zY4*$N;|&`V&$luF$28Z|t^{?*{dhg?x*wZ|v`aF;7}Q#LNA3c?+&$S`AP}5*K`FcrnxUD zv>n@;naA?{=%qU_F|co_Pw<}VSmEKe%2@mLlb}Xli}@!_YAXCm_aD$y?(U-iCXD+F zYcN7ut8y?4YUOM{WZ&K8Z(=^h#QYOfMy&mw2xTYo5Q){;3ugB=y_6`DbUSe2=oP}T z(p5Pewu=F*MppP)_1r#q9hZVzch$k_U!!BvxG1kPB~)U3I@DF6*foFPyrTYEH$)G) zJ)!-Evhj((V(6F&I?tg9jCXwNt~eG2w009{#5%3M>2|~FJm+4pPt)zfl~6JjiPa*E z`=Vnn9Bj=j+`E+*i*Id?6&}d%x66C8)`kbK_Az#}&w`Xp{-!ti(_@+QCjBkiu)|yS z73Nthv%B@k?XBrttKPVNmLPw2Sxow{G!4(n>@zl2`bg`MZ=Zn*Crl!@*8QQ$_WD+D z#?~g=4zLgWWU+s-G*A9tD_w9CSM-s+HGUWy^im0m@@`$U&(gO}pC$Ta&Fp=f+TS>T zUekmfo^cY|7gdl37AhWV;`;;Ch4{zVaCf zIkcUP6ax>%g-tVu0kpeoyw01T3frz=WBnRw+^ZT$x6`(4cE_tLjUtztrBVBR`_AgC zXR|-$7jQHD<_Sfqi7CA9a8eTmE+wd|?K>j`UM$^GlG|IQ6=l^p3~4*YZ!BX-?Cd&j zGj|iE`0Qi4qQ3-;Mk7GDUZi|EHO^ogs+oXine&v@#4_x%LcJl6LHF-OF=B7wIK&{pL))z!d97&UBU6R z#4zmQtTQb$P^hYEafr41$lcF(=Qr62PjBf_8HnKz=#cr4v9a_!asS$isDFW8E=YwR z2O=JV23vVAu`Q(l#3W}hGhy6_D+P07P!9Jsw)?EujsrQ_Ng!Qk!kXly@XkE%wJbvU zj&bWu%o#cwc`HtpwOYgCO>7NbdxMe;S&%sid8jzpCpt?<-`eCQZ-k_$88wz=g*Zmg z4J%1l?-G{C@r!!y#XQ1ir@*w`n&Q)Wl_G~+oY6nLa&f*nmOV4q9HYztQkJ-o#DrX1 zWZ9h+i-?^(C8&jPaZ8u9`bbWT(j6}{3-=BV^;#9q79b`baQ9MEMBe+Wlt>B^IgG0Q z{C?X1M)V_=k_!EZ@zSjeUXJ?xR!V3($OiOiQ|=p4FsVtNJgK6@>-ehBne0zLn0PgJGV5YAy2Dy4nwho9}P)qO8)EvR$g`;B_3LR;hCMP_lXvUt3F%p`*x?B(>ZbayT*4jMb0z-okn(jje z-}!7ZaEIW0+m$(;lCWH{m+90>=d;Pcm8|pGP-2zL`D_$;edBzZ8k91CPpiTOYG?@D zgpWgoW`|ds(Y!##&=zwtLpV%ho83YQq1l$&R0(w#AP#d&zg*8-OFar@H&?6V`g{o6dWau=!sUwwW_p!xB z`f3%k&M~>12AcHdLe(1bF?$V{NML_Cx#8umlvDX_JVmMQb11=gaO1Y;BIlR(H91QLmVsW9 z>lyuK<|7;bx8bT4&-8=C6hQN)&5i*la6{F?IZ={ zHL(6d*xBts$l6}K7DN%;|K||$7n4P@K>|K1Ik8N2%`~yt!X0Im`i*azIWHp@Fj*3n z*?f#ZEwu2C`#T^YfR=^-don;v$va}$k583Dph8s^U(UD({QGvy$FY?Uv`t7hOvaed zQ~A@;2s1nEt>b+ttJ4L^$gd54d7m*p+@SQRK(vo6!oxu29b3S{s}t-p#$mX;aB8b&ncmlL!pNlGpu+7FJ!3 z!>om1;~b?dKhfCvJzYY&{wmu5(8*2Sz?*H=2)#tp)$#OY6^wBoJ{#_ExtjUY;5;51 zQHXj*p=fi&222QLmoC^(#7ip6bm*l~18s+i#yv>0)Ab9TMacV~Ap6p7$AogR9EC5M zE&(ODdr)yq!$Ge@+E*DL!gJ%*-;5gwKROp;VlJ)oB8{`f_;a6)d^Yl_U7!Cb)Z^?L zFEXc|hqU!dg5fV5J){-DhDR{{3^=lQxR5C(2LFaHKvaGJAVf5R{4sZ+T1_V-WMS|* z;=R2kq*5H@X~b%-6{>y!?#|Z{=P*)S*r_U|z$TMw*$k0asG0--^7~r}%n8}ET%65g z4xJK3#?}Y~`2+ChtN4jM@`B{IC3p!^n?_;7_qND7m=rAcKdPf@PqI*jhI`Y`^z1i$ zY37?%P1^f0vW*x0sETAILe;Ej;^lNE-lJ*u}$EM3H(cdo3&3}E}9c&wRv@WwL{1S%vB&d*e@rIm>nA-@Db z-0K*-1BTwNMs{-F)m(-Rk^Xb=8*B%upI=cFg#34R$tIkcqfxF|lo@f=(ad z4#=TUdgVW|IaF1VsJm11T;qD<=bvQ+H-Qp-6zFZKiM9`nfqPhyUs}BOc!|q6!yEh4 zN2}%+hHR(D(-&3feni(F6gPbR5&Y(%=L&nuhw4ll_dfwgha<-aU}IoH;ibf7+*?dL z@w91)&nK5Oj7eOOyn$bgx}P37XaM^gDf;w`NI$x8{?P($ec zl<8t_E$?jUg*vkmYhC%3EkD6X%PpX{Q^_av*4)`L(Ac^7zRp&x=l0Ad6l!t~PN%6S zA-{@-inNLI-Ra$C`FB-l;k{YH8gj&Lif0{LMG7_Jo_I!aWF4xyEkg?WK2&F z^EOG5aUP?QJDyn~%n;99*+rXW!zfr`8I^{NtCSIa5%?ez8gaO77bVPX`+zy!o8;7W z*PCP7c7dY`C10N$SlDDzfn@43#~$-~mFIFpevsLznOk3oJZaGg10VLHx;rMM=nJEvdl)!w2|Y)-Iy4Ac~|=}+;N^4Q&HmgKq&R-kda zsqFiAZz+M6CSNpTPxT5_hl2&$xqj5`bFbj%BG#$+Le)1WqqZ}iCMvT?Wn$uryML#4elCyr%O;6DLyE=J&R;*t z$pnK~)>5ir_5b0+U@Z6zulQ(Y;&DrCY(%yTJpZ}gXdQWJY-djFIzzUj3caXU=%@J* z+I=!InkPKWzcc*%?~T{|cugxEQ-|=c39R{Ltk7TZq4D~N_rBv*}swME&Ujz4V_XZ4l)H@kDyf0N$iI1yZtJ+(sB_m5T07{-$UIj(V=lBdY30iS(& z>CGIzTxA7|Z90GxY81oQC!g#egiH%l0=dBsgyT9>$1^jFvfE==bMxI|+|JAmzJH0m zOmc#D6IeWph>Rml?4_QgOwNnRX#37FiM{77op#)DUdJC4n0^A5WwW~QFw&xNU9w0N zCzd&@0H=Fe;kd*Lb}jIq1jg%jdYzj%N4jhIwi67blkQWUKI1SO?6S^g42k<{Ash9^J1~f)P-Vu}VC1W7*{6F1}_ym(J+g zwT$S>`Ob#CG`W4FIbL!*$E}h(^;4+2T2-nwf3q{##tn^Q=Fi($a`81y{Yt<)DahbH z&RJUkAe5Q5jwxB=Z#CT8c0I2=#!rrB8cP#HP`66MzT!Y${=k31mMzM2mM4CHrhFO) zs8a2JZg5l8d{Pq|n#&j-?H%Q6X);rz%AB#T1d}e}jnUU=oKF7OKsagAh(!!1tmSm8 z{#!HRrirK5nyd>MSq3p2ZwCA$kkr2il z>_S=5SiAeV_hrj{R+u|qCU2CZMYMD?)u? zJLY?Add~dyGI7@SZxLd51raz zBphnH!{*?J6{EMKJ>;tvaRGsL7)Q&R)oTt=2vS9nQH8#XW~%-)rn=;|iNMuJ;nj0! zTkx}!Ss%K#N@Z>4Vz|p@pbq3fjKzq+oRQRkUW)bxSc!ua)~&*Lk?#t7FSyVO>J}oS zEFRyu?BW53*A7PHyAs@Irs^{)M6akr;=J0m2FBU$twCF}Yl$+W8%T^@HBOB>}I`uu5_VEKKop9n^oMyxCnN$RMvg2 zu2%5uu0)9%$D`;33pB3)2 zlg|jB&^FaBBuhw*KGQw57O|q$i=VugCVcfm$G-=V}&*yt0kM4OiXHa2=(g^a>R zZ+zTl$v?wJjeBCFDJo@D=YHi%`4`xzT)9R;^lF#upJJmeJION&8_lphAvPLRYNcb~#hy)I3NqgFbfO$l(E^Vt*v$2nh!qq5FtlL1WU zd^U1mI`bKh+T=ckqqewD;i!O5aMX|s$r7?%pJ}uH1hH@W!b0tOp;|qscGuykMj)yS zxo>=YSmoSxhlfYMpB$z6rK{XViY)4^EmXa67zxrnwl%c(YilTBi{^*Jk8`Y6h@gJhVrhcKIYHjn8pE)p%y)eg$y}}x8PV-#6meLQKq&tC)Wp~ zx7SG}PkE~N{tABnUvzttKXn)RI#K9qi(MDD49-elU%P!)`h;3L}J8r@3$7W@2pywKnq)0lv~5hry^@3ip1Xi zhv?w23@4(_Si*^==T~4VGlCdwB#MoLh9}!*MAJwoelilBe&E8tME$F)V`+QK>ZdhAw`>AHlosIFm=1$j5kc)#_1c*=F)hRqJJt6LxY1Ezy4*=`rv0&Y zUV>xK`qpZlr3()S4}6B#gXy;v{$AWDZ#Fa@2Ik6D+Z`-^Cy!mYi8V z$0lmeeA6%a%|V+W-G;~fZ*Fov;XiN9H%kC%r=z$1vuhwi4EOo5T4>dkTu5lj=g;AC zxi5D4yMk?WY`@^YPTwYDa&t8oWm3PiN&`}q57Z?B%F#58U-;Or!`RV4I=Ed?H4=Ir zC+2^$p1QkeFH>V2|56PZ`6M#_-Ddf$E~CD{ouBKR8c>uM8S6#3v8XfAB5B;!Z1T@l zFZ%Q;T`nCDusnpBQrumz+y}T)gRi!|-0QeN0Y&i{csKC1Xqe_9eW~CRq!Uq>xHl3F ziXmwED&gWdp`>(EJ#o6v=1xeJdzCRRQJNy^yxz`bx>aH@8|nykSoD+jJWt5Fl|WsZ zF)}OEACecUW*($L@0Pi_Xl6!)%j!;|So8u4hgy}y;aKegm#AH!Mm30b*Wjq#W)f$B z4#zX6bB#2s6s@uMg@Y*UHwr(XP5kUa``f1`;KA(}^w?I?46 z%|@fYgb1fMy@Ibo)zG1InWZ=!Tw}pcxZwKX;As|omkW+6n8z?G5~U3m^>dM5{87 z(<)vH!3*<#e``NUCQ9|3_x z=9<@QExQ{>W#W2of*VvG+D-pScBBTks80T5^&F?w31Sr^S*h^=w+;4e|$NGsKOZJwO zj3~K}N=xG2)O{3ndzN+W!bwCm^zgLXt{z3Wht>xr%_PNZ!)(WVEkke4H#mOdt;t;? zt~o0Cl%qA5!O_;}xxKK4)>vp7JNA`;IgD zX2yhU?8lu0m<-&q+_15DK^PC6jo@8)s5EXiD$x)-c_2-W&_1YRnjqH4> zyzKEz=_o>LaSfw48ZX-w_kPn84KAT@5ujgvN|%b-d}1_+@O2vpOU6y3K?t-W6atwIw6m;L6EmqNxZ0JBc-MZ%l{6->zBH0QmkOia z((_3sB8ZaViOI;Qn75wGTs${KY=rm4Xz0B|oFD7JIdrg6<#K)Q#{|#?Z#%N2{X7Pu zK>ptLA0zqyzWrMUD|PJ)U20!QRQp%c{velw;da}nq3lgeEf@hs>^7vKczKNs{mj|> zVFyYG7I7>&Qe_Jc^aRmdHxXZsuG@RqS9gun!I z^~u>durbMHQIbMFVsN&NYI#U%V-_e9n)c#;`xkp)jDIjw*RK1CakRmU5rR zTt}4jcx|`~nSt0rrcW1jpfA%b&R^=SKO3HV;Yi{umTjub995S&8}Aio!+M{uN_74; znkaiT;r-^pDC_Mm(mikeg`>T;1$Z0jE;lxv^q=C+V~6H3C?Nl95Z!XhJOJC?nk?fk zs$5(qYM|#mJmBOc>Mi>My{PkhrgTz3V=OI5oTw* zD1;FuraRurjH3C{{B%+^{}~BV_j&7;JS<;BGW_Q;m)xh`05!c_FwzP}4enybqhMNE zUt-y5?0;ELSK6Rgcm~_(>lmEEbJWV^DRK=;|)1L__Y90Dr&OvJ=*=<|Ag zeusECO(vO3j;)^m0t4-ue^^zp`zmCWFuNTmx`2g&ny?ESSV30u0a1f-pVf; z(R>M<7Bzn`?6219flKIh(Q)t@*-D0X+iT&&x+ZLsnNc!vgxesCwu}sfN~cZqT7Co{ z%YQ_lu;q05xN6H~({N5~BG|1~5w>&r3wGPe6=|3TU|O|cESi|f?38G-X0Ml4L`FWn zZ+?zddN@Ddz7h1ghJxXwqY@uHz^%bm-DG7RID(wOo111jljJsBZZ#Qy%dT^WFwm6R zntNj|UtCR4a0y#PWkNH%R%4O1Gmke0>)tV{JxU^{ku78ul9fdhReD%DHBRqxNKUj= z@NdylpC7^TRP&L|4$M#ts3RW_M@TyZJ`w19Igt_A6d^EA_{mY_iSD{lHbSKII46Os zky}cYpj3w0Ui0bJXnm_hIg>aROHV@P$>u1raaBL!y70A{zp~MN7xI|82M!SUQ^jq#e3uZ_7R#Yq!}B-P?0{8KVN71w?Jd#OyZO z{ZNkv>fju@9P;G+!PpRK#ciVYkPiBhh=)AcZb0fx0TEW54&iBWf1NRh26mmIhYGUoDGTTC_OcvE>t$8Km;7GQ!oRxYP_*!4RoO3ENb)IYCB+OOUdf%$K;VSK z@lh;)dh$mM9S+&apXh8(MkFJBa_03G^2vB+F42o$i+iVUj{9eV;<=#r^?1$3#uxL$ z@jMpZ_JY7{@F%ovmAbNDI@QvvH-czF7*2ws4Hf=x4v^5u4r4+BlERwMl5QJWJsdU_Q5Qz}DRFVXFCN5B$$ zDH%dFBFL`Ohuq~yku-4X=7zYUyoXF8*DD-mZtF1+OloNI!=1(QDQLM^p8Ig_?fUo0 zbK&RM>6dAw7b$+HSrYw(_fW1YQLWc}&dV&jGxA#kX{A`C-0jR`l zd5~=8mO(zW)|`m#TZF@obP9JGUZunc?|#6<+&Xl5Q~onfc6pjZS}|hB9yt`T&A$SR zUim8R5gD2xqEpAKCO9FcyM2OMrJ8+WHH82X&xTI7qY>nqiq0lnWwav%H{i&W@K2YF zvqX(lh0;*F#=>mAppri>gbyQueRw>(LZIem9fRy(gF1t}a|(4DFAXWgWX2Z^Gq=~) z-XV755ze<2&L`S4N8WnK{pbvo4Vh3lQ;#7UZuY+Yt{lh5hhw{D4^Giks2EO_E(*X_ z#J8eWvNr`AcwqTeb%Qg+T)bUngPavf(71GpB8goh$ z3xa|S+tKj4t!l1j*Zd0;{zJL|a!UN$yG#-B?alfL350uHsixfX|FI)9B2D_wH6Cl! z!8W=n=br$1JkJ>co6#5 z7LXGBR+571t;&56@~YkARvstmv0XI9za}~5YdMZ;W9ts3O8ba}%do$sj}E}|)EtZI zIQvth<@9ZgzukV8^zcLRnZW9mQ>N&CRr#!1ul!Q%>E_IeXKLq|#od?)!gw}m z=OB=m{oKF6v%Wpu8*|01y4G(mgrwKPQN1xs?gT`ty-)nrU(&-H-{$CBRkq1~RxG!l zRjc(gCUzwt`N}rtrd#dj*8k+EuJw+s{7_SYY}C}NZ(JC$LQA%}w`%q()LUymE2i7e zs#*FOvm~c1WBfk*xhZO$zIB{+S{u0~Rqhe|hJoeooJ2~}55v77M)o;ZDdnc=mNgu_ zB{MDY&RLdN4~tuJsUH2C=C~9FZ^=SSxuc1nr2o@a_o0ao%PqxUX+O8F)(8LAHSYUr zzKa0k-Amf};Xgfg=$C(?ddq80ya+-v*(L@qz70xtx9H@Gl-k}!GOioN6H)y3YXs}CHZF)KYWs7#b>XJoJ*qeo}uDB+# z)n!kvE_=*`H5lHkvTVf+RdVQHB`3K`rVmtNPp%R@76W8J`d&v~}{Xr!zj^3>h zH@Z$nxj#&e$Suz8TKHm3?;<(BPQZtrFw}1SF1FTo;8T5syCf$}@;_jJaK4y$U8upt zO4z+=>Ezp`?#(oxckljC1IK z@w;$KF~JxlEvRacV$3sRxZ&-$Y9UmxPH@L?966}}IC8KbryQ+FEiaVJxr8wJsH)%p`Irq22IN70X zeP-1z+6czM&uvk^HwwGRJ$fwG*IrRV7YW{h`6Kg(i?4)(mpgni=$@?tKbu4W$iIGT zzC6qkrQY0CS3y@;jnLKHD`Ut#iQLK%JZ@{Y)ur7`uIUtQmAOd1JJ)z>M7Kcl<8sre zHmt5g)%|)(q$JiB;poBcd2LDKxco7>PlkC&*WG-kL2Mn`ZhIs7|t#@WNKb3N3Bhw=Q*!QQZ{5dTIk zh2}Fwb~DGiJhp zao(c-lb0;o9Gb<9YO)u@POE)gv^6(s`{pA*uEtj?xu;6v&Nl z`hJ`fZcc)#q4JA;(9d`gNA|Q`IY6zFV!OTB&}y*VcGbX2uUtVl>`@JfkvEhI3*< zIHdPtyYqWt9#1{3_3gE-jdyaB?Jl`2?aWbiJynC8^xn^4rhx$IhjbU)j5RTWp=NGu zr3+|)FHFFhG_aw%GUexT|D9Ir;q0aQ1NzKw!E$C4RqHR{$T zvonZl_uu*Qq*&{ZMrr))t!j46|Ir9uWB!d1eiHtDngf1k@DGH%7{sLeAi(V)E0Ot; zzUZzXk~vXXW>J&ZEX{B-GYr)Z)|g$1i#=-5)j%kf@>u!j7PBidk(}5O+zb5)i-BT;cn7}UABOO!3pm(C z2^;txggJGv20?3frw$ECO-4O zgC96u>3IGm$BXHmKOPxc`PatdBgPr<^gFR|VG|~-s-zKe)QzttM>Q{rOx<`!&>4xO zyQ^V?s`f7JZVDCqUg0YJHy8o)9)PAlECES}EVpiaInQ%QPh}d$V`lxe@o`|qQtMi-fJF7v#6V! z_yz^pU0k%3UWatYLKCgMBu%7PjMal|w_Q2nk%l%#*so67n zQ#E_MX6=I#+`g@uId1-$smb4q&U+y-*_*$kyZ$liV~+xC3H;I`V6Wslua~YQIsWZ# zZDiuZ@gS|^de%HMpyJ9O6RwZN#bX=kXT*X{W$V}IvM;j&V+sU$--CDcfM1Sq!X=YM zsLTC(pJ>D)n8^tcxmTk@K>}4<%P-QXp#rKgUq=FkF)Pwi#XENtr2|RupD>?dP}r-( z>>sQ1&7lX6*Yo%gIejA{EdF>VlKpnUr)5VkmVHQkcxw5X{^(xkjkMi-c)5$Z(mE>98V4%+yct`$b@amHvf~-({6h?o;~?v3Buo@rk$3ZGV<)2 zZ;dQp@HGCzYfhZME&m7+n|*43ZbTwG_MlYFw+<>_aMIj~$(m0sI6hf(S#7j-2w%n4SB%m5bAwl{GK zjjOa{rJUb|i(m`%!UXB z=8ofyv*<9p+3OA|guPv~woq~Yu4yIt;ksAi_?m62k>A#@CXTo5-TA+LlPzFag?{R(P@5DVKSdN0^Ip24<#z|%_mL#TOv^hbLVbtIAUr1yQ!spHxk~Kl&QG=4T zSUZzVt;z|{>qKHnW&Vx%a(Z;?#?mUqK2G_1KPWjNzaw?Z?&68VSE~#H0(~IYJcOTGl!RTHXJ7RC$GapG+%?eWhNqZpTa%fElOPhW8J#zE*7vZ_unwaPn-eF>>2w&}$ozrJQ7P7P9O!8H zc`P#n{|c|qMX9SPZ)%}uKW5!)z(4X^(YcSZ#NGRut1Qs>H{vzbwcZLYY+Z%r{GyJ= zw%XR$S{`WpEt^zqkUHSQhJixGXJ545-x5nNBIr@`B<5@)Q(p=C7^VdKhl|F+Z!J(j zC$7Mv+pvN&w!{`H7fpJn^?6H&t5CXt@zh=|U>eZjGsnf3O#VtTF%^*ri44>`nR)nF zxPP?AR({di+)oeJ9DE#}U`7j=i*!lNdespKcCfXvb@XA80+@jK+;|HYjc)}%pvF{Y z0Z?)sBXbr|;^7@rW%+7S9nL~Pht(n{x^tPNW-8+#{_jg{7CCe-^c$A}~mTk;k?^X7j&mVUR; zaMfMR(USZpe3`ZnSW)&BwGv>Cr=XI~jlZ#pE&^6m~x37_B!xpHoa zC6+wL9<&hiAB!z{L01*HP7=HX-Nt@bYHsR#=6xkBbQdCb7El;IZy~+KKyd}FvA$rOF4a{c`{mul zkUN0$_N+3B%o)kkrO{aDi{hwfZkHG zB#+eoSIXHX6d;HmxPj?+>tdsB`R%}DF*%_#?w^GrpXdadybxUcD?9yfK&$Ml{j)3M z{uxzCe=&!;vvG>Ipti2{d-1x~3lp>J{BN9@zuGo4L9}RKpul_;r@Z_9PR_)4NlQkH za`1>1;gFm_!F?G9t0Ps`!+xneRo0s*+sft$^U@9-xw|FKh5w%(6?jSi4A{yUf>vAj zqFp37UpS1OV^G;PXSl{`E<(At86&O}p=51*f{$-X=-{=@#A(SzJ)nISeSKRc4**}> z?dljE>)gqx?M!s;3`cAqSVFVk;|A_Xs>BNZFSH$2*{3SQ(u(RAD{O&OMtIAP5i`yn zad53ya@NID?oLE@#JFvNi%dYO*6s>(*ktzVK2ETJ(zb9E5ADFTu#~r1BV(N}0LVLa znMo{2z_JtS*$E)+0J1Zx{wcq=bd!z$q8@71Sz5Kiz;;o`rJiaVUFYhbbr2oN%oGzU zSKW2PF9G2%aM=E9G+Fl7r1zUVn7ybc_@PzUQ5s}qbm`!2(xa=nuOC+7FNC!&Q$@8< zyn*cCeGzzH#2QYBdp8=prxcXszZttn{DEXS<-h!i;QK;^Yvb_$_clZl8ZJNYYCm$Y z_IpuG{r`gTxz_-%u>DgS`+vrE{>-~hr5+g&1#dWf_Y9w(5Q13E-qd(8CPtX|FfJu| zSm+{hd~&}zbY8Na16O-scj+0HpbJ&i;D+{n{&b=gvt8%A1a+^CXKs)vDw#QsJ*d_N z$%4FQ*)1e9Kk4P?Udd4z{3WPch_==l>wJ!TaNVrWNRaEqpdM)WG&b+tg4^3cR&K#{ z)p=(;?t*@C{|)>5r(r~0_3Vg7LyZxxSX zAUwvyROkMrT3mAirpveMK+L&V$78R#24|_Sh0W^`*2RKVK}b_1Zog zyBCvlL>1hLtZgEARr+tdBSG93^ZN(`#GOc_^mC}{n~_x6pK6;6S02LM$T;D7{O6Gs zG~N?*QNRSx$I1vmEWV8t3hkrNFt6>*h`%Mhb8+(n3t=*k;DRszO>()gEGUl2o6Od} zOWxt+9p-ONzqGjXB@EgNWqT+yBIR$)6AGC<&o{`*x;T3LY%L$l#;Un=mw4Yh-ueeR zpF2opwjj^q>@r*1#}_!K*_v~#D_J^z3LSi$)K)XElK0*IKpvaHufzqy`ulEryTq#S zGdZgVa%xAY&m>Bs=yK{zr6=>l>114ETHawqCO&QOEIXJ^`@4~#+iox$k9ck6{#MY< z-P4OK%azKKozJyKT&-l!1dr!N{3pO;=T30bQPxM!lPu@i5^Y(Tta-+}14#WLK% zROsBvcs)|~7U!6)v(s-K-N4O@r?lRGl6;6Mu3*1TaSm9#9O=$inzHHVpvmX3U{01j z2qo4xcU*alg7|n#lQ3#{$Vd_MpJVC1#SL4SrwyBeQGk-@?qpC36pc0Y)e;V9Q+h8y zsZCU)E^%^2nCslGS;nIu0?moCKPJj_-#}6(omBR0_g-bZEMB=JRS4h8BVIXXU*+c@z>?V)-nYl#g*&v@cWO~F zSY)7=0vV(#iHoJ6TIVr0?+Yk_!n?Qr%;`yg*32*$GY3*BnATI>DpZ`f15mn+s>Rns z`3-@@Fq;Gj69{7?smNnsN|2wf@q#J6$R9kbg=Fxa znb9bh5+S~8r~s8Ds&ubyOgL4Nu1dJwO0ALE4Pu*dybJSooOionl- zavvd(*y32{^O{L@Wm}m_CtL1UQSEE?cx?wmlF;mW9pDFO_L0u#q1g^LdC)9`pt;mC zhA9LNObqEvWU%rTrjTIQvX3v1kK@mDHkIWwCn3+C4va|0XW7q+Irg)vi67$5#WCtx z&Z9Ggl|Tbor6mw*92{c9Va2Ol@hVrm%8FyjI!jq5te9>;@Kn9E*oF;963Ecp0`W~( zt?Hw>asg0fxjc;YRHn++P!-mEPivCCB}dr_+0$`6-d!L)Ny!j-IV@zR=Y<^zPL zF@Tt5vBS;%<@|soHJ0$9S}d|vO;y%vt8#T$Sxb=4m#g`64oU)y8To@*#_hdSfF^@G z1Ua6F|FDLtT3cRrFKRQ^8oMyl(xfLpc3$p|kMG2h^U#HmJtz?de=TOl^3d`^pKkBy zJoZR_R?2@Y6?w<4%p^?g$m3%FlC7!8o9*t{wwuJK<7M|tPnb4-Ku|WG`T)df|K0Q` z|I4(JMA@^>6jT!?dGxN7|9Wi6^ZK4B;~4MM1kyL!>Mo*&#Z*&~W*Wf{c+Xy1&KCUb z46)`89ys44@0cT-g+uXjzf1AN(~F2Y7bskE;nDnaK%*Jpe93Rc|NYa<)QoKfbV@!0 zd44V5X;wQ4=9$56jKSH&g@W^<_0P{%0yUZqEq*3p%a=Nval4Tv0_Q13obbbrF69k1k$9a``c#H^l0i8=8!k$n&m z5hjrcY$Xi{Hx`!13Qy#_5s&whBcyTqEVdIX+pIGiCSfQk@5a0YU08b}GY6qzEkbum zl(HQVkS3}$QgIYg*|nmm3C>?qxTR|QA@IO-uX&dxDUEse4?4*$-L{AvHG@&NbGJnG z@g@6onYGsYVRsBy3rl(>72v2CThgZs;<&Z7eP=2grS|O-4@lr4sMEg?BCYFX>Cx$alYksZ9t4OO_|ns7M@s)Ci+L)=89Xt z;f(s!wBZ~YM8xzr;8KKndvKzzT)eophKJ!R%IvLQaREP>b>|9H^pN`Dnj@l_>Ui1f zgNN=iR`U92!e7Mgv3jYy#hiu9Q0h&rbzX9>=Vh&LxWPBQ1hLE=;nx_Tbji~Pl4n}-IG22>lD*~zRY{y@`}FP;C@8;4iu&3-fo%$eI!@?ycbam4 zsNM-*WGjE0;niPd-9r_tUShw(54?1a-dY|BH~e1na1MYPJ2P%@#TS#=%Op`O zZ~u&qJF37?nr<+)N54kTlT0bjQ2I(&eb(>ig(^>brC0AgAZQ$M1kH6EtZ_}Ssoicf67TpY56%hLV#z|fCKnIuO*{&=-C>u zIUg(>%zDB=*26qUI|Et841&~P)?r0pLk2^JxEyo`7CK7;iI;MZ|7fs_&ON{&2rE_Z zKMWkp`(NaB(Bd=X8Kn<^Fiu%F@n^R!-c0`ugXQK9lsmy|xvi*Nw-I*42-!H7X@%He zh|q(p$r-y(WRCo*pWL_Jsf7F_=y7B}^>87K{Op!7GBK_YyhtzEpNdLZe6?OkM1|mR zO>Fn+RTzM-+s>y(w139g5}zKK=q8<-!|OqnsxTx@jDZ@XY!6tu^Z&}w=bXWmu4P71BMTN|}`mK#0hd=c3mLD72SRb7VCo8Ajl3)Tw zCqB($r>%rE;jkB`iEdoVfU5B*nDj1Qlo?(_A4G#*^MCM;3-BvJ+g1me#u&)9e*k34 z8Db&##@CGm)NBZ6BbrdVbzt^8flYYbOaB+M z-u70(SK)~5ZjGv6W5#FoTSMlIABFcb=G!0HFJr#NCBK(3FLuesm_v*-j2+<3|DvxU z_%b-+LX^hGU!{E}xZR~U?(_jY$F4s67OP|fYr{`e6(QIz-LOqvrzM2kGi`WUw2Z*h zt6kz8S9UsOXYnXI0|vW^76mbn9Xx6+;c+dGvs|&|Hc6H=F@%)V{+5z+Xr#wJv^2SF ztKD0xds``RaVg^7YOUp#m3s5nt#*lVm$=5gb-3bd-CMhRYjh^2GC2$2gt)R$Gg+-XI>R5!jfmKi5_s-V*Yt%OS_Tsv3oUp z^Ap^enMW=@?K$Cmbmy%W#MBAf}Jf z!vNn#DPo-K9PE9N#QX~i7@0Db1TXvpjQbDXc^EIT0>R?@@Qd*!J|!dDli82F^GUDd zY}|IFB0VwucGNuEAH%66xK+)Y441}(vovzqbCGt=8a6wmGbNQrx}`c&D^ZDJyI6q> zoDdk7e;Y^7BZ zHUtfm5ezI2Yee4Nb}9gRoj_Viu}4@7k1#w5USM&n`9WayVlM)#TJjRdjQC;*tU_qL z<^^nj!4~I^Cgmjzll`o)lI5$`>TRgtD%Lj5j&9BM#I~z%ZH&hJRGG7|s*bhRdz|em zu}@8XB;{W+xY@@J62VrHc1`%7e_Ey_kS7i!xX*j*OM*YUw^8$}ytX)Upy{P3-^^>% z;~B(LFAa6e^(%54k3dHCXFz54$A_h|Q{TbxcV*MU;fMlaZL#1AkQ1!qdpoDilAsAZ zCNZQ~m|7ED*Ys>`=9>BH1{4e5|;f`yoOAM_TJ2md%0~dzcDJhFQTH3Nmq6J1)|m}`en~=J^46<=IA@*e&OZd1@a{EPqb%iJkm8STgpfFAG&lqW2GHapH=rEoXZPDRAw4yCJCV0~{!;rm-G&5uuea04tb z<-Zwx>^-g2=S)#xQYt4Ms#cDEH{IMukfi-0(%A28VO8!>E_tmv`O?5!j+@p9@V=>vTf_W{(%hh>9)RoJh zZv7N_(P&d}0pIHUw{5rau67&RYP2)*@Ce(*Lg?xl`PH+2IYMwUxIpByhjdnamg^1w z;4xO#%~D*MS*7(kQMM!IKSP~S>KwjFNkSup~Em?=ywq+UNW4CQet{VSguWE@{R6WTJd1IGTYY z<{e>1DK+58Y4=K)_w6G7;8U70Ma2B?&-4BsVrGQEJ7mlUcZjQBD^hOk*k9*jf6%?U zSzrd4fPA_IEBRC0##Kxh7Na6k4#oSzcK?AG$}rEL#&Hh;NBbk|KR~@9Sz9df*nQ*Z z6zFZ`rzHPfD7jTWm@+HYkQ4By)A2L?x-aI=@*BRmiv&#!CG@d{n9eie{aO6Tz4jOR zll&rkbCU`wQzbA-3nddp2)7kCn=`4hnW=ujKa5|wHl@5PFvR-muj;TSTPRgt6fp((*E8?fT z5kJ#B*uV@Q92X1gAud6Hbn%?4H2-xOCOb9~`bxYeZq zr}%`^8vKJKt1}rY-uK~mI`|pHZ>`=!4b&ih8$Z^M+jmb@Z~Jj;{WK4L7*X{i3|yy_ zq(5aOd~;;fbvHS(9O{xJuwPp>rf%doh-+jOWTEEcesbg_*TGhnAJG{7S#Btn4~0mV zAy2BiHtNUmlAXNk*XH3b`{#u99mWRT5QtNRbJF=rr-4Gn$GX_=rWZ9S24-Efw=s+h zHC)O4!q?0tYbj}~yp`;s`9ei6fgnk4=S79-W_z^LYpK$a%iXsrRNSLrk%yA9KPDl7 z!dqp!?l!V0CX_tx?!H#rCIoBzxJ??dJg8az^k?cO48lQ-alX^tl4fPbc0 z?#-qN>JOniywAjmzy_s7{E)*#PHzfB>cq&-^$;Lvz;~$}w|VF?Z@uoV+P$e9-zM=! z*-HJaZ@Gp!9xz|rS)Bl&wjNsQ{4RuYTui0$r zN9GLzBzx?`hiX@De#H1muRyC}GorFhDtk9&-)qkm-cJ~1RYZ|`=hkf&VWellmHO+w zTQ9jOsyBWArDU>;3J>va-Ls_J242-v1x>kRtFCREOWyZmAgB=p{r1vkHhjT(wM~U- z-ii*Hy4>6u?Q9rf_bhZdCNpvns-ylHRKKMDc=qZ`bEgPA2U_9S=)LHHH9~wC&j&>^ z)LS%nobvlSi2t|2T_CtbfUVy1Oks!_GZzL#ltlbaX6CX5y{dfout>v4GgHT8&K&Dc zJKR6*qlD-#uWh}0T%hrq7V=RGs^};Gl z&a2_R;nrRJg8i;2FI@I%P-jZ3PhP`r(_YwX?m|is%bXqOI_YXbnrZ7H3rDdgKF23u z4!=$;!QZ^(C36dJ;(LE{=PTtd%8E?gb`Nz7{}zhajj`R=?xLay{!HHG95;?S5}Es! z(?lwB`Z!MDt%(Vkvzms}U-x}JOLdFyVj$=+2v%sC(tKP$5d!Y5n8}mZ_Gg}|cp{hs zCs2!MO-ieBWyc~cTv16k{cM9}#v;-DQqq#x9fxoT)b#V9uSw|hv$cG10v-9ubY~ov zHsNmKBTZK(xOUMM&s>SoU~Ez%vMZGx&vk+;s}d95L79u`;X=;Sr$>OjIE~G zsa%>ky_{H>-{~XVz%|j}Cqhxd`J?GJcf%x<1jndHnX|^NJ=k^`o2i!AE0r?9R3L)) z8erBUp?IKSA`0<%&CPpz*{90>GIqD9geU}$7F%KdnQnwunB3jzj;CM20PJ#W;QGB5 zhTzutce)8ffQ9%Li$Z{#T_d^K>BX0RhLKtho*PrSnnNre!E*I*KJxzUBr|LJ_(A4U zs{3WEUA(DBJmv-;FAX2N>znm4e?{(Z2TPC3F3W~1b52|gR0|rxNsRV8b9>Wva#E@; z@Bi9Bwtc5IfGr17XK)8X+OSgA$5|w?BI<`wqFB$Br)vJ;HP2_CEH6K7A>WwleXq27 zwzpV2N!w1@Mf)L5XH#o)i!PONPEE6UlV4_*)=9jXr~h*pEP48GzKy=5`(`x$AfDxB zb#|Td=N`FQW5>o6X+N85JpMeS{PLB5u6h=_x|*Er08DS`D%ob@dtNhxZ6cGlkL%9DOB`V0sk zBv|Ot$I!+qbA5EJrLL&9)aLT=Rdbh%w&6JnnYg%&x3ryA+YV)JyexZocj1>c07xOq$>%0Nibq5_u2o&1bN;+ilzsT)gRUAq?SezDm;|eHj`SXfx@5 zw+l<6hjF6Zg|`z0dn%{22^W_KimbHTT>OK88q<}Bl7y@fkj$PO(QUi*i-O7_!A`!` z?#0$_zdM#bKsz&Adbv8CjN~9Er2v;I!n;E!2jEU1K@$IcwpRm?Ffri%xczRv6CX%y zqKtmHGQe0{U6aj|zd1->NsYO`H5lGk^UNJ`wJ=L$;h*1A`-b_g8>EN*xMJGsbW?7;a&Og6n*POXcoshX?DwS;*UzNLeIj>S7ff6QB48%3!+j-50Y>9-=ScYZi#+`9m?#xxU*58Ly7@XeB*brPo0Z3EfT|}DtF&8_j zI~l}a8eer$d%|=hF_9aySA)b@iAIt&z4OnNO~{v!?hMDzKnG~i7 z+7dhH)t}f8H6CrU3vR&X{^bcI7du94Oz;!?>$RM%%}*>dTLi*sS2%|THAUr>HjeQ) zjt^X0wX`MH!k%GtZNKMY){!`wbEngu8k=B^ff`HQ^*9awn>E;%KggWoevVd6L@H-V zC~n&0IDM2$BD%PhE+)cbS4qPm{bw!lt=w%*Ftb?0M-t%yEO#>riSA~1Mgyw;+)!Bk zTK=Ru-hd98?X;$+>&Ndhx@ugbvs>dw(GNC{&ykeM++&}#mHY)2CGCp*+2gcrm0<5? z$X4zgG8i+UU2CYG_(<{nAF0d~jO64)arQ7jIr;d$q&M|-i$p?XFCvjV3!9ivWqj)K zmY%LDG5NbaQ7>(A1~T98;jp&=7vFdwsRmUE!cT~=WKZr%f4?UhX`ILv7Ayq6#2!yB za)LL3IhMJ8d|LS#RNG7*;>op9^NQ`(}0K6)E<2BZHA?B^&>uE zOMF7N{QKB>t8|L4pN!;^No2ufAnq8vvyv?9;kJtB|BY_y4i&e53f+wlB3s1Ht8Ee% z=$!bNgLq-dkB+q=0c~6prr@cbC9bhd=nQ@a9Q|t~)F;Vt!(`mkmy5N17Dp@NN*c;p zzX}!2w@bkAx+)^M3N;|vD(%y^i#~Bfm2m(Y^UJlM#JR_T9;ciWR=-6B>Re1J{IfVJ z&#oj-D|ryO+IgABYLZs-JBcK>M>)NAU`~9gq>-vPWpnfsogN1v#O~q`ky5@te%6VN zRC-dKe_qs|HX27vT3b#V7f2*6F~(YcBTjbF&ZCoEY@%@RQ~o62{j-wpki`_uJ&geb z#{w-g&ea19OFOjO!R0FJsw-(YR1;3sg?V#_R53%(a5GftxnU$|hFbG9)L%erfNJO0 z&UkK~s)(DXJv_P2*-XXh5i_-eM9oxvWE{c4W2#bD)FRYn*YkB^kugvrb2d|zu`b26 z!siqzqiaxLrfcWha*6E8lM>vl#|_I_HQy~O$3fqotWpW>0nk$}nZmsj^Vm$~$V z`#&#z5ny4tgHZ%^et#l2D*^m*dXUVFo`^wwr13l4Y7cHA1@ndL$Nxz<@Y-%3FVA!q zc1Kg*&Uoe`>$zyWY@5-Oyl-7SuKTnoGol375R!KlnQmmx`e^2Y!w2{S(ynp&M-UGT z$nO&V+lg)Yv$Lg#oShwCdv?w7&!uoyn4GX9C98{q@vkYhshZ>Wx-n@WZp~KcAQvH4 zqPn(}X^pmav_uGcpUb=US2f?ASnj32B^Hn^otT)sFgkB;f@4i~^kRZC^?2z7pU`}B zR*XjzlZhyluH~4Kz?VyQbOOw8j>a<$o6Cdam6{zr#YHc19A=%Zof_~cXYjZzF(#kM ztZG~{FEtRsQ9B{rQ$*r85^sK*Q->*Vx&Y@O{Nz+lB;wMgfY`~Ggf2sPEngEU@hM)| z)cAbh?E1n8kWawu6amr#IwF2qHbnfgk%DZc2ClyD=@-3l_4N_i45T~Xcl8ya3sPmp zeteW3#xwWqF`>)P9q3F9Q@@&uO7h1kDsD3ZZ=@6x2`-slw3_YO=@fOckvG{6tDg4> zM#RybV8phePHYgDVB}jDQkiiL1S97`j0i^N&}_Qz^lNTP_np!3<8_D%V;b-=VRUh?3opU8P=nYr2M|zAK30UnXrO!lFl7IS*sroZ0>E6 zz16P{?7_O!asp}ZX=~btw-q03i)~ty=B`(_!di3Z`8$QhxK|H9uZL;7EWVvBgS(X7 z9kqm`+|%C{B5^#I!KHWoReU)_;y^y2l~U z<|23&2_YbOO#{|lzuG|S*GQo^Lpr4N4wr76H+-B$G56I3UY44*49P57z9Dj#iI2Po z=#uHNb3?fQbAiEKi9)xUDz!ibRK_mwQeH87WK(~ek&_dIruPwT=0+um9TKyJXfq0- zfs-}3QOX~lVkJxX=V7-wZ7`-x&FfrWrVwX1?%*o$FLLL~#N-Rg=Z;$NWNPxrd5@(s z7gVK)|IIq`y^;EJmR7=q{zSy*YW6k!l=F1{(?$2Clx>v$oL$b}#nbGsF4*>Z&Ho1Y zxCi;dS=lLHK*`=qSnDtBn)|S~Oaq&mJZf%NaF%+A4j2>Ji9FV2Hhfk;-uiVq&@eWR z7;R!OFK4Wl171Tzp<=>qsE0B$R?B9UDY&+zftwGCvrry>NR{nzBiy($n2Z4}TXT&W zwHjg>{5t>j&X=RkzO_6!j64ifygXAo79QX7fP}vj3oRWu>gi@1Ul}j!n;rN5ZL|J# z&Gx?A8T^qVv9^PQCw4=svyfph=hw=LU-lF_1H^O&h*221_{p`-8zzqfM}VDJ9<0or ze##Ec8#o*3XdE9N0UB54c5Qm5kiR13@62<-7jI9Ke!-EW|AZhM(i3$EDz^^RaK5c? zoj+Z>u_;Czm~OH}ho_B8mTNz%=AM|M=KiSW@DFgw^1&t-(WG~vwYKT!w04gXxHfNi zy;8lp@ZEq*Fiye$Ne08OHf`xet+2rBK!X*|hTnpPmV!UkA(-yL@D-@z%)>mMm7LFD zCfgyRdrmaL;$6znxJJ0Wn#_)$-GOz1-6sg1#AuY$B1XjdPZWJ?r@~-^3`$uWOsT$! z!(%xIO8HRrXW*LEj*|CUBOg;E*^1{T;F0a-KR?6sDI-3`bI((pyMAM!+|M-Dl9?;L zg#Df=8RV!|@o#>H|1NOx9dMD4;f=^rSCEPq?|d}>J(9F$IHvBT2O6wG#TDc+dPUbB zi*9Vhb%Ut(D@sQ7_|!F{`K3Cto=%#16n`mq@m!&1NA7O-8MsWI@|!DU?X^44m8AP= znC41oqgYrmj5_2jysN*+l@w7;S5TArvxuh`$BBoY8D*D^hR;1Po>@Eze{VfMomO(u z{eycy`QLt@eh@UVt)6a_o%@p4@)s@i?S1Mg{+Q3q9=?to^tWSVyykvy*#+vMR}Ir8(-tKHT7FQtacy7Bzaro-ozkMnSYJT zb=UD20Kf2uX(jh+Yp*W;d(93=fm?06*fBPaz0ajTo4cj^nS#B@BiQXaut5+#@_fdg zJ?=kMs5t&7=uR_dT#9Lf2})QeZI11E4n)tHI@m*cwcw;w=6kaQz!w4FVgPXSCiE-4 zBX^j<7;q4)(^BIRkW1WuHa8kbf|KFP{R_=XKxfR&&0ykQAk)870k6qA@`^!s!;b~s zvLn0ONhXpH_0WkYShtlw89ku>>ZK z?K)^~HN@R`BuLc#tJxcY@&@w99BRXL5>2=BvQ?;f=T?JA&?7j(XA_t2UjU+oK#v&b zi;eYzASG)4wBYlJ%zrE=vwZXkYbO9v5!N93+;d+rtXT~*&vICM1861XdGt@>RQ*_M zr7A`|6!~?7Srk=;irEI0UCcwD+b-ZT>$j`f%#V8Q?Nm1DpW&>nsR@}heiXk5Sm$sX z`f@oIy6CrF)r_^lQt~FVBOdHKs3djq==M~kGgf#ml{teO65ON>SV6iH@R`KjjEne-LMHa!h=hwS>#JMHQ<~i2n3(smyHM%0Eljek&=4HyB-G=%_F2!8bs;Tszg5 zZB3PJH&8-Xlz1n-x!%7{lZU&AKj`2$jEIo(uhZnI&)o1g{rK0}kJom?F1@y1=YD>y z8Py*k(!XxCdz&Pv{p&QVQvPMNDgUZCd8S+HnbX;5txWl6&g8d=-&uUpbl~w)l2-FO zC*eH1@6|fEk*(<9rol;MzES=G0~B1wY5|G|M$rvbaGsI} z$F|<@!e?7KAA<>e$vySi=WM2Ehs=({-%+UekN+>UWPz=(ENPG{&!$3!UzFN2a3g*m zsj?7xW8vtM(Eokx!q^3|&|hPmSqby&V9k*L)LDSTFxi5xq=&Xejk;eAmEN1e-_|f) z7)Gh}V-3DnzErpsXNCRmqSm|mcxQPmR3vVhW(K5KO3^PA%YFR7iKx>AntH^HD#|eM zBa6h=RY&u;yX6!7euqAidQ!g(Gl~E*MKkYK8O>^h_jB?nr8M_EK(CY)S8)(Gkz5B?2nut%gH;&D%*H4HZ$|&cqZ$z(*^QL1X#Wk+ zN7+3a$^6Qi-lmP~$PK@Eu-<B?SM}d_r2iHI@C|FrYm&+GXkOy?d6?OZK~s49Qh#7AO#Ugu+HJQCXWu26BPLloF# z;Xv8;PCK9kmzWJ_{qIN{nm!tu9zxoKb1VPx51?-@4vH{Zj)%~KpO2mEj2@>#>PC-N1P*^!Yc4wst~LyQrr%x< zx;n#k5cxWj?Rk)~e;NA~Kx6=78UzA21`m~quMAADQ^ug##?McOrq}++)@%M8i-D2u zQRE#;y2LtW{uucNck$G;PMk3kJP){z8%Bc1?fFmR~-T5jP)d%K6(tkX-R&|8lfZWxpeVZh;ts%zxlR_f#)p>4ymS?Xm zBJtvR6fw=XJVh9ipJkPLAClY2_Fl}kG8+5G?6LHB2xjL}=j`-`r z6!LQ*ii&;?h&9QaZ7f+ydZ5mKF#XrX@kjrfz*{QJ)3>`zg)NDK5h;g{jlmf5GXC3v za^fTHhrwX{Erl)V0(L#`u!^w1ycq9KiHoPSCnMd3od!xT)C|$i!1fvh*7>h8D)oLY zhUeEr=ie*gt3Be7aLt{s9K^B*qm;?({`pz(CqC`Bjv%7p>F$CE3h_suXRWHePaH7r zO??6q{mUMMm7TX3NOac+CU6?T6WC^ia_ zF4eFz;0})ZUzCfwa^gS1PFX+Zu(yN=>oI#;=$ zWks6`uX$1b9KD+1W!GxUOJuv07_2Zvmj^L!njXNDErkAC3I9zF1TDB?IbB>8M;!o? z%6@G;e=d{dB&6r~Da4iP=Qkp_oo-gVR`0(S`k}*n9LM|6e)3O=^!>7*e2Q$GY{mM} zNNRF3an%T9pYmT$`G1jr0ln9B8g;iwSeKgcZnEYTZ|PE~uFfwQt@Sxtdlg!HHY_8j ztNG*Vd||2HVJRsG+__4(&oaj{G`oiSL+VWY?Vyt2bj&hz{nfj+4DjGKGfMJPNxjH$@WJ`I;8Gh14Si$nA04up<0_ z;(Z__%Px|#`^rNSg)X;RAi!?y3FcBAlHgW2KyvcBh5VRxk{)ueFdKCxwKEqT!Y3I9 zsWGI;?tFeEcTL9}1rS(gjp1sc*zotql-IR>Ys@&mZp=p|d+dCry0*1p%uyo7*(4qj z_rEr#k^?c!u5L_~oqFoVR6CE10tLaQW@+##m=RmaE3N0pv64}y2^lSR1Ea@_)p89V z=-r8}zDc+MCqs^Y@tPj*+PCx}v^+se_^@RhB6fZ-xAnLkoMa_+_F9x7*a#AlDXVfe zUE-05MDPqDvdgS8UW?*#?&qnn7L?2)na9p#O=aUJlKw()HmBU5IhGOpa?Y(r;Z8Xi z&INjUvNk@szNwK6i-^apjhgB4-J#L$oRy-v3}rFnaZ~sGF6wN+^v&Pwf30h*p{sE@ z_3zzz5NoOJ!h>HS@8w+7|GJV_Wahe!N$`)Ac!|j_TA8ae?p(iGL7fqabEgaSC|Vl- z{HPunmh+?K7`a8qIe)BciVw8ZPMa-7ZJwk?B9Fr4YRROl8xej%`w1Bnc?PO~BajZ+HuVX4r4nBEcURx=h(s5^;*jO4X2~BV$|#b^ zNSyDKSr4jD1ToRoRe%aY;|*ZIz+g-bCcB;A*OJo-CN1;4Q_;f}LYf!E^2zW(*^DDR}@}k8^k= zQI8A5)c&pMyo2%D2#5Pj!&ULDIh@RoVGvtwSpKzNRZ6T|%7x+)*g_8_2-zixQ0`vw zr_622zyyseUuM;G{RoTtN7(N_He$%L2w~Yp=95CH?lwp8NeP#-b_phTvDhHT^4NW% zKCNm`=ga#)o*sS-#lcA*7Pl~})jjUd#C?f%P32rL;PzTQZm8mKzGf)C#qyZP(OodW zDEC`V#tZEqv91zsj3J~uYMq_o!vkpgw8Ye>CbH*`$1K4Nlf85YbsO&;ZrbAf7sCB` zvgS77&%5?Nlp)kMN4oNdg{Te@?KLmvyW)fBf?|l`&=Z0aMD?TitE_Y2*2W-Xwp_5= z_o5hsh?}S{Ir%n?JO>M}I-gQCiRtXQ{UvwV;CK%qvrJ!&BhOv&%w)Nk z%y3hmNB9}q2iw{O-^0ScBp6N><9beZvq9Uy;4Rj*V#bIJDtL*sROHXa$;6IPso+6A zg_92U$#`h5YG3ZKLbwrkO%HO-q18NLnVVg!h}KGi@7lA~Mgy1eX1)6BwJ08(rY3_S zo7ht3qBZfFXXj6qM(49)O#q8ETE8B3Z|+A&?End;u03L45T@SFAl$^T6e@0{&QPa{ zA635^XU0sPg&dj)y7GQzK8x)8Vde>!{9b1MS(p4?X8v(YhM9ZKP4tb9v<6r3z$!Hq zGdm13m$4T|Tq-h`xACd=E4ktNmKe_iMS>U^onDqzGU0Ct6mfdsGw4*>;iSbQdlLTM z;x8$Gi?y|n?QA0QS_;2WjP1}IPXxVu^|!cD*1p_|JV@d|tCn&nDJW=PH~-jIs z%2)e?Um&wEb=FI{k0Kyp#m}FX=l1QNG;xl#B6q6D$MO~VLoB%v3jcqmWUjGNkK?Sm zVqyu>$2y^VPQf)|fuHeBb(B9GZ$)K!}iwQwqoan5vOiXD%etq`97wzEJAoc;@V=%mN!e zhZYR`!6EWUY0kF2jQ5uVlG(#+å$%J=CXKKRM1c7ak94&Yjd$ZcJGNqk~nq6QE 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≠i?wpI0^!``8Skp*NOS`e_19t%m?;efkmLe%#NIaa$<@DPcIkKha|@|Q?>Q6`pBFTPi;yBgWwxVkPB zFRyZURJoheg_U^B234b zGXjg6ztt-II}%=*l~<1yM{O@#%^SZVGvlqmJ%C zI+Dr=XxB|of0+2mr-8;Ha>|Rb>L1>-W_U{SC0(?t#;yqH1urXCt!y~l$U9EMNQH0qn!r14q%#4`g-Buw>);znh z^EO#Q#>}w{dIbfNq?Cl{MtW6Ce~g|ySZItkx-o$pD6JGoF$KI=bcgn#(EBKh=AOe_ zoYGf0G2)Wo=P4w;x;-XL_d@Snw+hL0vC5q`CcnYVyLd0tJHe~ItL+Cn&8JW386^u~ zS0tB+&QaP+tadNUqD&@xg$fAsL-qY}96IjDk@8esePH28JVNATCNA^2D^p|Lm9ecy z2Nqu7i)|h@WW&r8ImR-#WpkILw`FUWZtGGU{eD?q%hsOV-a=6c57@y`Hzs%p)!N;!a6a9Y>L$men*tZ5Jun4H zMh0^|b!aOCFW-@FOwa04owzZb3R9S5^noGGcc_rbxNoETn(sK88{hEjqHkiGyJkn0 z3Uc*8Y~#_X0AIe1Z3<*Z*0QlnZ0oRYE6sg{pOaBm|LgF84b{HAN+Cp*@PmitZ|Gal z2~@2L4|v@(A$@OZ5gp2c*mc}&7Cih3$>BMi;N{5*%WMm3AM;36KLe|)L^e*frSecNp zgMja#=-5LKv8wjBr&c)eyC#4CtQJ;Fw@&Ny~u-&e`|A*<(c3o$?roFn?Loj_(;oh$e={ymg zB=YAJv%wUu2{caZ)Of&dhtfWv(&s{{$&tWtzTmg%_2KV0P+-|_G-YdM!qmqj@tJmo z6^Z=T0`a>f#~JXU@Nj*8aHcc(mkua*B2N9og0?u3E^7lXj zj>e&3q};H9A`+-dCNC9_r$>UT%5EfEI1tP)4)pP*P7N=XtUaFpg^EQTachWOBiO5s za2jmxx}J=RSjQsOOWW%id=x+hogX;6cYU7)zUaPQ_1)%=_MJUS=lF2SK?id*OnKS4 zshlY9>zr8{DgSrpZsOztc4u*{IwyM+hU43*!o-1w1vDUwft2BN z%>=FDZBCj5l-d_GZ&-tde}JPu*i9#TtGjZMZiLI1y<$HD!@tS2q)z+4OzKzmWCe>I zq**U9V;^EUl`a<^0P((EzZlQWi(mE4sXct6Sp?Q9VS_T!y^@~-8ogQDtONp%Kts3W zK3R!W(m&x73GyM7uzsN}a0s@4G4u!$w)CHr9^YsKkuJF};o;o^u z2lf0L-k^~}IJczmXZ;1xwDlMK_CM=0{sLH%r|F7%U)c*BV9T>Ssl4XU zPI`Zzhch~uMl5rtLmFSASE53yzXPF23A@nBXk={Kj3HAatNPEVZCCx9elJ#G&6&4* zine>=7rDuwypHbYE|qJq{GC9fs;Mhp=j{ekf&xm`H9n3S$yXk<=nwX=-WBHZ*^E1Z_QoA7X0M4R@H_G3o;Fp#1Hfh6d9-NOKCv&IDtF=p3e;_; zZR&73*{Ws6Py4Dk0n~2qu@7WX8_eiu?y?8&>ZDAF3hi|1&MP;8k0M}>%hA? z_A#~!r_BT3ee4%JCJPj_{9bPK%7Z=Rv$UOwv&*!AFYYzh5 z;Ws&BJY2@9X=zIK#Pf9UQatA*-;_V6eRWi+8|rF(ho`P&6AU7UJqzW#X6m}5>jP3_ zW`xKmS7mTj`0xff)~}G66FWY~Yy@Pe(=+tMTs?7m>M-SVQalc!Y1FMSpSsp)Qc-UR; zG4cT|98$vL*0}oUmvoNE8E|eQ|3t~0HL4JLEJL|PLje_s+1HQor@F5g!R|Yf0nYcc zDXR;=VE9dWZAz`R>(2L%|A@rr1S5lo>D+=1rl5y*iH`7xuYC(!U*7id{>+gC`F^`i zlp=ZZrFT##K)0#()VufPrgQ8T0jlvP3Ywt|x#rj{(CM5Iv{tkknf&H4nh?nf`Rc;b ztT;nwPaPXj##^6&dGlZ!=koj5E+ST`CLjq%6a32@v3Q4Ujbo+N*TVZ#f77?ge3RYV zNk!6QD465X=3ta|o^|Ru&sYDBcO^c9HPgvm8_ZwsvsOs`^LijCuh=uT9-)ZJ1DNA- znxg4XWpy3f7RsT(J%#T5fnT=xTPUH3<;`y12}A`-(;TW)cP4Aby^7GA710A!+;-Bd zC=r}GWMpIWore!k^jwZm-UwSqVxcbF?_h>#mCDupho4pR;b* zKXNOg>D;=5-LLn&9o_89dAov&->{c-s;J_*fp`mu=&S~l*m1bGV*V`DtX0FCZvRO- zoPN_?ms)IvoJn0_)lw)^nBf(~8b+NPzgeq0P{Sq3515NrgL&5v9R-&DWIwvXkwq|7 z(yFf}R1dWj-=|RGTwFf$@_5xD4J@d-e{^TM+>^Ty|)(Q{#l|9r&O3#%i zZ~&EMbI2n*1?ptt{ci*fh^ENob=P@wNEeRX$r)0p7KfktZ{~%Xm)X#lD7@~MnIo#Q zOh0+sa~`}s_iYw9>iR_6^)f-Dz3VS`pyInHRJ$Cc8FnnQvVh%mT0*aVshyzi?dgOHb{P4~vYfTyS11D<@y}$FxTFVzQXnVfjYmxX( z>`F4hOu~tXBi54;Amj!^Xr z`?gtp-J<)yybn&~`xrGyXA$=j1A7r`$FqL%zGU8inHR6^ASZFqbEMT4;>+S&l)WR@ zG|tJ|_CRU;gTTccMMsYB9m*8!f(F9n@6LP&Vc>q)zUr2htCo(=*rSvzM~5oy6sHZx zMMv`Hkn;K=);r_aPsQEJ`GKb1sgnTikasMtnopWOL%A&&X@BD9cwgn2kwy*MIRZsK zaUcDSVrurSf@0egJbc^laGaM1K+tpz03;y1SGAb)MpIQ(t`#|MR+zVYYHJGz3-$y? zu*A22&SIV$VIvQZTQMjWV8%RzqoPwp@GuY9+UHPmFWxU7X9`@K1$Ox5EU+a;h1qQc z(ZS6%ciSQ$86hRYlR%!4DpLq`&St|{VN88e0UYI6=2dv{>ZeZq)i1^@iicl$eAab; zc|9@c6vR2C^#ZM;fvUAU-*3LZDN@`!LK4R#dPSa>fl-^jm^EmbUsKvNzPMM|$0@|a zThvJD2l0x0EHP#v@JyFuzpVD0%WzKh%TypyMhNYkxRO8_F)31?SrK?muHvW(|8(TQ~kKE(na_^uD)I|JPA>0jT4AW5nr5v!mg#$dC zy`NzN4!z~X@S=0S_+b2Rj=1)x5uZxK1a3K0$7!hDR?yF^zv7r)X}Rb1|_s?D9m7r5Y#+Wen_d(pL+1hsdAcphd#>toga&;h=*(B-mVb3IT9@NfYV~PS@{%fOQ9USQNd%_;;%njuL@QHwVQ6+*-*i5 zXwCe3mL%^(Hqk^in*u`IMPF-?;HzZT)872)r)Uc3Ut{S=N$Wx_NvZrHJ?q#dwZRPH z1{VSi&v0jmKhXGRKGjldU&&z!(>WnbCq5S-6L0nI+;wXX5L%s_Yl0&pg@1 zb_>bLwZ2K3$M%_JJfn$Lz1q!71Ckhckv}pR;Jj)pfUC zan;pz3iR0>HzPpdHNRlfZy67DzSl`m#umy5b3e0eO+q8OYuZ=A*xU znvVSBCySJz=ln$07&?1=OcAG;J1t9k;rEJ^?si&Qf=+2mxMfAi@vR9HW@uT`$0=RH z^+KnmITR`V;{T8K^ldv=_)qvd+WhCfo0$0NEAz7<;3%k;{uvz zRKMZAoJWX=xNK>ZdgJxS)NleOXPBU`t~7mbq(Nh|Lm=2+rz^<^$m@mDTIJo`Be&r8 z1>4feuQu%gJG*i?k-xqm$r^iS;hoR<<&gy2i75?Xt>kcG&Ojrs7TZ`L1+@p3Kqwra zQEol2}X9O}IRMSFuM?I)&>+x|IdZACwtJa2JZ_O#^J_dy|ZVz0t0 zSM72F&m3A$jAB&>fofknD-wS+%INJLlD%QhNxAt@nLK4AtukxB3F`|rcT%6o&FiV& zci8v6_%oifg}7d9;!C=43YP^oC;p;kZSnsT7qStmSIseF(F_wWD#g@Xz-58$c0RdQ zp=Z`Ajp`mTu|=1u${3)+ktnm%rKQsB*MrJj=5={TFeDfKEom{Gt| zEJVCRZGO()Hfw4zH}fR!BquRDWPa~`8EAf`FR`T+dRx-vN4tElL8FY{SQYy=U3W@+ zc7^%f-?zbXAu)=bYF5->=Z&*Lj6LQTCvQz-0Nh3sB4yCvLEN1CVwB0|y!zY0b(C+N zF@d!8$<>KF(O-_cyfXOqhj90(btJbPxsDl@q{t=4+4=^Tk zIe%E-NA!KN{XToDxk6v!BL-UfAV52NpgHU0ZOEV(SE-%c#C-oi--TEIh2A!8ZKF31 zTBN2i+6<lBHSRD%5rv4RJyf$%Dy8oL~06@#;0*K8>CZZ{5CsI`V55t;t7{50N%`GzsfBPW5)0bo!WTRo!4x4C3^6A85Qu>6L)RKE~5#J?U;<4rq zS4DGKnbU`HAl15SEz`%%`4o6{bYRZiW}^`9m$DTUU|``_qH*9$F+V>EAh|2u_x3C; z(1{~ZO#Gq{8Hh!^e-H0R;SHMcOncAL?zTY*4F=Mnq+^4h&;T7unO)>jTtwl^8~vaR zl(N{q@o4nT{{-e~T2{%mbq!rp9lxG+bVBZ{vCY1{AI3HpByQ`zrzJN~^|kwT?A5-N z?yAbz#?YRYV4!MURktOLAJ#SFqgIwr7f7A@z!BVv<+*{zC_P79(gKq7Uk`eH5iaji zf4vh2NBU?pb({>txMcKX{NQ3LmqT?cDoRwruA=F>;;s?*J#!tsgx$|8=JT8BB!|)_ zwuL5XGh&inu+`j26VEMp5gr*DS?DFZwzoWtmeN4Q%*{A8=ks2Da_9`uZ$oVowo!QE zuh=k9EPeDXC~#Zz9ruhfEW0v1sZre#P8JTH2Qm^syQDC4ehlm|;ytPAft=|IM*d07 zfiI^m+pqyUTw_av=^7GBSMEyTTG?B=$7($~pn^#}r}jy{W;~Z79|(r0I7~{x>{iGK z9J569d6tMg$>gfBj@c~VU)Os~e8>U3=f+Q0sqLPdFC*$96*IC7&?RQz+V(Utea_Md z60`jtJUi%0Et?$VK1YZ%Lo*1p!V7M-W9^)f0Ror)>MXvp2Lv2gHW24kqTtwjV8TlB z_>p6K0< zMb5J`t)v%qCeF~=F|X8qls?0!Wt2O) zjAM&*G6ed>E1J9h4~x}!RSl%@n~^kFl5T818LrLrv3g^~YuyJh4@|H5PB!wy#15%9%4{Z7nv_AJh)+rUt?WC?5# zSn)>QWd7!TmtASb*x>SuQGFk)@84h69`vEb$LUIKP3dJg;pBQ{RY@DU_3yY1f6VPV zqd*Y2D5Ru{VHpaOnk-4zb|BQ@_CTn_87=1~hU_DsF)v+stZGfi&ksd>Ux(Q};*lOk zYHjG^WXd6dXD=}^b;R%@zcFc zjR+@hWa>N3sd~G+Jo+^QkI^fR3Y8DJi^~}Lceiq>a{he{`fxw4jDF_Z)8eZiM|3e% z86R6>1A7Vu`Y7>RIe%P!!)j`*;H9jL-xuW>l(}H$asR3+H&x$~x-h-E(zQ1;H@Hln zfrcA^X!2Ho%zN(@!3Gw7nUPM9Pp|_stLfR3PR}1}CugUX9LSSsXb$qdMxNx43%D5{ zXGJ;D1gHN>sJ(nj;D+WYfyvFg1Jj#xrsz*35#C4`J}`6j$kMmJ4BXh4HaC7aB~bUl zl&ZkGkEV>o>M5xVEdJ8*9dP=igYOErY$O`=T4cb|$lzn^POePMNLTe=U+I3CdYi}A zqO$Hr_%=Sw)FZxiT9Pn2tJew}dZ%SeLAa&0Ae^Y!<@8^}8}m``XRhYa79MT= za=3TJ{#t{e>oz6uQaZLbkjkI(3Ub}|=G<4s$^whu_O1IzbV@88xTQ-tJ-X~4>ETU% zeNE$i!Ekz91$@uY_b4>zIhiE5-b{?I_CiQI1pv=<$Hj|C4*2NFcAqb{#AMYWC6lzz z=&2%aT5K@Gw6P7BVvXENUY*hbd0L`fOtLmTVOKcNV$lS&6t-xK_+6^hTN!;tXydCt z1msm?@oJcoG_EBjpbI)vW__1ms0F+G1Fw)svXuy(8kD1h(pshjb~b+*m_x)QG3XWAnJaqQ!*|8oP(*P4NohGlbQ?P- zuMTD0CQq^6Hp?+jj1K0z)I5Ky7&-mGhlV)uae(n-xGku++j<_V4!VnQZVFp z2|3V4XKcod!z|D^f;KO3osw+oZ&qRn(U;ovPvw6)&tE^@iThNy+d@Wuv=OLnMAh+b zlByP)ESq3;prHwXvF|(-iBB%k$d*t|MBw>NZ^buTmG~E1=41?Hr2f!TZUv$n13;!_ zV~BHwad~aBLF_6CNOCE9y>qR%HUK+drOr4M1#cJBtX=ytSXF+1G;q+ifkFSIwQ24y z?=!t`oyD)a)Vs7p%6;t60~<{G|GMF->f_}aS%r$Lmn3fkjve445B}+)?e<~T?0k}H zimC@s3D#HG%^w5ui^D6sc!F)vdv`EOdj4YP7TmrzgCA{l038NOI2@T&m~gtQ^($Oi zl5j1ub^x0(Q6a?Z7V{)twmU*9zKR3uMBvA;ozp87uQ3xg3>j z`XPF=9vJB##BVGrm4QlScPW9yLiD?+^x=C+#@UWa=5~KJjDLYQzOt~(j)QkInJ|e# zkBXCk+Uf0Dae^?~=Pq%6lLi^D=Kp$}O*a1(gN;vn*jj6vq_cFhVx^AT1K0seIId0R zX!ipq3NEF4jg{L!vihTFW!8562z_hxjC_a%0%wF^0Wgn$eZ@2qW zfo&N=ux~bt3$VsdEp48ctAlGfwe8|pkhehSzzcKvENxB~{`n1IW#PhIgTw> zmS4BTn@(lmnLzz1mGeiFxI>+%UlP6~iy`9Prl?+Dgo5^{b_TS}_a&DyvDGr@OjSP* z@rX$Aa0RG*@jyv@VJ$2Ml*Ao0rw9W>vxi1|H~fEDrPdg$bW#`CP;47&AEu9olMc!; zo5(7%C0L0kp?zVxEi183HpXQARxoFCsq{4BNr^j)Y_vZR%nJm^kfGLRENWICTYJjt z_{r008Slzidy7vWX7%gmA7)}+29EtLHvWB+He;VAe!VRXW15Fk-5Rvtw`tDeG!$S$ zow>%-@KRzyc0a;{T>grRDh`0R7UY~@@*XKbnzZ8k9Ak?C`fQO>V<{q0!yRkLXgYK8^w`SJi z+r^2sXs1_3?;Mp|S4nY@QMr}zQ5DDn%6veOWl)#-`13vK%9W$a1e8kmh9Q;i#EMcK zirif$x?gjM2?eHQVdg^U{1V>IPUZ9e6_`Sxt*`R@4V6$ za4cOJZi_I6OV?x^Lhu5-GOjA&j({}~OLEUI$+Fbgl@&xxFLTYVKuZDJETEpc;+|{@ zvO!0)IM3s<|GHP7Elx`^1QiBG7oSb2aXcT8PD;bMc9LD%(LoLoE{ENWcpn!s+{K=$%{GyDuuFX{+K~Nb z3cgdihl)I~`*30i8}C+_d7eIi^_E??dahW@FK=g7Q>i=(NW&D}^U*AhmGSI;X&NzF z+!pr(N_H?m6S~BskRQn8JcX9BsK>fzw026|Z1dU7@Z0lk^LUA$AP9ltmK}NKob7ro zYQVjqv>ev>+gg#ROfE6>uy++ppJ*+$!IC#?qmg#iZ>AEneUt|!|!ge?-}3S&dKOpII>Fjn3E0{+YApL<-h5O zFb6;LA~Yl~yx_%p_lM4C@fW@vXqH0G{JZ4LnT;TA^QGRK^;n)=F>9`y46NYGL(^O9+{m4nM zi?Fdd9H=7H#4&)e{&IMt<`BP#ibQAjM>xMB3C5sL$T71H5eZYWL3V;o|CiraKzN;z zo}0*5?MVzj6LC*w|AHEka0AOGA*1%_OSJo~c39;kxsgNR^5u2saq2wef@}}RuVAuRb*zX%I!JzeqtmLQv}jW6v2O z3P-b_*GxC!D3?oTp1V>;m#OV5lVt@d0kLLa6jvLl19kY9OPm1&$n6!Ik*X3ygkdCg zns5@ZKKl9(z6u!DpxbK}(;q^|)->>J2Sv)oEF>gc1qyV!Yl1($*WTW zg|F@oOyK{CExQAK@{4x|f&~-r>p^sQ!fGdnU%ecDO$n5&-5t1e4Zqdo;wAjxnTyBx zd3Y5MjzK;5w1!T)!UR?7SF(3R2TsJM_+ep#=H24yQ1>ct370RI?%|SrFd_5Ar&h7j zX4rU{xery^p8c0b1n0dhiQwc-56=BoGxfX%rK@Z6WK!c~3^b@L9~*Up&-hSuDgz6~ zasKFX;6@<@E_jU^bqEMHYtTfyTUwhZrL2YBR_xW?mm6r1#?fw&fQ&LoHcw}S;59V; zT`h9!*=qUp351g-Uh{%@ez%zFi)xVKChA3EGpz#3rVL$*S74xpB_Oo{- zu#n0tD^2hq0F*#N=L?+^gSONI8@v=DV>WLAH_MbhM%ckSuGUHCS`WeFP+m1L%*yDT za8CV6WMn{FPEoufG+3^K3yHpg31Any@6~E znhWuXe{b!dxZ%I9ed^Kgt^Ln`S9g@cOnd6h4>AF4yo>=Ay)Eox^R2hMI-V|U{bATI^TbrA zNOkpMDi?`HIW9M(y}*=8t6Q{Q~z%bQ_5yxI)Z0R|x{+tC3w{kubBX z8)NPP8HeNs?q}x%4%oW?3CF(8ySa-dVh2V?SE{4U8@90c_#QY*tjxS-3)~%RjluMC zrIml0;&fACMI5rJ2+pslJHw~r`JB{|s#TP6Ch2AkM6iT0?lGmjTFHdH0}Jbl1Llmk z_TXCC2)sMxq%UGk^pEU;t}}q-9QKZ8f*;dvWMuum6-HSpw#wqqdh@^f6yT3X(oe@9 zHREXXsHub#^4U#hYn{b!4}ujO^Sy(%!lr`PnWn|2CFWnPnJ#TOzrNgw^#HX{X2GZ9 zttX4`@i9SMJ^64pl#kne{`CLD+MB>fRh|F;Nl0Ko=nP6UTCAf+OIH4%^uBya~N ziq+Pjf>aSPs36QB?!iekmtoXaZEcG!ZPn7&wpuM>MM+qafE$YoMMXfxI}A(E7J?%4 zdwsBi-3Kj_5}7n!EOmAG$oIaA4C8qm||l*GtY0g=Jd$U%4QN# zRl&lZYT*LG$rp5Hx?JwwAa4E2Od+vzVc-efXf6+vU)V4_T?PS0)Y|DQ;6vLENaU0$rF})S3oM zh|)|+V+lb2a7uI6Z@-3ZMr+De?sL~5Bj9^+Xp7&G>n!*=j`3nk#c{2vM&fl6mojJ3 zdn!}mytLJKnDA`kJUTO$t4im%J;eSp>p2K?X$&^Bufd)DswW%7y6F~B=&=)=vkiX2 zG^?PJ`;9jTHn$FZxP`|fr3_QnSTi*q=StwRYih#WrLCN%SYk_maRYg)ZxCdm{rMmC zAB!mCtlhgYHP&hD>+bjd?Dx7ou)I}Sc$#?Hk~z=hkj}%XK8O(jl7MP?RpKwX-5(p{ zx8E#&cTNiU$eM9%`DdIuV>~;n?RMu9Eeqp+Guhv}Xf3tC-ns9@1KE-iLCyd{py9cp^s3W zy%%et@o(oYOJYxSdmTS(rIEe7z}v8%$02YFnu%E7LOK|V4OxRdSlK7$d{M{Sa6$aM z{&1Fi$(4pRdRY*T8kN+4k{=?dtS&&>eObkX(Kzx;?@}vCqk({sOj2SYCHVOrKUUg% z>u&fEwwaM9_@vn$ec_#`BIkk;I@wfsdD2!^DBJ_{l*|EN|uhkUfl0 zm!eSiUz+%Sx}6oYEzdNTC>`r)q#Te;Wnr#%2eYp*upho9&{uR5L=`ih8`<=i21dvd0;GOlclW$-3XFW>1JgEaOxl~( z!}KMJ)S7sk^uwpX@h^(AO~^~AOJ%x%%7?Jkf|~*I_6MLpH?~Vik4GFT``pWnN<{L{ ztvC~fSVMnW<#o1sO%4~8Nz$UCF4=^`45$2THSx0N0CNEnVUy`6H4G|;&--J`JgX!A z+Q-Lz{*c}@G|fKBUN(nyP7Mq9#*)#n%3d4!s5*XKZr~L?Bs<4V5BA}E$H%7hNjFsA z!f2@JvzzCv;<66TobN@p1Y$Sk9`?Oo@;%ei(#SHg%q1Be;b3%x+$^R(tt(!@Th;V! zio!tZU3Tzoy;AF?D17;_Z)i*$kWF`MAFr{S-I3WXbGB&!8dH@-H|)`04Iczu)+U?vxQ3892n^Ddb z#*8UtWf9Scku9w0c#ywb?281e$EYZWp@y)fMAw4C-UB>22+&fZ8v>wqI~Dq_PAZtE zNi?zlu{%o8uA$&y)2|8^uOJX*i%E44bK&-*{59{x&A@tv_tBOL&l};HH>|E0?j>0| zAQ%95$t(8z%3K85PF#%@K&uNF;kP| z1&{{rsmqds)t1|o=~d+T%v#BUVb{rcsKB%(R-IH?cH8f+B+25Ih zm_l4y++FE({mUqwrc7`)^PNL>{cKTElrRcKkx-jP047paN)s@xvz|}0u^X}b!1%yq zRgi%rg2&c%9<)1EK86mETvvdgd6Nf|W4ka#h5lH^xUDv8h(+ij%|(f5#Mz6ii z1!5%%hbpn6yXpj+9Cu^b@xjWy9&N$Sx7pSGRHWSw#L~3#K_UBaVK1ZU*zK&-?6Bgj zD(mMidnAvLsO0E5`PGG^RjZz_K@BVHDj{ad4A7F zkgHY=9;DdntaUy~4Iy#PDQsRN>N~S>pFo|tlQR#ksjv49W$#gJ7Y6&41kJ7WMtA5Y zwK5c&k*lfdV`2{pMjwbU+uS#~E|yceYGDs-685sS+oM}^daqpw<+_Sfiov4$)>-k} zawqRwmaTjSZzglC=&IcGW6$1Yef5yy-l{j@rpRkn`KG-rx)r$W`_t&=oKSp7Gr3iK z=)F?+pecPElOzidEw8k`8*1ruSCjEm#H!VUpQQO+Dy2qgDfU$=0KHpgeSi}5F`D=G1m%18soD;=B z7ZW{z+Wf@z0+Ms3Nxm{M;md6q%R;U*>60WW3GOE@JSUuEB#$c-D}VT23KzKbyQN_7 zV|iZ&r1uO<_Nc8GxA)(8#8~Tz9bA)Ex?-$+gAi(SdaXkq#uP!TGX~lTYyC&TeeYJE zxG&WEOT&>FWb39m9{TWW2AStV5Hll(DRYKHOHx>U+7K3eP zl74!(W*K)q42f1;p7tM!QTnk+rt}rEN+>YeOa=^_bLYp&)GL4l2G!TvG8@n6*QYJX_6}#1FW%rKCD`BPr#~jzHB{ z?F)OsG|2Rj@kg5L+rmh1-H96qnD1j_eS9sD2uJ=~^rxl zh_s(@`j**1(Gl>3s0FX{MQ-N3AFN=iJJn+{K5LOXq!FwFo-HPNf6k0cy0m7@o#fbO z*bRbncvK=F38i-NK)=Ng3C@*{a1@%2>xBm%rKppY(3-IYZ*ZFyA1&?7A>&ItLX@NH z1;pOHpu+V6^1uTf(d7k{EA?rQPA8xxrDk`ox!mkdA`lIT+_Hnu9qx8g_$__T{d%8! ztIr`vG}_o7{a7Er_-co7VHgFw7ptf+yIdy=#72MvdO5XkptM2F$SDLp1NM(|1q{2K z0iY$0WNsZ{Op*9l3}MIwDo;@U?x6$EF`fT|QVqoO-g=bIyM7%W=kEY{7wn7;7)5)~ z{zR#_V$+JU|64_fV)>4lRaNoH5=RI-t;Bosa(03c!xnVxdVOjYdSfH5*xSfl>flQa z%lWRN?p>Diiz<6Z@@;ZPX9uJ2N+DgoiMAUs)5HTZ?t z=@9sNmvbGj(Ue!f#BW!1xa1mZF!`pu_ir@!qoATDx?Z4-GKYluuyqN&^v-GRxdZ5m+f8D zX1D#L=ibk}i#qD|pX|N=9<_Bt%5<{FU0IG|;*<4~JV;#8&Q0QDW=r>MqY`HmPxO^R zZpXa!Pifr7IC-W9CHC_j?NeeU06~t?mp}-L&tdUYEJiV(4SygI4^6O{Rm7zXlBOj)l&}yh(#X;waN4*9B7x zIiGj#5i!Ul=?JCTzDb4Nl8jF(F=&gx^yM)$xkyo+mn6GV*?FYuPE&cs3s`&{mmPZVnS zc3f9M&6mj`8^gp<-@lB2^Wz`V1tgmZpF#uSW4~{&fsfv6O#n=swO1o9b%pIFm z;QW`^BmCp0aPX_gYHh;LFBR<3^F`bY(MZX(TE7r@3&kEPkOY@!0D4ZdidEw#zbO=} z%L1?nMknJA>4w5(wG}m7Rw}%fz;FT-+K{!w1J@?ds5K?GV+3#=+2z_c0`H}(lcTHQ zpT?pv6uZ2~ZVs*|H*iqy!|>k2Oa_a;6KlPtXSKaLxNl?d#Lt4+%Yt&^9JR`Ik-OAa zoei0nah3=+cU73`8RMCqmjw#)A+nWTs~5f$gpvK%YxPDh4x@}mcy-yKC*&jNOf-7LaQCNt%>K%3Q zQMx-y9;7bBS*Y?`J-7CmX}*k&jc;WX(s`}d$gjjzxy1(+GXOz+5go)s*X`W(es*SB z8)w-1TSd;lr?Hl9F_0j9mI{A&Y(?X(WjNOs2#1NYbc6huA6b=9i6>ZDj6oCNrp_nV zQu`^CTe@$9x2|`^dxR9o5lc$NRXGw2F7`$C2*MP{qIootkf&v#LcHGhm3a~^%L<>u zI&N{bhX+XY5BdCSWM|4a&q#age3<=FY8<7N{Ags6!M*W8Z%~pVsm%(r+ONjp?u`cxDiw~U zsbWY(L@o#oaOXsNC!f^RDRuGP?{BBx}SFam?Mj$(|tYa$$BPASYrWsz0*E z0b6pXGv8dci02dA{Wmw& zh*$lL5W?`acz1%Pf@Q(jW&MD9OmiR|tVyHIQ1a!7KIdmz-a2Pp*6k#clSnK=EgMgA{W8feRb~3NO5#T!PBefUFX z*4s1!9L~K|YBB^VwzRPkB18Uvaf-(wzD+12v2PU(%DZhB7wO<3<5J9WjPh%?u94Wa zOm1EBh(d#p)6hl!ZcaKu`y#&y6YuoTaW+d3LT8wAJ}{SNJ%md!2S*%%r>oj``ZC+e z9-Wp8lWEH&w_sm^kXT;!X)h-_{$p^=SZ6RqN`2}DUKp2}=mF6hdueBOiFGW1>#|?J zjG_uZ+sJ3RfG%Qc=c35Tewm9*jP~FUGohbIt(K_4`Lb&3D_-LRidvE=s9F9bLAyf_ z{tgV1H^Dh>2u&chJK47@@e48Xy)@dJ`4%Z0aZMeAV`=flKK}4xpL4}CUs4Pwl6}sV z95JF3`%Ir2)XUZp3j2W1z1ENN>3fXXd2$mD6t4VYa^uPFM%GDEEjZ5~g{$P(-AXtA z(YTeydMPBrB1{TjS%?g1p(SzP;8vp>lGM%koT$DgiyZQ}Oh$Mimbc8R4k@V^cl^K1 zDqrLM1)8l?sCXaeA6IxEZmp=_A2}yj+^YBnB8s4oZ}8s4)@HwH?9%qKRKBx7GIJ*1 zBVX|-|5h-2uT0^L-(aECDL?(4g`qTqJ8OM`8Ye&R+mYv=Ur&>K_zDglIDf{mPQRXq z7l+~-GM^V3-KiV;AMBq$pp>)r-!zPl3IsipZ;S;YT*$BNkYAZ7o1@SQ-mu#hNP8V> zjWi-Fu4JRruSv;2r4m<(O7EgQ6?I>cKdpXMxbWbrMvL>xIZN-I=B*y@3$OQHE3<0z z77tG2z1v&~Rl1QoJfu}2@#foNULjoUI}dKvSe3;;w*qL+V{o(QH_Gr^^f% zyUk=x0qp)8KhYpl94W<_QN>>YvT9X@=Bre{S6Nxqfi{w@a;Ql^l8 zB~Qs^T0-Y+zjH4X*|-{s4LP!Tr-wcK6$X+2IO`A?l1B&TPAk)G>3d9|q(;unjSMi@ z&L|$uo_5BL0;K4DY`?>`oqrW4aHzKPVrdMH+rYBL@7pXujz3Vr z_L1kl;RND?23^YXlfoc`Q))L^8c$Ls{!>mm*e;)ac|psl>Ci7`XO_qL8(UY|#qE^6 zsdU|o(vv%tpNky{B5{=jBvPSqa)v8CwR{ivIe+G}Vy7f-B4qXxPc^O}@_AxBFEZJt zf9$p!Ag}IX^)s+koyG*!QQd>wCp2@dO1lSVLBdcTZ*zvq^*cUj$Yt6~`KiyZF> z#C}wvykdy)&M$cglEpPJR^_sXeS^xTg3#t+)&eAl!f+Wrf}@QgjOL(|pib+x$Ftz$ zsqrPAWy|P``vjC%zI@iiv?y%7$Qrtmf11zA2*v;CX}6_?;zDm!EI?W)4w~WYa-PCb zCy0XAFRvAJj`S$ytlgv&PEtwHXxwv8hd(nmgY{x&L=QB~)OLo+WP6+ocrTkcsb4za zSJ>A@T{IKCf9L}#c#i&yA);HyLPU?6;B4P0_{g6rnu@e|$J=I0gZ`rT`0?KRCEe!G z2(ut&J%F4JtA}xqdVwaK{z*jdDMik-q`ULUQDPNIDeNn4ik2&bcP!vx-IKkr-~@m( zSeqXq?fq92@(w>4*P+suORC5gBaX9mgft|Q+d%YX90w@R-!T=Sd9*eBsllmuVwOF1 z3Zx0d?J^2Rd37CvrBef2AjIJEgob-p^T!!oUtbxtFrR@yK7WYGfx{prl5OlMs-EOK+ODney66f&KI^`9@1 zdPS0$;pmY};Fmf8`1=L0=RzUT_x$fb-c+~0aOQPZ%xm4yBsm!yGzepYZ|b~kBQIL( zlhKcc1?&$4$ctm*LoRf%5@nIM;rubN@cAC6cAyc(k^O5>8?WCSEWJ+>q@jVb3@ADx zaCKs|Iu+0V;35O9;!am1EZ}yQB8wL;@~)yiKJ=|h0AcsLfVN3L^N!(>zy=i}_?r=z z5?6|ybIljWxt0mnd~sBl`J#W%N#e}g`Ba99>}8~R zDqoFMNtW-=c!jf_SeEnpw^a7`WE(fT5q<=Zbmq!fy_@@yah%N4dFCz^ty2%@tWdP4 z^nYV_984wdXVHU{Z`ZrQ^@R?<-uhd3N}p<&32*(8>LiAOZN*P$;6lN!!{-y35s1C|%7a7V1TO(0_ie#LI3n#oF&Er=jC3Imp>L zL=`Nii2kc1;vnJ)ypomW&q`iv#hx$J8!PrmVH3a7Gi$MoN!&SVF^sCxmuAYJYTk=L zE3dc~wXTE=rw~)O!APDQH{e{-TGwAd`iu@6#U9G|ynCOa=P`ya0Zsqa2>^OIU#$Ex zg{!uv4yHp>QehbrLw(@_N^$LTwyhA)zOth6%tFnKhU~75l-so>CY{4g+2j^f?%~;< zbgXj)4Z4{{-NI#tgINjAeCH;K3JR)Hh(<-&3()lRK5z^L7#L9tDd#y;WM?qC(p^@` zKF5j9b6l8=ey&&VP5=5bRa<7hzcY*PW813GVP*CdXzg@1&OG-3Rvm-^&{%R_F?w|_ zP|z67lvM)488}q419u}m&iQAGCcmR?N&e6!CPAii{5o-LOU&S%(tk<>#x5Y2q8fGD z`M3>Zf4_)71Kg^8l%{o}bMK!xW@GM|g^9WB1anc(h3ZdH#K}ZWLQTkizOYUc&I;5B zw5IE7qON9}ou(aQrPv3tJ1m5WvGR8CIN=p8{}8R+KtU5vDvjHO6YguSHb4p zb#YFZO_Q=N^;Xr;;KP<`SjiE(gc znS>6p${%!SqHs*|RsO(HE(Mb(VLBm=+*{xqO>NLtIYGL!<5|Onb(6p6;hAS*%XNOE zaBCNv1!^X+O~Ga@mhJKPYD#AxxKibLP= zN5k1wpq5h5;F{MUe{6-GY_DE-qX=LQ6rVfR*@4I+ifA{NuG`z(!~4iGt2Y+n)qZh0 zq=7Wgl)}c8!F1k3FT9b@NO#(2A#t}>w7mzKOf+Fnnom}Z;gcsP*@{D3-6v!8I{69&&QCJ#x3-O3+OuSGt#a9bw|3Lgb1X(9814%cKiJ$qOJ`3 z4^z=NiI5{a6g%y??7-d?IgzQZ?BZUL#g; z5MMo)4>bJVOw|QJK2VgLol%`ctQd!k-!4^AfmOQSDs8uVw?%xV?{z7_V0<`HEj@_i z7y80y(Bu<{V8Q6eJ7qUNEwU|jbRr^%Cv@})^PStxK+KXP+$VKmBa--4HB6eEY0}(LUM#*Omow6IgmLLo%f{y7vdUuRSNZLF>ELE4z079hwA`wa-z} zWq6J58)Xl!q(Gx^p@#wFhR5)?N0?#kbKcj23Z3F7R^k0wbKNR)hB4#Y+JVD!rM2a=SWm@&xD4ZDxmnmWL@~uBi!1 zYBt0b?o9vLqTH#Z8%mdxM;pZ|GR1P;VpCP@9P-0a3@eznxcu{HgO~E|;T>u7(Ms+- zqf3Rzw)xtuXGgxrD0_y{uI+Os3!V=h=!IrV+OSl)Q{u>NwzJHP>3C~?_wXX4DDn+c zGY^f^$=*fH(p;WmK+^t@Om(gdot8GXY2CXP(M|l-`9Sgc@u7X)>HNz`#?R)uvNgS- z(!Te8Gs^Q7P)hn%NQ;8z3Z4a>wDb(4@Z3t4ewdG*Pv9W7X&I1q;(Rh3s z87-6>k6F&8%-n=*+}?9=9pLzuBQ*yFG?NCumdN7_PtI)qPBMi8n0;qd1YHl&5E$*4 z^qtN*&wWFJ7m&9l#LUbiDkgy~EOO_>Ze#x^pd+|YS*0yj?>EACh3^Onq#7?P z^omwV)`8b5LJ|n1E-#qNW8DbS!1 zJf-kD(oDb$+1w_3242VsERsP<;h+5(`ZGNcvtauW&w%vE$p%j<$bHH$0GiXTt}VNQ zm2rMU8P>J&rvR{u&e1~0U z45DbWpCDNPVm$0fU;9|JV=`an25M6IXOYQK`rTZ1FPRV@c)-fS0@Iw%EhLQ5J-eJS zz#CZtZ||V|3=eX`hdJrPU<6dr3MAj|+zGs+j68M-2cG{5@Gz%Q5dUW)gy$MB&~V{# z-WPt1$KaiXr%$#o&y5{zqxzdv=qKv1h>*TwvQB&JrEE+KdImebm{oz>ZvNeKLB#Ys zQkBZz7`O1L_XnFl_6MV{Ym{gTZdlMcf1XnMy+6lc>j;686@^b_9EO^11BYOIj3971*UIM)R7=pV&F6 z>olq5bTB5xf?qkxby)IP=Tycez(Ymnfve5FC)axfELAD<7--#(84dMlg9EuUnO z4Ia2LMzEuWlve>bV)`AV*YE|79w3m4+ z!0r+v<*E0if^Xjm#W)aRXSlW+DI8`QgjQFU6)6eS-DPEki^+ndFatry-ta~8F%@dR ziMf$Nz^UA-klnkol3u+MZshI7dKiKF_JH2pDVDCv0b#%dV7AUk|pXz&bAWTv8NK~n!TYx=HJ{zQ5#WhPpE8MESM zK^#?K)NRDA7diJG*g>zA8*x+xsgBDIQ@8O71U_&rB$0f874#BFkQ!T_$+F4DUwMXh zopKzJVMJXoh`QMYS+eGT=#=~gE7WPh*nMl7y9v%Nja?jKpG@qW4r}MW&^{T$rxb{=4p9zJGDIFUJ>YW!X5=9aqvj9Xtpq;f7^JY=_byn z32Y->tMm@kfO+kgGE&qa8ca_7gbp(O_wJ20!=i$sUE>Oty&gw|8Que$vCLkGH0Cj51gEK z!)eWCjmD*$>Svl_rbiDQI*yp`ru)nsU8ITXY2=DS zCaR0fY?MZ`8<`OWaq|Ta)>4U93PYAR zL#s|&U{lmX8 zFlwl#-)NKX0=_G(`!VkiM6+8Rn+0O-iDwxxu{hLi!MuW>AkxEkBHNRs3?eS>rPmC8 zlFj*OwT*U&<-U-~5JmnT+HC?b)9OXR{B$iy8!<(Md`F zY=4ee!-q_YxDy$ye+elWW2Krs47j#%~y#t~8t$(|%dR(vGw zDEJyb5jm6kI~&5==62E`T!ZfL8lUT4t58j%%U%{|g-Mdl+iDaU*y4NXGoky>Wvja! zB(x=+Y%xBx=fR`35u3{4TZ)oJFf@;I>0~W2x}e*1{hyc2bsvNSN?xRrBPKYnys$Bq zST2SIKQ5Gx1hzcd>~F5aM;B#<9vN(rU1w^|E}|AH%tmTSK294lo^U>L4RpXBd8yq5 zd8F3^*;u%l0p`GHkxTO=J~=;n&4u>!q|x^&91kIw93kQ{{a6Rt0Wesy<=|B1poYGsrD@`51^ZnD$_)3>ALA)aGu*Ui zW}=dU-6gC!JBmc4=}plNl;P;tnsvs6w&l&2uSo<@sjC zo-s^t`95#-_p1ENFI}!5xbEeg0FqInC`>iIybnCU`;fiFoa<+`y4F$c0;hPjffaB4 z`o7u|IL}~2s+&EM9J^Ohr)9)QQiLyELs{nlb6~Fw*zd%!7@#GPhNxTY&&|Ig-Jrb! z+1!(k^s%Q7skCQSNX_X-l66sT$lmYV0ZUkAPcDF|=A7@59Kz8PVuGuBF=hwD#c)z# z9o=K?a=rCs>RP86VqW29-WUsox46F0@E*$RRKLoMpx*S0bYAYO$=?3;g+6*Jn~N%H z5#;SL8LZ7qSr_TXL@5V~%zcRzUSmBfYHVq`RfR0)D~@0VTD65v!>vW7I711 zH4v+=RFg~lxF2+z_14!gI8{18L2Wcf*wA5StcnKf%mi!H8+c|Mnqt!nVq^V826etB z5r7qYuufBxQ<`#ePXRl-{el9)h$w=rq1klJ8y(4Pm_=3alkvV%+PUV0KQ`5GZ!cc`qDD~MT)x_S|F0-I zS?r%<0b0A<(9QxikO7|7IIO4ko-4c~mI2qbIahdxFSAz{FWa}V zxY;{=b##A^8M%N;r6g=;&@-7ui;U7Do)4a3+@$m{ojaS(*;9>!tgMVDa2u%mm>dO* z{v#%!h>13UidgegM0Le@pJ1Sic;fBOF%%bg2_h~cR41_jSf%J>6^%#yVj>6A0mYCN z0nTJSBZ(qP-&mu#G4BhjvR7Gy8#n7Zx`26v8?4itKuc8+6pZ;p#X~Uz41l+<5{&xE z({$2afhwoG!&`3&fZ|iKIr3N$D{yU&HTcqk@K*Oj&(zTzIi0-GEVC&quyaKUjH?mC z5X%^_I|9XRfjJ#2IIAzcUkG)e71Hl315|7P-5rka9YHS%e`V~4oc+-p*-&M#sVZ&@ zuc@+^2i7L5iZ_gkp9lRVN9PuQsP`VJy+;>BR#gH@Q__ul@4uTaR26T8g)p1H^OTX7 zQ+&Ise07){tjhx@CM)e%PfQY14;mjxP|qyi7<=F*_J69GP-T6Cb4V%+Z%o5B$@A+I zJ()CnRW&D&$We!oIllfDaX*20Zdt0$yJ(H;moxC)6fR>h=a#eWXfv^F1whS3izocAEV&6h+b~l z=v^#%!%o)D#TX_F9s_CE$Ri+S3~%4$l5;GW1pMR~FWFR=826jN+?#?<5)K|fw%6mX z8U`mfrBVkuXVTkTUnmGtCN=Wdu1pqoBEv}r^j9YSK)db1IZvB%Ivb&MCwT;v;@lJA z^dz(i1UG*Oo2%n5WMY(Yf3)3qGr-_rZbBr{3g`@SF;~!1Wl9H;5RgY+Mc#9DToFA zfFHuqdV{Xbn~b9{x?Y>Ufvo$uA024qss?oSKDooq}b+N z6i<{(j^SntH)czB>wTa^fP$x6u4_HE$pB z^XLkPkZg<7(n{6o5aGU|@;mpz(QS)-Y{kcbfx;hljJD4M)U5&*|31Np);`%IXuqG1 z6S;tH2Fu?Mcpt6`npH`JG=MoP#LIQ6;m~OTBZogsv@`z*T7KtzE)wU;bqH|P@;I?4 znTyRx>!R-Va_93$H7y$waUPi&5oR+GZV_!0ivP2bT2}1wh5W>4W;_2ueM*#2OT%Jy z`J#B?U_oN}r{1Vmir$Fptrx&*eQFf11II|RR{6o1`5i!(yWGy9yL=f zI_U_ab*xl;0iV%29?Q%dv}$9SEJ-$yW>}ANc$~OVQ>C2(4&bY|0X<#pXAk2p2hfFL z6FCj-dBZSa+;B55%`>;&hGUoy?eRjU+u3IA)_4$D*!S~E+^H_W-|uq1e2Qg)ZkO>W zIM`(by$uE2iD`D|Yc)y@{BE8wMS$-5LX*W0d}(Hu7Y|X21?tt;B0eTP4E`m8tzPTuF-`-qy{?W}xQ6RTb_ zyR#EFXr2x2E~Kh>evMe9ee^=!u%}Fn)J9;;gg0$Ox>WKR_QF1=M&UCCeUC9*pBP(a zvRxy@!3-NzLlaoD)p_bSZb83u(I0d*-*C;iS;S@zbmr+1lGUQe^=gT6o^*a_yS-^r zTd^gsAQPY9cYgIdxAczRt2C*aEPFynn!A>s*4ab>$nJ?R?9sTtzO#;Wz3iO+WRp$2 z51Sz`;_2yAvkFge^)5GBK-EIN?d;NdX7Qm>Kg+V|??&qWltRurbDj5Vo~IKx`u}L& zzO+lyd%xj7HpYjUKSIcM6AX}h^)D)s_d=oj5r22t71@_fJIa^V?f?l3DCP`y8}&CB zk^KXS>}O4I@}G7)a;tgTdc6B|sav*P-TT9zR3iWB?{R(qQyX!h5+}()-f0mAAg`p=2OSHoaQK0qp1`qcAu7X2hs}+l8iz zHP;Dc3v=}pWog%*_^mY#r*`PHkddUWFH@p=&;v%!?8s24@>nwnNre^O;@m~gIL<&x02gkQQp65N8j+^kbZ&B6J=`XddZ>Dp`6Cp?_8op-C z8m9xCw7>xD^ylSBPvZ2m=vShMKc?t;nD6QJk*4VBS}K*P&Rp>8miyt)Ou63X^*?x; zJ}nI`htu?1pj?bH`vts%L1nT>?KuC?zKptQSX@6L=hF>z%@e^=N7wGBVzM6|S(=O* zXDG$lS}o7f(-@wZUq=aAJ)DBA}1+Ksq_!6UN0)dsVLH?xo#;F4yDBiC{1_gP`#`^_WF`))PsE^e; zT#+>N^BO|Rk{W@JXVi@1r?edckwT>$cpe=Wk}+veT@Cw$x7@8I44eeQ3!yU)FxMPc}QIirG_ zXR|x=Oz%kutGn6(SEF}Q0O4g1LM459IVf654ADB=H)HB`Gb}gchVUQXfK0XYV%7SL z4|nl;B~WW2MkHwW#OC2~KAq2Ww2rW{#PNWJxE?D*4OuG60JBd7qxP5z<6>wchxjvv zlGo1W&mY8|==ZVouLxRJ>xdF1Zi-&(=bVk9JTTy9$Be?GH7cf1k4jfH#>CY||Inl- zjjNYNlHs^iirLCs-ww)!;hpW!zcdqp3oh*(UgU%JSGbdks0B3fUH zEKrf{M%_T#s&}cY1?R;xda;%l@~O4oh5$<7FXOk6Um_ZfF`S;gX4<B|?mvdIST%#%XNZ~{L!h2xr8`*cT!4=M)7z`pEm`+u* zTYk(bypwUX&C~G~PZX}FDk^Oemu8>e~L}oPnH&yVsordiJz>#{6v1{4__m^dP&7w?T1gA^Y=Cd^Yj{osCWJ zg$7+X9WVY*Q)}=Yz{jMwuJb3|AUkm?m477{LG(bc8dR_wH_o!G+7oKLRlplPZ{rK0 z*b`>bG;x-i8NjmBTCF@#pavUaGp9_E55SUGk&SN4|X~2uN%af zj=y19aAO>)(+f-Z<*a5Gl)iuw6yLuQW)_*?sbW-&Caq%qD)}Fy3Z?g zEr_PBrE38&*JE`p2BMz&>kHS>PM~q*_4Mm19!;T| zFawu2a;d$?<#Zh6?x9qe-@EyZ1nmj4tL>-iDCus6`wT{CHAy#^U69(}7VuNmXtsMG z`jpmQx6kt<5Z67Yan37zNf!a{Jr6W-!KS+JpZo@+Pp#oc6*lNL{>o;41Vf#;FO|RJ zC#)-4{V9BGiaHv7YC1ov6y}%i*KrrH@0;!3EpYGdOkBG+b%^Gd(m zYNxBDe!123*H&Cj-YE;ka9*P@3pnkq+8RA`vR?a$-6{E*uuy(s>@ZcbFDqoI)Du`G zLY?fIqL4kYBs$S@?X(qTh^K9|ZCfE(YFyRSBZf*TgH!aHewrzFmvLO>@O;Yug0a}6 ziToN~M1hj5%EsAaL-vfakX;K%!2R*YN<8S(03Ipq01$+|H}e(Klr}bTKQ1T;h&S*? z8M3r2>=k*H{c}IjZgs=hf@hrU&Vxb0+V?|vAV)-G;5AfK=_PA(vJ%T#dgkjbJ(CEI zS(_yjXgH&OieXN5`_U(R4Hk5XITx^pMHNzSVx?vm&-nIT{G032yZBKq*u^p0PvuYH zMmfp!jVzq6>Cr=6rShloqBeD9#;l_7H!BYP;w1wgK3#t%>d#pHsn8z+pY9p%*B^`< z_vE}%N7+))#{6rQQ#M>wd)d{g{9zOHLB;C+S(D0$8Xna}JnyXiqp}iDnu(p3`Ovf{ z3Y*Lqr_DE3I-;qbF5K)sA&}~pH5_z1tzWX24&Ql?!)`m)aG&SiPy38#?G##~7E;n3E%U_#oYJM@f%Da0VK~H=2^gk4NhlbzVLxbDg2d1I7)X-+?rXSw& zjvAu)d!MN;-<$Rkb>C9mE!2JAeV{70tXJI)6i+|Ag zG5ydTjox;SX16}9-X!SFSJdT!I&sUp>J1v21L=piysh5o?RNEMI|m(untZ^q>55+$ zRo-dMywsXiYO$)k9c}JIZkzOGZI0gP;eqrU70=auv)(M@YVR_x4z}pe3fgAQy5{=; z58k8?ZQXmgpNGT64;!UczHIb?Nl zz{5_Y!7dJ%*fp@iL_Q;wNVaG;Nmk-BxNLE%B~m&fID8XV{Kxp$xngLdHk=8pfR5;z zx{g{;Bd`o_9O4XL@y6NPWavBN6n&4KY5L(32bW1cLywnO+dS8fc;5QVXS6Bjq4cfOn6R?A%bG~h{sLGU}9c|LoPI;C_vsfey8)> z7sAFNa^&LJ>zuz*&NiIKg6*NkkTRACL6}dVci?2pB6kTOYxHrRy9BmXQrS4A3~nI9 z%5hw_Cwe`n2LoB9?~7O(vIN`10vH|}1M6qb%XPeBXj9CxxT=uoPvDt-cuQd8-|PH3 zUBb+*lqFJ)N@Jp8l!5%<2M|#yxVQyOm6mz2+QYf7LZ0?s|)}IWlEY0G%Il=ZF zXSk^%DT^k_fi4lb`Me}fYC~mzKjsz(;1+Se!4* zKh!wHPb!&v^g4eQ@XFaI4}=HOgrV{{R=6Bx}B?T zNBykEY)_><1snEs-1MfPkeuj8qQ86YnENI^{wLkmfwpA9LSdmp}PvjUC zYjSjAFsr3vjM>O8JhV9NaZR6&FCRSLkogEIESKOr6Q3j0dp4|J@0nza8P2T z@D0F=gbyFuCQ?3vjL^aP1a=E~6O30Dl4J1YwtZ`rW1G&FS?e7up4)(g#6cr~G8P`Z zO*nq-Ku&G$l{k<5+n5WPs?s*i%L1B_73jX_3uv$TV`NRNM?6&S1c|KJuk*CE8o72Q zUG*gQE(yD=1TYeGPd^MsuQ$T(1d{E+ajgoKe-yq^%zd@k!nA~Yad!!~A~g63(?Vo` zQ0-qw?IZ|&_bM^15791C?)N3-u0YEDzANRDZn1yv_W}Nkk#fI}l#8gT9^lZMd@#hs z>n>F8_G{MhnnCr@72oK$ME|iE_GPWI?5B-TrERItIUo9&3PxI|k@g#x*~ua>5W;#Vmb|D|5d*hqia75ksoR)3`7!{kPXx>s0LMBuO z(`8E!-}n|5Q~IDq5C~uvOn+X>0A_#)Wt0~Ub@V7?8>4E-ep%EJvFyj2^uxr0qwZ2YIh5WaO4-PV;W*xC*6bE7(s>DO-9 zY;Fx3(%|Siu7!>Ic?a=}PV|`$vvC{R(+K=Gg%scVE~4d%JaPPkZn0z_|qp}v_W z05dsqHBB+>m!)P9#c)4U1siY^A%T$s&dc+=H0)R_j_L(?hk(_;v{a;2}pA|48lPz#rjrbACyPeozQDvn3Rgu3;N#mAT9UbFv&VV9ztE zC{02;TgI5Ihw=?eN7eFDd()(26!6A}o|}VR>n)L8abIs~Lr+m@xB{)06~9-vq4+-p zFNz`!am17JrKw;5flz^MP8Janu5J=Lh7{<9ujm1n>kSiOh%YF|@tl@Qd5 z=N0!xO0=t7!X45&p#3u+wQnjibI#k6=yhcVxL9nw9;4SyLE6~egos~N6SD7`%_gX$ zO;WX?Uce*U`Kfw{=XctF+FSp7&gg_xIWN|xQj7Kd7wh>W$E<2a9?3gVNk{zxcXy85 ziA?ZHjRWSI>ZD@*0i!%Q8D zJ#7Sfi(er#;a8L#IOysMo7zq?y3(Ekv$MB{Y^QWpD1N3+I}6MmpQ`(^5B5wB?J9pe z0w+v}NFs?!;*xBu_-*5*nFHXIrs{^2U4ZcqPml8bk{^_vtaT~|5xyrTnk2QLV79N01?_{d%(e;|_6Z%v+TwvJT}r|WG{LYag?6!GEN z9J>T4A5CXi!2tdT-ulbTFSW_SK`+SU}#vr0<;J>FC{E-9>I#KI~7JY+Wv%)UQbafnL=L}{OmxmZYrQ{HJ$UR(SMaJ_fU6EebRV%3l^*U7C z0R;DPT`~v*h@2bh0m|SFdX*j#B5T1RgYpLxJ=EihRQ}IHM*DI@x?yH#G>D0n^)_tv zP^V#M2wTWotw6@;* zI`s$S=&{yrM$5yV{!x!USpWldi&AU4bmf+tbjm{`Zb#~`S4-FL1lAYRoc^nmLOpqW z*L|jvfumEzIe1KE)02}_|7EIG&P{^=i_S4kAE(ikCKe0|f&Nxp}_$$lX%X$8)r8~~^Zwn>hhZ%`XIQv`Y2oF^6;WZb6-wwmytkpEaCbUWS7QC(h|Uby@_ifbmQ7Hvm=Ld6|Mc zzr#yPRSZa%vgFo2mhCa~oNKS2F)cD3s?^h3e9p|<9I!E8~;R(;ZRqha-+0`g#`Kr;k-&dn*Peo1hExBi$ zLuzZ&R^qo*H8bmNcn$PEH*Y9rn)I9%^HDQryZgCQ(KTV33O_UKrL>v0uST1))=L@S z_13qgYaKp;5}D(tO!|0~0g35CA;JQg!H!4`I90peJY#X#lp9EPL%SJVV0aMOT$)tP z^h6k6$V_Nsjeg4~75ZilH1i<|eJeAq>1cT`JsqSb+v!erdY(%RXulEEJbz;5Cfvu& zF=&UvtF*R9;BT7cF06Y@FR43zpow=^lch8ZY9{_F^QFvccAs;1C0sB-><0{77)W>V z*Qmf%&w$61n8;6m500TC}tR-%BS7Y?oRs-(j|7Mna z9rR>Au!0M5-G@%;--Nwf<_k0C?o|HcJm}<+c!7P>aAifQ{CiDVS1EFc732oJ01-_| ze7?=NIDIShOkrKS&&KX-)$u z&$7BNvcty`z2FAaKpUr6<;|!ykP~zbXw!?Uz>_!#dqCfup`~pv7Rbd!^9>&Yf6~Ox z>e)E2a67-^h>S$bnJHbIkSaJ|-c2&%MQNR1v;$_LKLjyueNneRmkb=_XCO~0;a5Lv zs&Dqz|Cc?IfltSGuWR-q@UeV7Wj)Q_hPPAzJ&-@KT320L(Odr{^iz9>jrTXuaN<$! zySRhILR`hkcMFH6euZpupWf_g8R_fUIP!wYcn@ZE_T3qESf9h^e{+9{V_>*un3Lw1 zzQPHYzsY>(#uZeBTfSz&i)-uj2Rebk2=Y!eq8n@-K@5vT1YIxn9XQc^RIM7AR z4#BCOce)cZv*$Ts{j97`at5C+GMB*_J<~Wtjr0=Q5YAXm-ei{|s)Jd^%|MxIS}RZQ zarR9=ncbRu`nA(J^*Oo{@kWHxrTS?&n2cFG7o+j1Vv5y((Qjs0U>8yn&Vw_$oDn2a zxu(+OP{^9}3mKS7&!HTIDx9eeQZhP+|EHea13B#8GjIJJu*curJ8%8fyzA`YBWwXNJ=%M254{Z+szADz ziBfLF3|!c`9_MkgwJ}EjPb(7Icj$_AlhCe0tpeC0p}8O>jYSgxp!>rlG{h;rSd4F2 zmj0>8W_~**G~~W^?jhe@=%|T%C-jqUf*GiedWOWhBA8X&W@W$HC5U+&&Vf`3a1Cgr zg)plajM_~I^EUKWsUDf`g47b(GnH!TyLCg3=o86DTn_K4yR*l^ew=V%wL21wElfgWE zCUd$q942sscqucJnMU0i4Hmy1%zjP%)eI&_WJFwVgWLnV#9VhS)QYf4b@3aF{<*&cDV2AuhY)ZY8ZBlzj}kDa6VfjMxV(_vWX-I_G7aVV~SnaM^5giO7E zp9-eo`)eNhGp}L;Q}`iMI9-WwgtVW2XxFGL=kK%lKzwNSI1_ac{9=?jr6zc*oo0D8e`@BA^E>Ow5V?NcFT^*}Du;Y3E7?I#>Ith!+R`I+GO#v6#VZtQ&mQ-Zv z;DP+dKK+WqmlV(yx?@5B&Z2_jr#s$7&l{dSGce~j9?9ody9&d*Z&26rez8s856SkZ zk3VK^JHIBMeXV&WR^jN*zVW%%Q3cE*wFlixE$6QhvOi{8_tSc^hTGZ!6P%-TGp6%h zu5O2<-|d^i%{h?q2i{@Ivaco+Kz*1;1Le=Rfadj|#Wq{OuhgL}R3PIm9#3+u!!OS~ z-4P@ZXCo-omV{3-x2Q$Jn&?{4u_ z{!?5eL8!|+X(>!aR&r+Y;=^j(mHxo5GmUk9`gp`KRkP%x!X7QXNPh zZ+?Wr)6$X4V#AJ|K+(fE^uFmw-PEJ|E8J3y`uHS(L0Xnh6;da+{+2294cz)mdVyta z@bSG5O)H<}V}4q53mI7!hi)Er>tV9Z!666glrX8LI(E*|tSk>)#}CV;JM%W~1D5QS zrKwl4JbL`_VE6HM9tY&wJsQKkRtun}-#OMfuaRI~bK$LSzV8P%oOsi`6g!dN=yQr#Iuu1zEVLymni zD;8mP#RND}6uJ^dp63(whd8K7g|jjBe2lt9${|0tiUBZmWWUFTZDOds_vX^3lspCM zOej9|#;JYSBJ&FuVh0ruEA-1@*;1eq-uzl1`c@V;&**9%!(>Lk>KPtStS9aZL$jz6 z{tm8qxvHb=Ysu~Z(nDiC+#5)}Yu&KYJ#XR6+~Ay*3)$Z0y?RB~C{WVf_LoAU1iuMEC+t(QINv3#ZJ&fQ;}b+h>ui$FhB1_6vy= zcMx&TiXbKpK;F(3Q^|SRip1g1Sc_(0WLQCE9w#E46$()nML$M%5)ZQ=B`io&6^cT5 zCJvtovQQQB45?$lSiLYX$I614jkRAH{MG{V{1LO@$X7N}E#o&kS*sPm-du z@XSg&o{R3QwlDs`jC2WX!YUXPmxZS?RyAlnErqjSDeSV*O}(y8rJWAURTgcYjc z!3v3dXo4hk1d>UPIMJz71SYTjYOp{rrYLLTbmw|r$YqtsLN-f%e88!uZ$<^h#B}%7 zwWs*;Vkx4-K)m98(|#(Y>l(+Bb7CTBy0yaOM={&6qQ>j%cOj8}WFwlwi5M5VouUwX7PTHT_DbAG}AzkSv>E~kOC)%)1%w{+*WT=Vf0brl6us1J4;Zbi?@nUPIS%`?`L zwN%I4AcLHQ{-b<9Nwb>6`BscQwTf13uVvrnp7NSyQsnn<=PQ$L5vMiucwN`%nlxq= z^?SogPurr?e}-Ez@@{qXoOyEXY2&8%ltIiJUS(mGgxI7Tiw8^&wCb!#&z2EoImwMmw+3g&Ps^n@ik^&~=SNjpn zUSD<#Sve@B9+fa@IpNibABamZg)_b2bPaNMq>Gh>|Cl(BBI=maOa~0@9|Xn1Dy=lg ziDIrz-clp-&{0ez1P)GcE|FqPu~Q9#W_Ji5+^veag+^TnyLuL7SV?HN%6)ETr3(L6 zhYV_$`ZX{-{?zZ-2mnxQSoB&yvfvQXWzcx5A$80-Dhua&h@!d~RaUGN&itc|ua5AD zEKPHao=%fGwjdGaMp}a-In=|C?uI@S7HLl{GABi9Gt#ISd!2Ns;QC9<OUxNFt}&)hIhfte1aERQkrMEG26FIEDl(@ca6-lE zh*w4)0aWssG+epk*6AB`&At?FWk?~PpI}iDd#aI$gpdFVJDm`>JO&od?8X7$#Zb>i-Zz6v!SdD_r=+>Jd0W1KU4|!STYBp^o1tIE z$v~8!n0$l0T-lf<*f{aNZ&-7h^+}~}k2jjD)au9{&JQ5LYP&Fyn0A<5%>yazXzpH` z3r=l?Pg&AaC@>g%zUOp)otuA?gC{13`D7DrmU3=1_y?9cVT=oCSI3A?hjfZgfG<$V zElY9=APp;zXCiwBr^45n2_WTIi#vlzmalC70zOb2K9$h0Gm_+|z!;I--Ov2};So4c zol>i9ICPe-kL9{63nqD6uf|`2v_)u3qdT%^d`F#ZMVpEPnLoJ$k0ps5ei#j`TAfFW zB%Xg1XVgPa;@&ZaojUOA#}d?xHai$%1c{E3CKN~Ku47|c5^as{nX!S(lr|9vQk1>y zQDDQ#l-6ln?4oVX#UFe?uda8HNqnO^_;WFwWB-d->;5Cj*XkSPaMhD2&62Dj78H+G zBs#ew9l6L|of}!l=@{D>i^*Qkc1*lBAI>#)5uZ|eMIAT~w0j%sUi-jE&<(e8flo&1 zxho-=hSMfK}6;OW``a@5tdB&sgrxTlD}(&>dvDicUS(+dhrv7 zY~KR#q;Z=&udp^17;nWN6l_`uW}FXuzcz>g=Frsk0@13AtoRLRp>JU-E-?^M{4Vas z*qI5vJoYR&%*RNv1v)Kl68(R)=|yD%^IFYVl^y)F@W~pI9bQEKNHEQ5Nlr{7v5f^6 zWA^cRqWGf!p3$)-y9Ln3FEQBsNuGe;6UufNEh#EH!IzZqXsx#&GNLj~y9jx|^gy6p zVQ9P7kIe`yU&94xz=~brbI081j#(nc3w4<>msnFB_S??zMWMK||76CzDOmhY=a^49 zvvbVt8Z-G$JI9PEN@K<+r)$h-xnl+>43FYud+(j6H8Ly<&wQg}^^O_&HNx`j@gfxk zb)u^@b?gApt~D@nPr%=GxSf=XJmnQ?l1}(_=~bfluLQ!d^vdw!%OP(w`C|cQ$Xf=| z)0FLykNSzbC<1ZbV0z49(g+=Vh5boCGJPmWF3FtqQ(?f#Y)-_#lyeQpth6aOxYsS5 z!K85rYmrkf&+E%o(rJ&Z&-s|Lk`b8>nMxLRQmYaIpQnZ#G{8mna)cy-%NJG~D;(pK@Z;b9~l;Fb*oY z)`RRgLeeKnHIxhH@I)zs;btCjbCW`8mF1~}A~O+e5R3(+CHU?q2jhT-z=9o%suI|k zT=C;vS-L8!&AU=cFh6y(lK4twDoYi~d%uohEOHi6TN=5tD(?$_bb)(*p~T0a{XuZw z+tt~hOs=#Sx-U>WxrQlg>T>dvo!QHpv$Brv<6Y|LmE=qug4?B;DA9A`3Ys@-__@mR z9_odRUXNEJrHbbjj#Y`&@?i1%R{UAb6j;p3C8eTelL}vcw@UF}_cD;#{83&g`%7WD zm>V;R_kgqGV+fdvqFUJ|6&9#}nX|d4`s3Q~32Zhvsx#FqG`E7!pdSg@JEbwS1a<%~ zRm@%@kBlgy{T-6in;qrn0zub3R}kosl|`%JY|+=b(U_5rtbH52b^C=6<7w-fJ*GoC zFwKLvXr4RjqDRcAz5RQ5`;P$-F7=1v#5~Z1QUS!4PSlhL5i21;b@?vNwWLW_X6bZ( zCue~6UfmIc1Q@6CW`d)^iH4OiN>3IP3a~ACdyuzb4&+JojG!Ptqzv$DG@*}~Pp6U> zeZzaRAv7NzXNeT5F<0Tnq4LS|AnyAQtHQi@HrcJ}9ICdRUW(-iArnqoctYLbO;7ow&PTQnf8(OVN)tZq6&fr92MZpI!Rz!>zP!gf_DL9E{GK{5H zsH2Kcxw9!gBk!L!2ev^8b>k9=%%uhs6 zgXNTn<-nZoTGuLY%X-`{u*^zjgh;tM^I8#02zQ}ms)7x{Mj(o&;pb*IYCAEUKAXvb z8GMm081cEQT>Ietiyjg+50b;Ej#n?Wh2LuhEH92_J0x@BcYd#>+_*0)B{C!U$+@Ot zl2#C`INyG6zuC%^D@SDxE^*>?SLSF^at}8=C~yX62nKFtvP`3bOqPjVVf|?;KL7WY z=h#zGcOKlV?9qRm-SP}4duP!|EV7sfv+EvwcJRuPdzk#xqsDloXmTX;mujv)bCJUB zJ3a>IdWPFIST0zM2;NX_0{Mx>Gv8p#al#OMVdftZ&)lT$`I$3VCLFU7=g{tW#d9b$ ztP)=B8#gH;Rqlc3HEW#N{1;=wNiEtY{7U5yVXe+?@p6qibIPw~r8+d7uv7x=?ztQt zBoDdu8V%XeZu+Y%a|X1y;AwDwKnxs;vUM(6+y{vP=@I+LfL;?o2mrg`6VAC0_h&1h z3WVf<6oDS=EB-c!@$bhV_F()s-m7)b%dC5L8{=msD6YTbdE@$dz^)43(3HngKN55p zPP;)V(@=EKk0ip_rY2CqFsLOgTK7VdEtT&bE_(=2qqIJ9rv9g4q{9>y)J z^Wdn+pdG!XANL(Y^tt+mRpeHsCj0hVfD*Pnyl-t>lRoZ; zJzgJ4u70cq1KV!NS65lzr(eO=404WhQj>RkUEsO#?=YKYw zqC{b@u8U0+Qu8zZ&L{lBw{!<8tHr)?t3CllkiRfvr^BF;B@UBbHtaB`Y{?KIt3dFT zx8V|NhXP9r?nY`T(bCCzn%#=t-wIX3;Md$N)S|h$dz!wb?-%6+FE#T!xf+p15IO2m zm^@@dc$M7l(fAb^X4{?dL4+dl%*0-%dYEk4-pT7Q!qzT@vQ;SwFCn-09ANI{c!s(WstdMT6 z5*b&GP~rz?Hw;@_#bSpTDW#7=0vgrkXf6`SMV9* z!!|whwQtwUO7sN%Lu#+}+K=bR#Olz>pbZK1cVAdGQ??`R>@sLNF%#{UjqXA$OaxV$ z2~pY|3g86#Zmsla+00WBCi_#5X%E=#V`k?&XDTEa!*OqzexAW7?((jJ4K8(Tz_lzg0a%k@&1{YfmmICZBBzu|Gn{ zrT$u1AOB~C7%a_AjU~TY*mCBey8632|IrWb?$*op>F$Q7^4)E66%Sipm^&NY@Y>Ns zIIhr@tA_}P^bF4$1doq>NCRKm7anu_8yHCg-iqGf!JJl~QW!YG=QiI;SMZ(-g6*c1mKuoE*9~Q{f=Mwa343<$*-&z;?2|c zGW$G0+uZ3%lox6=6VHy|p|PeyjzAfT+RD!CiftAnhqKx^tDwrYYF-dU*u~nS-{wUV z34Xe4dWmEYpia&xq6gh$`Qhm0u)vAvi4(aA$!=%h&?5#P)(3IcADoK3uM}qSX?e)2 zSFKbW_UgM=F+1s0zzQ9OW~ z626dppDhpbK4W}@&NLD+%8;9gm~r+qngDf+PX7G>c45dl&fKkNh(mGym)C}>(R2tJF8o&T<3mxr(qFCX#MqVW3%7`3tw5yhb#$4S z*?V=6OXaF~rj8Z@XbX#Z9L9_vs>F$7Rlh@{odF)Zc9>o5h20)GPS~I|>?FIDqmk(E z%)A0T*^bj(1}=J-r&aJW)sDizq9A`*x-EJ$l?f@6JO$-p`ygVPFM_d!15ydEuJ;R~kG4uX3N!TR#=exWgw+3eK#OSJ=QhD;@X_`8nQyiE1qZkR>2(QNa{**{< z6{}P{G*FMUK7xc?9o<>iaT(DAScVC{T3krh1lw;UmXq$}6k;_R%bkb5ABJHjw{mF_ z+sad|JM?`e_!Q?+wU-3U7_LCk09@>?OmB_6Ip8Jv6@P%@`q!GsaLQBPSa>#SjMg2N zj4F;w7A!|J=sA}L=!e?V`n;9G!9}Erj`fmXQ4XvVoqvdHRDMZ{DQ-uQWFHWA$kbA! z`fw%j?fnhwhGLT}plU^eQ{T9qM!8sUT2E>4HY?>;m-*i0p%EMeU&!}Li{B1<=am$C zC2_Nd%u|glZd+A{q0>r!F+^3MkHP0{$c%bN(0Bv$QH1eN__NF^a-OMLlXltr?RHkm zD`ls|D@9wC!d)q1M}rks@(a_31t*h_QEFH;Tciobn6a4(gw{AQe8`HI3Vl_G8jq~f zg1Uho%D|xswYv4$ss-gB^z7I4;lI&a`7XhN%&wO2s8$IMaf840Yyk*1Ajj+b2~Yvi zL}SCV`@bhrzQZQh&%i&ecmyK4d!vMAp11F>*qzWY@ShbSea!3U$Xh{L0oI?j6U!)P zG*v(*anUgW0COQ}7QMo@VETlp7XHP#um5+!XjlLkg#~+p5nGtZv49W31#LrU-!S1U ze#*|$7^MG-2W}HX z?pLMwf2D6&r#`}QEBU=4{EZjV4UQxrp78!n9KBS*G%A1|0ft!ZZ7Kl6V(|ycV?xdb z!wJh^Gxc(C7pKMQxf#22VllF{WWY^QVOUy5HVuiLmu<5e++m(tZ^fLQ*cGmQr#5}% zo9rs}s$=Mo4@667w#nxx^sW*eB6+B=`H)!mOC@z9-(ZU{Qa^I{K;;q1)r#n_sQyl*UucY-( zezF2&I}X-D8p;!vB7Q{lBf^hzvF@!@WbnGj;Ke#sVM|g?jcUbbzVA~-K*?5`ZCKedigD++MVp$KChgRK@G*E3h6nTG!}QGy|z)ss%M)hTD=#j8bqp@PtS`H zHf#wQ5q(PDZWO$rH*9*hBqAKb%^+gUKED#Yhq_;%J}RocYrAsni+m8rUq)48=IXho zr6fCnFI?<}K;4eVNoB_b53okCn$PFrU(FjjG7Bx{@1BAAJKmEE^bs0m$AseS;ga1@ z$ZVsNg^Uzbmszbw@-W{yM_z9PeduI5+=(=;8!TGu_L8jShV6Gb*LTo!wp*oSLfbn+ z^g@mT!e4?zhK{sYE)c+M2Jp;lzZhWDSHDI)3IinP zAn1eSt7MwwYL`7tuFjS_;$gI$sCIqy+SaHPvux7azvY>5mqn6Q=gsgZ{He#;fxBh44e${+{QCr6 z_(|V5Zw!RdbA#Ru7_IhUM{pKC5Q7#`1owLZ(e=IS_A8it;n*L4$O@{H&;8aBwJDb9 zBz16uHeW;|mb4@I7>ALv=V=&pc%BF^%&*muM0z7>;eu#{1%Z(l$3&P2+M}yB_==E- zI@OGLLfHB2C#ZI>=I6{I1Vw-ICgkqc3TU6wyR(WPr4FnF6dqRjb@p6p3XE6cHn6iG*S*d*Qoo0kPbM+!k#mKcRn_n-kYNt;1?!lW8xl zW8v36SnJ5c^42Y))-BQl_v2@M`m^=8(dW)mXSSvlCC^yN#NWX+nbvwqCMA1QRvkH1#8@^pzb2g)N`Z ziAV?cJQIibG~bS$A)*Y?mm1#~jKLQ^@21m@)X?$=jH5n%9Q@a<2OIL2b~P#~;<3Kb zVns?^kGCE`&3mzPrUCX&F>F4T*CR%;)*zi*GUit0T^4=s8Hamg1j@IM^2$FG84oTh5qZHuRX)L{bNj=KI9Qja?J~h)Peu7Rd7)<{OV@> z!|o`?EZ0QFprvLHXWT`vX))lZPGAQF3r~7ZByq`{a`E4I;Wix~ZqT1;hKAZjMy^WE zCnIPkHO0l65d{lV5KV$-5^Y#C@(0xAmN&5fjhVkG?J(hOQ`L(0arz7(GqV1S@g=&K@!i-o*2jHqpkPSt4AW1~GM7qj8%R-$4N=Ue(>m$~$0 z__G|;C&QnI2wvGFeyp7< zRuhVKmh#y8h^&^F1h@=B+;J0&bjHY}(dFD&Bec~eIlycOfU6~`Rt7ryEDb>W063zU5H+8;80#fhHa%p?BF z@qn**?Y|-kZCN{)Wb^f>lK+p=@)odwb?lnXEe@g-m{r&Q*XBkpOCX8C?t#fwfoG10v4I=i&*IriP^rsN?OO1=xC*1q7|^EKKiM!A7}L^b-RoW z%2?B%`g4~$N~xdgPrWH${Gk4%>s`i?%2?Q+dKsxoc>@ibUJ%_SfwltXm`G%lc3c>j zFm}`-wBq0xY97Bn*?Tm#n5@(Y4#eVwkk@GjD-s8#jTU?p@w)e}o3g67( zWdZ-I*q(Z?Y19nak(x((zuXk#EJyP*v5kTE%N@C_gWYXY+?YPjnDS6=3)4oBrVEY@ z$aBNQw-`t)pYt3Nfy7aQ%G3QLJn?YN$LGEFp8llqE~BrE&KMw2e4JGIz*Q>wd;OW; zkA&rK=udj{4A;%(e2TCjc$U;!mg|NOXY@MxA%~Ss#*h$6%Nf*( z1qG!AUi&YZKx!Br(}8tGR_g z9CgpWCxS`CdvO%^+Ggl2#bF^5<~RFkI8o~f2R(S*JPr>W{X5tx-~b~Z3rfHGOy8{E z&SblP*3LI)5wFLhHS95*`D5Hrw%&4JLFX{AvpMQ#PVKAe_L4hIhD$?76)Bq)d!Vo& z_M5`&!8+BbHd~hXh3~1dD!;H-^ID@nCJ$&GG7&mNK@{>Tlf_5Mi1hz3ngUE4OVO|GuO?rG{Yokb?*N%xzd6b>HQ zJRL-C{#vs4oaPgfz29m+&P`!kIVH2NFu9-rXJQz{A4&06fN%FTutN8K`mmR5rgO_b znf-0pN=Xo<((&7}In?1KeUHnw%}PzV5!XXH?;aOV^)J z*j?*AxUJUvWj2;+Uk1mUbz*G4`6Jc8>3P6^QaUC@Cp3aMy@ud zN;!qNlB)Etm2{uO0doDH6uSOjT*J9jg|k-F)#p*tB|8_|s z^&i!b?n}EyADXS;ODMjfyvKCEiJkI83LaIa9^%-~MC=HTdT3kUuL_Cs#`I{}tu3ec z4|l`TJ5IrN@9f{wukdc)M+o-hKkAew{dw|uCz3!3b+-d z#o;b~pzdE-Nz@?>j`M4@+-R`;lbnsTZ``+uq~U`(h@N|FUrZLmr{6$Yq_4r<5{96E zt-z}K5dv(wZA96ISRq~+66@i)_u>^%WbKP@NgJ$5&87nlZRQj%!J%48cBG61kfWi_Jx zq=@{TIZAn#Ip=DljeY`+DR{bG`Ir#UGBPi(2fsS6(Ci9q@GvW;l$m!@a0kW^P(q*| zKndNpIr3gXiyHo+PWkoR*#*N8tNvS>VWEoZUv#7c5Ah3w>rO!5X+=CyC!&vzuC)a8Swn`$~6#-iO#4f86mLj>J%45Obiyd zgZ39vXF#1+^(b_M&*!TS-u#K&1-Ark(`Y-%`3Rhk2Q~>g^};A2A#E1^Ke|b%dlAg( zRQzQbqYDD{2;FqH*-b3CIut2^D;IjPePuO%2HUYB8)RHc-(!i|h!ASYUgoZiPY{23 z=jM5*$Prxhp)HFpo(x}%%W7Do4Pk0f^{(Xp)=-=C2RD;QiEtEbm6*=3R&w>42}g{> zP@+aC0V1%2uLCdOp4f-2=ptG`ReGiM;7A=4Q%48RWNG$*nJ(vDZr!oHn5C8yY~j*u zP0>HUiJUL)6Oy~Ag!uu8xN zjt1JqtiQ7{Ou#}4!Qg`I6Uq<#N-XQ`=4YpFM0i(Y<$4M-dZ`LutQ)?)40MCpC8skQ znT&fqxZ@%`dbJH>>)-RFiR=YVA8=xv3~Rw?Y5f;t_DUxM?vtSfgEjm|i`6`=Cj;-3 zp$8pcnhcNsqIvkigl7kH)&S5v&RzVZQJ0W$5Ve|TBQ_AjpUa0pBC?_En2Fsx?~1yE z8$AZ>EU={obbe=WT}I&IJm3y!%N#>*Aw~5Ck8V=C_jdu%pj*Eet=1$k(dTA48a>FP z98MvhO4AMA@xc?#HH)hAeCVMD1ut0qhzfGQ+@@fWekOGryY7MEPbF;YqAGsW=sLHe z)z41id0m~)%a|VbQa=qWoDCMv8_aFHIC@^U&`-4s#;RMka}x7xGSWtNVPB($GXC%Om<#u3wd*uR&&91y|QL4UG}7TKhT* zJNo_=l;_kTMpK_UnhzZ)g>yf5KhHe>c{pzlZkPK7~vNjIqB_9psB(m*8DMOCTBrtnBI| zX{zFR^A}Vl22WRux>ukL*Ysu4%9WaF4l5&nP^e_D$*@ZxKJCV_T}c#ZC7Yhc!mW$E zMARaxs~g{r;19w}dZ0mfE_NMN9Mtx2RxrF3-4-hK4}47aj`7-7*^eU#1`F3o_MVH| zEjrEG*=g$1g`9M~5TcI)ao;QRxA)SHW3%wX3W- zoL9_6#cfg9`f1U=%H3Dt?aK7b9Q(}2ROp^)Bup;Xb0vBEBRp32ryLPh;akx*hfFls z$h#miEpa4_(zxiG!Mztz5fZ|NoZQ6_pB(At0`Pq8QGImNAU^KkaeIg`iw$8|6Hw@E zmIt;9fKh;U5G$y`0BJ?iQbX4oWEFc(;U*k~euh(vao}v^Ablqq1o*A_f)4wFU;W#l z)~%I;%gL5jFpndp5knQicdgIvM*scy(J%MyFlQ1RJeGn1e)={cWj1ZUsntIcDzky_ z2+|MlUHd;7(imQR;SYO%Y|%%$N7L%#K+`2^`U?Y1>+riZ>#ucvvDvT`4%cYP{621u z+G@C-T}uBAhh&&27ck%&wJhsxZu6M4gehTv=1v|bx-Tr|4NaDlv?m^{>rct!!B$ej zL9hI)M&UMm6#G=n}Ip+|oIERrz$S2U( znZb_jnhs; zJsd23eW0hVt(P6yY9Vpbx`B^EUWb=pIK3A5YFvp1h*bzkiLrD1ecM5*+B{6KV+hux(-MStXs#)W_ zSWR`6yjP3$Xlb-nxw>C1wy2r>=K4pMj~jFt4V}vtsXIeV=sjGNQmj@P4hC}m3ofmTA zh`N1}BzGFZPvn-P+_`%qe4}z1xg24AL2fC9o*Q$Zo+WyRzNYy{ny~L{I`h*sGE&t#p7K}Tpm#up=1a(0 z`)J0{rRII7bv!*bh_loz3udhsIo+`bSqWi9GPoncA&!FvxraX9{RV2TL$^WR+0|Rw z4MBsDlBH!tP4*1(hg|2QFsM9R5?vaU`{@$u0Uc^P@x-7r|Ddk?B|hN@ zfs4_pBYUrav~NQqH%H}vhSOpGYGy%G?$Y#aIrtAlDm1RZZ>-=6uQt#pk%s6^yfc`( zNOQ1T*_5vDOY|K=*HDaHm0;wm`2@SfKy9*_LupiYX&q0~T0=Hs{05FJrr69)T<>#l z?cS6h_DPg|CvB-sr=VdVp*m4xm!;FU@O>HY3Q|asUUd^}YE=^0)0ou}@4eyYr=El6 z>U0o)byl8zO&-p#C_+}Dg{$lU%$QWPyxmG_KOZfv*`A;alID84!E>7jd1^b@x2x^I zwN6bsxufpN*AGO0sy{WN)COK>@qAJxQ+Gr+@|3CHnBr!=q@^{3ipXIaw9g#VwkH}I z{nJ28^bEl(@#6n^uwK(eH-+rR2@prDkn^$$hDpD&qQd_gYUV4j_3G`0>v{N!0EM6G zkQA+8|LX*a7quyx${96hd#y`O?kT_UJkOc(GEMavo?m`|%7^Zo##zx)7`IdD#2L!O zahN&>5A=6&BAS;Nl*ENe7&FSC+p0%ToJW2XKYfQO#DRfeVy?h>0CkB=(}n@)Hp_9B zqiGnlqeHhOF$JlPh)gNmlwm8hD};!ro(#rbt2(l{zHrc33=qZsFUDM;4-r{yhtocc zjq)yQOvr0_qdF-n4@6(G@!n-pP4kWRK-RmQ?+XYoNo9zhUzr(=aRunmW;Qj78uoW8 zz99etOwdL_mX0s5&{=8=#R5=tSmtD=Mzh?Y%YCkv@4aB@xei>Gju>enipSO*43oQP zl@(&`(vyxF@zTLoiVl|bXz3W1@N5k8Ez@^2h7G(U*x?AF3Xs3yh@m)wb7d{AM(N=~G>^l}mKAk7Db*iurr3CqxnMSYct z>VO;7y!Pj1!Fu0XaT-Y;L3R7I>=%z^*OpMsF!Tsj0QOk_n5n!l*c-NzwlG;A%v9E( z>Kw{}_(~Um%I&!{TB)b$xc7`v%?LoDB&Og@uUS|q)3RpNFP>b1VomQ^Q~1M zG-Gs2EN>0(VtL(`UMrS|A&?i5`i3x3(a@T|qM(`FX?Mx?CG;dwxWhc&wZq|{N0{4( zw{mLi0lw;AtEfOEn2QcdqbX&VE3*5VuRtg+u7E*=jjPIk0Z)GSWp)$c-BJPk>OT;G z6MEfB)dEMrQWQHKSiFehv^oR#X0&7V|Gn>?nUrjz)x|E-WLsmKNr;xyFyNHl3&x6h-#>A7$^eBiwsK5N<)Xf6; zBa1yWWUX12^W3q@4$?MwZPiqnXRy_85@ga?s#62+vIeu7no!rtOYYlElaWv?GYrTJ z!^8UDSa`HWKf$ZS;=w!z^?S_E==U-7o3lTJg6NlpT5|UUXVY^{iLf%BNklOa!#ov5 zr~OC8>dEcVCG?0xQQ~Rw^i3kzcxDQ8&b891O>wXGZ?PRW2nvPz9Z&v?LBvnvVHdA{ zpR_+o{S`?HsKxd~H?!wb(@`{`5qpQ8^n{d4G&WQqjkrF;DOJULO1;WH*F~C#S8h}Q z&5b7ZIK@lrvd5=Z5tBSPezmFymy1k=(fsk}AriEt_u3c8ei1eygQ^4St71)#BaAsj zO3G86&T=c*qV8@6L#4%U)stv`iS#s_;NHW{Xo>JCeKr=#n|)10IxWy9 zQcop_{!_nEcevSnO92;|sqbFfzkO^_W629RLzl+WLHqdM))&YR4Qf8k{M<&9PFhca z=Q=vzr<2x{aF*Bms;oig`?0=pYo9>`WG2?A3ZJkkoe|-o34w3wr0Q zndLQhz2(j8f*|ItlcQZiJd{~C79>IS_Q~GdVMmzyAvBofHFwYQp6U|TDWA4QR)2|( zAeJJD!WR>VzvpL$JxNZw{O49dy3e9Ui;mAtS@{m zo_q*TkToUshyNV{MXRIz>{Z$#tA2AZrL-I>@F~21y!!b;0ie9vHwmLC0uT)b_2bn) z_aZK!0>Ww$W&$K_s7v3wfsV%0Ka$i^IpM1O0A77eoA0{|TaLswuf)RU!$m8?-T2xY zRSHPMdaYzUb>mjvU{Uy7bn#1q?>57=+l|xhL3vLjAf^RN$d{+Se$(x5DXV`7?8}EH zs<(UXukuECd2TZLV*8Kvn}ILXIB21jr`L9h2@?V>@C?rFB+z7X4K6VQVpLLmsr!6_ z%%%f!mn&Z+ioEu>43*qDNwpx^5u~0`Gs_(+FL9{c7rcBL`?z3mgP;D*JYe9bzq?Qm zfH#|G@SVF&VRdW;$+p;}ppGjmw*;Du=?=XBrXki=eq?{5QDvNsjB>H<{2@LYf{^^M z=lBNx#Ja>ulwYeH*;lenltTb(AT&S~MGdk@!M*pYRR=q1v1(0XzEQ24QvYQ^Y0wO=!9~wnx+@$Kd+8b)k_?^2 zA*{w1O0olf1bh3`JCbB;kO=zXM%EKd2KoGcVV3WOpE=FsLW#+R3D(qk2+4H2=-5xY z8{{)nLz&=vwL5pTn@G@4cJfRl)K|a3D>0BbuW41}mzDt7-U+bAGq30xn^ig>aHHWU zrAC!Gi;lZfvrbTE#vJ}bM)XI*bW0{=+(bEdmQW^q_IH9|I8J1P!IT3FC0_e$h6I=4 zR=jsZsrSVo*v5yOjoEZNO`HyBtlsAp$?5BoorLO;fx~`mwI3i`zz-1C61V3Qg+;6- ztO6LUUV{x(k*wO!R;kTL56r~tB5eT|%VltI*FfiW%7RY+he?_9=yYGQRd|uPzmi8V z;Yi2}B~t*FV~zkTvJ-}Tr8jGuz0!1zJ(4OhEBRC56;QT%>~?@O?SZz*b@oV$&m~en z6?aUe?%v9yC)q(6l$tGJ^s^u~M^%KFmP(2ls2d_MuQVy1&~L94O_(Ikz6!(9q=*_s zj*ZsYnyse#0Uceyjj1kAnHEQMQ}9HEzHG~$q!TYt>O8A_GTH7i^^}-g5xB<50e>d< z!Y)q5D1O~=(LsbtRa-Gdf}6e(8sO5B#2HirDX9yy!?a08Ch?cx{mC%80ZO9|Z3uz_ z!TNHSO*(6EGIcqmf_b#2-Ae64OyL;k*pHdOG7gqoNA?BOCMuGx7sIIGf!qM zID$&D-73c{Yrg1djaWOA=2ijBkgsVXJ7WZ-{W_95BQy$ThXA+9+jyxu!F2i6Z+mSV z_oiyx&rI4X@)D~|YddDB02a)hTuk+GwE^DVZm5uD_2^cCrblwr>U)Y1At!*{!I7&p z95*xB1LR`M=;5Z$LM6eol>v#F2lm9kZ%-B~_JkEPP$TSq!7n7!z_JSo?jd}&=}+V3 zMdyY6c(MdK*kWO0CvV2V1sxl_H3A9Yu&JrPTEkg-mHiom9e@~Hv-333OXx^;O0lYy z?KB;0WHS78d^XI>|9#6v^XFakjk)vv@z|#y^B?@i+?jJOxMJ>1fBbHYBJq_MTyfEy zi!T1=Wr^`?xok83+xZtYfAi}zFKVtIPoKiwcl0V70&o(tCg^J(F^w#lOhc@2+Glxh zbTI*hi%d2~3|XkiaXB`6;AV-`GeOJ7*HQNSf>&<-3&=DdC)KNJ{LCpe!i)~aiQ_5? z>`U>(*I*N@p5@Ky+EafW&pRt;X9#k3mbWK(bBBGww2TI77_7cF&~2fZoQODe zO1*yOT5N?_2IxQ{-Be{p{;LrP6}{f|^)21}S_( zaXKL%q$;ZNZs_B$pPpPpXy|E^Gh@g5eXHmVw#TQo@8sywVy7!4yP<`URWXSI$1JMa zWA;%$?Ol<#-?uil1h;>d+A(uBkJs>pJXFsAPp#XzQCnSBAnBB!Rslo!uWY$)u_*`U zyb<;ox5SVgEKJ(@Jis5%TrmSz+>oe#ef}bU=QDmEK@gia_GT{^FhgWyQ+T^q!oINE zl#tL7-wY{Mqy<`-8u~c(-tN~ z9LUD2*Cf0NfpF+H!}qq3GRwz5>mPr+GmW-=Orkr>4impA8{$mgq$$cnEAN6SpLDGjN3g1f{{+1suOB1Oq z%hE*k1-&hQ${la;2&*Z2bp8N=vh4QSA7=#~FI-FbW1~)knJr4^3Y&I5!$o3G_L{+g zK@O%dEuxHu0}~(aMT}X57q8yo-S9&#?l0+a&{!OXEE)^M99#4=hjIjKHLQC=uZ`T6 z_Cm$mP*UP4JO`ie8~4|T5nAb_s8^u2XZi;Oh%m@qa{Z9OnC-tFk+%tqG zh(jBoh_Z7zSCuBISe6Gz2cZ=4+V29$Svw&OIc1K4Bf@Kf>$_-Ecae{7ncOdb@>tz3 zf*w)NLZ#c!I7;oOzL0W41kPTMyYC*O?5|B8+wUrt0yW9ZpN!Rb(#T#3x6;RwyM#-u6W9R#WTOJBq6w;!ubUN%9peEX(1BP zK)ljhG)lRt+$6*!;RY2We&xRiGi7d6y{ty!shiXxs$XZ1n>N_v7n^x#N^1DBmEXil z=}<{bQTa8=e_Ws}_%M=Au7y14N}Fl_YWfDr8Uuj@HeRuKc^I2=CQn#3+mb%2yi%J9 zxbdH}Xfg&3)70z$i>A$?{C^5u7qvvp*0`21=6}GZzx)^O3Y60;qNOoUBiTZx(p$0A zIl;V$6U;r%31*Yu{c;41kOPcA5`AxJvjP@dNEoC`g$Op4p$M3{AK)&L*UfuIW(r^S;dL zb_*2h9N6|$KU?*&d%!#0Y8?Ex`gxxhzAsZ2-qkr{{Ti9| zyHz=$@kTw-Qd%Yofg%PX)^73vv|S&44}SJ#Wx^A=p!pI_1ETu@^EZxH;30hW_$TVd zuOGi7`<%p<0INFbjq3#lJl^HUt2X8ICJ-U123DJ1+iJ`Oe)TG^?LK~Z?ZiI=<{^hz zVx8I|y1$d|_l!l*Y^4=` zvw*KvtQNQ7+9*UH8Jm&F+!bvQ|HVx)^@dJW!Kz9aQgF+^N-M+gsF%(Sc-?#Dy2UPU zy@G+N_JZ(PsZ}16R3i?iU5w|00_ICc)qSAXa~bV$gZ*2LMkP6}_M_b*zLd^B9CG z79iHC^Exmx=&ZO z+mUB6+i`8CQ8T&-KUdJ~TfRGqXg>3Y z)rhXXoUq?vg|<7PQo?wie0ON13~tJb))1CZujZGPpGn@;xXSOtr{5|f<|a`gqWz## z-CVV12fAZD6RU>Clbws8W%`O1te7ZVFk`X^W{%-H_5#;bdp_k$nHcKFMqhX6su4=h{a zqCxDxZxl954`a5|2K zVP1=x%n`+~c)2Ui_lQ^eH8!HjqbgF9YcMGK5b(6@RN+|2OM(KrE0csFP6(LhF#?KG zg5GsbxC*L*ZUOV8Q3>P%eF^X5yRtt9ukJ1!U_Xw;vReSpzR4=@_%rPGKC-AHV?_v) zM!jgu49*b)30B_>-Sji2f517uf3-4(4C(Ygi^^I!QJ1Hj!OU*N9L3uIFlN_qz*h8% zJ(%5B2iN`1v#Ps!*xiLW?o*W%29{zQ!J(CZLj&Ixd>LIi5ZXcDp55_(jBf`YLw+Igpl@IA*2RX`O4HeW7p1&_Z^P@{)iF zH?c3c>L1rDZ1mdi7jCECm78~}CugXmTp0J`$!&#KjH|DH`O1+KT2J`wgV*MAqgr0! z@V;VH{#7WbsTzn;P```w#gdcNB8Pm3EOKw*DxX`}L-^ zpuuR=0Y&rOsCVX0s2#lZadqsS`ihsh0i2j739l}vTgkM1Q$bsg8IkHT@j(wH~*|Q z#?-?yse98^G~V9q-#J8tTaA&qo1(GJFNrk>p2e#UzAOL8}P*-K0gjQcHbej3Y; z+#l|7C4Z+h@wFYn6)!)%=NVS9P=)SFj~Kt+KmIg7=6$Cp7U^leytbp60D5WTV9RuJP+*ttSi{ zMbwRW;p2iu^_rGkmbkFg5+!&sp~nd1uqn8C^Iw=~&eG*c(kL{|bvo%Y>D89txoK>e zi#NerxO!cjpyDB2_gqbAjOG(j8NIe=Ad<=HDaS@8rxVAP$NL`X8F6&H;t}t9b5PA3 z>T&gy-?vu5e=ayn^1FxTw&Wgwbj2B#8%&9gJSzDPac)s20t7 zU-MEMjrbXInZ7wNJAV3@XmI5wO;322Oc47l;e3nfC(wy!TCkqJBs zV8Hxu3C`H$IOYC?)bR-}qJ>ON4!(J{d>Pm=Ak0-{{sBQc`eI+Mlt4OnqbtTMw&nH< z7Jlyq{HfN&`ySP5r-W-q318@dn><3iK#B#Jb)h2GxLfTKsgwN7WwgAu&IPZjQ}CLL z$R&)?yd^J^u7fa8(bROtTeP`F#8y|X;|k5+bzy9B2g=#TZsj3hOG$7#S9_>wpV(Ur zD`Xu#W{tRTJ4i6Uch=eomBb0|d%XDw#ce68e?bhp1s|XjAKh$p|H=Z;uyjUn{#)V( zS4XRYw-c7B`B`;onRO{|6$-5?M>;wk-=*_Pgpr)E%CGL`4wr6~XjKVBZHJZA#AU|( zdMQ=1sm#doqtp&KDQHziSJQ<&LI@FH+j-g?H1CEUY2D7XFyg1@mD`FR9Ju07PKh2( zF>n@V;76!0k(n8-8ow>Jqo=Ut6e4dfm{{kn*g^cJT5rO3KlvoU6*BY(sON_c;5vo9 zR=eL&gjmyyL8&#+d{6e@=>pw-AKpEgY! z{mp{cKf?U0!|&$7^EK=oU5KtoZ~E7)6cVJ0L&Ea60#3s&i??SZIsrMNlb9h-Wff%OaT)YoW^mz zxaPRJ`@hx2!)Sz!A-ec4+20sCe`5AP7Y`AR{(~;Quu)xXxlRmJSjb(SiQ}CTJfCZf zKPuXN->PZu&V3o2Ti@}KA@p@u?x33A6e5HcJtWaQSO-B7lHjfFG{GE=W}hIaGfh1I zZ8ZS{_=lm3){!fikTq3eX)`4hYhg!lxl8%JO9`&uMg{`u0wv;$a%?`48Fo<9&}kCL zm42!kA(P0Ax$Es00CT)Jp?ixnMc4dQuQAq(iD+XyRT@uTP=b49tPJLhJh>oJ5Wg?N zPmyVT>h$v1-9zg-&gKS!)2sN(Jr1eU8^|u4()UI_&L(YMJo)2RlIZF;Bh+6WPkl$c ziHG1&pZbn;j=GNTE#m=S?D>X9#c`~!AaUs1b{fwu zo|PJrK*o(C5FZkf%?v*!L(Hy&UxZY25y?W5$K18RUds}xnutOXFj@2b)Iok~D*KTa zN02^~$|JNDTRyb5V-j$lN@$RaF&d_(Ht@{=6aTGp2!x5$X^mu?&DVK;@?Tp?BB#$t zZxwiW2t0|@w*{WsjvJRLF*D{Mfd^Uz8l#$qa`RL(? zF4Xd{{N-Z?OTlo@+eMU;NPkxT=)>e|UKD4{TpT93X%LFPC`Ks=HIU+?BrFtY5&}&; zbr3P#K%vxB;#C2k`0pZ&!J*IG@|t^x#yYM8eWrpwK#3oqkAqTuYHlMRL7%Ch&j4)V z4mLa->ikl$iFG`x0Z0x9~R{|^K^^V{-k3QQ6p^Bqj$XH{^ z6QZcUyHs83g+%Ib06B3DLqt4Dh9DO2h_>=%uAPKs4P=Sx4`pH?tlNv{^z|~5hEhZH zd~Se(6P3hM!%z#S$JxCo*0oO&{em76`g9qw7En`aP#STu4<4+4ju`XT6k~iSkt#cf zdyW%@?|Q#Ky|4X=g++ef`dq!Y;_}@!t-HIfIl^1<&G(6<*mcdPxW6R!cU0cL$C6t| z#JaZ*Prh-7gPMzIf8ew-OcaCf}=U zzBxC1{I=ZLm~5o&N(h4QQ9?r&jcXr-QK=^ER$q?*^`arab|MWV*y>QQ2|O_Hp7n^+ z57Fynj){C?NP+Q0;ng6X*buz^$Y1(0eoyk<9o|26XBsx7)}3uP5E9Kt_q@g*M7hwv zRz))Q(`S?fedj%gl6h@eqWY>bo$xy;hkNq;vS0_?iXWAHs|?C0!oGbY+Hj*Y(c7(= zSykmC3aR$s=PHxrR&A7Km(5SQh(h1ti(TKD?*|>%Kl-r%b$x2NKXhuPzw)5z%^T|u znvTF*g*LXquXxL^e&)(j>I$mpd7`?vd2Bp=Wro336gY{Lfb z<}Cljegn5pa2L_q;_UTSaBU>pp5gQ$FJVJM5^n!{S66qMV#(E=Xdam{e>+rl7R}b;?C^ z(sh8E9?L&GpFbVmYB^3#vZx>?3d1(-{M_szdLd$J`#Jm|q|_vO#Dt~RX0Zsck8qA% zhMN63t}z36;3sp1SFqh>*A~UoD}0&?E;~e*G3*Q!LX_Bbjilw+{x|dpBT>__U4CCr zcoE@P8i*e`gT}Uyt&Az|`*hPUARW7*=ERmS`72rD>)&BMrb;Ml*gG7!V1!#yjC)G_ z!k#NU|F_#+p6j@4_R1o~+Fb3g9Z{lusRe*=QpxJUw{{X5n~sr(1G-?zZ}q~zR+i^n zHv5$K&#Vw0_rBZR_HYXqFU~8@e)r%Z1qv3f%VQe@!gL`BuUZ%^mV-9z>;*k3^If}Nv^F?n71KwQY-P%)Ays3HE_-At$ z>grwi=pp_k>y?kdi-2(oOCqg;zz7V8Pe?f+;dCN-%p`bt@eGT~xGH#Y>5BxyJR!<8 zU4HsJ*kXE0v<#M-Mi3Ia6lQ)LP$Sm;X1ZP_&ZaP-7##e=w>OoX&EEO25xCZEXn%qV z3fGYeeU;>1@g8{Cy|$h(qF~{EnAMc6%X^?}wRf*Ki|&re#QF|jhknA+i5~K4;~o<~ z+-sM5hR(>eBwwTRy9P|*e)>Rv{3?z^4RuW5VFBQCkab}T0oo@*6KA2<;5DQJXup{H zTwm^EY!(ylP4eB2f!6YkL4x73PUsD*qDE~yY{`cr=ZXdz)N1JDh_RQ#z0B9h>7SelR@HqUp#PO`q2l4Q#sy6F;Ldd?D63wK&#!{z!M) zJBkGAz$vjlJquvYv0^n=U`O!P&szc4o72e%*tl>>nIJB+V($p*Ez?oNL#4g9fE~DH z7b8^JZ`=FYZnI?u3yj90&H;MeHA@KLv)tS_9WDEw3ygE|9(eO@3J47*V!CGIeYWZi zF+oUn7nv1RcW5)am`lwU)ZLANF7@`q7=>8&u*8*Boc>&a{l?Wndc-tDKZE&LnEme# ztqilh_TMmWL)VI@<0)`EHGtc=W+<56QI>x?Gj$C?UH8nQp8fMt`JPRhwbyk7vs~cG ziYfR-R3xGe@}#X14m2O?CgM!B9@eS(sR{N!fLR$jJ^O3M0d9WGySFxapo`JH&Za7i zB3Z%S16hQ>mD&c_z)SX0fM!=<__MsDi(b8CRDqYw@L^WmyLOFg{RuC^d#=%7)*IB_ zX&zMxS;V1ciysJCvU0j{JnMsKg$7&6Ae&)JaDn-BI@tX9nOQVYJ1mc>5I8%57e8fEbQ zf$B|%lmZY0Pi?mdGJ;SS&)U?k?i@Iz6U-&GsrS4U4|^;A*!^O$Kax02TT2L|4vn;& zDj;f&1xY%0Fx&Z24d$k0L!c=&p{y(Q1aRUx!3zFpnY4sNeir0r%<}D!z;(v09bjg8 zoAzo!UF{;fNar8ce-@R}9aSbgL_00Yt(8r6iq`LrhNK*>9Rh0hQ_@y`J4%9xw41H& zNx_?r0vS(!b!f{M-}bJRgk!!tlzDBTN!S5J$hInC5mtLubU)URI|>1hY#g|}L*Q3g zue6~Y-}5qn#r+R!ZS9NELSk&t@<&MIi;=TA!|5IoLZcY@?CcD*BBtI~RQJ=m6-;YN zv|cmxB4Ot)i^k(4pWLgQ5UQ1yUHQ*b9bv$)G40djrHh8{^)&?cfk* zPo__y%F61~3jpTr=G|(;Bg{AB`n#&q{ofKw(^L_cj}DDZw_7BncLI_aIEBv|)%D+~ z$d<2OE85IMFJ^*kDf24~Q$`h#z!KGzC}(-T#A0J#D#;E6b2Jx;uz=<5Uy!^_=cC!a z7yKK$yZznq+Edhv*y7?KNH4I;S;g-TCemw7+BBAv48Mx%@&oKlM7_=_(fzZ(AyG_D zls?e636XvJReB25<7y&6UdukNpsuskZSTv|BGp6hvJWGfskxDwFYq&93r^}>j_ZF+ zqgg@=^3YgjE!7yvexcuam;)Jm2QqUEB4HUIqcSSnsC4RT;7M1|BXpRqgTZtxwuwWh z*}r3HbfmT6>hUv+qoeemihWX}QdvRU>I!2~!}>G{!Tksau|7eA|LhE)i!Lpf7jT}* zJ}n|SUanJ;Ty(`fSHR^|{wJz?7=w`g2kcIA6Jl^hn^#FS5b2OO+bIV!KxXoDRg3F1 z9WY)@%>d?^po4P_i8PLE)FGJXfs~)Omh**!`HA~q0f4YAxKASTAWfr-)6==s0$r-J z&(IZj{TYrn`%LF2eWp#*mpw-6naI{?c6V?LuD37~G|gf(P1Yw0Fsqn41DO<o z(UWXzBuNN0$%=vk=}>ko_h_mmk+r z8$D;%Zwo4Cv4Vv*=>v+&%;>xVK731w3o$~rlK=eBSm`in+)Z7=q@^bLgrySj!l#b5 z=udd)^w%<;u+FP3Cyvc}CFgRUs)U~s^^&Vv^JYGAre(x^O(}d`$8(H*trc5z(=48R z8&j(ZGb^!U#uqYS@iaG1i@6Z@n<^a}MNhrhbnQq}<&37|q;89OPbpD;e6>2ifeljU z{ePxH;uDhREA=8zHZ5n8v&v}hGKH(A?0dn}VOdvhu>=NeL)1~zaVZjdsD>0zpH`Bn zcoTNXG+zuer@Y%|(RSo3bT^T{i2uKV#INJJgwjbRGC(~C95v}>S-CbYAOGK-o;QB~ zQK#oM%lQ$eXN_gtb9xvCF#6A@=OJ9R`={r1EA&CrGd@2(zp?2YJUw_#eZ=YciYW~B z%%7&!BJliIr^g5FK5%-zdTV}qUe~lkh~+ZlRBGi=B~B#9<-8B@-K^myD_;JQGAde= zGB!#~&Q^`{RO5E5acQ&_sAaz&sy@ER;X1x3TZMGSYKf$IN})`n8dg9dRrOKw9!n>6 zsnW$3M`}v+qLHhlAJUr(bo^qE4z=2V!VW3uq!WIp>sP2CNQ6jc1*gFh%rnmVf)6ES zV;vKV<73L(1VVzN;~UO5%YHSt;2y zoot6Vu!NA%3*c!p@azE*P=si`7^myHYdUb5q)U>@0-vO^ffF_6X{EDv$?}v&FThJj z?hW5nPW|4>Q=X!Mp0wwXfrxeb9^!-REi6Xx@l!-HIJFoPSBctHes>iLkh0Gcae*@P z;yJdO7dOnWM7{-h@+?tn`g`ntSOI0T#8Gz57`@>DQpd(AV-$%%$eEQ_bH%~I6-KHVu$Gy7uYdScMKqVmddTZ)2zx(w{r9Q6LFd*`y z{8n|Yn#EQ^)o!;UgaT4`Kt|D!pZcmp?}>)q%92NK%Vw_NMe&txy$z+i^)@Soz2?X* z#vGPQGz-h$GQEE~Zr_t@VFcQ`|d}(T!k#&Y#zp0w+T zWz(2PGoa&VG7CLT?Cr?UqbAC0v05qOZ3W}C&n@I-2zMB|D)xAU1gVljS4Ib}6irwm zT_t3fe5&FTlO_eRhMxw=Owoa1E}tZ6hYdWL6X0|$26b%dSY5?Qs^J+eoM$P|5&swtU13!Q2dUIH zmSbfN&|BC*Xxvj9QZ+QpU@=ix6eb5)j{suBb60(YLQ^S}FF;E}TPDi*jTZxkZ}fJs zN?2qQyjyy^v`MI?PJim9wQFNXs-L@hOQ`B@Y$CBiP}EckAT{EVt$JCp%3HC%`-NiN zFWLPPM$$(^Q~c3>Y7VNv4C9rS)ow*|b+8aY6n&s_HV3fZqiIgV&iTYgIBnBx)^Z(*4UzI4=XR>H4<+2fxGKEsP{?&+>C zC6Q;b|oKLIA}E5KQxxK3+Hy7A-(M5ugXcb znZ=#kWrv3=ecNxIcGp00#o_0|5-c0ZSww?<8{)}piwl}*Nc--(5329eZ{0Krq7V1# zwV8aT+fI%Ul2MNADNbPTViS;+rnnG8dpU^fhz^zZ^I@I)LmcNS4AL(RVAONWl@_A$ zbe;IHEd?i*7#}_bY|zDU2hciv_`KNky?HTv+HMRmK$zehHe|SZvM+e2Se1^5brO?_ z6>-bKHQtJMaEsgWs{;yxHk2E@A}es^%dsV{B~0oR)0nyDJP|#Zi}Cn>0vpjowVus= zA;0Bjx`mvNrs?+Pq11_sygMUFd!V^)bF@uY+r75lPG9X;JbVQbIvHEA{+q6Z-p4GmBGWnVhhNPa13G?XgC9n!zAYTiP zLu1%tAc4n%IP@D&kB-J*kY)qU4Qx$l(tZLiXT#k!g?nDts6^C(brViFj zRSeA3ejQv|ek}W<#*T{PY`)rT!F$=Y$HzOhpRT*zW48DfPM6=0T+;`;?!gzhMMY@U zIb1vQqWY5h_HE7Iaw|S5Te^!`Pha8nt}WpxA}n*Jj-2H0KwS>|iKmA}ooVJ>xDb-p zGNC}t5fm^FOMc!cJ_X-IgVBQJH32w1u?!asukChgVs-9OuBbg_P+K2T)d_o6_2Yr6 zn$Pr8t8*LacH7;gCXT->TGI0MK{cxP_;772^sbkxVh!|n@vo!|>S9b8s%Mn7JZ|b% z9j3K9r_|W}Zfoldi?cr>+m#KL1!P`3g3iHEE-prmad@7+h8(DQUi*D~(ky~dR+-a% zt|pFT5vpJIO!9GpMmPi!u@{qvIR|vBaVhcI9=D;+FN8B3-gpL{jvaqeIC^uK?Y(v=5I5@r*v4^(5o)Al9m)(IY4dDRY1@>l%8 zT3bSAM$?(G3d{lC&WuK~ck+qp*%J&pnq116TXaIHS3=Hx^&3>cGBi6FWo`73@WRX5 z=;!pSK?XXeq&Yf+F%-63*KtO1$0;M7npQ49fYJ%0Xu)n%=THvSGx~YK=ZMmRb(irK z;rq_?fM`rP|@&N9X~&LbM$G>_zy% z7+lvn-FcqQ#ZhV5vIzXUo{X*EwD=`8gLCfCP-CbV=UV#id7 z(wRu4RSf39=rr=9@t@+99k%(-Ti%f>S{%Rhkup60sB=oO=w*ag zI;=R}_Yh}I;SCee3n#+IhO#<9Y)*ievxh)r4hdzaM>@~GnyLkb3x@M|$oxb2JIsC; z&EJ1~7jGjL6!W+EiXqDjR}(5bp4v{Rwr*n3V6LpMUe|oU#Lls!>N95-PW;MPuRis3 z^Q*aH#C-K*-amEusfVRqmEkO^V;FRx8i-B+K7ML6uA;{_{74p;G1G6v*JI2%O~Yag zer@p96ZohnA1Yhztr*e0m0i9uWe0J{F+CO!hcRn(94S4l7zmH>R&d>bzDEYWKN@~_ zM=MUn3KFONp1v0x#+m;m0Q&<9Md}^AD8)BN$CA-#f%b1+4xa9MrZ1M}O6$~dY~iy< zZa)9#m&H=xYCz|XdIku1`e?)oL!^^ zkC%qk!{NRTlv}q;llyXBxg{MDVOuvo9P*ae`}%S)4^&zt5{nMjF<$8z{BK*&bfvOi zY5L#SnSQ?q2mc2;(|5_(FV_EOI@9DmtNO8V08_vIXFAhcaIHaI{J*I)Z6v7h|3GJw z9jd?Q|G&=Ubf!=L`9pLjOw-z7tv)B)`_>+U=0h~7yyhfv(}iftYb;K4(mq7LN?}Hn z0o`&R&1tk{&T9kzCC%x$d^e;xJ&#v-z8fJiVP+kqILVP^I@0^2=uQI~(~e*(ZV3Nh z)R+i>@V}xl4ad;^-`1Gs(~18jjp-vT=oju(XZKmqFSP~z(pAL||KDBEJ52zaTG7)I z`??BnxQ_wDR8|>z`M3Q#IXVQ@{4@<-;-u8a)zR>qxhO1@TU7A|5#;LUGA zPePkiH_SMeJZWglSb1nql!LZxM<#LqQ%P$lAy&RW=b0Z(dUD)!|Gvt9aA^0 zcKQe!%Gi4AN#?|3Z*k0pHCNf72UVj5PDAix*29AbG08^g z#@q7M53r28(VAs^oThhA%lP04j%j=>*|eF>>dPzum0HNQS|`IN>lKtl4p_+ac?Lh{ z69~x$Fd@PcPjl6;bxmK*DMdiz-J6KcsHOIERC}XppDhs11K@p}UBnN&H;&sY*DO~i zMy^kc?9Sb4N~w;zl&1*H2BMzMs^N*|V`Q(}?x!y=sT$t$S$BG&&^F7C%h~8A$>cw= zWRROr?&D_H!RqN2h6Ig}9y!5G4bX+mi&9qyExZ=JrsbG(vJ&R?p9W3sVt=fIZ`vP| z%tIp+Dj)F!(V%m&($3d1l7;Mp5w#M$3%+Uci_HmhY7&m#Vl{-$J@RM5!D*goz2B)x z1tt5cLWFg=ouphm^-`?k8?s}>vBT^&`*O{wG=CJ>A_vcqgea?e1^j(eqMey)vDj%3bDy?d{Yj;lq*KS=pxqvA*l)h94+YYo6Y_}K}sZe1d^Ux%UB$khDOS*feW z)pkrc2;|bF3_`9vJ7YD6>3F+g$+ab&2ijVc&4U{JehXWgxectPS*J4b6fCRhTzGJ2 z%^?tC^}}AnIc)#hs#Kfu{s9BHCsfIu-PCt>zQ)?lnuBXQ{X-HQ-qXTxRdZQw=b^*vsx~h;tgh60JaW7>)ZludvFTu%#gJo9EjQNyOo@q zV6wn%NxWhdGy)!Rn%g)V%pN|SZ@xSCWY}_k>-q!tquK9)dcg|qy=d2|%3rHPo!FO1 zoCx=rSkg1`5H_PHmK9WL6CZQ`&fv4?VKKSqe@r+6UmTD?hbX03*o6fX3&);|y=mGd zXzyzon%cg)AA;K2KabL)9LHr-) z&ICTn>gxXq5KLHnqBS;ksiTe>3TmjLiAzl&ff=1Z6c=23sK&-!#0kBFUiAzF} z_{FR>e5H>CLQ(!_?chx;tKD!&8k;+34Wwt~;uCT0as=V4^C3^s#6k57nrKQ++Om1` zuK5U9=>~;6ZS?1D64D&x-jlOV?|CT^`*_pb`JDYw`~1vpKd;XJT>fJ?GL(t|vayeG zhl?5g6+UH*`=Dsz8jPHmGEntN9%$OozG8u8Ncd=%NPRp%?#74s|*|E0$nv#dSZx6!dt-0hZASVyAJE_|LQ88{U z@fDWsr8>HN9T?)OIw+@h9uzNVH3P$;w^H@8-zzcPbDzLY!WB zC#jd~AC8o4jFfzc;9+u2An{&KpqDDFQ99io1|&hpBq9x&dis!G)-Qj%xMWLwpsq_i_a~MPu)dcTB=K& zP_}Y464=VMVDosLCX<1gf-B`ufyK&6Gj$F-Np)wfd=3_xDeoh0pB*N*(*x# zBH4lda-H{{?$67mf@LX4ka93(>){5Cov(m);FlhMEL~qq+TUPl`0s(5gapcMd|n-& zx92`*N1#UA7oB>-c7`Hn09Ydu*&SSh2Ce(a;pV_?7l*{^dH%646Xn;FCVqNa9Ur!) zR5LK9PLCA@l!V6VBhI@6@;HHJSh#MPdef*QU_=mu*KHh710LY+Ewec;fIa+wh zqPGr&0hJ)FZosSJ)!e zSYJRBt7)MQ^861zfF{136iwXX?+BU0pI~2X>*oo^jahdBpa$kioYw~Y+)_@^?WZM> zjcI72S@WyN2%_i)e+`w_E;vXkVxiKK>tZLtLwZ(7NV=C9>&-X8Tn?BYaq<%FhHDD; z3Xohw&O`D668PtU<2F;@w+6>ah1-B*{1^w0zw-g$czK}%M~2(~IdD8fZU0}u5k%Za z9|TJJ*G|fZXmT=A3rQZ1O~ww-rrB*BA-SNfjNAmpY4%m-7W@DHA}LI(=a#cA(&7AK zf^-kTZAuje4aA@YN}Hj%#dC~RcqB|WTX0mapmL~K?hMQ1aKe2E2lH2GE%aw{P{s{C zNmaAUot4iKTsJ9E$vrvNmSn@C_@9XV&jvPj|b%p1|O{Id_rN8FFr9rCe2Jf+!CqF>*FB&KX~|FM;9-9t87wpXEE-lJOp1ic@sE*WZ+vlB!Lhk*xA;-vNcAKR**y>7%C`n} ztjeY0{CPG0Rf=Iv7Tx%@Nd>9dkWa2(;2H;;WYKF}NT_7te^%zG)XDY@`#NzY1f0X( z&9ykJp4D86keKm*+Qo@s>=H3e93Oyy2CU8vmm;#sVZ{F_f>49_L=@=&uar#dVM>*; zeC?1}VJ~?nilZCW=m;+IYod?#;h@(?x+7kcM&~~!EQ(hDx$SQ_Cs`W}i7{aj#A&oF znQ#*W4lFs|?Q6gWG|yNZf2EP%|CRDtDp}PV{3xT>`&W=jM`^2)BY!bU39d(kqnKaJ zz@{#TcqH=0vvNkv3b+z`h3V2_zXr$Gbi=^Ls)EL- zeF(MZBbGt5da-Y<-&HVVuNk=>qx%bPPPJM9rt>?!d zq3)h?HbhHL%U5osWa_BsH-s_Jt>teHi6xtR8{!{Cmw&)Ebg%422Sk!!LdV0svBC2| zj8&E)cFkYP=xEuYHOdfsmjCFjWYd$&j-_kpa0}36eo+cntMuO?pMcDAtdq z`T$2`B&CxK1p_Te@1zVt_$0}LgYxXaLQBwm1II&L`N;2gjKFVlaDNo|%B|h?&ZCt7 z<_|UEk3^g$R*dQ;*Ulw{k8u7$b7}3g)Si#)H4mRAosGHYW%he#`lNzJfOdddQ9`Sy z{XG^@EOAWg+YfBX*!FzC_vQLn;=JP6>^Y@c&N*tE99MQ<8LHN48M5|5=HWbt;2pPO zLW#&}Jw?s1CqK4* zzfR>5#r$V{fjxnl?w}Tc76ObJF zrI(;4wZLl#y%60%ApIksXHR)2C->_jR=q#U+bZqH_Z zA;}zT7ir}6;7RJqUC9sKA8t~;LmNup0J-GnGofxnPRpzXVc}g2vFHapVh&3gA#a>` z<6p7#jm)WrM%SZ@rHXzEWp^pTi!a`~&JzaKiRGkd!uIOiKUZfJPI9u31)eV>xE^v@ z34e<&8H}$B7dv?0mj_HSF0h@e+R|K>wEmsH!&=v1Qp=|SD5*m2t(>3Vw^U8e?_*~v zGhdU>M|P*_vm8Et#t}RJavN$pF4)=K?fj0&bW#ZswNR0j6Xmz1bBFgmz2MAiLiklr zEMGY>w0A)}@{QB|P3ri_|4BK^w&R$>{v)2SoT;9KbDq;CfGU%kxQaS;CiH6kvLi0p zLHjAa+-H?4$WZec5~f^&p`n;yv%An;FH_DLT_x}Aiy)qR#VOW#uUhh7N#V6~vqU+o z=3x!QQves=+lK+JoYcoS3(^;E<#R;e zYP|l8Nt{qtQ`pAVAF&oe;LG>&+KR;g?t;wycfKTm277no*~EdZKKO_jBPN2)$aJas z0wH6q@z9`&+Oe!m`H;-EV0n~ejsc=F69ZOkgMIvX=##5H=gic_mNYiJiGZ z*#~O6*&#|FuO33PTd_8lPKFhnsBI%e#Kh#i5EVmKQX8WYS-&Y|FH}lzF*>lHHQCb_ z-cEz8u&m=s1EqiMUY9U1s->cT?efKC!jU+bAb%Q%tN?Pk-an_j4pj<)sWd%DBA}oH zh=iGd$hq_yhyv_czAU$V3bkW9xa~+8Heg+x(m$5elgdtFi6SJ>4VtFI4Au`A zZ4OqcMU*wVZEk=JO)#d=eQaMST6C$Tm+IwkAB|7?uIWTc2}I`kNnO6Lzp?eK1~KTw{v7_5A8|N zd{wJ3fd?W}g;IHe?S~9*8=WmfMc`sp@k&JZ|qV)Zs41^?#$oSA4M!uL=EM>F{6n`a%#s=zq7v^WSsU z%WOmfHj)(UAzG>#p2cE_(1`*m?Bk$?)Pe3r{KdQcOAJyl- zCs_uOj;#kNZlUIV+=&<;`Ss6=AY!f47T61vl7EX6s~|z;1(65DQ25u*(U%x-L}OJ0 z?Mk}2aini5V&C~dL1kiE2wKW)ew>N%%R46;$w z1}FnG0Ab{b#FSPiR9iF?)1T-&K{HimKEJl#&>gK_>2?0nn)$%rz@{Y@6*6@yuhQs` zH*<%wv(8TqUXw}xY=O2lAiS{mlPW}Yt8q7}w-AO=x+;+)Ms0UPaXPBEHF_4Z9_k9( zS&!&9vpBtny^SPBKqqTMvH0bXDWcEfr$Tz!;Wg2S%@uzxtuiG7d)|~p9?Ak!JsW=B z8u|51gblLwx7ED-=Fho#X=7jL&~SRLjK#u&5U0*pND#i0+VQ|=JmY~rC!6gwng1si z=k}C$L}_^Ka#Y2*i)SUObU-|-npH3>volYKv=OcrAcLB0`)a@&afWidk?nt%UL>^_ zD*S?l;dXT);ZDItXrL>d;qUT{ZUEfQ@O*cTWInWea&hWq)Sdw(c$WEq5a8BCBpmT@ z1RegZ^<2)~Bx>qAe5)Wh{c2HRCS+3A`?nX1cDNv!u0=r9qC+VFZ#jzvWQB+|rDKv) z46_BQK8^eSuVwxH(HSoPn%j=$RGdY2!XRs~Sqv(Jc3`?8|W75e8t^jqg;ZR3;HKPzv6 zx~&iAKT>M`Bby&avvd9sFG7EU-~ z%x(?wf406B8NCOa0Ix+ekHz8_g{WRrTF~~>^t6V;r-DaqH>Hn_C3XqNs-KzL7|lG< zpcX}XrzH3IT2xgp;AX;tJxa$PvBz$$t7C&NP@GwRbzavL2!=4RRB5tN)GJkAD$LV{ zLQXK7td`rzq~25s{>6m7v-v*?*Fad-JmK$`6XT$IA!<>%^c%6l4{+Ivc#}4wi0#Gv zq=#{_WjLlaV$G31Cv;%wOqTuCp1c_2$ylD`P0sxH`slt)9(W9PbICP_G~8k74`g2m z?O#xFO$l_=xd*8}Wn5^T#*zmnS~20pIkJ}9Y{E4q$RQmzvw9KS z;tVYbQqqZvlr|sGZ%erMg`6#+tx83vnJqPvyeqtj8nWT=WUqw^wN_8?mL7VrGC3)$ z1*WXgOl11+0*&(t)yk<5U#^j!NrkO=i@c(WP-x-0FfZ*xuw}xLKK?J4%SYg9wEUT{ zlpti@99NqUfP1@a9BjI0eRbQKWAsZ3o7>LN&dV;%Z?Lg?VL{FM#~_!=@FZsCBoK|B zoQd+U)xbqC{p-vwHvktCHp#+-oIpQ)D59g`F&6#oNvnk#+>o|&R7RnYi& zjhHMVfaDY2Rz;HTbkdkk%2+wRG(UTh;tbKtvN9IS@*V$m0x4kV!jpVF#C)WI$)R8^ zznGY_{fJ+pewf0p6^&kM{b&jLaZ|XR@+weeaOygrm7v`$Hsw%ZqiFI%rE~)G+|btj z`J1)tZ5z>6Y!PiGE~0JOk5}K=cGT# zx7e2ZE|&FKnzgnAH_7N!M%al{bj*FoU0JURf&Q}x-a@sJocEP-??>e-Am_$haNFl=oYUmT*Kbap z|K1{|(pgmViOG;~lcf9h3|j-khGlK7S{F!`8Givsb6TY6WyLs)u!X;obQ2gK2 z9}OmE64E7;av%vHI{JpS?$OaVvTcIQw!@_9$fof&LV|^6M6;%hQ#BrB0heuJyHUP} z1%A505C(b(BUZD#SZpAz)>s~6FWowZ}CbU5$vZG zq8#Zfwi+Nffb-so=!%e&nh0jv%EGovV6!O0ydl_jO+^THiM0%s6SV}w;T z;7pCovDB5NPij-ef1%nB}K50_JRMCptP#sWImN{9Tus6 zX)apjwDeWD!As@P=UVw}m(DJ9^|UtT>Nwr%Xl>KUe$}6}y(teggcundkq<=58~qy0 z)xmDO>A*7M!v4{Q}vv-vbDVfIQ3+AXN}j>rAB>f)E5t>DcE|huT-K zTj36gW!X=tA-yVwz|-} zec{d)K`27|YA8>W(;>#>tFQ(3)q8{1PJ+#^8m*nw*Q{P&b~ zFh^4JH_{&Xle%iUecSZ@?VW4UdGnJdTm;2UMsDobxPy0{^zn|qeY{RNN_F&|Vqm7B>-Lhuwz(gfc~*=g7Rie#sn zrDrFL9{3OQhU+$OINBmtRY7W!r6CID9Ei^l?#>eITXdDbOmwU1{pIQJ2p6c3sXRZic#9)J+VJMGb z3rz~Nn&<+pl0_qD%h>>0ZQnRcl1I6`%xIkArwv!FTG7(~_@m=`Ue}F0K}N3NCv_CD z2f(C+Pg94uYY0U_>Hw~_%juGQaV~)R0E=o=UtR2pqAFo8>YCit?rId{VJ}8@7 z#bJq3tK1)MS2<=OJEyO~&!P%4J(BtC=4I*vW<<0YVMerAG{PuL`dX0=o=T9Ke9br(tzK$aHSdu-8?_6B?hU#y{A4x{L`}N>0StjmoLYq+^mb8##p1 z(KVR8W;LeRfm|CyK`(#^3(3E{@Dy%vds*vwI>d-9bGeL{EYwY z#ldnK0Y>ZN)Sk?QtA@DFtrq5@ylQGRQGip`X)f#XYtrE;slTYSb*Rn0%U|L*N|Z>jjCyJwx$wB=kqc>-gQWHGN0xc4-CK) z)SF;};qv?{Q^f4N3^llgaW}X{?lwNH){}Pw*>u5z!vqq3sQU3?m*OSjXWW;s&MZU8B{nU4kf^|3Cu4vz3$INX=4t z?_J<-Vn?RT$+)7#2&v<4aW zGJ`G5|3EyB2JlXH9p_6k{^E>)p#%fU_M>d`oe}155nXK~s@g?_mY#q*e+vKWteG7i z(Ltj9Zif=qUQ8`|%6$BWwtgLp;0~>0_*?uhtb@bMIyl^{gSi0KT=c5n`6~g=rA*t= z(Kw863SGtbn(0Jff~_47!;!_J&?{BgYLKXKo7mNUn-^KLvzA4dKa~W+7)7usf+!#Q z9ZR5@WE0!5A6U5*t}a$p6YKBx>w&Y1J~oLNtwrBG4sB%u>dzr8%TSII zT&6K{utgYU;$*ZfIswyOA+Or&ehCgpswoN1P0$W+zI}xjPY&^CvLdU8Di0Z6C*`z> zsU_>PxYekgzoJW>?J|NZ4cB)OW4>74+Wl-s{>yo5BY7#-Tt-FlIZz*8oEQ9Y;{0GN zga;#ynK^c?tvbBz?5xa-%Mn>g#fsY7JIM-M8W=Ygd!2-E>pBRW~>%r z@_91y$sgkl6_4~H0`k)r=?Lkzv}t7xomCEd=h6V^E45`~sK4I-HQ6piIVuhEJL}_Q z*?g+P2%5S>bPp(33CcC*h^KtJ$Qc+xiLGYqM)@q;uFaZOa~_k_*b+%*)k88lqr}f3 zy4>x0(ibKl_N+n3Dk%xt>}XzRA(w7GG07pWZ(|$Fx+?nDeOFz_K(}`!&eV%p7^6^U zTQFbP_Qnh*9K(Pd>#Cr|q?q-wO2i*a^+`y=QDBvgG3#aOc27)eh$LM9(h*S{&W{U# zfr<_lf=<^X8+L}K1I$1(zL{E%k-&Knp*U{TCMR?dKr{zT7Rx}Bf8Eo38q zFDM8DDTC?n&u(#)Ww*FMIVvv5W|SbiML9_&g6tN5rmY~mMQe%jQ*`xc&}6n)tFOrX zlgo*b_tnGOe3i{=p|8GBRtwTtM7|Q+CaXnj5m_zT{wK3qO!%2r*ym@p*o!hb?#yK9 z?6sVMHT|E>YM}r}(;KIew?%Or2fz9zJb(}yTw1`l*1^zb_NLn3pNRat#~YbOU-pKv zJ*Q$!H;J*-@_EkR($3?#`@}dvJ$B?FE_>xJuWtmmClrtG9#bisrvh?!)ABXh@&o^r zIf~#~BeC+vr#CBrL7^90S$vBjYobMB#XXP{oeW>g=^+zv1wc?8`K_PGw3K(U`@K#9 zSf42yPPlApXB6US@>1;X_uB~}_uffIA!nJg_eM{`EO8!W=-R4=*&oaR_g$3J&e7yi zWBf&Y7@7Z=9;Z{0B#xKJ+uhtrfj40)!aPi##-EdC88MO}zQr4LQ&_O@hfDFhhb#SS z*J80X9-k6v>iC7!4M^tWY|~Ad!T<9Jeu8`k(NM+ql4vNev}pfbCKV_pIhUi|Wkn=D zsfvW=HTa{z7~Ix7*O8ooEHSB3*IJxBZ&8O;c%ClUi=1Sxwd{Xg-%bg2y^*(lddn)G zVZr9|?7^2^}S;@V-JHt!#GTyP2A5FwF>gKd|tOOtOgd80e z4YRMQ)F+DSghTy8*Z!>(i_Tx!$PP4&BK;O2FlGYMOD8e=kLw#kCL3m-S7F~5zBjhV zM7reBGk;o!L)70}kH#?0!1X%9aqu0>!QzdBF9V;6A9_8KoK-0K2OiEYz(?sK1aZRY z-#0|_(+|dytSI`tmd|TfOp2&w|4I7pR6CxwM>%G_6hLKl-wl9^giyuUR}0cR1IOb2 zHL-zUMjWSO@gqg>#^_0l6QnFXf`N~0KJ|MB5}4NG))IyO;<5U?Z>Yb;RcykMeu>-yFB2Vux#Gy zRVJve_h--qE>>oZabl8OI4|U>>i!XRLV7G+ffEGSxq}~^qCb}J2uV$$TY;ZCA*Ee& zZUsVS0HKoh25sk!uJvFRXQX)~uPpb=cnZZYrxV56_HX1EcmhPg5eR7`=B0}XodB0so%%@Q zx$B4QM?xpETOA!?0q(MZt{;GpBRgyu!ic^oO&9qmE!&(q7cs+?q^5I`xAyDhGcI=7 zug@+LL-ykhi@aSgh$$nkx$EDqRp+xEv|%e(wf?n74*9Z-;M(l*COo6iT4GW+72?ql zwEPGWV35bd3GYOds$J$N!idAkNGf?QalwVs5-L} zQXB+C4p0$h277$Y#HyH^IRzEMh2qwBv)q zOAd`yf82Vo@q%NMhgMEWh7Xd**1hvsF8V^^d3;@_Y`nS>~hfxpG*q*FL&VNnmwS5b0BC( zja6Dnq@EC+C9pRzqDbTbYG_APPzg#@5XR#;r^cScGxQ{#dUUla*U=|Anj!>DT)D#> z@mNXzuD3C@i6P31Rh*01P^drH4uCA^UsptHxYOozT35HGD(()w7q{!>-k8xAf5oCq zrk=g}Y+WOAb%pF)2YqfLD4#FlGY*X~45tN?)SWu;zZX4(2(7 zPU&0*JBS0E#UEe3o-IUy^Cs^B?lUt)*X8~X;<$x3b%e{yJmKJ-ynOd9Bz-eY@D=}u*~JGAJ!;~=PL zf*>*>!QA*i|A9#{TPfWCVmbj||8!3J$^YzhZn*V7H=UA#1YVoX_5SEGA-A&*nJqe! zT4=?+P5v&cFd;~Ey#RGqPf0udFe!)p^MRJ)lI6Rdr`uGo z^19AK2B)GY22^yH6!!tO_{;3kl5n}IGB=QprVzT%#EN3|+??}Q4&}&TM)84vBu*9` zRl~im7@Z|PCff06aep$5lz{2McN3V#J~wtfnUPv|9h>PmsaK2o?PGXG({ z#A#hZ?02lIZgOQepHr&FMyHnK0p#8{^8qrLq;J~=$Z4u73y>TxVUqN^8mJ9`#0OOL zV{H`2v4P-&qW1>eX#7c?Z+0v1qNs?QBh~c-aQLUey|`i4B>u55K~i(8d?%s`bekNj##_U;Pi!2goyB67EI8 z#E_VK$p0$65r3;dSNA$CUjfV`6q((#*gikBI5K~QECo&$_yE88)K7RL;bw+&>qPuA zNiaSb69PjMq^X)y(l%o_P-Dn-|9&?$l$yot`aR$! zdTx4(X`ESTl`>iB>l8yB0^H|@s|wb`P77OiWz1EDZJuPS3aLU2EuwgoXgr%HNQ+aV z552xw?iDB4P>*gIFCVC~+tyAjXx{rQf2R|+iXZtQV6TH=;zWXa>VkLjG%?t3Y_>TO z$|gbQ*9w>&J)2DqA$QG^#4z-Rzco~E_Bt;UVlV}vW0QMS+1~2Q{$7U4;>y*|`3nsa z^b=(h`iZJV5_#x%3pSBRf+&Y6GQwa=MB$zAMC6=UvLI5J%Dmy9^dYlgpwZumfoTRS zy)Hb()9l58n%zbZVUpmm~KOPmhofY^F;>ZjCXW|ywVz0N<{ zO-n^&_HrR?$NfWvtgJ)%OhpP;fW6afg}Ki$d)>ebju=X{Zvi6olCibq)6X~<|ET6S z4_o~+p@C6|FftD7U8_eZg`;OQ-m^{d)HF&fy`RGH70OBzYy2mYdT4^yg!1%{$#XdO z^@#=k3sV)Wbo7HaW0pvkMR=rO`$bcDTK&SMJ4R+dtPYc}3X=v3yW;Ji@Xwy?6km6M z=KS}B54qS5ya*~tK1}N;U|~B~GU7Wvhyc+r`%U1@>c^OPmco(s1tg=9u%LhKPOp;b zJw7;X$r38G^rxX`^yyu(7Cnw%Q!uAaS`Cl#-5e~F_5x6rL3zm&=KoR`XS75>;2#T;KNM(G2Cr~`=4-M)A_z)%`4h= zrp6uF7s$aN-6%CT5{>U=t0Ib`+5b{K8IFbOXn8QycsD)Px=(z0#~bbQH?}jV*0mjd zC9SU{BWv-{z2q+)J*zwVPPybyfbcM#BWykZ@A|usBd-!etrX3y5*ex~pgXO&jvV-Q zTrom;t+||TeBqz+#~`NL1{&oqb+0I8a@^C`X{{(sTpasd|3H;QgOH3DjqkxWwbVXZ z!iOCvgyhjDU&mfba?k09DM;@fe|*@_BqMzt8;gkGKWD^uVuc$sZ%`LiA4-wb{xoAA z#>yDf(T8L4FfMH9Ugv)HEacs|yrb`0Plu3rojR@Cm;v|$M+kNyli)V?ek++-`$j z;h)hhNU6xYS@b1&HGAS)BJp?q9a%A2u{Tgqj`-OvWR!w>Q4o=e9L>^J@zIyxD0Cb7 z)Uybo$)aoi0)-xZRwQ|ogX;bbM!yffODI-W^#X50XZdTR_OzB;{~uOjtm^c|B^|`j4%~H0$uBd=q0Uy&lQsu-q;@(nJ z(D8O*WE3tb6ofq&lNq}jNuoEl_uJhk78P`#IIa|9BCaZxBsU!#*#P&ts;DoT_$tkn z5`Ch~OSov@wzR?j{yA#Vy&=p)V4_FYH!=crK2(C8uCL+xUj30kP@XAk-4VgH`qef- zxWPX(rSGBfvpUAy8K%7u_wh||Ho+xSK zvQqC`)9!sK^9ZRq2S-M|z+QPD`6i1a)xC4EDSGGx_HClGP(4N%L0(xe0=3eArhY2{ z`A(sY&VD4ONuWzi#L6_eCUS4v%(*QyFPt+sGWOxfgBQ*@_oA~enR9Mr?9-8l&c0;k zMKjO4{DR2XmCmnDUi6JJkf^(y5yREc_`iEb9stWDBtH?VH6+>)I?m*GW~hNAlY9SJiaMB) zsuqI;o)?xkc^55j@@DjWRgbDf?ni z6K`e+U1s>JW*Tv7MQVFKR=7E~Hv!l~-Ul$uZ7MQ~u3X+1sb1rC7zLlbQqYYi?jIVl z-z7tZYz~oS&-2Tke@`)>x2F$nqFrmTsA@?G?Z4QAGXrb5s;wznxDxpfvwTl!!`|;u zkj|ziOR3rLTCVj%Uz!k;a-z(B#{(!N{G0?BWHx~+2!^=c(&0S(d-p2#h-i$@(VZfQ z%luLWiG0;fF8C4=kqZ{MKpJPabn9v$tYxn}CFFVC|K0@9uVW=!bs4tm*svPE(w&Og zdSyO35{v(-A-;kWFj>?t-Q*K~<=fiazYN@%UeP}yHjVuguNA71wo8Raogm*Fy#7{L)&yC8G!g0wwi1?Re?|4#bGT_ee31GUPs zWWojZxMo;E!#N|m8w!`#B0D6H4fYuoYA}8|D|k2sCgZ*lEnHQbSsS@WoS%Q~k?P6C zt!3#`*H0`jY@OO%acXlYJ-p+Z;=;Cx&E=$X<>;kd$PF=q^Q=w*s8ay&^7MfNz7MtS z-duTVb4B_u>nHNvs`Lms{AjDZxj6lh&aUzvN%_yc2b+VVERT%(FtU6j(!}w-k$q1o z{@9x{q_oMq^l?MjI&eo%iUaiRtw+)w-c;{B&{Nyd>!pjDYL}H3%zqk%uE4v0eQjZH z&C+(vV13?YJ47;*N^6#8YPt_)6xdvU^Y?6l!q)TUTgK5H7nP*5pkh+p{??ReB+qzIXh*l_@MDo0P*CN8ntxik~ndErbjm@9qpU%Onr zI7nh?wqwuJF*EJ&5*>vceGa6)KWW+To$6#;Qux(X=7s8}zdwNKD_|`TG;$t9Jy;8V zNN)4_m2?~kiN(R~EToV7Ef~gxaSTLK-gdZnjPwnW4kdGJv0prO^gD_m3;FICOhTzY z@~l74lq4xwjWjz1L=kj~JK2mMqr*Uddqg(!f-piP?)g!!$7JwqS{N`dmblBc3U4G z_LtA{m(*+}dv@F4%_#zE21>u<|4E3DI4Z1!{-7BnAf6KJ{uZ4v6q2mS1~K%1G!$Pd zsML@3e#SnW$w7ei_;!3cxa~Yk{y_M#KJDl`!0WQ(1z4hdf}pwH{~i%KViH~#F-5Ey zIF%%=N->gY!kV7TnVgj_OKs}TpbX;i1>qVIz({Hx0~fE0NF<%7^*u^fw`!g0H(P7q z)NaUOs#TMo*RbNbj5}3Jf36VqKqki4q5;ve;mrgZw~oH;Ke*)eOmt;^pGbp^IsH|& z6;fN3at()joG8yvW!`|THmb%(LBZ>kc{L^N%Q=P7iz-eU_ibEsOAMg)w1Ts*D5ymE zs$Ds0hsx>$r%TU*le>VZ)?IVKP>13Bi)34@bOpGnDDJ2ATCKCy>Y1Rb=n#edY=rJd z6NeK+C{NX_H-`Z0H_sE$WZ~5GMUvLv8nCnx1~!>_-I2{2(DWv&RY!bvtDiZKsaW!x zgCf;W#k{&V35RG5xWufjI5GCDGlcKc1lSodu4bvx7EPBCqmVGE@%Loz!>d-^Pu^t> zM&lO(E4pLm4fgV42{%63^Hs1DN4B?YymuJ?l6S%n?cTW=#31)VmKd9qMy|mPR*u`} z%|lsaV*k}wgzhuZCN9Lvcp=CR=GJNTiSlUm_3*1zx=6p&tX0|X)f=sT+UwFbk6YSW zG{WQ3^x1k)r4@s0k4)v(4p*S6r~z}P7W~1d$Yg6yi1#9s2s#)wBuG(~Ng%hiAB*EU zy*V0x3iYeMX_uHrCzi^bFc)y1UxAcWDN=!VB)FAN5@@efs~~Saev`GR zd5FLGSjH!@^qhzz3T)crpZ(vT>?oxM&a+jbemz{r;(aJkgPf>&BpOab{8MmZt!Uq} zSoQl{_ldNBc%n27HryEx-vb{J6+(&;33zZ3O65gZ&X<@~GV4K>DVwqdE6^e6W1r=> z_JoAv*%?7GBEL0VKvgnjWqdinZ_P+d6}xMA=xrqEpwG^>tKM?yh=|iABZF&;O-nzm z2Q$=xhiyeB#WS*-2HSC~c?c=sf6}dH4)y(a+-ee61=Q_-%dO^>R%YV=h+EAR`U3iE z%JR^EfKu^8?c~bxfoTo5wb2JD&F2j5pBxEFMH0goz-UdR({ZZa(pAahUy9x@+RwlC z<{{HNHX*a1IC>|MJse49PImaL^*hi=C)yH}FHG`*2Sca!Ht) z2cO>WK(-{jNF{J6yVFYE6#xRe{L69!c(Fw@2ji%IO=4oD*R_BNGtMU&{03=S>`FQ4 zt&yC1z^(ei^83n6&WTg|u=A>vgnjI}f<9Q?Z+O zEOd91zvqwTAhL!#|CL|Ao=N|B$TLR`^E%Qr4>ks~XhLjfxLqCBlo~GRCX0TmA*#dm|%8shqY)OxDoRHkuE_FIK0T zB1&OBc*DQ1Q;`0K6G#6^2W+Ap)(xsfWI`)c4t0Fw_}r%FZGTd?#2|DgETVP_tFk%& zf`#R8_%4n9h5T`E<_;UY<^GBID!lDq&qs*Or(a!Wx3_VtJW|H;@ z`&`HN-czQ4tLaHSD*%17zc=grdw{}Ly^)whOoXBAIV8pQr_--)1fu~*!|rB1TkpS5 z1@!FEtJJgg{tiLUUI`KM0uC=9uKIg7TE@T3{p3-goLmTQEwT5sFJiQLDcR5Xz0a?f$|8CdEXixGrO{744`QI-l9V; zqYvwtny4YVux~*hnfM$Qxa8^er1_k|`VU31(wP>5_r#y_+9L!1~Mm?H}24k5Esl4gN@& z%vrHQj_1RRg)YDs2J!!~%<`NQLQJ(|9$Y}j`HOHbB02-mwSToAbj)4Ol;QyBrp=jB z1aWg7z_R_r3nU~SF3A_!c!|Rm&0)bl{BPd9mX62O;*dceweSO>9E|W}Y9QvRk4d3C zp0;{!H5{;=8bnc3VXe)z0;nNbnWL{QIl#5ltiizcg z>C^uEbvIG>H@+l*y1Idw>K=&koBTs!GJ}CMmoErVCNF}^P-ZeHGdaZnRo#X#s%Tq; zdF7)lBK$IVzkP)HL#~`5OdU()zm70d_V_%6$xgMD+3NGNCiJORq3+D98Q4HV%5W z;&(3zFXcBi3Bcsgl*R7AJqRag5C+a90^ruHdlt|G9Uw-LChr3_MWFlbpi6V{nKBg5 zqFSg9#&I@J)2akP4^ttSJaacC(1liO-GR|KFP4f#)VkF9P9HouBr~0+x*@)~fjC^u z8i5bb+*z>C_?WO;*8A`!YAV{Jk!JOhN<+p_jc$nm*a3U~5qwDOmc*AC{WL+ojSY0o zKG(oy2Lwd|%3k>AEL+gl+Xi-tQ@i4} zj`C1qB|W<(+(JJBccrhp;nAY@LT{uz9rh)XmUA5^m~bBCz)9vF~etJ))icMqyut^hRKQq71`l zU_iu{BCHS={g9#PUYMx+#oV(k?bwj5vQ<0*q9R3@!Z=(~;@C?(WSzgtkHDT!up){5);EwW~1@yW4(maaK6YIt-Kv*F$b9bkh^uG(v+`>pBpkVhKDFq$b@> zNT}GgMsLC1C@^3S0nDjV0XMMuiIgeC+{vk<0{M^KFpujVTVJHk;5X*gW8TTi)R4TC zOXT6iOqJGZOOZ2xR1yqV*`eo{<{S%Om{pxy!?R6yW{XK?xOrO4?dm=1md4yX=*-l^ zVbuV=t6Oklcs8Y)q1>(Ei*lsfK9-uhosW-T)cqy}c~fr5sZ%KT)P`m;i&>dvxH${N z^s6!JaFVt2-OvUtm|+mn=`sNt<$wVi2`D*0IFX+1=Rl;lM1WP@3&X#ITqEFDNWlLM z*VHP0A|-q=zh>;CCLyG$2H>C7OgXU@CGt>;zvb&H8K$^Qj1qV0%eyhS+VA~gxg&}| z-mhQ!xCj)lV`iV^zK)q)%)Rtpp}x${cH0?#mER^B`kVbO3BPT>5K#NQKm0Dg>Y%Dq z2jAnD)>Ru{eaerNMUyGpPO;=jyw%5oor2@JRa@Mdn!&A_)Z0%XiDH(n>CW&Fp6lLq zp))*`drQ6r&7Qp@G&^}BtR>JGSeRRhy-s;{(u2t&V7vyadHwgZMV$_bc5EqZLzcWH z=nHDMHp*mP4MpQJrvyk3yqwa5U>9gSZ$jWC|9M^CGb{xwp_roL0NBQ}2iH21Azh85RVA0^!z@J{QBmDd;9s0liTRjmSqjoTSHS4xsz$od~|hFMLvGx#dpS zrnefK-a4#vV-(sbFh+B>zgpp50#6nT9PT;}N)@iEg+UcJ1)n+@N#iv{9`%LBt0`@b z${@Oh5&R>7uK=Y!&Hy)zs0(EBWssVp-=5%CNdbV-LZk9feU4ACCkR=+T&NDo3X%;L zaWC;H^{4=mEPDO}l#qNpWZiCshvGGEC);VvS)v0T`DO6rhQwjQL$7P~7KO5sP7L7W z!%Dyqu;fGFfU?k#K(pzvV2yui1cZiuXlS{ya^XrECtK{sM0k+KL>n#oWo*yrHyB$n z-FLltiz^9^`b@+zSQ$ubk|wlfgh|G|xA+}3rrLX5Pw|zI$<~3_^`LGkYIZWl`{zlb zr(0LnZ?54CKuWNzioLF%T2*9s2Q=T;HC?ui2fCcIp0?P$we#BMZ4v#q!OCJPtT;;z zGB&9XfY8R-&NcrPq-yt4@3KY(CnKANo++#UJ3AqJZ}naS4&Lv_dnPcwd;j;4hTvr} zFV*-P6OmtE#lRGS@xxfw`9J$7#z#)IFzV&ZiITh}T_8#6hh#pemuef)Ez*t8S!W!mcIB6Y8YchT1W-%(dJj z%%)G`e8NV3FS;g-Ph(8}tZ}&hQ^@t73mcifW=b^fOUDS`hDcN;nG<L$&~`n+a0VYF4VIEJkEFTWWJ z^Nogny4`=HY~N;kp3a-p#hY=g0K!?kXas7hbsAo_e-HraApRS*8Yn2RD1-k1&A1nK!)-m_ET6-Y*qyvs+L_Aw@{X zn5go$@!B|$AfWAU34#)!Ot=Bn-E$}12=(<|2)$NpURpuwW*}<{8w)|8*6J;QVURG6 zQ?wql!uHX&jmQnc;GWZulSQ`->o?+H$=!K*Yy4ZMi42d9XkhV8 zoI1L4f* zmJpekdM?TeRpa{$II1i@$GDh?E*K#aa0;VyV4>#Qsacwn873{I61-HkmWq~=TTx`Q zQ4b(qHT(*J)eZk$n4xWNsVy}_9u5RFTkpw{BT6)D&Y;m;K24LZbxr{%aV@mfsK-?T zR&vkDgY>~I;Tmocr3hHM%XDr%Yvh^kr|DPAlSwke4K55D{liYO*}^XXJA?ogl+ajj z!2lM_q}R0$vLf@*3>5S^xM$yC8W(npIjnE!r{+<4WYJP#Q)0pg^dCq@fjcQ6+J7f+ zsLHx4Ra(zv4hDG{Ng)1^Ni&9{Jn`G*JPhpPnt)CIMc)<$kywrx_aj>hiYreBM-L=s z_b#Yi8%acc>Gh?SfVT`PBUFea&R}!6YazGV($cRGSA0M);nK+tFZH=L1C}!_mqo3$Cjy5AroxcvO}m9K~B4TK}#CWp0p%H*K0SX z1^cTzR!A+VPysCrEc7D^VKO4RcD2_zQR9n0l3rv|ozNM?V`;IvQ%akx_2*C&Yyg$D zYNzoFj%Fp_pm-KPQ{(Kj3*;Mg24;r^7#O6HUmIxTS38XyDedw|$to?(cDgDo*Ep;j z?t*&7S#ztg?J7eSEd@~XPW>)lizn35KS!t%lwZsv(;fLri*lKYuxhk={3Scs_>SL+;DB8D&Mc+rOA8VT~|5t1U!~t&dJ5PYnogwBR zc~j7EawsWT>>jySYAksZ{h|GGF&M*H3~|qlq38+L_?VugQ+ccv=>MXODhC7jdA} zZDDPbh*Zzwu~}In@oB7-85sHQ2!tTFPf6axD94b?;3JACz|QbLITktO#hcf;{J!q4zlqJ`IWjP(xFiOPeiplk~xnpf^mqPJKhr`L~t-0Z9vCD*5J zEmyJZaVno}q*%f1Z9W2;_YYmFr*fh|6*Y{VOi9hAj#ImW#k3 zrtxcZA_|UZIi**w3#)kUKzwQ?dm#uYoYk{YrZ*HkM8q@_KT=df{5>t1N;h+vNC^BN z)HcZ>20FA5y{?u!9hF5dETP;CoKZr<8hJOVdp>;;6Z^wuDfNw=FP;n%rozkZkry?TPsd$Z6YXi`4Y&ybl(GSkh}`z+Fi1@Ib&;B6q9L*xvNX0g@H1tDa8EvW#R(R+)Pzp{0(4~w z7^&C!z8~*C!%{lW%w!c7NRJcMPSf%XkT^RKro7spsC! zaEy+z=pZAB7=0vQ-HvNRLNr&2^H{kShAjC&MEpFYz<~_;aCZNKLRqeTtVt^Qto<$u z<+yhFZuCZ6TZj4Fz&u5cL~i8-BF$XpFZbacs4%GEuk%5*V)*!gF>!XZ~9A2fCUJ-LPYEn_DOYZw~78q>(Hj5LeDwCVeI3n zt7*@>?i1V(`rq@CGO2SIkpexuF5=D|p>w1g13BwPjfk*_4a8qt{yyQ4ud_6fuFa_v#ZiA9htTsxL`nEcbShSiorV7^bTNm$L?iY)cNpcRU9*x!)h2?35ZhC_o zTeV6cllqF)bVs-s)E7pC9L4$l z%xJ(C|G;T}tPQX0R%EKW?mKMMB5Aj2^k#^!g!=u0yBxLqnFcSZ*owf8bk7o*k>xFN zf`0M0!m`mitDYTaoU^nsQ!HKNK1s{`Yd1)ciFR`=d48s$`qKulZe0!q07|L9=UpHL zeXcb6iWjk%Wc=`^j`PT&5}%IwXnG|%ju$bv=PiR|OcJft%_=%{OSphL(x_D5H<2YY z7>Tjy8(bol;JZjpU>&mHzc@-%>HJFK$&fOxtih?VH=o0rJ_{k$D9)m_{PyV=Q#*|j(;=RU(o@WDP8P=>Y;Xy; z*c2kwk8#!r9gZZstS-vB3eH4GYzy66B{m)3P@8#?^G+bIgH%?*(G@#)OY%WS9`=UVHZAI#oqS<||F#enC!jptm5n_#6B`rgBO=_W1Uk`evbgvUQVq9Kvm7GStY0{{3&0B7}G!4}&Y zq8lTOx{=J3jai}ZY{8Tha#$CVE%DX7i7K==y~;jsl; z?082ev%ZcnC$F=Ey6sD$gtNY_F%K<1^6&d4eF1_$G@QOE>;o83X6QYj%qSELce_Jy z+hSl_$D zCVgOu3p6)oA_!=4rtE8f#=2Xb_BzkD^?h!*+`suwK}m5JsPO_-w0fQ9LD2NNuCQ|0 zl70=9)Vm#mg=jna0~z$Z7|fChUdCxsL4B( z6}TuvKvguPJsnL%c79ZDSy0ZVk^7$DUel@ftAcxhpL!zt_6Ct#-mMMZX^MC^L+{#y zcYVP-O(X9}D9W}1?+{HD`Jk?8-nmr@Io%2+yu0Urn-8@=bQ2>_%wNDAH#Z1SfMJ@D z)WPX(KXZUSB#L0AKUGr~A1xJ9fKdKUbS2*f*nWhEUci6*Yb%+Q8!>xtn$|AhOc z4LxevsfZ)d@qu}n;T@qAMfJMsfp==`K06mD|ZY_@M5x4y&>8ys9uyeo^{K<qI%sGNixrY;CsFy<&ASYbSyre6oZ^fiN!^aBekEKIREWD8Y4YT`*1hgfTk6 z2RNBW}QE zOofqHE1ZOv$i!UuxsdcaciUUNHRc4IR|(b|FXN0`lC~7I4p(kO&1Yd-EJ)g=Vag9J zRj^5n9pg|8aZ{GF^rim&taT;m0<0$c!Z^V@og_^Qs9Qb$Ba}$*NsJ5_eZ28c74#1o zF9;w?h}H=|_%$t9_x(OF)vE@y=yg2-9%(!025_ywyQ!!4>*$JtCZuguk$!PIUKW(>EPuW7Rkl$dWig3Q$OQHhop;zDZf0syr-JgHd zDo8iWBGj*8dR^Z|EYIyZ3QE-AZ>nPZ^feKBj7rk$v;n?YzdK<*r&;NJ#p(t$qK|pi zo_>Mu5g2;8S6f-|`%mwYhkcXq|IiyljUz*@m{7tm+e>d;tcbAhPU>+!A@sprn^AI> z7Rzqa{?ma#3Ls^&QT75;3OP08ImIG(rj$FJDFv#nAfSE~;|JX3RE(SLRo0+F&$yTD zVa7y^uZy`)&lLe&#+A)B+liWOXI(L?$}I3|#%e4o;1gLmQkC72H9-q4MD)nEQUi+R z*;Y({>z_AUDz-$`d`Dk#TU1k}acHV!?NPo1bxH@cREpproXFxJK|yrF+vy~-12mA( zsUAn}dgCi8+vT+VW}Pw{8%>_1B{mSE@1G$x_gW5r>HVx4vulSz+giXhA(m~8RRoP! z1fAJwusdmQY6y7&65m6jls>Y&oJy7#BELur5KF@K@bf6ER@Bu9cb0NPe4U+sxTV&+ z`LWs!uSGka+8iw;?LKC+kNx!^npthr7W^)bD8kdt?`M4oCbsk1zt3>gk-S*EqCvZp zqZ{H!g^j#gPNg*@4wy(ZQb4K~@!!!Z3okg$cr)tKsMdTPYDz4G_b0E(=p-AWq~GNt_Q~$Zc_mIUI47xLv*- zU(VG~HRZ;11_7u(UJ$I~Fk;6SmeuxABX$=T_6Z*no1nqc)Wx5w>3*B4 z@fcUrw)SihrCRgU*-1o(RZO>7dul)%9`*}`;#U}_;%1rBbJ6$6kw`*b$KhHI+4n31 zaf0T;)Oa2@-E(e1ym#z#O&dOJ;^>f01%+ipiso{%fWnE!ol#b>U`X+TSh%rjRsUL? zJI=@o%a$>?Oh@H`<&JGZi(Z6g(UhM!FS1o3(NJ?@zrmcOzA4Ksm}C>n@8{vg))Pu{(9}Nm zJ)usblP%k|a0Nzb;OZ8AAUHT`k*;!h`yUV6gq`6w7S^+l%UL^cIi!v3MMd_aR2N34 zMF@qP{tLHn!M=qbHWDY+IlhVsL(Jswbv^yMV|YT>y6&NM-6t2;#V;KcFoH{max^si z8DkjiU)&rsP80XUck^iJD;E8>6e%zJ9GqfQ(m@Ulo z$$)gom#rk{m=!x?m`v$UP;P8bL-iK#=AI3!k-<0jo5muAH)<30Z`ONvx3RZm@f`#T`VEPOUV;USwR|<@T-#EX3kS-U zj)&mrJ@7yxK{U}&DGNb8kzd+MMF^-}aCL-wV|*@;a4w?;a_-Gmz!r%C+v~cRHI_R6 zHAiJcnu2A7o*CR2$q|v-4uYhQSMe{f(IYdeLr*yV=eFWds%cmCXj^nh^}MPVcZJ)* zUFTsjN7acz=?TaK(6oIwi|so{_Omu%;jr~Vgu*}iVB1VMBXzF6X8{0U{NMgcQjc6% zx04@|MRVTRnI>*>up`Q4<@jPI!h!{GV{pL&;~srSg>ErMu2tVMTP}x#|AjA{Ty7+j zi2a*!NWupfS!u+PZzh&hFm#j)N5K1i;Z8Ps6pLTXpf5-C8~1)CdEc@f$@O}Te}n6g z*ELndgf?YT6ax?`l}M@;rg5d3_$z2>x%}6i<5FYP&eE(a{fW5JKTLAO5NmsOq=anH zcx&Wb_f5S+>FcI_?ZgS|>$*AQl3%Q^il!lSLN4VsJk@#jI<&rtSMS>^@Sa~$In|_5 zNwdxd+N72^C>JmK!4x*o4X#+r8Xt3~hih}f7akZhWbs`I=)IxO-%<4Aci3V$E zht)v8js*d@;KtU@o!mr&UCQmOA&2l6J^;3u!w~9uY8`*92SJb26PA3hda2%#UOd|| zG5of@0^T}S%yixm zI{eS!-t~K<{od0E=c@B=f5YpT#HPmLucn5ZPR#o24^nXSJsN-7zYM_Q_tB-lja zucdA`jmeN;VYnTzN^L4I^~ud<77s)Pjq+&^WH+(Vwt7%SkG#8Y34g?I>To&{i2JN= zrw}0qI9FhYPX4i@ktf)_V6m5{#_&N<37Gy5tBc5D`@KKBNxz`Rr}_mrvL-O;Bj_Ch ziBw93G`z>#_zJdyQd9rz92K{}jNS4D&Tjbz0M~NM@xTl3lZ=2thKJf~X`Lh$)a5Dz zqHg;>H?i$s!x}R+l0c|aCBdwU(AliA3N)*!eV!5;xkAEOO??dH5Q|`E&hP!EW(AWa zJJlcg;nVT^q_p0uO4C@WQW|UO_7@?S#TXz>_BjzrD~=fm3f;&>xtyOV zXXkDlva5GD>J7X8=Z2fL)Gtse*@$#=m2RXq14*r_IOLf-?R0rv+AV29XkA5>Y|-Bl zenQKdf!Ws;7!Xto%lt`O?!-FrOGT=Iir(YS^))Uz&15r#HHiqMA0~}}DD*Go2Pe_+ zoIt=^p=GNwyfwMfubCnU9)gIVoKX?;`+6~3s`&^PPG$}Hm33CsmHBnHOs=LPqTZ>A zfKKv=$bIZD_Sb!;5nIoC0Jk(2<`B`P&v|!0e*WV}d3Qfo z_(Yxe(AqlhcW>4vfg8)Q>FC*lt_~ zvj+v+EQ8q&qm@h+k!IPL`WlN)(<3UJT_pX2NN(b^VkluIWOsqY*JG=OUUFLU=0Q@H zOTFvfVt%+S^{$t<1qq{cR!hgmLEg7c(iCMLZ<=28Q7FBG;qRh5hxCRf5) zoagTfU^g*@juwkwgm`rkfSSzUg$>D~S6>G+0;G`K@6sd=KnhXMEK(SC0U7RtHw7-f zWXge%iu#GcG#^fO$aRKpU^dey#PswI{YTwmVp@SfH#v6(38S_pNS$NnFVuiAPW{|{37Dlhwh`wl9%N|BAw~J?TB|g+0th@#xoy(|$jqW+AQ~3qNxa8`TCqVWRjD zzZ~s2Ix>npJsJPkC%Ur=lH-21C!#BJ@FRQjaq4m+j-rLHiO*C}*t9Yx5n^Iq_>{us z63Y+j`1z%&`N9qCVKW-yW5Q9E0a+u8PKIzfRh|F;8AxD);0+2I6*bhT zL6Aj3i3Xj41n%erVnswnplTz=jlzuZt%?aVQ7+?DtF?CVtG3$Kwtib%Es854kbn!K zwk%R*ap8`GEG{8zncw?!?j!`Tzu))&di{B6=H7eGJ@+indCs#xA@QYxfXZalH*5po z-q*ca@tF)d$9Bd3toUF4940hB@}6{Y9p)bl71H{9EW*sBuIBdndR1tKZ}@MOG44DcEjhnVPBiIXoIsp zwi$YEtJ}Y1J347XJ=>{*YeSv|=>i@m*YaoR}eA0H-5qJHwh$ zV)l@S-lOBQ#0ckxW6q6p&rnJSk3i0z8#}M@&W-5pozD!j-(k+Q-}x^mHJ?9*IpY(C zIpbI7gNQqT2V7(>;1hE|=IUmLqX+NHl*Q1}9ZYWeQhn~b2WbYUX1K`Oh0>n7auE7D zh|)hjr{mpo;*g78q_2)n&&N)yV4TL3c{+={UO|&#o`(mdJ1lC11Hr|h^7ZZ|vdqEx zkl3~eJjN2-R%tsW#?jC@L)NX@lxgYeQ*s$kN{BN9Zh)TOgprC-X_9fJ9SDX1OI(Tt z0@)d|gOD?0y3gUvk(d-F(i>;$SFkmzVb+0PGnt$KhErhLH9M&r#QP+pJFG=-v6VfJ zZesEJjDKCR&uL73$mTfwD_S~3tTXvqvDE3?wEX+KSoIB92UahB(AP=Q`m-fH`=$QK z^X$0_tpX)(d&Z4fZtvz(#NKpa=iyx8byysFcl<|6FkWdoo$2~RNH2`l+#xOh4e;Ml&d)+0+fcdd%AIhMSw4H?c>mdv)@N80#C z1HLZLeK`=O^3P7ikr?tdQG5cvXY~txq_6AVxP)^r?u*{MO)+3A=Bu401c`VH(&5zK z0ne#_k*rH%hntPR0B-yFO<;>#G;;^#4NGWDOCWhedK$|686xll3-2nvNe=uqA6y)y=Sc`U-=Qk;yz~qL{c&YIir~xU>q;_t9IV*O1uAF+?3T zW!k)a(IsK%`jUy?kh`ODhjWR=4Y3C-w2^qB@pmMPEZi~ zVF0|pX^h{uU`&2{5bE=kPeoyLc#d$eD?1UCyVdP>B4pzKHurU>2%E8OGfd2W*_{x_ z*fv4&H`xQbX`Iu;5aOJSEMkjWG{=Jm9I#|X{4^i-f+#A^zp3#@g8m6!OpWNR+Utd} z)*g}KSZlAysj=46ta?MAd$k`wq&B3!X`{-RceJ-L`rsEZO8l7fha4mBmYLho$88Hc zX)zSg8kzJoCN0`01PkPa7^2(m*M$^}6<%cFSRTnXN=zaJ$q+`$0Y)*bVwroZx?J23Gd65++#|%+x;2zx3 z?0U@GnMLaQN!pP*=f|0hvJKgZd#FWB-~p|RCsS+K`}Xc#m|wb%11eiA3K z>dMjY@3RDQ+46D0g<}gBU>fH^RjQU12HX0rMH7pyhAkkWNO7N|>T=Ut+gFm=jm?%bL0nePu>Fvj9BGUGdY9SoUHOD0}=Y?(=A zF*P`?(VJLh*t274->efgvoBuE07x6;mh5ZGkaS*inBJ6~Ws;msY9-;6SqIR|o*Tg- zPIGDnil|Oopl+KDF7sy83sf}NY^t~k&X3>XOd1{Km5j=k%;k~DMDd+KuKV?4a`zj; zX)?~@cnexDPUz)nn=2AG=7;j%4lX3|Tw(&w`S)aFjw-#{0_0}=hzj_rT68wSK+7)t zQSL$w+vElFbnzqHNRJK3VjN-WL0XtEdn87CPeg8M2Fzai%Kh~BTHPT?8`!VEQ~iTI z){efv)|BIXKsar=Z>rwg)YINCI;?UvrmB?*3)fDand6Snjx-9oWFcv$wOW8U@xOxUK&0ps-DA}dz#Nx@Em2^+r^T?Bi&ojLI7fus*O zf>(TL`lXXx>*U&_AQ-WE0Xbyf>pdobm3z^GF(u{B^#j@$aLkbG;$43>x#5R~ojb|P zF{Th1pv)}o*5|_5V1>deVu;eQk#~k!eUU|#&V&^Z)2kPh7hAyv z~MmYeQd3D?-V`|KG$hp$hz&sFcap%p` z5ss#XvT$M;N_6&32nT~U0&#^ErFRP@nzEU8GHxQAg*5N_SBrCVcBUZDc_7Onry1@w zI|6TlMMn)~aQZDWze4m-dzxH*gs7&0o$cfwXm$l?b~QN2T41l!<64@=*oa**1ADgV z>&?47qv|GI8@T|EU4n@xd9KWoH-|E-LN~Q&_=d{1ecLtc0N*#HL8Y@S)AuL8f$~UT ze4n29e+8KAi&z`DBX_p}3*VMw7?OZ)PyO|PU?XlCM$n$6=xLG<5K?)+kPok$p|aTe zzI)Yfy+hZr<_wqaiCCHhTMnC5V%mw@2NoB!4ONwy*!9?@4Us;=12*q#xh0qk#g>tb z1U)F%Vdr~d+O&!iAOW4b-9GvZ-`=V6br-Vi28o&lZQopKLj0% z{m3Q~g8pDSGVUde0NMzzt1PPGJo~<=6O{^=H9w^a#|!EBMY8DveiHcVz(YlLY_C6h zxm5x|*Fm$9&ImiQOR*yx<4>PrW?4H{=h<{~0FlT87Z#53o0SM8yMxukPCHoBR%<34 z_@>B%egpc4ek-ur>TPebddoDfiWG1M`+rkQc7SsjAZZeHV9&E(qfz~<73pj1Gp*bi z6Ru3(4(fXz@0AoLviM({+7%Xz-VcFvNlhPEO~p}X5{ zg#l@|XJsNYePcA6f^>qE1LVGAGG;RwcXmt$kfT1i1HNg?q&C9_98T5qefd`tVWMjI)_HK}5{q?l*UUP&p!2}I?wrV^#U#cfop(;K1uXl7;! z!)#7{`*oZ58K;$&p&ck`D(qaH>8|2CcTRWrsOeZEdxP)1%8Q0PyCMjIW^w>y*^8Y+ zbrA^+*t&O&4BvEf$#fvYeVe+KzRxP1-)l4Qqood&HUuNc0m$m;+(lP`{sRb{tH;>JMu!W)N1^Xc4Bx62FPAlA5ZWM%!Qk=~&s1jo()ghp@6 z^j-UF_8s#jJuLg88{g?pjz$1HU>nMGN>G$mr`;IaRtV)HBPF54@FC&S>Vhbgz+FT9%5ifv`Duo*P;j=pGF43L z^1}27FgU&WaAC*5t_2pHEnl%Rz`{>&fRig{Mked&Cfi}|dp*WOrLrG%*z>2e&-<9? zkjaJS6;bMXZF#o%Tc%N8Y&@byW44BLE~ZA64GQkQKyTleEfXy=S%j#_aBrm*AChmt z1KRASG9gi?*>={rE9nU7U&_@A6DTgkK?Id|XC)H|YgD(sWNQZcrC^joobAkp_9)ggTz;jm3P1v5GlK_UfDMF(L$~5Jlb~ezadXfT0kQd4CRj z;|Ux-p6nn}zu|2fQu8OPd0L^DK9i!6PSc_~-2X|9UCTw%Vq25m%Y4JuENs1=SujW0 z272`$TG;r+;VrziPrWoPET;ucAHD2R(*@#$n7L-wg#esOfYWIy)a;XW~*m|)& ztjSLBx7i-hY@g7SIy2jxbwqQw(p)>MShvkk0nW~FV#4%r;>sD}#58ESX;pBYldS?m zpP;bi8~`_TYa;1lSRfQ~$SX5q?>^F+3{zCODV3$0Rf$t_>`>U`0L$^xB`mo!zG^Wm zn-lK6Ib8ZlWp5bDYPk5Z)A^l2kd~RCwV6QcMYc1QRh`E)kLOF{i^62G4Leh9CLr@Z zd6Xd(ynrkO=QB+MV^%B20*MS#?uU?l4)V6hD0os-f zTN#MAAmg*j8}1!f0N=;lPZ0SEa5XCnc565hoJ`LL^Qy@rzAcDc7;mcwjOQpH;}$AcD*0{{^azzLbIolqhw*;;^#QL z#96nv(Gee-{OZM=m5hE&K^mV5-oTxq0KpU_RVRGQLni9_g7jZs`aK(#WS7al|7=7g z7HjP?i*4FuzlU33?$MPuujm;py{mU_$Qr#OSX$OQWQ|>657?PrW8d7+v$PDH{^*in zEv0uA%QQNGbnZ1Ia9h>v=rx-@)W zdiRX0g2RTbz&H0-Lf#6Hn(W)s?O1Fda!31GZ(5>Shn4s0K_I?F&pPMLhA;fXmXz)V z@EWVU2Ftw`%X!86D~5HnSGs!k`Ls5+y|qqd;nF3fyiVjcl(t3@gD`!kO9-tbtzCvK zxr&6cz0NWN5Kgw8H{G&#BoFO-w)c>1Q|?(j2|24n16pT+NONBgJ4USnIK~`z7yvV!JN;&aSwrISewsc~w8(io6>Zugx?jAIO=Aq9XWGzZ_=;iiF_q zoppPj8VJaoki2)YdF{kGM`K_O0DNXsb?;V>1KiNB{wCv4jZle6n+{U`hh!e=r8gFAc>oUJC(Dei6`gi8~ zYjZse7f~xN_^8XAW3C&_^|)j8{9&$5vvrxp&<2r`y39+6A|f|%uipuEnP1Xa^r5=8 zm-$`%EB>VZqz2laqrMdvdZNr+|J+=^rtA8tkjO8+&Shiv&Bu5%eOq1IUukynEBr}U zXK!BC%~f@6XVSaHgZYylSJ!qW-Fqp_AFwEnkL4@s+Ah+gOV#a)23j@Mhp2jCUE5G* zV)01+q>sve@6UYCj7-4y(ktr8ORws$s1vX)^zu9iP-y1lh@x$Ma%%Ff7U3oL?o$_x z^EZvl&v6HD;5>>gE4bz`iV~XD9~yX``^W=ZAtk*~13JJ*T>ftYWJL1EEa+24+O9Og zUhafUmQeFMNJme!yibJDhs>NYoiI`xWbDpA6`ZJ$3{5rusbmOt-+x}2tp62uE(kl< zd1Qb`BQysYC`?uURpI0<@X2y8Y=L~2mawMq8t&b@yw)RukZC!5;qc-JXU$zFx55~m zOoB0TvPHxLH5R1bWd>+~gPADvH3h-R?(=)uQtmv=4;*H_}>3eSdqEOmWP6 zkyv^R8ik@@)7YSoY&YaF^oIs4w;pK-_81?i-Q$bqVKNUY+F%of1NHBr#JXMu92$6& zx2PF%2B-hUW`6v3__thae=_ccE1BJw<_3R%<&REEEVf_1_1d@A45~_B-&o}`L(Jqh z7`g6-O2z@$PF$%Ir1~1(_eq9CI3#zj??A>#e-oz~u{vf$cKwFPSqt;Vq1CA=n3m}~ z;z6)HXVFQv!@|!55%&FR3XcqEPHlAmHE2C{lGADmrn)^|r9-ic@y4anJF4Wg(wXO} z0g;t@Wsyj;ur3bl(FsJwGeWz{diMn*|Cwv?^hj#&DOtKJ6YD-&Mf7SDSgkj z!p-Vcky))#$Z1&Yt#qnWe&*CAd{D_dkq=9pF7m$VuqxyDDykW8Hw%dDL_oT(OTS=S zqekR>!<`i0k<4mn*WS;Ga_#hqM&!}7&);xy5B^Rp?#bUs@zMN6G=P^wdGRs)4Hx&} z@5JKcsvDO0s~Z~le<}Yr@qe?wI;e+1Jq_xylUrO31JR`#1}L|h?bWSXz>I9JytoH{ z!^J)MJF)oan#|RR!vIuBD~BK(ZT`pw)v>ZjPNWCN7Uag(8$XKc%E3qk*Bvo@#K zhLdA`_JB6Kbd_yQ(Eo@No6@h<_^-AH>}6Bf)_9t1qF}f8GP7;(O}R$fkYr zO{!KvUrGoyi6eARy?c|4XW{>!BuG!&cmI39Kon4SVQJg~0*cmx|>&$oA zPa^V~-0KEo5T;WmIQ80Ws(bH*5`JudW3Bt`s`U^uIDU)4g)$Vb>e{+96CSXy(uW;X zdc~Wvhkct=ANiJHiZbrg2R@P=-?84YFiciTbclbBW{EK8`NIpCW)g-V(pMyPnK613UAwy=-& z{V>yaK8=Tc`)FSa%!*X8JLiy37P(yMidk@-KwJI$_`Ehi3B#f+t%$!D=^m^tD|lnx z6uW+fMao%H-gt*tr`2-%K zr3t`J_Px(Mmk|yPvEs>}iWTX5F9kJ&(`>U*rQVbK^<>agw`b$J%oRps`&!N! zY-J$3^;cV=k$cU_vz}T$3zZPm&9(59c(316kSbb9VBaf)lO*cn=wf9}dP;~K@H*#G zvuDmqtfYdRVJ+^&d$)p8S|a_8(lz7$lsyZ@+&d>?NnhLKJ}d*h%&O=X560jWJ*qWi!pR`~sZ2pjR5k!zBuiR2`Lvhp-cW%I!kw`E6OaN&m%^t3A;R65AdcIxC4=(!Q=RLWnr_ms zY)+rkh1n*U8FOtcPdr;O>0?&&NY&Pv`t=(;&O{|HPXOvurJnJmz84|i^$%NFlNX#q z!eG(YRnKh67^zCEb#NqY0L6-5RwPZK_fu z0Ijjq4RUz-(JNszEw~J*|5AFe&$HvbUUx|xWB3MQV#ER;Nu=4!P&8b)r^>fiv7X@7O(M2H_{d7^pMKR!YcS*>(c4(#Z zL&9MFFrbo&lvEi_uO?ETzakMYzFpT&#SK)LVJGi5k!WK5NucqATr|&K$E@DLZZe%y zzp9=+qgHGZ2ooPmWec(H8ID;7~3BjIAWD@2)?d71mYD7Jmk z@nmuIMUID&x8^U%^A=y_40}oXwCdR2JS(>7G@h5XTJz2Ms^b9e`9@2Toy#cyI)RVL?@ zR3>l7Jo)aN9I-I2uZh zc_P+&qBVaj&y!;e+|1v=HK;OY%@%C>{Py+XBnI)R%x1oSSx&T1>aUcmFF6sJJ&bG$ zcK2B?R{5+&fv$G4XBWf#vCl&(V$7mYws)J-t(Q5nneYR(%=Q!fj{N z?Kz36b5!*eQ+1fCo~){S)QDBzTUC?2{+m)V+}gg?=(k}9$Jwd1-NSUQrrYFf|8jl4_936fvIywy+PO1wBGc;j)#mVl`OG=h;? z)0lyOV;%|>6)oU;)R*Skii^sG8keC?!&aE5Q0Yc1-oV3PV)!ZGefO4s!tBNxbJL%- zH~-5cnxB0&UWo`|7Kgjw*YAAL3pmXQzL8;h%KNu^r$;gEIP0kNO23@y-Crl4`vG;z z`{S*!)%8>6wXpkZ!CZOW(mzmYz4&2z2%UY<>$pUhhjcX3uf3DaA7ne3(#Jk_U*uj& zayylf(zj_`l?i%d2V1)PBBX5{SD4OYj0{WKrUn&Jo|Z5JMrOBrfXng)BQaOVg-lL6-b=khrMDIe%KWoV3_0|&5ARmw60OiYoSj!4 zbZ*TxxYol+V5iT%$tM%jUB!jvOzTBymcVJkDQ76~>cMXGxC+GJ^{4Ql979nRq&`5B zU;AqDaISMACzp?Wp?CzBvqw7{%ZcW`iB`-h6S*LLlK1GH_D9hkv=;qd>SXGJ$xUnZ zw8lE7#;!HO{Oah{*(a>- zvcsPD4f~S76}s)IZL1wv!EX09w;WIiQVL~LGkB_-S;at%QxlZ&Zybkt13Gc*!=e&e-C^Cgh>OwIqF0CO zERkQ)Pt)+wu&q|Tm~N13r4LEoK6@Z?#92WJsC+xEhhQ>XSPB1%=-^;&8&GpgKTR9o zMKZ%zT4X8noN02G`{-EXl~!L3SjyyD!rl}{k(pr2GG7$)3EUpq+%Pj5be0X<;N5d% zqr;qT@S&Mh8m0H{ou?kiq<+lKKqPbRu$3~$m}{6UBTii9<}pF>B@|v=Qye7yyhudJ z9pSE|SoOVwCsaW#Js7rO7%`hOHTL8nOljfx0oI&Nz`T-5jis0_eR;`RxiChW6!bLE)q!@2lhQEuxrEX<1!B^!2w#w6DvMR{W z>-~!QPa$R9m^PJ@$}}M5KanzLIelS*v2aq|-Mf6uNyn7U{~fc#QWlKJS!Xg#?f`rF zcVw*j_frr=rVRYq`i8R><_N(G@rd4v9A_u`_`{`pXLW~ZvYkE%KNrE@0wiNw{U%zN4t70%XRrdi@;MxDA6 z5Wqoix-a+w4sGo_l?bF$;q@e@VMWcw1 zj#)c{QWW;)Ezgjix=U5}c=j-CP*%J_k5Wn5pMfPbd^-vGB6Mf=Vyvyp?B4n)`OQ77 zG3-mS4aC~|9`f)trZ8uA5hC$v;nIDPbCE1uqyud0U$w896XTZ#ioxzz6U#PI^KPH# zv*l?-8{YRtB^2UBCs+l#rxec(`8H|~!bq^y&8Bfn=b*1QE#Xk1mb3wdR80s4el@$= zkajX|Hmr9Vsu?5#a9k8|jE72FW)lDrS1Il_n+;pg7xyf%FT|0DN0ADxuIcGlzsi!o z(c^_r)wX*49KWmTV#JJaqvnl+5f7N<`Ymk&`X;iUHlz%3}%ClUc>1LO)j|I|vs zb6X0pO$K)tHoJ^4U;{IZy4RUnx<{@R@)FH;2$I>#ih^X+&~*1aw#Bdw5(S>cQD~4b z!abqdxroBDtL`nY`lDIP1{8j_cq9N|8p@7(|1W9STC~HQ^Q0GtOK`AP@CeUY|AG|! zY6}Q&h`^E zuJP69dab!0={?7x-HH$Lo}23;b3Li2p7$}=a<#YOesg^hDqt%vn!j$}mF9YgJe!vtzVBYRI=jhk3 z=u6-9-W{gkR`cE&2j62mnBpr<@yYzqU1SRGH_LJ?1-@LrS8%#1c;{Qa zF;ES1ZvwJ<4R$ldpX92zzlz~9J!;K-Z>wL!So?1kYyG*c+qaQ-m^^d+%Bi|uVy@5V zuj?1g^}o;3wPN`JO8a#En7Ka7)KU6}x;;5XdLB2|+f6%j&Gi(s;J0w?d>Gr(TDMmj zYOMG*rcjY3toQ`3lMnyFjH)YVm$^-tS)-f7%xzA0R(kKzKI+du)jUa?dFx@#FEFg;QMe;RnrajWz!hbGyb&Q7>!$Kh5n5bDL+)Uv6$+Gq*Ig$lShc zZu71Ae=xVd9jpz|-J1Ukb6a6$%jAaD6ZQxR9pCG4gU9%5C0DYYiw^< z-txa0@b66~2I3s1_yZ3$B%e3d0d0M~PpnENjM{(CNt6ZryZrC9G(da(24cRh@kRox z#P)T;l*$^N3OYMd3q|94MtB17V(}T>iYy)OR(HuGgba&7)%aBtWmyqaAwG zA2=|NM(NQz{Hcg%toTTr>tvT7zn%+`_d?j_FbJ0Dq`O3cgHd5kMxZlEmb*4mp0OQb z6$sZSdBG%7eOed8mMlP;#RVnL>H)WElG_)ux5Db&zM8#V;@vLOtw*eZ`B!iwDw8DcAix%)|X3v}c6g!Qz^9X-DtzFpBLW9mnb;~78 zsXNdiOL=euFqD<0?DDRy_?y%{OhjSD#UyxQiXHCaNBHI;vXn=UXnyu&$2~%n^13HV z;aJ_l$vul^zC)A(WxvCnq%t+|osyKXURVF4BxQ$tTzeOhr0jr|?56wdG^PH;`O(r1 z=>r;*!n8lpEj^4t!JZJMO>@h<9_Tc$iEa|3*opCl>0Il@@yHu6%1g`}DJcq8%SaXO zC`cb;y*Mc=zZff{s8|yuO0VXH&>!Ofw#4LIk>grW1SpsyRE+clD1qp4Mt~yQj3b07 zuWQz`LKLDkAVkT8OAkb5B18$G4LV#L(piYoz!7bDuU^-v4~>jxVc~z4p-|QRhsG=! zO2%ExN9R-JoQXqEnK13Y2yqwwB&P0@_ zZ79N6lM(G3h?DeA&<#8lxcx_h>kgZt0d=@&JDPx4_m!}PV!rt1ehJR&@UhHR#8iUtZYi}#Qfa_RmzEyt)jp>yh9j~0sE6?ys+0oX0T5b8k zTTeC3TAw2N3_WQVB0XC?!@RrI-A2!{nEP@FYG*kuRI7zvkxgL2Yjl}!#m`sS4mYgZ zJS$$pZR!u|lXv{a&3Ki}tVNvbR(DRaeH3TWU|(MQo3AV{vZc%iT~gM2&TT>eDmu4# z!}KnY01eLiSUYon^T&s%8i6GoPTvs3 z;TLBof(7jhYy#R?CB9(0*Z2U8tmQKvgbOAb0Idq`ujbdC`)_>$&Rq_9>v$40o=Lsq zhg1`kK4_MTn2UOC-|G_gwLf-GRW~H;8^BrZ9g~L&`;K{~UD)T=zb5$;?qk5@(5%d= zx#s~G&GcV8nDe=&6g|tuL?o@rz1sa9HN<=RT1D(k*APUiXs-)q+JnhTIJVV&Fwwru z#j$;mZWn?yGL55Z8Nuw0re#jrdtQd$#9$(g$`iwK7Wo+(B11w^j#4Q}N_qBF_bO@) zTN!*^@3J&S&T`~o`ZVW2q2iMSla9~1g+8UmM$;1#_maP zLh@EI;2U+rpR|1}@?>6fc1o>#|_sL025);mU!_N>cVoE z(-2x>q=a>Wn!%o#Rf{{ARbelY&vPEL)vG$D^WbB|PwrQXHFzu`*U0YUY$-*qTS#4BsIKh*zjFp3`Sw1xg>d{C*|)o)DGSW{Qm;?o zbw{tKD^Sk)bJNG#NzV!b_gs|Zc%WzA##$rQ%-GBlORt6n#8UW9j#!P{&=|G4z+#TB z>(YIOg=erQX%4`51WyRmlFacuBErj!nv=NL6fI<)6!qa^27B?FI8^ZaYRO0*)xg?o; zp&;-{6+sB^tYo{khMax`F9VW8*hUoOgkBp^oAXb;f{1^sJ7n8OaPFeNBKO4h7R@S5 zj@}e&y=YFikZg#0#P;45$&2m1M?2N~c3!7`IsSAZxxf+_s2nthk>Lt!C21?<;iYT5 z;qA;0uT{hQ=kc6Nb<1R3(_wgXE%B|ro}=lZXDqLDGdur?X&wFEi8%#hsSbj+hxz~l z4>;ZD#Odi6sW%sdkYCT>J>%ok0}F@y1GP=7k$B>9(_sotrJzYXMYym-=P&iSK9?MIf9p|D z_jxDZGdkyWSqiwB)pG3yj|h7x)b?epA%)I87< zW@n$>Jz9p%o)3{b?J+{#a2jD%<#mq0a+n61Cu}|8?{-ZdbH(-a0{V*)JK0eIy4*{X zxvX&e3GdOe!j|S(c*e}hoC1Xi)Ul`35x5#%8%kV^r<&hYni``GTS`R?=P&e#B~(I; z&Kw;-&hSkH1vAXd(}X1W8d>3JXV5doF6dcvEQVssb`r&|ApLmz%%~Q<80UApuGeg! z=+hL%e`IF$60;g+c%( z+0pcmH45e4u{}Ma{mWs8vHfJ7KI#oa+gYFZu14Lhty?nBbxp0J-I~IyF}Z=ci4=}a z^z7!mSG&0|_`&9K-#ek$lHAzR*7PUVJLHK#S`{P=iTf|SQIAif`4s!++07Z>q~xXuE*&5F8~Be)kgW)D~z zBKA%C0z3c$1UuaA{!Y;EGzuHw+sK+DH*AQU9ITxe^hN)`SB`0S7RbJj*+05hJGQLI zGynALNV{Ak55{;ME9_YkGA;kjkdYX=gWulCc@jN=NB4V==%QHuzNR2DkrVaPvl(fZ zY3yztswL0stOWj&rajz8)(l&M*GQ+w2ssNtX6Yr4KA%R=+5SO0Fl6*=8Flju8seJ65$aN+Ro zf!fcpP?y7DZQIa@n=T{7Z~6r4^e}afRX=JQ)DP6Jv$kQ;g_*DU-q-tO0p8HE+PKOs zS{M7o=d5$y%+8q!8uS6S*)oY{m&&Yly<7UU(DoV3;8d*cn^_@nh>0NN`DhyxR7pYy z^~$bDowis9(BjkOnD5G|;k=er>KnG7sYX--aeGbyH5VgihHJkzlx zRQjG3`;&II0%^WFy0+}-3p}>6GI>>Qxb(xYHTuKK()E?rxb?#}R646FOTUf`A8Rct zJ1>~LeRb?Wk69-KWA9?G*Zc(k_o%Q&?=5!@5H8J{)1%>&-2AjGU*4?5HNNzN*(ajZ zA9PCWzy;CrP^PicS^RO@6n`^}s zvP>i8?Pe}%H|)GcMe?nMt#NM!7hzEmDqSD3%NLfN60B`rjWbRDob#ng6GIuv3p(la z$<-Ay@w```xp_m6pf6n=tlO8#vF@AABXqYAukgU>MImQ>fbgy8F7%vfwqoZnM(f3X zA##p_t=oGPD96pf<&bj4$BzI!9Gn{#SlXufAOr82>NNS3UhrD#yzAF_mFYEYG*>%YUj$lYG+P&zC13U zKNF7P&y~ISGtFx1o|C#v)O@n<8E4_(jT2Dc5nLE&g=Y8rKQp-WG(E}4OUw;;PX?&+ zhlluFjWk~E;5s`Y$*5nXKc>9ni*$jI<~IJH3QGu^V*A$VcPJJp^GXQO%BIv&NAO){ z3IgQ|0@}`+WAZM~nK{N)^oxzN$rmkJmrz9o~PmD)ohPMDBX;)@EO*aZ`*oVNd+OLe3s% zt+NUe^7{kj-TkKU&iPHdI(vcDZCk;#VZv?V2tu&Su?LE`ilpbl`{D5t@L+};Y~VamCT(9}_pg$Ez|`Y`NT1#!s7B z6){PsiR>zghif4#gZU^7p#4N_kIdvToZ_Ng)mW<;PkF zTJ?9*rqdK#RixL(?9^ypeiNzoAJ7~;NEwIM5A<0`S@T(DN>Ey6kq%Oj}oC9n9Lyo8L?d7aEJ$~Z z*BKBZR%yCG@tU_;!PY5C2{r^%Z!%&YxZI}kZ;=bTS?YHLO@t_p@)O0Jau=IfOo5V1&WU>FMZxH0}a4${6pH2J7A}d ztpy}Fua;yxw??*-&aO&lvl|^i=RTqNc2uA>F5(_Z2Kld0(WAVNV_o-mTGdo;M*kmH zj3Nw>Fqg{$1YIpuSChT=e{U?%GZCe9K26IO&Dk9iBTr7(rS7?C!x%U)@`49vvFZX3 ziZziYN2Ey1gOiA_Avr<#cBQi?HD1&V;@D0j6R;nw?Tu=adkNf1%4oA#j4wmwbl##p&c`1L@c_hFMf}sq(KTI>8*FUHgPp<8Y}q4b&kJ{|oNKnL6pcp!5`J)fAG@aWMs7Z7 z8!8*S)6P1Vexq=V+)+ty=(A>1g2}U#&%w-OvTyP)2Y2=7?w3+Z zT}(TK)(p`Z=Kg+}HUOh+>H-?oBd|L-hRxyrmN!#~`Iy~JVHWT?E{T6%>6~wx!XYzx z@&rG$m(EVD@GtnX;A;lqO3^~e4K1OCqx$z{I)&OrK zX!q}=M2CeZ=RP!nM#w>0+~od-_T@hHBvlm#nSBnmp&l&J%NS})>k-g1u=lv;|h>UBlVFJraa4;RmjQG;Moks`YggrVlXo9ohi^v2J zeAIS^Lu2m?C%rIu>PLx*nIgV{Fe__@uxS$)5v&3KrQ7gL%M6KJ!rv*8a7q|B3|=j)TAF-9Cabyq)M*9PNoRvQwiY9{m&h9_A5+^cy?(vqNZv!3#r4Fr-OAf~27I zP6eb|r3^km?^6xMhHghXza8$%X(HP$p7T96mi5#-vwJ*`9BF6B*PPz$g*5lqLYr7m zy*X>BM_vukQC^Irv(XFAdLI*R)Ps5CMoF)vMn_VV^ebLZP|DN-F}k69Sq%+oK;nhW zewdSJiAwpc<=5=PE$&t9Gz4G}+IKKH%v_86InrO9ud|pOv+jm2-A!KHyyc2*dq%~= z+Z5Y&Y&L@L_-q8v_ z2D6KG1Sc!OJR3tB;HWov#{ddpPTc1(u1w{s2Q0{N$e}X0wStgyhr%WzUh3T~=#0hr zdwjp3GpQJ7)@m%_O7fSH`z?e29mueKXL(Wahs5o7Zx)cB~xC~D7`9Ao^5;>wW0A`9I- zwnRkAmjuQX9vC5j6Ss%tNwAn0UhL69hSm5&V8-T08R70cjg#$%R1YU^;29(WXCKU9 zn|pf}c>gZAOpf?%KM$uU*1U&S_I`0BTB&q4A$v?cgHf1}b%r)XazW{sIpy`bJ(?}6yfHb{zq4D4w}T0|$UrwBX7M~wcj9j9eGB&2qO z1Xi0py!J-Hf5dA)FUjJy=qbW!nvcQ-#Fy;ESou<8H1(Y~q{sqJ|2bw?63bL%%7efc zy6&Jej*gzdKV}o=XiuWm8q_>)xGu|`8%OegS^0uFfz&RQfi=}Y*x{U1 z^uie&-=ywQ5!`h$@3lRCDj96k%?RMYy@D?&@y}iq2Dywwc|1qXSOdzyf|~#v38CGk zWn-5=sm8n}#uDry+v5Srm~8ju#GAh39yxDK+Y*WNnlAi>A6@1)GG^S01!r?;Q~@toF9 zV>%ZX3h_H#F$X8(AR)xf!O( zkhBqkmmM;u5&gX}X@vX_g606d`*Rq-#1G53X5Two+^v!yctj4$8uJi50FfhZ=LPJ6 zL(cmKB|--oefq~>#EQhVCE)5o^l~V@93D(uJCc}Gcb^rCEe}BJi-v(t$5-+DRl$j< z8ZQrCak=}}F?=evERZ_es1rs_I0kzA`*lXodX28fde`yg(xUcSU_tdH^LihP(0t%j z(?@rBt%6LOutcBO&V@E1Ik6s?{e(DU*!BCocCR{y@cm+@1K0e6wAS-OgXw z>?Q@j8eYyp4#n`cY&sP!Iig3vioAKfyfymu1ULcTI6c+16Oz?_jm~O zXhnJ)$qx&IGGMYKuND!lr>4lPEOW4A?n(izQ)PCy=Iv-c?)=$1P zUjt!aP2~RWRG@ld@l20vwc;oB&|Kp-D2B3@nz6m8Fj&TrAL6SB8=SbNfYgbQj7U1o9CQ~F&dU9wrjO0MRr<{FM+u_tbPx-28C`28%P ziO6K0mi+)*&=+!5a3$+ZMLQ$4*oLFPqB5S?tK<9RKPxN~JCCu5w!C5^-V+z*9Q-zx z8_`olm&_7e|Cd~7-_`ipoGbVZCub2|IbMETZTRD zEKkkgP9m~GWx@2VlU%Wu@5!2Pr)(4h3oOaM5Xi&iSb-ss>-k zD`z1K53Y>(j!%IWZ=;+lZg&%1=$Pq||HDlO#xdaXH_Ej(0vQi9vdah+GBO)fKR@i8 zQ@(%zv&s9t_MF}f;qxy&vL3L7tVbe-Wt2zO=N)^nO7_xp63y^VN`in=>-_w;j zA(-G{GUeB^GUc7%HgRtw36&BFYkLOt_WZxoVn@%_*>!Zhe8F_SxfEc9IMqqSfi~0c zUdCYokuI{LGm(BUcw1%#Z0Wpnb&}gT(Sa}`^%CbRcq*FbkKGMqr(`BQK&+nwLK3>Y zonHe_CRw_vm}Xb&tcE*eH%DY7*0Z>L;SZohKt4u>vfM+kkl@-Q#iC zh!JvPVDRSUJ$wyy=$Wu!zC+t{u8pptmN9}DgU&nYSLsjcE$&f^L=yRQHcn!=}9lIkEFzeph_s~l5uuSKzSSfX3v={#+mmi_$apr?@@iIWreOiHkV z1#wRy%gfX4QWQ>+W7_5Qa zwu4CMW{6B{B6w#ub%9?gMjE+Q5)XVTAW>5xl=e=eyAa{}LE@Y#T8rda(t6R~99Y5y z9sAK)Q|^2PJ}VRH1^2LCl=+pxD>7IG1TWWLcM!P9kmu)$JcryE){^Qk{SjXtDQq9m z>;>D;0Bq@e0JBJaFRr+SWY`T5CFJu{gHLStEWnzjGkzE6+J`D3!6s7VKT1)B#Wm&=SPq0 zQSU<@{aL7(31YYIFmoq5eah`};?HZ?h0@L#6DieC==WKWap z&{ATxk4z`Zc@J^bg6`8Ty3(ThFhLcG;6-*-sL;JeDr->(Iap3_lq$^#U1y~^FW&lH@{QQ*%OtThE} zRPU@`cD(wcJsYJj*KkJPdxd(UVs+fAk8sX@1pJ#&W=(Ob^!fsr+NQ>6gq`Sd0uSwH~GnIYUN0N`#yy1`96!I`7}CGiR-seE?RE3IOwDNwRYS{w3Bxa9G)FJO; z{^}!Yv{hfHXY9u?1tnq5siFMevz*P-N9eke9ZxJp5noe$oU)?p4GFlCLj!~xW>P_f z-rkcHNcb^X_*-$4ZVOk`!Rx|3#Ph`eixoUCJ_{lhB{?{PTp_JqLRgT_fuyE52JjDE$bcrKff8Z~0CrS=LXz z!?^5s+}g=8Op81FD4yjGvEn~~GFG&-&v=i32iCnZ(->1*R>o*_$}*aSV@9)PUqwzz z8cZ_?>|yJVVZ*V!&#EsnoHL~M@tZbeVvSu)rA~8O*m)rCt;d>C{ET@52OJ#5&R=P6 z*)+sYV0|jvdXqJ<>W9$b+KX|a zRAlDT_11kW)fnQN0qd;!?{W?22Oz)#+Rn8?kF8s{i#HJK-@ zXa$&K2R_*Bm4|-~`V+)Tg1~lJ`&&a!$3M~|_W4{PbddN!i1WxWF`+i_=I)^y$>gA5 zMXu__$Fna!oqchp@atSMWElo-jaxTC?)M&_EEk`Uw9XyIVd{#Xu2d!{VOEf>-av8= z%mu?Xhdkfp2y1lb>$6bB$tloj(vc-Dh3EjaB&vvk{*^so7YdQmU6JEMrQbx3A<6oP zoWO#zbL!?d`4qg2UJU z7yqyIuh$l{7QHWOg@J&7wmWaR=k{U?Cb~;ma_++N;_wl61MLp)u$w|U2ieWk+n`p- zEW&`-M5#5hn(zuVsLE6bfj2H;*Q_vH{LYDS#5~e6d@z%(3*b`vyCLC+m2UZ8=HHRXqAJjfu3o5 z&VacMNL*hoX>I%t3MGL&Z{4fk;(wp%nPS3yz*B`B!&{Xc zVvHG~A5Np@p-*hzl!)a8@ray+C1${v?m;`O*>(R-XZH<>tWp(XJU(W=8cui~!*+rU zw)8^e$#6&mS$b_02a*44WMQJg%qXDZ5n^MHNnhqdU{oaL4GJc&Bn6HqWpKaWP2)3% z_|tDmJ7_n06Ry%=0N&D~I(OPz9=;I2pWDQsWp&e|o+)LDbZHa8ly zsc6u~qd^;s25tOsh9(W#ZD`P%0^;D+GY}|j`xaPr^k?YMCIzodox`yOl;I{aK9n5W zFMXxCF(5=x8Rk?^6@NH4CC0pyHG}tIgSiOT^A&c}A;)#kq`lPV2SN7}uLS6U}(~z?sgAdrwAc?L* z#6$`S_!Yjsi1{85T7jUUYI*UXASGp~E806`MnYsktzvSlQQ2m@G%4F9nYMHqB?yD* zJ!Ewm?H91m6(}@!f5NfWYCvK~=W$f8luGxuLDnMNs@m~^5VFzgqS)Kx{tEGkvFVDA z054lr`I;eF zS`I7I6US{ar%NY-A9Ge?p2{K8ky!*4q6qVXmeKfao!A-uyT)tN5pna+bWgO%%xNy_ z;pzhT8S)H!hrhe3Ke(48FEJeP%NF*}{KEHr-ftce1JKS%6B^oQr8ehRZ z5h_@3*?pmfz*`-2=_N*M7qZHiA^91YwId;S>>*Al9hpl^CXj1W4?F^hs)@t|CgIYo ztqwVk3$ivV~U+iOK>b3gXOJfad3{@&FgX&_3Pd>2$K1n#-r*?r1jRtzjT8(~LDr?E#l6=n7*9c= z3Oc;UZuJV}R`%_@&IJ>_0=bnHcpo>D-r`i5G|kq5_Yt9y7A0yJ4$6DgcWEX!h$r^yF>B1(Pnxm!7Ql|YC5(ocOkYfIe$V{htj=0G5rdqw4d z-E{|Q>D27p8jf{}k-fdF9knjPE7vh})Rr-(IJ?!E3WBLv|a*zP_^$4t_} zPEe3d$-^M6_@8LrOO_PddwR4+^T&ktEUsi90o!Cp0PqR@qss%2W|VZLcTTYMT^xuB zGK0(ed(pFk$qCYE%sM(4+qw}8xHqtX%bRnor{|b;X}e2V-W>s)Q^9k%N~A|Pt54sU zIW@;Po8dvWBzcM2FmkRaQ9(9J(bmsioVq7ROk}{QI(oK)v~vB#_Rfp!NY0-QK{smp zTIhJ%SeR2ppu|0^Pu49Gv*i4OE)*XPGL>&y@@3@=eW?wFOKCF?nh5|J@W0DzIc=HJ z23|@2JtyZtrnE`51O8Pi*-uH3#)JNyB#PCOeFy9AJ+$r~O0w;$Vyjm%;NMeDUub%F zwz@jflIiG!ioWe=sZFKd99sJI!BVeVJ9jb8wjE}is=uqF{=0Qcb8>cON|(~-fWI~1 z-}wyEs-;E{G^V7cn^vIHJd*m1Y-op~E(b&A={)?lO+4ZyzxVnr=>4 zFb(P;<3!&Hj+jGr{k^$lHdr-$)(E_{a&PJnH>lqBuwm z6^z~J&q@7*JJB_Vsth~Ze$<~s6?SF;au9U3i2d6QG5j?bGs+$Aw1+ry*xC@^5wUxn8u+KXqP0)MS7e{rpWV~LrKdbs zF4ASO=l%%ZdR)d=_rQj$31*Xj+?a$pWKKI0< z6#U+M!(hbE-S@l##gn*7Z)B17=k80UAaXIs38z;} z$1r3^!c4G3&8%fR8ke@*{9to;fCp1>Dg4Y4zr!8&prA!U6IP>0Kyg1hw4igU7R-;G zY;Lf5oZ;3goH;$yghq#CZkCAAP?n?<%Z*KEc!x^`;K@g=oog8E2fl>C9y8TlL@HvB zmYI0D(#D~czk}3PYfTnGGS;CW>vhdGVRR;;#Z8#u8oKbOT%yChG~`=Lh))=`=-Jer z)=^gnz?6g4AL9}dBwt5U)>B(tUi)oIi%0jm^S*n@RWSMT5<*eOij1_C9u#7%8@tHc zq9%uX;h{YKqTAY0g>7;Q?iH{ULZt#P?r)|mQy~JP|3lfkz(-YG{ok2fV7Q*3AQ4fc z22CnzXi*a`Is*xuk%?fX8c>uLv>0qlVFs{x8JLM?7^by-Y^$w(iq<~0txpTBqP12N zQEpWVS_Q9wT0G;RqO}k}nfLqK=S*(cKL3}GX3p7XU)NrHt+m%)Yi*glI}4wZ*u=#) zG8z!OykoNu{Z<$AUwzQuzHqv9KbC5U&X2n)MLx{X`us5#4c)4A$$x~oIN z+WiYpks+0?&D(FnoJl1<*&iEM{nV``vU=vGz4Z7WM$Hub{atDxj?B2}8tu`-s2{t< z3>=qm$Lp1_@FHtn?>x^saY?ncZn7`luDDd~W1^?)%Fv^Qk>M++7RK7%h;i0pVdR}Z zYkAR8e=8K|Wj_w_W~;l^^MybAj*q;{S=HxlTn-s`Ba|3t_@i9R9_4~UVgRHE*zbu9 zquqPeQP6a6OR$YcWU)=74g{=qaC%^>>m3D}%f|M2QIh0)k7c?yUXN z_Yea_%;8$@{hcz~@ErwLL!AfQWnYkhW>7!Eu@?HD@8)u~&qm&M1vRh}@Vl3F=Bw#m z!E@y2ViH*9(|TI3r^k3QLR9VZlA-=;WT;5#s25^y`Oux^D~$hRSNz$hOxw{R@y~`W zdNY1R>mh#RW{UZr&Js;#*rLt6f|y6fM4vL&A!8Oj%H@Y1HsWUX;(OT#6_P@skeQBkg3PGqhfvA{Wg; z%*M?5@%2egx&++;wn)5eJwh7Cbb3gENIStCOf*&Sn<9RKn%A4x^%U>#e@fiMcAs_9gKa7iggpE>kyX+ZCGBHoI{7vsE84lO-UDDq^6-Y z7n;~;ThDwqSI2F_=U{n_+e{A6>j6jhij=$lz(<`2Wv=4t5wCs}O;B=Q77Oh$k>h2n zJ&-tWm_5ebv4?-<;9>U&H_74opNbSIpD!__A_eR8QE5Nr4O_9eKO) zpX0VS@V6V0K#5qsp|B5pqUA^869XRF4f{=(j8`u?{~Ui=o?{#T*!aFm+)i8!cur7E za<6Ni&mH`eq`-sD|3Z{CufH`Jn17`+|0nmH|3AC)7dHT1)MMs#PL9)QZrqsY9PnZ^ z>Q`zv!qF=vrzVb!w-$}sTnF#tHu9>!nF~}ocYM>;Fgia%JV>Q?v+X=a6Q&UFg zHg}{y=+-70D;B3PGY}hQ=7KwL?#>6+acRsXXpFh&+rI!(($|>u^!O6sOLlUP#I4Fc zB6Ghc$PlZJir)JcUyjeT9Q);MeHkosb5XaB0%xhJDq=BrPhPIvr)4MhNZz32vMkiF zTO}Knd{TBukK|93{H2+>-R8V|y4)|=$Q%gyUS4>WwpU!an=ZZ}T)UruT>D40hGaMb zb4nLCqoL&_)}(g|>X)Pk`xMv;`~8DE?bEh}4(_$?#EW^CUG+C2ng^^OvoYQg8DuWA z&o2~hxwSPI8nS-BU!i#M{eGTHkiK%j_K0M84F0hYb93yodA4+gDuMaX|E@k^eOj}@{iEaOI}MoTOcje5{@XKz@KBui!_ zNYMdXX2CKB>7uBX!~|7GTb!LqC+b{qxf@Zltk-TmB9%V+O=zj~`keKlwF+{)GZGbC zqn*Sb9`Z_$bIvF1V}cucVRC$1X+Z?5-GjLyEkg_ghVG#e6|8{?`x^Bdl*PZ+PD=Tu z1GVI`8aDCFRIJIIUYig(Z z+D*|yZo+oe>L*Z3mqlbk!A&N3i=qi~O7ub%SHFheC~3|MTXke?+f1wB-OI?I;UomyAV5DuXxGOt#u&0x zVC*6-?Z35iYITt*+hULIzswh2K&?fv4G2Z%88-!#YL_!~AHI}1zc-0j`I9^2yE)wT zMK6FM$bo|hw!I~ZmI!$X3HeuW*`LSdCvZ!HG?{vHBYwx5+eZ*`zn$|(OEOo|(e(!5 zQaHZQl3jJwZu_8@!#O_vLQk`-^s3C6f^5fb(~f6-3kgzm&?#k7b>f%Z=P{b~K&~k; zBQtz)4oA0?hFR%6*`l+}Wvn9xviBD1C2V_S5IvaUk8#E#{JGp*bzZLGEiUB&;Gm!s=1wFVVsXG87+ zx|Jj(mY;LZ-*iNB5-WmPb)G|*%Z^8qWAUL&D~y&P5iw&O`L#%*&5JB)cpA1f;()d`=LtZ5n7N`?Y+Y(r;RWR+xKt z`KR_{-f}tBZf=WwlZbCbfhh_n-C_Q>)I61DO;fBvzS*26bgU1ID7 z(BB#PYh#?as8miYKS<{H?1BD=Kot*ypB?y&Q7 zI*fp5I2l~UoZ5!XsU)O<1k{j7b9k8Zz+aPCWinK8ctzk)6Jw!ts*Z}TRDo;BHt5;~ z{JC;Af2L03&*VTu?ZL<%49K840Y29N1ST7kTs{$Wf%Y(oA= zAFOp-gURQDZSV97`S!&=@>%O%X?weu?aOj>tl;}?yKxH`Ss7aXtcnHW2aAGj?~?aJ zZ8RX5AO;9P2oowZyKEMPrZmKRqLt_~L{|D28Zv%9;s1Xy$63;?x?Q}XUod+DYWUb0 zYDy>=i&g(DA3p$;pEnuer>x2utkBC?p&_1q$E@EO3-~&luhY0)D?m*;kuMb>O9j%> zS(IL`5m|$hvcRwgeSfw2xo3@jN{g&gmVPNDpj4z_d8_%D)VV)dcblJk_VdG}lyywX ztS;ELe4pGy@{5rrvESbAJY_os#jQPRTN92VVs6bVn;y zWK|mujDe;=BSUV>Li7$gKaR>}g@bWdbro-A$T;Q@t7it=YF$Ok@u38!02*0|ZL=3a zfe2SgXfY5@QdA{7ke#ofh*-)QH7pz9K^EFI)`|^gP7W0=I*IT*JDa8m%b*TE}&|LP`{}a`CmtbwGs=7ep=veC1rI+Efk%C+;*9cMGHc&Q3<3F4zM@WSZ<`e?kpF`d>DJrmQ^V%Dmb6 zIeQNo1op3&D5kRy!M%19v$4tcZN|vJ*s|b^!=sfTFpIE7VU^MY&QlX#pa~uBZ~uTW zBSd8FUkHWfe7#q=YLAhoG$XqAN(S`JJ1Ei4HUj|@%=ad%-2E8S$Jflq493|u^Deus zY9<_$#CjX+O*f!_@^ALR9b9v6*Y2?5%?R=sEyj=fBSVO@&xuDd0mzDJa~yns1NY(* zVwtK479Ys2yCmKJ8yaYsUDb9+{cE(h!??g9_}B%6iMk|R?D;5Lzu%5n*k+H~))Y|O zHn1z=4_kkss{Qb;19sb9j0HJe0MCV><#v(rz~XMEFz!BP$D*qUS6l@~)zu{WV>!T8 zhz(jgsVAP>#v6jSu6*8}ZGiV~f1fSi+2Pu^mK+aVt?RQXzT1cX*+-B!AqD0mp~7A{AC5T`aA2u`SDS$pN`2^&)L<3$IdE)+ZpI_klPQt zl)kI8^d$0perZ{|fCZEe#dC~HhQ}c@!uJKzT1K&t*xGL^Zg91A$4(89+kj&HhLXEN zu!RQS!BFiR1jGzk6FwA@h`vKM#36D+b`)wuq|K)98M0Y%ZO^m=#2Rl_YXf_!*8Fnx z7E3YY4P`qr%aI-=*)YUBYcxy}ioR~sX!utvEX(Fzs`#_5ZF}HU&xPX8w1&}m^dl;R z8}vB(U85#zsKO|KLqpW~bg#yA&mB)V-Tx~FkA$EGeGGocie2-bDS}s_?QW>u8+lyU zAD2h|*rn^@W+7=+lZV{if0TSW_OZ_@`Spc8cN0FEx5h4Zj0%!ZkA#Q zgd}4Kf$UGi$yLt@)^#n3{y!4LaCs7m1@D1fql}%mJ0TwtGBcSC5OOp1=LqtZA}0_a zNOxX`59t?e?_eaeGL2MuOsYB{tfh&}z7bs55s%e0rMU6V{3kp%B6N2R>_s0&(iPr2wPl6uQVry#Mew_&&35 z$Vkc!`#z&!VA1q2hL<`s45i>KM-@Zso`2RJk)3V=J%(ktST#j!{uB^fs8>BG*(~ zRrglJ7`dd&1y&V@y;hY}DtO6O7AU51N8^V13BNMbEvYrGVX+{~tvh=6VnCwI@K5{F z^tdw=&57e#QCSdRE`!t8qPe(8)c#`;rZ^qd8X@ju=Pq?PzOhv-@Q`iQ|CP~*?9<85 zk)MhOVbnMX{GC1s1ipF@7~IOjQ|y!Me;d*suBFjPz=TuS{kgTUgs<+spTE<4@8)l~ z_cs34^%gnj|7Qc4I%ExEmxtQ^(aUJHfwJM%IJMk?R}7N0UG;%x7%aE#BI7#kuoVf_ zJ`*9pccE2!2`lc)thkx1xNbrt_o@eA@U4Wb&u)|V&6rT_K5NC(U{MEXKvu&KU)B0A zm-A_$p6N`7E2cRU(JW)GoLRuHHw6jG=BL0P^1aR_C_40m2nuWQXMGp=gT4*5pDp@Y zM1Xb@UhZnsUgA%%-%$q{NNvhXwic@ltsxKxu+s!1qi658^UaF1H94%gChZf+HSux+ajU?9R@njTFEXvDuu(<5tyg_WTDqDvG3`o9*brt{8EsRKaz4yw|y@uNw2;aHNa!hS-Vrry4Bcp zsR{_8?WJ>-;f; zFvIDMa6lYxB9`Ze~$carwP4lK#Ho#wVUBr_lUc9 zQcuRvY`ls=Nyp`xvIW~l;Ian4KS9prn zTy9$k9`CAIbGad3ft=bKIXk5)Ch(%a@|v7jj#Z@?zJ_g#x4|%TU@%j4-nQ9S>5<=m?HFv-V~0`v2w)NT$gd8hgi`6tM1ii@&BS=)Se0A9UEBzuyiOab<+3d<{$a8tGKN zuAzkeZ2)m;_4&F?DX1!`3#Dq4BZ0>y7aP&S}_de`~QA5g`D z`MltFYBG=U^s<=QL4qP@xLVnU>h4-uN#HIqmZc+6epHs7cOgdy@k5+&3@KFgIp-am zqB0wh{<~2gdRh+nt*TWfK!$oM0nmk{oxaNz2Nfh#5*^ij-~H-5xfe#Vgz6-oK}Sj_ z&(@JvSupn0Pw7E{l@L}5_CWGRR0AAPRT_arhgp!ZzF!yQ>xmCl&$SH+X+IPpqDBN7 z<`0OF%ijwnpLKr532#V|UpqJwifD#CQO%+cAB3+|{0#a$UvO2q<FB13IXI?GPp(t;SP)3C71&6h^0*kBk6GoWH0-_&Z(t zp}TZtAX9?qSA_^zRp@nbE2%156t!d>QR$2UT{46NWJ*0PGdqF6TVF>X<% zpaeJr%l<-Pp>zLb-w?5*#fCO@bOvSGTU9K81R`v^v=G&CwzE zfQ2dOUSW4KsLD@*UO0;o#xj7gQ_3s#fX{E)~LmaCjYn2i~Pna-!K zz}xHRh7NjoEt&9><+#Q}I4LM`&8$EI{+XS~TTZpK0jXJLA(|~7E7Hhu0%m=gU^!c` zkhsGrQVE65;VASTXst}Q?0o&N^}e*^er!sO*@fQKnk_=m#m zMG}*D@?xjmZo7(pI$3IZnt7wdMJcrrWR(}wkTbbyKW9_ZD+ar9`{*sO-4r`q7-2Hq zn6M$Oe*J?jxjl4)*%=CV8i%-BqWw8rrpD6D9NMtcdF1G$>q2TYUdAy`vhzXr{@nR-~uo2`j@Dy;?4{ zbhlaY^~p;INCd7#TY*{viP9DQ4J{ji3P4+%_(li0ybJ+fTwsCK{0S)P%IAvPWHrBI z-k0oWu_< z^;-Nt4BPyKu4uO0W&ecfn!EKAxjlFbBUe;r{_Kaie5+kY`xDg-W*A(}2+c$o@OU1cDaoH7n}I}-joJUOu}bEex%B*b@gw3)a=tUq$A zd>4CkT_bR)D?SL~#R-tY_Ed|?)0C&}$tiIT8TTCsQ5wgwWYCCp++h1r1E$K)){AEtJ$ zO&VN6gPluKqy!@d8)Jq5s0L0hMQU7tfHu1Z1}!Gs$?;JpkN?9IBLR(j3JK^-+#g%X ze$Uu}blI)Mo^&Nk6l0UvTz*%p(XMS<^kri+uB0n$dwy%Rof=md<}|(D_TjHO!EcZK zu9=L}c@SY=!to;^ktbqxF#*lMB}T{<(i1lp>z@C;N&_YYp=bD?9>4Vx(>d!&I(OzZ z&bw!s&S5@c;}%kG!UjKJKzt-b5Ygn4ax8MnLi1m??Nt9#_6H^IMMJi4n=LCh%PI}f zwv9M54N12V+pfuelo9~!N&t3kjWhaHqL%zw+@>JHaHiB?N*B4pm}&8>s0H&kBR`FU z`X06qzPey6*B6@jiXY9?jK^0~&=?d>*dI>*QE!aKX6GqT&uhjqGd<+Kzc8BeEOc-D zV0V1KQp#!9IK3GkHbJS|N@Gh0`=Ter?b2L4my4FkL1X48bp_6|XYN!=q*rdl{U6lJ zKEF$dA6LSX5e1uOgr@vO(EIJGc5B5f+{4kk>p&JhTc8y_Hc=6yi;CiaR5V@Ui~{Iz z3~t>%M%g9e*z-B=7*|wmB^16PoUDMib36DG721P{sG+Sp^K}$J7@S2dSy~Y&O)&>| znX2JbxM7-8acsq~NBDH7_VPQlz*K`M)Kc?%S4E5Yz1Q49WDP2`21zr_Het{u04uCW zF@(jt3?{VI-WV(;v$)zU1(AVFnus_*dkyb7?c^fUbXdDU#&HLoBQz;?%K|!fBQX)} z&{@^|oqkq1f5T^$^0)Xb?^ubhbS=2*Pizd~Yz$Mobb zRAaIdXJ(1QK+UgQi4DX=U!H;SJV?*tY+x(`D*!rfG3W!@vd5gH%RJG8<%xTR#2|LU89^(wo}n)Kdx+%!DupGg`#R)u<&1a;uNDE(Ec`R)Zi3 zyjfXCvJcCn4p`L1Mhsw-t6Np8yq)G>$vNlneXhPj zMGZrJ)mim-$!2bC*=y{LZm%JsoyKGV$^HV0I@73D!RuDuh1c86uea?Sbe9o|1*{t7 z16Y;n13*=i8hZ5XCO_!hfgjE|uM2`>7T2l@zv+uvUmc4}7mWZNfomS0nImoLp^K~{W4ULP zN5p28=>n>L+e#d-YRudiJwlI(0S7cIF~J4ZjCg`(Wi`K994BwCm?tUMp$@4@aN@jf zwI&60GUqUdox?9^Mj!>4jO+A4bKxnF&IyrTEp5b7%tj?}bhlB;Qxe8*R7s*IXpkb` z(2e&ReRPO;v7VeQX5t@mbw-H03xw)1+7cj5uTdhb*88BVPliTKKe-&raWc|O-O1QB zV?gqd8~8rHK9G4{5S>0-ZZ zW<|k#LaDpFt!;y!P+oAHuhaWTAbCf3|z(ZFF7vJPkaH&)beSyoNM*jpB;e?ztz4w0Sf=g*CPjCM9QaN&e3VBlHhAz~4hM*D^UcB%8e1F+{GLF;)l zo|nRDm+FY*X&F-C}P5MOVWNTUT$egc0^O zwo#L@qx^a~X+wV8wu{xRt6`=BJ##|vscPP(RSo(>acpx;Ig7IADu<=y<6@il zx7eS#nY|o6^B2zy#QuTn<@2#X3-rgt&BVd*kNa}oZ5hF9bgeQ&20Ct3luYv1*)Fzn z)51xGY2eHNm!H4mXm6*!#XMhI>HPTStj1dHt_`!L(FLvH6qZ^>^vqkg;`=Y-Rph<^ zjReYYFmWxU*_)Sg_O$S1BWhi&9fN|_xA{Q}47Gc46?dsTUES)gS(HrW*QSGFBw!~c2k^&5+P$I*Oa7h&I8_i^HdrH#rqTE|}WbZ33d zKcd*Dn$u0>Kb>}#BPH$?$V;2%=yYS$3)rAV<~oPbU<6|qv6bJ)O3@nCZiWNgFNWef zj?aE)`G(u5HGZ^c$qKM|=a=P$)PD^=g}FUyay&i5kcMCj_0MxN#XUG_9(Wo}z?Ugx zt@|i*9ly?xI@)N_YE15h0QkH0#aYym<+^+~I{NFI+0ktW2()y|A!P$z>BWCqh}0MZ>wFU~d1#c9)+ zt$w7=RR8Ht8jxBA>9;c(N$sF>n58u8Kq&V-CJC`=eF`p_Gx*mwH}JmIbm}$PkX`ac zN@g#@_VDU#ja~9D;KwB-@zztbU*PXW*$TTvEGIjhw`JKA>=NmuxWBw)u*&taON@Mp zbr9xbw$;3r0|<4$2E(Po&)`*=N&9rDKJ-$u5~u@~@ojbFfGZ-SAxLK(frA zUNLPP-ID1`z`mh1hA)mbq9rk+&T13PCH9#asysdZjhSYjd)^<|2UcF=JT*9f3^Dz3 z@7f>ZqkQOILIG{>w(PCux9NRQ0c8(5ukc-nEB?(=uVTe3c@l;htadA*VFznIw3>g< zgApk&_h;mO2{xA8#sngRT6Y-bMS8#$Q@i*Ps+wigo_N8!$E7!s`?EJH^*YmLbhe&n zxX;t|+~7XjdJgi8`kJQ;-PA7zWiWZrspOU5{rRO49Y#ku+yA8dvS_}Lt`Qz;nDk&G zXvW*I8!^QXjH72lv2e21)XS`pKeLP)QfDa?XM@>+sX=rl1<9A7kR^eZv$JE}{Kd+T zfa$bQ#B;V82LD0f4AzE|#PcAS2Wmx}M#{2%SPrEvMS({O11G?V;|@Dna^(EfAQWkeribj$9dBJue#(%opbyL-x?p}osi4I zJFo+?7I}ysAA5RR>~P;j{a9>XrKSmW=_>S8#Y1sL ztlf(3%SO8jOKg6UTX6dCz0x0R+Z#JX48qM#!)IC(wll{_r43UIt6ypRw&(WraLrAP z!!@^8rV@(X53EAZ8BO&Z0egi_1Nw_L3fVHK40THA+!J3R&N?l_WB;R z->fc*ZuLl?qE@ZUuaEt*Pz{`%`QEW#?$odhvF$#BfvT%tX4bJK{;m@4rJ~)&JXGmt zADjP`T51}UF{+a8ZQMhzvR~~n2*JN;c;=mBA-zRiD$8s+_RHCt{mRUmW50}1nW4s# zqenaARAyxMwjRm1sK6=NdDCocx6Kaq9#Eb@4OdWkQ-2J>Fm1wreB|yN@r}EW=LwY^ zaEu?n0sgUm{9je>!Kb+`uVk+=yu822P2|>MB*tUQA%Vw6Y^`N~aP$zOURk zcHu>YCm~{g-X?&n9z)4Z&ahu)5ely3roCGVd=c)UsSNFw`0cZolsaz{MOPcDLO_rnKlgHpa|0gy9}^?v z6@I*%WO_S;2j)dP?;?5W3?&iITQf;#4YSQvk1`eur(MO2F=^QP_-df-JY-~Yu^1wn zyPsuaB!M}QH*KhKdCueaslc*)fyjxReYcT>-a<`w42x}a+70H642aE>O=t)(xF^~Dcxq@2Q2jlO= z@okUZdd7>$pf)o5*>dZigZ7RzBX%(0Mls zaP(#Eq(i*$SbHZl|Cut*EbX+b;YI#u7hGf|&ZY-4h}ciIx|Q?x2V-1{ml$ID1!&>P zeN-&oT9)0~GQ9$qFM8yeQqYoFtPJ}xitF;r!QOAFe$^#?kQQ7St;D?|rHb~pK@V(( z%!HVmhNaQMJQK)2NLHDQ{*I$qWpHf@?@7zVrKPAckW|X+ zR^D83+Bl%Qz$?;dkJZ6{^Q?|4nDJ_Yu%K`HWTFIt!9OCPeeNw>Aetv5;MpJpv%%6q z3qlBdX9yF|ekF4+lZpXG^XX(-;|o4I%}j5 z43aWm^0LOqxJq^1B!>_BXihKUNBrFQ?$%ju zH7g3Sh7PEth-LiM1vrFBK}*t`PU!~{qdAlk)R~?;^{ZV}sfM1<_1^nt;aiEfRUI&` z7Jx9#Tu1g%n{~}GTE{S|Pn8d+?se-ULTEy~Cq#s+#J5zmc8ism%0pn~ID+Z52V?tl zk%9F{;PtrZ1mpXAXN!Vs{Gk5dg3C8+LDXAMY_2b812n(axHgM%6o{4DJvb_(kaQhw4X*RI170*ryJ)O@4t z)W8}JciEg15{5HGZA&eg>tpN&2RX@XIwhAY$T9OlAdxx#0+a>WerD&{b?-ogzi>JBRb;3=s@MDb3B?cRj%_%b0s?m?wy9wm!qF9&&SQU zm4GS7p_;*(W)d3pNo5?6U`|LsWmTxYo`Xt=eZ4l_(n(F!%8p%J5*>y)YbnQoXNrdO z*-%u%h9`T%hN52CK_WtEwkLA@j{=Ag4la-FVKhzrC^tY~Q0fnu`KR!4T-Ro@^aw2V zhqL8irR$^^RekaUmI;0cZ^{drP+RX|hdPRkgjJfOLo%70p%4FzxPoJH6$}DoK5^UdZsQqy91TJ_P`GqKE5AQblxaa2sXP{Tvm8No?m)Pn45THZ8 z$ZcFFW3G!i_gpKHr7k>uvU^6oA4(UW7si!``mWa9x8#~WaphoaJ=cvMnEuXF!Q{4J zY*RT49SzE1QH?rl;>Pr?eE29B+iX6N_mDO5Xt1W801pZ=b^~tHA4Y#0JA7_*xB+Um zc+?A@6W@v;E|KH$c^+OE{pP3_{z9*yRy(6R{@}}Q7t{~F9F~vayUzIr=vMQ88z2bi zq5)nJg4is6z<@11&u1(SxO|&?aTw@Jkmzhn2S^Qo%~k82tyyvDhfRrI%uAyfOT3MP zyiM+%%jxkynQT;OpZ<(>$63SpmG1lS|K^>G=f{7?eXr2_K;E0&_jkxIm0Q@y+FpM2 zGrGRG_o&v)WF`kANtE%egpA>*ZH=!!(PlNDt64)$a#t(fVE(q~h}gwnh@u8M>WgfO z-R3(t`gHIyvJ`~!7Y-Jz^=18|HrJy^AJuAQ7{CNsZ zveu0o8p=IQsK;}o7t(&f`r)&fxzIiui)Tl*)+PSsUafUtJ-kkulVGkD?r9tg!nH3) zAI>hJ@HvqI{Jl1M0%tj+Udv9T8ET1qgV#U$vSWhj$=k;DU38)hXzpq?d5Cdv@sfr* z|IT1?eYPSPBT{v2<1a_O7L4WgEUML0si2-{f1KLQ*Tf54 z@4TMNokz7A!ZM3^p9i+r`Cmbc73mWska=BlXZD?X-=?6{jX!J6?wscQ0&{yY*SlJ0 zxT==R@s^TCPhklPTco(@REZgNSUEs;_3Lln;c7hxl7iNAjHmUS=2e+EK$lVPJfB{B z8-0x*?Y-nOg!B1hC9I5IYx}n5_7cNT8`*AZP%UNheaYl2UXGNP+bvohp}8(<(C?eA z)bh63svCo&JMJ*$&Oh6f>;GNb_fc*S%EW8e7H4kfld2eHdhF^MXL_RhY%9+I zo?V@3k(-Ln)F^pBxm`L_qNsT1KAz6>U=N+?Ar=*uc$U z@{+@Tahc0Yv#(84T%_q=P$?6I{&C6+j+&k2B9T zKBJ0^j1R25kQlF#{x_YT9fgR%hinx)woq9I-!z1CHG&SHoBUxble)EO z7|O}*jIs18^jtKTbZ^&rTdh5&li&E*f@m)Ykw071G^sJ4Q|j1@30LHIMrxd?Wmt7B zDtAtGU#baO%MR}n?O&4vgI`NA{S8Z+Q$(;0=I+<$%vqjzq zdVAdaT?qv-*N@|nBBEXH&n{9;GpGsa@LD}LxX+jCIp{u5*7Ny1XUFU5Y&Uh3yNXZd zt;;EyISOEcdz_FpzX4iv6u|!Q4E{Hv)fM`%>wNXLnun8X{a1t!$Qsa)(Etmal13D5 z@w;-g6RZL&&vj}Ly$JE!dkNd`7g$tAKm5ZDfyCD6XvOJ?f9P8{Ca^A-%miN8%g0Ec zz=4+or;n~d8UlfFaTOf;&c~qaW3CT;*&zw8M)XRii$!-p;bq+L0wW ziRKot_-sTbFG%JF=OVfnTsbgys4!ZL5J=XEei6{VE5jVd5tLafGc3x80L3~m5ly*#pjUG!?fd0z`cAHE^5OI8O2}H93J%{e6SEPu}uJreYQH%z_dI& z{ytu|-*o0=z(FY@~TKp;;At4Thi6{8tdNo?PMs|CUad^^NLwDt58?ihWjXHUEYT zX1X=M+V-wCzpmv@@DYxUUWg2>TZtsyW@s9*#MMZ%HimV{_p{%CMlFv_21PcEUqM>* zYIGxoi?5J|Br**dbV;GCkJJ}-3zDQFV@RD`)PsF}mD$ObtJK0_`2qk0+kI+)5m+r3 zlS5EMHj&XVp0<4Ns@9?zX-YI?+j??=hHSO0rPaC?h$ll|%@?QYO%J~>qQ2NT{Dhm0 zb%dc8qOvGnRE=P<6Ij``u7i%X!pF(BbS$by-jrn6Mh20}NSH&ic58UVKIHkZ+%BjY! zrvrjJ)FHNfrOpSh8`8PjY96ZWA`%1j;DHwVB|AwV)cDs+3!IOLx`I60G-*at?KM{2 zNAB@p-PYKlNmldgpEJg_wN~?f)0AgE&muyW_|W-1t>R$;92uS3T;Da9rw#S&9jXyJ zK6KXZR*75aAve1G(6r@h#-wp-6d9f7jKl|e?fKePF6&yI8f79?%Y0Ld+VyO0)%N7B znN8cM=>)|t1;5y(;2M21fcl(*5B4Z{XjguuEW>=kmqZpoF&FEk`$bpTqhM>kpjvuB z1u#+-;)Ee4Dkuf0`~HB7+^NA}%3ZF85ui}3>n|cy5>o4Z69x5dRsru~2rdM9+3CG- zO5obN%6`!CN*KH%eZTkK>eXlnC^Z_0@m*>ywP2vcyWe{^fZ@H=dpE$~z07+z#4q`uG3~<4m$0!U(-VdUc&U4Hidb+k+~)(gN=#)jwf{AhigG0v zu}0Qo;r?)E8Kl?Tkieg?-#Y^(7Swd>^0wPp^KyB<<1YD!rqB1CC+6zyFrdOk){5`& z#ZWho_K9Lz>lPS-nViMPOfl8ftz>FwJTpZV#Sa%+w+HpqrI4vEakl%t#9DD0Ppa5j zXBSdoQ9dur9egI*Z~+;tb%ElxJ*6CAnL6K>9fG=*c$+6{-BLsOMN7ebX5ldPZsv=r zH}RCoV;50-alUqRRqmp_-+T;|w7pwK1APv8%%acM>{z!gn6%f{5|ed7_qIgyuHl0_ zgn-9vJgcjC9bYn8{utghy_0t>Qk)-u;o|w`wrtVV~O(13Gf|Qesl$8qF2}$fw9?M%6-g-7uy`$_;3PkEmq^@V*Te^>xyf8aQ=GG9NR1k z47JnK*j-E~gp5iWu74I^>3~$3i|7MZkeMxFd9tqtrMqzY2Y3|-W;>H!HXwkrpG#>& zen;p5o7<(HOUbBKfq_e*Zttfru!N;OK>km)k_Y)-^CFNx;p+4AP`8rH>4d?f#!f(3 z&5x)+?P2S78I*Vcv2Oo4FI|A*hA=Y>y4if`0h?%L<{SBX=9+p09`}Tz147A5%om(p zoJ(;AVCot71xgb$I7bgq$lXFLiaPp*Fz)BqK&#S_A>N#OUj-*Q%2-)fVdIq27fu}s zWcmuKAaga&3f4L-K*AO0u_UcWBNgZL*$UjMh|b4NQ+xb&pO5T5+pk|<`<0U;s4WRBYTIi5Ddz>E`7w2XuPyo&&HW}_&CE7s6gvtL27rdREa@Rb#^Z-9{LFX} z;f@~~6ye12Aw%iohmMb&tryYu_@PrGsQ+-qGcTt`2E`AJu$pf)^Z$_R>&sa%9TAfd zvQcxuV2~27l&##%Pe`3dXi|`5~M1>3l+jcXpt1AAN z$39$iv4eY zBfH4aFYq3aZF2Mra%WgTuKZVd%jQce=S^PDNU(0@0~OpfQxHtoRlI=4Jl$Uevfy!_ zufX>rX9(kptqEINrugbw<`iI?*pm0-LvK3!xeVzvrGOEeE3uwf0Amtu;iD) zhffxw>t*5H2Dy0(K0Hi`F&?9FyjBG?FeY+EDD}P7dIq&LP9r`~^~C1~pyI*g%Q{JO z$7dy^FXpBWj=h>MQFb~a9M9KnHJ<^FXO9a$e7a8ERWqn%kw%+>o59k*@<6+-{Di%B zL&@GDE~3Mwnk$#7RFf1=an}`R{Y|}sSF3+6+>dhguQOd9N0Q;lX11e-%^+`@I^Dos ze|yt}#A|+3d3y9S`upI+qfMlhW4@f&(ecQ&YfcXuTgM?96h2Zej2vtOQCdV!=Fm?B znyT_$KA@;8<)me=>#U~CttK*@?Z=ug*|ixf{*1EpUo+fPpIE0#lFww`W$_3>G>FWr zya=B(E5f0YHw8puX*@iPV==$g{3kMW*_1PQ0nJX`5U}T8X4|&!Jv$Xd%i~!Uq=IOG zpo8RD8T>*^UB%FqK?Mys&rW?Cp)**nJ^$SzwCUmv$|*v&GFU~Ha|7!xB;g^78Vh_; zB-yl!eAu-wS&4aN6q6ALiQ!a~)4*G>VExc3J6RoC+K992Yy!k_Jm}QE0r6RPq4qrA z8!C7FN3;r+IXhgL>*^k%-%(SsD9mz*!b&{$N_H)6h!(R zU^+mcUzkGfY&0Z4w#T}ja8_a=AHr$*eMAJ1GefD774mT;d^4)I&Q>+l z66hfcZm9e5$F$dAF@KY_kXb@Ulz*PGE)ceul?V#7k}2@WiAFr%1?jI_S-N8rip1nc8f`-wUFA|v?Gj`!iBMY8 zO(;e1`cb}~v>wuzxq=rxFx5yjO)fHDJi_$CU%_XLuq6uU)Y|5RHodCiHl{3osCdZ* z=!Gvk&FtSiyII$Y?p8z3P{Wy;aiYgQW%-^0P4qLs4oC-=f4Z6{t64WR>Hsg%%4_Cb z0mH3hj916?BynpRdfB$!ppL1DiVD!Vve3+QxF_01N>=RHEjlkD<7|OM8Dz6`MdpW{ zb-#(4M6z68w||HT9TgYk@T_oq@R*nD9d%UA!#v#P840q4vASWt@8mmp&!~(9sAgE} zhKqs6`l>@fp;+dxkXR!r%@0`XUS589g{p2YQW1iInLO6*he+g=9j6qnuDImlbce*W z-F)aNF*OgP`phFL?jdwWVvnh7g^siHYXe*~^_mH9<|VTmi79q?QodZ2;H_+KtjBkk zEgEX4P*IK0>=A2sq@66T$UKg;#K%(ZWXw-OWOlcF!OY*;_jXIV$P~SeqRE%CLj#YT zksY8vC4rSUR?IWd14O{(Sv!Rfn~N{D;M~6=6QWcD)8cVVz%5t{w$3--)pUDHR){*D zhT~k0)Lf??&_69=sPPEXA%@lFU;sI;Vq9V9aX#o@%msboEq1U%jFl&-?-)QN_qRC+ zFQTUS5E%c1K>0`h?JDnOe2~d~;s=zs z;+Gqeqzz(v8k=5slU28}g2U@h(sVAFh=gz5KElwbX^`8R#===Ii4_%4RC7Ys<#z%JnA5G6XbTfMELRE_^OakH96aPhCD{hPey(zWU z^{+udcaI(uE7VYWDr9tvb$ir(p}*d8gN)YvCo)>60xCJyEeRRrB%e>IBi1Q}&7 zto10GG}wG8_V*;CpDKfja-F%l0~vLDV5%{z>J{_FBcrJepok#0Ua86LP`~92IWmHW z`}OeE4tjVWIfxNStcr?)$hR^-P=Wjsvzp_2_1Ktkj@jb8E|CLq+Lc@}q`X#nAVAaf zn|#Pn!0c(l;c{qAu-n&!Q8!2$DK|?M)HECqsl=sU`D$46S0hxiIuCSsNLqJ%qIpb@ z|Jq4n0iz!!NOx|p!KByBhtJ#BxA7(O2T7X3xIgyDXA(uJ0Ayat(nX(;FkgxXb(;^X zc@EWO=Tmm^^{%ePMPGvKRwxnGjqT15#Y44Q7YE42M0>ePW+>B0`M-g|T0^1Q4U324 zES-PXwFZ#DKB9=t4+6kZoALcjoF^n=ZpujkvgO`unfp4(du=qYi8uKXmC~!~HPgj= zOxbvEr4FrOi7sY}mnvi0-5fdx*tV~9mzSb_{fuuSQ--Cf5|h^@7FKDHXjxK=3E>v; zMPYSjie3Z`7a$TOLdlu?5*b&g?cuEf&J1bEM7t%@>xK{#Zj=h^gZyVj5YCz;>aX!mMDG#~PSCKx7d$#HBB2qBI-K z&T9Ss+ucxJMHWgr243174TZ;YiI9VZr}#Yw>J6L}n#aDxrC^@Ivs5+}zn`Z+(fulF2L!cXRSVQ_)Ok*t0?ycZC?H zagC|bJ9uInI+lI5s$FVYU`a!Qq7UGCz>-?4U+l}ID#1lN{X@g+v$xy!6}6v2gEbnjQ|lTieJ zWZgd1yts;BTit|_78>{&(>-OK8 zs$6=jsvzWr(s`R%>)bvsy()8_a;nHuw{@5?FY|dZWn2w=!e~hiTrV?UipO*#{ynO- z60ZOr5w05Ac8-4v&>J#Hs;fi3LEiyefrbeS@avbUE#fm5Vv@-xUp z*rv|&R1>K}XiZN*r7(^#I^1=l5^){W_txHt;Cp~1x z*?o4RBQme4=PLI%J*0y$V)V480wX6qW|DQjas6MkHWs<@3jZEv9;exl+Q9{cP7 zq&M-vjUy=k_oDniN?e2MmtTbPf1iu};V$zEB|jui zEb-+C8VOG^_k&3EZ&Ce}y^~*S-QvRd(IHmiekzC`EsOMxA3Ztxqs*<;WZV^+rR)}( z8sY&246=1nA_Q{D2>R+=_XK!H0{Wf_rYA0qmASU3s1=U2K-?gL$O<$`ceJ*#;cpt& zXw`3{A-yNJ8F^MYlUuNkQuhb2{X^F8XEncJ(*Iw&)YNyTbHuEjI{Jwss8T(M(E^k< zQo(M@=x%=4=H~aF~K3VE-m|n8|AWyfI*L;HkKOqscdkeS+|HvBCoS)3WrmNKxvFT>O zn9^=p80LRow^L21TB;}dJ`Ky zY}IoMuv8~MZ2gmLyDYnnYXlr@?YW+2oGnkRjH4D5H)tGQ5c?(uyE)K=vNVO_}FuHn~A3E%poM@~W5ULcD#Hm3WSa%n<&V z6Xx3b>SzgMIxFRMO*nNOphgJL;^7cWLjx-y7IGq3AW~cL^3xMw%JqYFpJBNUS@e_^jmqzmIl@_RL~^zV_pO6 zhIOI~mrdCeL~p|}4p4C3hM%+1g$CWpYo@?hIe%6Z^@BO*@jn-ccf&V3g@_zjSDt+& zu+jxZ)~_dxAO1CJiF8LB-1yK1t%XpzU$j{(Vz8^vt0<$h)4;mZvLBhUqr6aGZn;g1 zP9yxBq7V53EsM}E%=c%WeuqinLGe!3=@~$_Gstji_B4Bbps`GM&VerT%yhU%RX#g@ zuQ|ud8S_4L?B-N9JoW*T4Nor?T?j%%TyRwFd4}ga&QX6}AXw>c$x%S+2(~eL9yld{ z-|-<0C0o0XS1_u!;>S}h-fJ0iQ$n&o#vZFG?jXB4;=Ze*na4g`pmEF9*S5F3gYNA{ z*#<3a8bEZhCn`*s0Jw|LMM3kxlKmh6~F(8VTlCGkN z!LyWuocddyg%MCKglm*&$0<{-8q^~?Nu&PmiDdn}=&wl-QG z^usKIR;4j`h^)IZI=0UDZ3dQbel3@R$d|QI6~-uxTMH>6z@YtsC%k2mA=qpFN%OH( z-(q|-C~NXy|LkVCTPr)PKT}0Pq1Oc0g2RncELn&rgg(fmHk%V+Hnxi|CETjf7*2DR zZzEs`H*)4O3R9|4pT}gWV|Saz^7&?v&rImb=@qt#ZEW5$=TjM}w`)ELEXsUnN)<4UDO;_!lJ(G^C>!ltmb%O#*&H*~ zJ~2XlF|+xwnN3QCa_(@_#ue5*_g3Ifpj53cQRxEn%kZ7H-8y=lTQM7>)) z$8dzusekc6)62SJfJ)tP&or6nucO8>pU&M{d8Q>coN^^!9XkzT65*$#1QuOP>Rp640o;tKjBT+qy08H z)Aj%93>`b&!px%#jDz&LmSw({%L^H^x{;h%gvg?9v`oaa#O;J^!ZRtdtLmD}|DwX~ z_KBNC*k+6$cJO%C%8;rXa6qZM#!3EF-X}x8sMlWCI5W2xXOz|hCeyxoq@JIBrPDkc z#}2FcysbD2*r`Va(#%1)M;F6|_&$zl!{`-c6cS1y?<1P%2wRuAwkGJ35-N)e)w^3B*IZ7;~J0;Z`b8YT<+s`-K}sS<#hGNiW9@>xg6}lF{dDvm4?Pn z_D9@nsJUu>3%dnIIj&cvDwJxl1SE@aoAt!0mQIYkeTLaW7tvBSFiJO~Yqc6F6yovJKCJC%!PaAXU7)t4Tef7j@gG zf&m`TH3Dgw`6LI1lan~7z@S92EL~&YUCyl!3+2u>{`F$Wk~Jy?7-n%61|<{~Y5t5; zKF?A+vPhE>STjh>rY3rW79d&(G@lU2VD9hU&7Q1!A_bxRMaSJN~tDIzss6 z9pRui^>RGsr%8ATQY;%70`_HZ5A*%U9}(kt%bhzP5v28Wx>YGPY=3| zFWjbLhIPdCa&b-^qRUWv`EXtWR-pAnqIEP9kPYb4pJo2X1(w{9+VA2&(<;vvE*K$2 z&MmQv$KWgI-4@kxZ9VsH(Pgf#KQ5HImAe2gaAqQ_kXn{?=&)QoJcsG!`^vRUxCxiW zn4yFA^26E+py4Kp?)Sd%8jG4p@K?~Qb_Fz@r^Qy?G^DY~ho{>Pt3<@$hwBNw&;Vhc zPEu~jsQ<#XG-NKox;&y1l zom#(Svi|79QIcS)%b!t4jekf-*H_a~A*(2Xb3d666!{``a+NPl?u_p);s}rUAgM(t zI+peJ;+d5&#@seL_t#MTHuqMmgSjEM{eT^jER7fQfbY#9H|#!fb;lRP*cajZy8Icn z*4ch=x?GBOD7yvaGG3dird zeKQ>E=@*y;*qQam56V=_Ds&{#bnbnIKX8dS5LBROAjom&`z|QCK>d1Bc z?PDcY&{3ZHMk4$j5V?@Qr$>VPJuC91dYo}5UB9uo;_B+`99I|Eqtk1(&3E`?axKh` zH@|0P&o{rPXU{ReS7%4mF|Egcyi0Q3S2q+_#B_ygarPwh`J35Z<~Jfs$-;u`*_!n& zK;Yjk;=%-qxcutZ5DJ&LO#fO3?6IEi2K!4&Gq=$hY}w+QeC9sd;cZUg^;A2M>9UU^ z=gD*bRL#GYgTL4^y<$i(zSjz_9DD)KCy;sQEp(>1|JBhAb;Sdh ziM9+BEwvu4t2p6$F=JS8U-I?qn`wYN2(kWjN4t0H!TxZ{3MJoaNcIiI+nB(8Tyk}C zE509g`s6!j`B8M9f3DCbeg1Fy$>Ds!Z9gE&SINw#Vs5HVZVX-?{Bo23^57NDpWie@ z(zxO&Y^=4eH@Ux`14-t1-o!nECDl@W#)M`eB4%<=C|T<^Kjf_RUYai{`NEbdm>uiVOd(~kyYb2We&Fq0byx>nXJ^GnTF_dX8{ zn9ywXD&GSfW4@*CmR#Z1Im2`?bIGv~{p4c*}Z#LF8j?Mg?}*yc z9$h{#&wz6U+34~=KB8kRmZFY4q>B)!Y+p4QRtdbi(q zQ+sE>E9v(PU30xZpYME|1{vSx-+r1SEU0|ci%cdjn&HtH#zO11L$0y)O>B;wLuf;> zk#TNIqG1j_r-qAxGClVo^yDtJ)T5h!7AT62fly4zy-idz?zJ1T%0QyzW`1I|s9NeV z^6Cs{*3^e4HV{Tpp391Y2HzU;&=C=h{+^+jbfH}33Y9Ho3qlY5Nyq~Pj>o7w+_Ns; zlWXdS*U2$?UvKHi`&BpZk&DPXC_k`YGO#S7L^t>gh)n}EMTEc>rxl4WbxHg{w-*2U zw{omK4?I72X*gQoe%GSg{_ZbP$V}YT?!ex>|VNTznAaRw=hu} z(j`X&!T+mz?(zUP7FQxiVdLhs(2R>17tj~>u+Tj4ib&a|L~v^=3|^~?Gs3n1uo7>n zuSg002`h`sK^Ue*e>{+`@9lxq+!OA?Q;+`{o^MFhq=rUiHTVH!ILnb1E~fT6AnIzd zO{Wb+ovrt2lA}}VlDiLXd$1@vhVh?S?^cJD`tPvB9k-bSC*@Wlu{(1j6GQ}>FHy_R z1OGP^UFcmx1`UIe&d>le1d8)>cALBAq%$G8hB zhc-P})`eufBL$92vc9p;(AQoYcIHH5Tn==~YrAq8*@zhinZ9yRDVXhu`(iqFU@$U}%lRf;^$?EOj(%`uKGYvS_`mOMM@@ zUj{RtJozI~Z=3V8R}32$1?;V`xu3#VVuyOe2Rg#$_Bzm&s(0_mV7mEva?2^CXK(7! z>x1+GlGDA0tP*Rc8Ad23;d2LWVs`e+gZbdj&tYRfr({!~V`6sxPRad_;coXU+2wAX zF*|cIYjb0E-n$gc{k)i+29e;@Da*qPA|wp>@@uby7uc|-&)@T&D>3lX)Nf`}i6n-N z&Lb~)aP3AY9s~)cl!IY%!I$(0OYsugFiAR{dyR61)!}^e_1AN;Wu-;z+wqE~h&0}= z2K%VfM$2L&t4MFq-D0WRDh-8zEm7l*BHsk^Gj%%^stFRHsv^eV7qSB-RZKH36_p7} zy5t8}xNFwd3ZEvzG0!afYGtL$l1t5CK~2$G2*r(}x}uS~K6um5Lp~=f z*#VzXo7@Bk#lqFxO~DgyI{Xw)cZrT_0^Lj^?FxFiAwym4diTu}7DE(k*m^T8R1w^d z)@ASZV-a@k-I6!KqQ`&o6-Gme8kN`>@S_f=mf7Vbj*q>nS-YuBu}Jt~dtX+Djd4~UErPGy!4C){u+g%bepy;25gb;g);Qs1cKte~nmHtjw z-wV|v+g;gr?~@Wr=fu+(300>Dta-A7-kJTr+vhI(eRVXmS-nk{yiMlpcpe_t!)PAb z^nfE_URT!9)VJq|B^Z^$8_M%dGDmp$KNw)vXyEA}>#?J*-##zcnYzBMx=#O`_WqLf zhL#>MtFxJZqh!$JqoZs2X$RENl3eL0Le5LSzwrNK?M>jLs?I;|3|W!D4Qe#*L4qW% zq;5n&5=h_@*3xQiYg@$~H%tg7pjB}NwE|kj zdmWXa6#^*pet+lAOeTPB|9xLRnz_rlXMOhboaZ^T;9pt4v7a3_^zvJNH{s*Y+GO2= z!D8m^tt@u#*+)3Bws3Z^Wp}V^|GI41Q%hT(jeVP*X5IhtY+svnhv1Ihgu994pK%W6 zE_h}BGd~ufck%Lz={>(?UZ!p}RBo}!17cK<1lV=UkRKAXB5o#V0BPL6N=NKT&dzfo z11Grod%q#WjpAJIf*1Wj^-Var#;bo<)mN($DM5SpBy=aQJcGq?Dth$Z?G18hZ#n3$m0Yc&dynl$ z*MoXqw{BN4CGhxxX$W-J_^*i+{Wpyd=q?&kt=dDfBV)1D7@sR?@R{A6F;qrk@27Zp z*klklnT#TtSAT78LE6kV8WbWyCVLqvHfe?aX`XAM)AXF5b(@)=67lTmQcm`{tT$rp ziVwYs>f!tQE_bOBOU%msTIC2jyU+R_LJ)}8H!-!lK6q5JyL%YTx8EB_$o6cx$SZ?m z+D(ZJj^_|f$kuv@A>#LW30W$~Ldnl6^q2)ZP|7VPyBhk1Y}RlUY}UJs&H4=4l|MMZ z*sQBfE+S*IzBGV=d6GzbjwIq)tW2oQ#Cp={`3C4aTd*ObUay~HtkpL524k&eYlCeE zW34{*o^ETkQn9Eqr#N0y6wbBH+0H4F+UI;}wJ&@g3$15=WBw`)#h8qVe-%bnJfC=( z=cCV#1JN$~?JP>qc~8=jVw=>-USI*m^JJS_KnlwJ8=mry!{ydHWWg z@g1(Zi(CsPDd}284;`@D-oDu%T4mjlaB4s%50q^6m;K$kmneaX=RgQqZLXZ4bSR{) zLd@X5%}ztwKjr6H&rZ_~Amiw~Xm3+i3BbHPm!P&yJUcxPS(3~0qEDKD>l5Sg)xIIt zx|eA>1HtX)0_QX)kwe=i096}!ywNG*iS`0f^iUN_`t$we@(rrZatPcCCBa77lK|2FwZ#H}tO($rfJ!37TECYcC zTL~F}=C71DSU~j7oT?7ZEiiH7Plt0lUoSKJ)RSwt-pqB1WUC!$6BXEMGKN>9c4C7E zkd%EK!6XpAlnd?Ig)hvjizykZL?DDpT;Q@~ax-cJ#vw78R;KeWN~k9$jD zYx3`J0B3&D+!EM_cN~rqj>&4c1Mj$}jCWl93DHaiY8_%UXU{cGva?68z@WTwxW;K_ zOlB{$d#R$xW)f44=ve`jUrB$A-K3&0C1)Ta5>I(G6d(maQg*G~d&et%oAy-368VlK zv8d{EG0$942vDS!g!Vuz6O9(y!Jibf23MLMlL6Qq=m?jqL%@O8hl1$yDbqjyi=iSu za<#!}_1Z#B;lSG93!2wHv(NHJi2DjbtYO1m$B0YuMR#w)YlT=q7uBbo4NV{XS03*#+kS{`kL2D#zM(!?Js;R{LMeb_rxt>io&Bhf3iLHi9 zqQmP?;C+_Wj8_$aFMmX{(jGm8fT1y6VoXVVofh4{`*Sc;MGNU=u_K>kdTBk~tU;-@ z)fBG|edpi)w%@m^wkq_XUR2MB6-YrDS{*t5B=Xnuag`&Nk+qc8)_(ag?vNepP8rOCe!)akQs~4t1P7>QoPD(gzeG*sAFrX0Rhn800)w6y%vZqqA><8 z3%P)u5Wk6!<4!tS0q4hRIUEo94~}nNZ#CYoNsD-auKc0uF6CWShm|f=qleyA=}$Ef z7N3AnRbe3VKv5%A;>eT?OLilr17*9c=JTks(t7#@5ue)Niw4%L1zFs|ook8en>iZ- z2OHLqJbMspNKgM6{i&a~^~X>qs{zj5qf91c63VcguO{sCy9hjBjv-o2I*}(pAI9?f!yFzm3?3|>F0rD98L5VHD3UqWt6&RLEJDQl za*=mK4{Rgz5qaYhm*ZU6dlT{1nBVSs?E`?A#=*=2I|f;sze?0A)oc(Manwc`Rq}5i zFK4JJ&iM~|E>h!QJu@C!7ptkuxnzZCwsUdU$3`ybX9o)b!=(blv4ka>8R|28Y-Pmu)mDaX)04oA)krjF=S>Jr><6LsjY4$om%|ccl<(ivPYB`<+j-+c zxAqf~u-R|o1VYbY_>mF6%fWgS$sa|p>I$bgkNpAnk$9AQtidFH&vCTp6$mZ&7%w3* zIwXj8@Gu^R)$>=Vu}KPF_FBVa>*+>rd&PPu57Ugtk800ToJ-1Nqz}D#P z6T-K)m^ldfpwvcQ@dwwYMc+wrdjiIw_g>m}NovrRM^tNdWSW#Sh$4jdedp7Xu9!cv zLc{i+5N6(4YaU*WnPqe@yUdx*k+9p;o*g*{8^$SbVE1kHmwZUXJA#6J9?O3b*SqS_ z^BXi#3D!YqJHj-LeqP@nFh1cpr)VCV8GFcKF0N zj}nIDIe)`p07jPNThJ^tALPn^B^lQrHA?@CcBmzyL?Ci}ah!2MQD6apV-*AkbmPin zStwYX<%{zxEHwVeTrsOdY>!#>Hn5t)tQ2ruw9KnK!Lgn;pcBd8IoA8^O#_xGpRMBo zsPd%xSCIfsoiY!0<<7oQ73Kwu50%y2NYQbTQ@%Bj=lcr1%%0z&6=?l9J(gd{bgMX0 z;7rz0I-9c+V~38dLhqm-R`EovlKs=I{`lhcKc^5k>>)_;Ly`0$Fz49JJZ>o6zGIQh zi|BP-u6&%tj@y6d5s3EH!()0 z;A5w3FqVwS3m&ZMiCpT6c*v}J#c@OOhfeY%a94+}U~8fWe8rU)+?b?E1;S^_&C!5P zY!wYYCAgFr|1WHqvHZzbYZ+l@m(e_8SiCN2D{||gyP;i>#kztiPVqM$X5%b60m5O& zeVx**r*;8Gk5#f-I-hR*(A?)v+7*j`*K!y1p)}^W<(MhLNFhXn*10nUhF-00=8^7) zZRp_;!3vW#D)_}rv}A3KC2S#)Q#UZT7_6so#wu3BL{y4|!93pBdXb29b_wRcU_TKhRQptT%h3p4tq-R5G!ZudT!T zvo1tm|w~t2A?@qey9t0eRdnDbC9xC}Om&_@6mmdG8^^9sG zK;sOPH9km?dpW&I@2;_zH%yy7bK2F{&bCXt{L8Pt_VR0fGV9vQ{iU7$XMQqk+BMUz zxc(}C=??$1v!~Txf9d7Z>iwnUXaXus1jq3J^Jo|!CWa7hX`$K0Mk!{kgO`=F=%6n9 zSnoUi7>pM9_G0pb2Upd^gX}YphDEVevC%n1W$3llo)sfks2&;7P~A;sL>|7`zVnC3 z{t&*RT(*c|xa(Y8UGiyl8Hnuqtx>Oegp3@7)=pBxVX2 zneCIZ)&>jEa89DD%8wJCfDib2VA-5JWDt@9+tz3@k&of7)gPKr5ITH;S0#2GXhFktayXr!%c}8Ki(-?HqD8fRK`vVRb_n6->D`WYe{zOzTLH_Vt1Z?5{%Qyo=fdo;D4T|9Arx78g<#ED}IE)JKcME0b z0&QPY90#$Low5A8snCyjmRe`%YZ6dxb1LqD9L5KY3-Q#7NzTBUA0G9kx21BCq!IBg zL%=aO*X2y9n`)r4z3U@{27(YC$SIGDpi?tmnJVGBkmHUbf+AkTz5CKPYrI_sWvj2O zhFndx!#H9`PT@66v)TF9mZ24;Q4aaWygJi465}iDk719dV);)`h13UMnu;DBeME{T z%R$xJ`Jt|a1q2|(^01c+ga;4?y5!1ynBa=QWWd$UHUL%Q+(UpTe43|5Hzr`{95c%! zO*)HtyiKOFsQC@^7QSJKm%U;XcXc@z)=j;@J(E&21R=pNw5|R$%v`EN(79O?mPhRJ z?at$a|4BiO4hLT<5bO!uFpf>d*re2e!Bz8;OjpS% zMoc^t-S668OQ2J}uLC`MBVO3X_r2X6pveplW~m7WY1Feb^u-9i=oa0y^9TDz{J2Et zlTU#7VClRZw_TwZ%dPVZ+~YsRVG=zXs%Pbd)RqwPC6SjHK5^u(D(cjqJU>g0@_P{q zx4gIHWN8e*2<0X%-O&ollb6;&4jDw<>d@wDV(SGR->gIZ^Vab`rrqeR*bin6@(8fA?pwhFSZ+eBZ34tpev;aoN-pNOLHJ02 zzt*3$1 z;pb13Q0osraiUzooWJr=E!yV%2I&Cm#|!!lH8FUrEtKdXqA-OBazR%H?{K4;09wZQ zs2POS^=35s(xmx;WigWIX8^;tgoE05z{tnMkz5{q!f;e>pvGs0@VUsHeQYvAe*2OiG_{>R^y~HHmDDb zFMb0TWi9&I+usk&SP6{=#D;1ceq4B>Z~eG1$70?7oSE){XG2LnF5H1`)r(`%Jo|+( z*cc)}7jv5t+7bN7vhiZIgX?3p*0q_wUPAt@20sp}wYIFOwJz^nYeiSrTDP!E(wZ0j z1Z@tqL^Pkx@r#>*uZcxDvHZ>p=qh`NInmzVSl4EKW8IQ*W&jal`+5>vzNtWpO@|9J z!^fQw$WOE8o5O@0@ZbK1-+Bb8$2H8=qvJlvqQN)O#Lxzvc7qiM!ovb#DOSv}vH!mR z8txE6OeC2yRP_s%1Tsl`aY}ai;`+?A#ktuSbE2Egr;$;e{sF7_ zjxC_{F^jJ%%!_gyepIJD5XcDkA^%VL;!{XoNZPD=AM*nyOVP^zjhUkOz$gjJf=#d& zRMP2wAkt~%B-@vOICT6R198WV2T#TeEK>G1+U&BqdDeoAzUy@;F-!O%0WMtL)qPeE zDcVRj$aC1juJz_lO0aVut|T1t*JONwZ+8td@p;waqU@^0mmi#`eZmvv)9_O(FIA;&~{E}m&tD9ZIU*e8X5l<=l5rwFn`z6 zpjZ8%$oRFv9s6-wC32U7P6v0+w0_2sm4@8;ZLJ%*-_?sWl#|<*`GT=CyujGxrt^~2 zgm%pTXk+ZCv|#It!5xRHihIjpoxz<4Q$^(IVqNb(s@(b+>F?ex&v`9!dk&B0@5q71 zo6>h+5)JO`XBv#$KA*e!JLVJom6thhl;>;>?VSJdZW@@sGq;eZcT?#d^lAQX@!oj7 zk$cnL=F!ehY|~U!p7V9&>DcQk6#HYckZC+ETlKGnmYK%$dg-%%rY{Vb54WxKHCXep zMDhaK(~olTgh2_-y`b@y3PPTI$jli9;u4@~EIVD-f))~ZkZ2YyBk>=H3T#dd?r_?Uih7^phSnsd zrsO5t*G6{i=rR7#HH8)JV=6EyWK|Pjn^%fpwci9HjrbZeDMqTK5A4u-?Vt1{s2D=l zoQfGK14Bj3sYPRHjy3pjrm{5BTim< zQ|(X#l0cuyb80)P%6+`p;!Flp z&4x7wp)F3exm#soly7lHawh}P^^!z>-YWimcT3J{>8_KMpocVks~djoc?gJV3f5v9xQi8S``ZUh`mYuNh21oRyeYVTZU9YZ@1Rev9NC zcLsF9KjT%Jgm&G6CgyYd?;}KzFniFP6 zz-kl(W=Q_Gt<0rS{I~@E1=h^w-bdjQ#}Ki87J5e=WR-HBnVoPKX}AWYv!7wK`ge;R zIS}68YL~VeX)B!pwSq*iz6{S#oHIjfM9MrbFM1eiBMd`&s`HnX*yHdvJoSlJFdX(n z$oi}zc78$BN+~m#V?j)vEs&GJ)06YXHj^WhW4&&1SLABJ@i)STT&qVTQ~O-W*sm( zTz~p^td~>&r4+sP@1jn{Vmy>97GG54kFV9mZ8~rm>>4Iqyerzr+G){o2ti~0bpMkzDM&!6 zvnhFtna3MPmDTjP_iTdIr1Vden`||I%$4a>cA7g% zUz?fEuofu@4CClrojQ&c>1waeYvly1`5ow+2HqF&%GRrM^eR3DYkGVd+&$WA{+icb zYd-gF^(!)Fd$6mQwP2Ii$-Y+8yWUkHk(s=!0XWQiSFGzI?`kB8o^?gj7EPzA>Gj?# zK;y^W6`(QFyJE2=UoqlgR?|`5v*85l_MWkTztFSf%u{2gYFy}*WSsN3GX35!&8_vG z(#~3qKDe89-tewy=Rxm^c5d>nXlI5u+q5%;Z%OyFc#xMsCV7qiYe}udIaocx(Y=@$2xo>u9czdGV1zGAwO!LcxSos<~9nwPc79e z3Uks5#NR`un{>kG;znA#yEOX7)2O-HG1QiB|LK%7gxTFgfKxrXC=|B~km+l}tgli=vr2G4Jx!-49xjQnK{N93H(e z<-u?DX=e1=lt+V(po~A|L8HoKMTz2*Y;l_Eei+0}dG^NH5~_&$-CgX>!+DewB^gQb z%YLfNh%_6kWKc@ZLE=ymvfm~NeSuJUUS-J6XipoY({Ok7^F*A)W)~W-Z9jv%r2ffm ztNvj783H;dZW|8s>efEfFzsr@Z{6D|VO!63jYP8PU6+1=F{K1|WY5h*#6DuB5#i!T zO?rNK=>ROLX7_?+o8rDg0)cqd&RD&Q=l@Q$Q_zIShexvhS%F3#@umn?kux)Be zH9MVH!Zqoe6z|o@fr!X2EAP4W?Cz21<|IKhiUvkGMoLbN9}|3vyn&$&#!<;#RY*9X zMC6v!*ds>q{`ZkvUJ4*ehc=qeV}qXN&RnKiVo{PsB2BCo99XTV7ETxOiuBEI)jS=j zQ&n}nC)qC~Cf>h1?HDgETE#E#*u%zd9($2!9Q$aCq1+lazu!J-D+Z> zxxBty5%G!d$BKO<$XxYAVH^p@tbXN{Rw zQ(C-R2jFvAIJa+QsLOBN-(oE|lTJuQ0tv3qX!rGV?;5REX$5iHVlm&&BlJMb;C6yG<2iXSwM`gAZQVfS!GC*@dr> zwP-M+AOP`KQ!u`s74u`Ftr$5T?Ny9Y$-O8y=T{Y|eDQ4$G5e5VGfUY%_Y-Cy(Pkx1 zkXTgI_L|hT{oyIo?cgro+#JB;YRzZQ-gGgOM-SBCv#h2=%tddjc_P4A9jTqf)M7RK zC1WFj9K*GnKd_os9L@H~Nw{A7rGJb>Sr~tKc3f(D~?sGgokFX+0dL0 zoE*!gR=uG3gP3~+H;GZu``1_Wn7Ks;7`yhj?gAKl8}pCVl*5YbvFht-ghz9%=IFuQ zlaz%Vpcg%XhdwHyM6fH*Y97tTzdyXtFj^~b;ZnNl4?d`$G=Im!Kk-9JJyHqKzR9>! z%UQON7lH5t=H6saDWg|%jFqs!KwfwOg53+R71`IFt$j?O-X{5q)(v+fbn?Ghn(zA? zxU`yA7NxF8c6N^yd7M(tn=UKzuqh8f@20n!u;xD=s-kUJGN-eErlZ>dJ?DNEmp;PF z6vSRu?g9NXD&$b^T_=z73EI$9 zu4QgFpqu9YN?(f}VYMp6Do02)+2IIOH;HKhR4|v6N2VyLMbV%<_Ci?AV(9yhzF~u;1@J zbbd_W5shXOkL>3Xq*~_2yt-a^HK=W8z_GjxUv1lEA6m`305)wzz=R9gdFF@EgY1{E z%be$M{FeRV(Kwj2b!ne^3g`=*-1}TAoUG~X!HGg>*PZE3%Qp*TDlom><}54mR>oTN z*Fl=~F0(qp-*OXQ9Urq^%=f+qcG*CRZYf{E?d> zXdK3VA2HlYo$18^%IIdh$RZ4 zYX6Z!0+`D=zy_ENlqt8>YI+i%Cw7sS(m_5_cYZ{7{GqFDw}CGV6%JKt=VZ(zc1v($ z*$ZM4y|tGo7cAKFovT>%J;*@B{?-IS4)ygArRhXV7nap@rMV!HRm%XrS#qDKt~-W@ z&Abmoy2k8CB;Gixz4~?11 z#q=ar0N);H_vm_;I~UmgkF)}s_6g;Pr(!kVQ|NV4{J<>M*OfTB|M@tEq3ka`ra?5K z>9fR_Te(QAk}t#kh6?s54ZGOEkPN%nX)d5K&#Km*To}FFEO78sPXV}>B5@|Vo=a=d z%SZ7b4s%N2nryb0tMeFpH@hIwY%tO6=y%8vpi%x3E8Xe714`IvPy4M*@Hh z_Be4*qH*U=ylARJ59+!)v|_6Hd3ZWMLVti`rY@lZ{?L6(bqU2N*46}JMKP-b*lhCS zS5QMPP!rdnT#tsR#8jQtn5o+u{+u<{4&PeTsFp)#%`~nETo`{BAhUmV0vB+`E%1k~ zwWB9H-;j6-J$`ugum`<$7ae`H-S(T zGHb}~-e?J-d-0Lfx!siE&21fM3Q@Wi{6sRih`YqvWnt`1;&5oR&D6Uq;3-MLqn0jB+Vlp-uzZmnuE<9o>)pAjm9 z%ehHX)jpmW)AY7Bs}dr3^B=t;qOP2i{3Unp`rA{Mt5AUOCPl)gLdath1 zs~)1}Pk+KsEB(o z->Q>qoi0 zaRd5X4xhgFgF6c6=7wGamO8Bkvw^w!5K#pCrW5E)wcH|q9Up|3ssRrSyQEcK9KQDg zC4`W?)dVYFrU24+GaUB-zC$~ZY1C@|2ZDvWOwv|QIhQF@jvPbcC2Y8Bp<@-1eTvji zq{@4qBGpW_;?XS|JraH=MWAq+PI2a6yxC2(vvb|^Dg6U=PujcgQviR}eT1pI;biv| zmDzXK4&fC-s)~QL!RyKf5I@e1(aJnRRu1MOJE(i^i`!*k`45^8jPEoc%COAK&|^Im zstoPii{iPT4&7^V`5Ge)U+1xkT)49Y;`<)KBt}~i8T(?ei-fDT`VLBaxh3{mvEQ&z zMsOdfj|?R`#7vf_-Uf5INm9s6cN0!Zdn`LW6N541(nKXo_jMnmbV4fmfxi9)!c`qH zq71DM!tlU@1aDn%9Ti~zA&dLPJgysLi0o~Id`~oz-N&sqUD_vE>rW!YN4(+Wc4U z+yV8SHIliWuzg!K{BX*kAr=@4?oes#$J+j``YSpkbVt z%|M&)<7IMqecV~R@LJiMMxJ%*9!(^M&PKL3^yy}9(Xd7)G^{D22XPHc%)esELIFJ4 zBAeM3`R{OQ0;u_Kgo*EEvoUhS>!3*78Z!@x-DviJh(Byt8gBA;up-VA*a50T4=?5# z*%H{jckX=8aOLXq|-0Xzl{g_ra z*u9k>rxv|O-DqGwv;-cufBPn+X<7+C zQB*)@-5aSveOvmD*S95KCHnR-C=$1Zs&Ac|p#O8EXWS z3ZwEp$`V}>eoEUGiWQ-v2BSW5juN?QyeVz4)vOG$%*_L;hN*N`kSsdcku1*bqI%Nt z&8`d%3GK7KD6!}(02ycE+bsGslI9a;^X6-yodznhgx-xS;@W8!h2q-jxikc{>V?le z2!|p=MqGu)_Q=7Jp5*6Q`1+?ve(XMP{=%#pL<3!d^^D7hUzj2ON7ECOky$Fn^8 z^p#Wd?dP$_(+Pe`;^F*D)3pDXcy+2?_2t!Ry!wg0%1*pGlvlhsf){7?c;PcItfs#L z194o=u2_7Z*&gxGYr5?!ZDtCUIOSN6N}Lj(#=2vSczF_8z0l=_@kLyAuZ;UoHX)?{ zEj1IM-JV=`Cych|vxD6`K{pC_gy$yxvizt%>8rg@kNK&c0 zX;}Zn2gR!tLq$rlQ}Rc+iFA^jCsvc>A3H*(VBUx%#~nwYAaNxx;Gk7WI zr8-6lSg}%GTAb$WB2$z52Yn9ea(0A>F4!XZjDn@3wYN&EJ34xN}~na_1;E(W-I~l64bpu zCQSOtbx5)tXVeK=hbr{Xra!U7|HVQCLYHzB=ck2s=)z)W-m5IZ?E;@}sVZZT!Nca4 z@se<{1trChiCjA?^~G5ld7Q{3%#HP@rPQ$o-XvV!-*Eo8hrkD{d}6nI;YMu~zK5Mg zR8{li?W^~3hpCnOX+`qQW9Y3O&nhq-@kH1K4eal@Sv)bo*3oMqHJhXS;-`*#=N5h3 z^g4*-4}RyX?}M+K??vl2+35VSzmxvjw+9#3u{sFwMxC|1h$(Fx1_RH9z9T{$=$?)@ zSe%k(CMc`Cy;jpC|Z-4^d== z{7;=cvz*Y9_`a*L?dHY@J5J;)_+4LYI>N9>=Jwwz#&7OY6Cl=X`aNO#0rO#pHG!S@ zV|1~M3GitspmLe(GiUYV>SV4!Dn)A**%9uVJwj%Co0Gx9_{%P_>j&tahA5IW>x1|f z;}fPhkCdlRTZy;O!@c_9{+2z9c$*nkP~$h!q}gON&HP5dt7eW&ZKhA68M9}sHnb7> zK=udT{$}b>-Jj4zf@&ITx~aD+QE!j#Kc3hj^|k@M?(f~}22r%6gL_bQW^;a+L( zJ>YP6>9>U@+JsH*BzP>DBGav-Ec0QMoce=Ri7^Yw!$Spf+*dx1qk)I2x$Yfc=bqg3 zQwAsG>n~+LsWOe3Zm90wB-d=!d%N`E6=FIl%-S?_rca?U_(CBYTX{S%Ct6?#3sopF z!mQrzX{J-R8jcq4R|20T>=ZdV`sx9RyA4c|hElag)TRE=xcE2d`4sUl!~NtV4Kr2z z>zk}GVitY7^Xg~owA@DM-zK+#6WEY+zFckU&G!$x&odqmXWm2}c6`EQ7)|_ao+LH# zO7mKqeVB)xgP1w@Q%V|(U}A_kW}ZWb_!{e|pDT2=r6Qzp-w}+Z&gIXg3}8QZAf=L@ z_j3=_=Lr{yY;GjZEv5?XGRt_v?``wE-+LB&zxVxuU#tJ!MXM=i_5XFzdh>g$$uny8 zk8^uWAWL~}m;JS9t=>0p5dnax{7Fw?)XVf6$v^mR#G%X!9IIoOAGNK`qnAe{UcMfG`3Y;E00gr` z`?)jhjrS1_7B;GrY(R}d7@x<9N)GNTX2dE-!SxK`QG&RQgfDsLG@Su6CzM$<6J%?^ zUs;i|s~P*TYJjmDip$tFqs|LmpU2#zd1FL|qftDzySIqx?J-Ht^^=V@A~8P1H-h|} z3oRZL)l`LoqORv$~}SIBU<4+Y0A|f7RQ^paLUizbJ>)MGu>mNC8mml_ff?Z zqpT(U@(6|0t?3N@WL?a?Yu`9Cgn=g~xVO9ILy)9f21?_+spOA`pou+c!NKm9UCEB+ zMDNf_3ONMsoAevWFTT?Q_lcW5RYWFPacB=Kex1MypI3~r>hRV#Z3Z`*<-eEnL>oljpV6cO|9j&t76oWuVtBsiYDJo5BNR1Yk> z?{kl3MO4IJ_75xgnW~FCyqtUEcZIkwkX>qe(*Ys1@jUSQW@8?iSA(n5BxE>(g-iLUv(R40#XCbXw^-;r)>mqzS8Z}%PJJ{rFlnRFk+Sdm!B9!q27dZ!wTb9{Y1 z<}waQfnn3q8W5hhIDdYc<(~1~RDb%47KUUpG{d0jr8yIAz%DV5zD)N9aJ<`a2n>UI z5+|=4sOga5a5x}*k0uAPzrYz+L>DXRqNwsWDDi@e9^`!k4++Gp85S68KAqeCs8%4~ z-LiIfAMDU1+x@+n{`fbl&$;kFexoB9s`cNg$!?UT@sKmF1St7dwT|3A8Q zhkGQ!^d=VNRgeObkR{%d8)9pRDb0qsCp9glr_OcEvRnNRZ&ZbewPcMwk07h08)#UQ z$NAK)H828E){5)oikYH7XmB8O3&?V9o->kuq*TRno=xGS6Ma#vc$SA0q*N!7Ro!y$ z&~|S7LZJueQVk#Osad&edf?wc_Xf^e?6c&HJxd8;VmLWH(9T|3JC zJ?t;ekkX>Ziflvj4N<+*7zY_{H{c&6)G!l}oE>j!@A@!hY7cr!v+7Y}w+zcG$5tP> z$3$j4a#y8^%($=y4U=Sbx{dpl5`ym|=i&1bF;s(J(C#k(i(rWUH7;2wHEQVE*=7FF zw#E181}1zw-Z;Of5>2W)U9n^g=eY^-wir|NMyF{2B&TC^K^k_Tj%|dFw>dbW*mRr` zF5lLH&nJ>g#nEYLk%ei+vDgS7e+YySxviJtBJAk3Nw=+qt@H5^_9;X{;p)hQujTGf z)P~l21)3>s3GU9FyWcar*|o9m-#Y87$b|X99a*zB&u^a^Q&5P_e8%yRMe7CY!xpXP zr(u8G0(^6hCq|}j-Pw=RPM-YOZeOcXp_Ph1M);rpI zfIQZmGhYqi?Ru2S4IlV2ogwBPsi=1|9u>wF{AaB)rv1F7sg-0X9K>+@E{nyOt-sMZ z$%nZ-gjGy-=RXpQO>TQe-$l?INvqQPLTmI&-&PHG^vh+d8%RJ$O|50yjc2(U^Fn|T z;e()Q!%i3Z+UV3D{|&1@I>)cjn!zG=(u0?CLW&?cCWab$f`TTnWX~fYIgFd|TZ&}~ zP6Tj`<52lja;4#rk3q|h`#Ezn9iB(tBvxF!BlNy=>k36Q^bgCj8qcE^S*t)YCy_4-&kz$=b(+ucF*y5U^t{Mv8;@YhQd0vJy$A zI&>mQ5g@Wt3>7>3B~e{PFg*{Nn?=TP%6Qq|Are5di0<|8K^gX}vdvpP=R_mV#lvPN ziP9k{6`49tr4IMU0@%oi$v-oM4j4R;W~ipQUTYfsf<|mTMxK~dh4SA87HAd`y*qw`O7%+p#Un{8M}kRacH7wPiT6= zD3=6m%9(uwak30BRL|Hp)x^^}nq~r#Tc%1gywLL{U5Y4x*1pM1u$h*xoHOyx;?n7C z>oLJcq|8hA1Q)EAv2KgA6udSO#N6?;qNY8e5W_Ov)mYxv^WgJE4)3br&L%2+7-2^bxT>TbxlXDHMQkyYi3JYt^Sk}r)ka_Vk{k4O2DS~YpweAwUySo zw%RHv$+1<|^Q-;7t^NUT_**|BF73B$8(k`d(Sm3STIHVVon_Ff>ve(e4r-9wx1Gkzct&4R4JuqG%4EuKbu575;{9_up>FR+C?1*zm3 zgC0Lx*<sr#L0)_7xD74nSQcIk(W31=528cgBV7J}6naGS=?2_$v*(HGB6Rc9?y4Zl%$dmGp z*l!@TslEc_GqIWpTtf(pTI&{OyE^oDE?7@z(}I5}Fd3I>v^w+=H>N}--z8ZdHG!~cxP?rql&-tA4 z=zmrLf5rlQ+0N2Gh!KUQ;aYjY<^0&;=hm8^$Mu~Zyk8F?*ufTla&#HIU&U!Tk@>*N z%Ut?xCFZ^0CZ2P*z`HZ`gn}Z9Cg`*sx~q$8=f1y4y{J!Qi*?rAD{Xs1A;({lBr5AM zQ@w0MCVxTUXu5dmb6n|Pqem>l)92aYWsN)#you{L#Rc4GEBSF*rb2{hdRHHs@c$g2 z>i>@H8WL3O`lBQ%n@)v2O6?F(lg0eCc^Dloexui#yXl%k<6R*vJYt{%HQfXaZ^&^h zJ|cN6G{~Iz$!1Ow4`(nbQ^nOM*}koYqL_?7zRwlot{AJJV=UD+JpnI0J1D`1tR`)0 zDF|<{eX3nHX-GXE)a%5>Jc@x1f$;Qlp+KSPEHCI+H@i6V_$<9US z0-Atedx4GUmz+9$>Kw`30_D#T1PZF?pGL;&32rnIL)^nbOLAfYAx$rshZhy) zv4^i9P%3h2P9!d0s6?F@kq{P6Y5nM{a?lHPz zM%sg$32{{8dCukeJV8i4=y|DhqY==~$!kw1UY~?D?I(w8ibe8g3O8+M_*$t|Hx|`6 zk4B}tdFbOj`6qPOF={Kd!%hahH8lmo%UT2~!dY{{xS_wv*cWGH)tiC)cFx0FX03x z`$6`znmP2B@VPL!Ezb65Sa;YypwL2T1ug9Nb3QM_bk1OiFM=szsD?G;)*_oRbSlpK*q;@+wsIUXdUsw!&E~NTTgP@=Sx>G+hqbU z6hD=nze?o3TeKm1syEOCE(m1*jN_MnCo?zQpu7Jbpo{rUv%u-2kr)M2g0jv3;{T@N zC1yUM>r>2*KFPBFveo)gJi;`!D zFTyvZ*_=R@ruQua*;`26$kU{d+RKNO;punSk!>t>ETvRB=N}X^6^eG<@qoZaYOoPr z_t5EfZrHa@chl29EVLr}n5LXRyz*~!x(m0{E+mZENm!ZoQs^#M1sb`TKDSz+uTMf( zDhR=zg6?UQc1tMJ1DwPRu@Kqa%b$=>9u@*Bx1J}TFjsgbx=VS8>FD3dC$bz7UvSD$ ztN(e$R{sga!B(unEb-pO%&n&Nq1(l1y{Nhg(LhAThz9=f&GRtBH*)U~_SusG%1pz` zGMJD7HpA@tzA70&@vB9?gze7wa;5>eE{+m55UwQFK@LrC8xoWP%tVO>9frq)7d6Bw z;1d!lL25?J4M$`K6^3v9;oHOlL~@TL0i!=;ZrKA_uBS8JfE?r!!_&p*LBPZWiAv^0 z=h?os%1v$M*<>0b>RjHWp^4%9LzWTM_+x}NBfee2>&sx@htT;qsv0bx#ONB{ZIokHKga9KR&PscXe5g*&n^U zsF1Sr=&X$%gs7wE?45e4)661lc3OTxLI&7Gjp;_J+4+FIdUE}0spm1rr{S^IhO!qp zKm9<4_vF&ooawzS7bMtD1-I@N(f#1=^aeji^CEr!)_~!I04*5b>Q5s$@P3s`G7ct! zZ)Ie{i#?)0MrydK2+GQ8P<(lu~ zVQ7m9Waa#bE!5mz744pREURL1Q;~6~4Ynn0W0O$rw>Z;(tE~|JQ)mQ@tsDB>x8Ku7 zl(0~Vb(B)oTa!W8lc zI0G-L?MKvR=wuHX`2TGw&S8V|e_4u|*RvGa7dYcq|CdYgM>iJB;DGgiT8a;U^TSKw zU%&6A`1`W|ycFNA`cF&ockOks6gT&%?ZAC5#UH8d|L>((%~n}_DgGcV@UQ~Hmym*6 ze-JU;xzGh-S3TeUU#`X>4v3NapI76oU;prGJooOtSL4h_{_|>F(e|HK|{aR{~Txf;PQpz7E?QiOwcvwhU7a>;{#5(5n1W|%^Fg~Xyj_+g3ecIaU}T(VG( z%%r5kZ(Z?ruRAocsZ`9Sl9;4(0^TR?XXX=RYW89-m?xt&oEry7tP@o^nW9dS%+oX3 z{y-z=Q2~|!==Zcjy_dMni!F`~@zE~Kkutf4-i<5Gx#)Mu1{#Ge5;HL#Tz)R zM+0`EfviV;(M##*xqH?hpQGbm&rZ$}>%R8@ioE)*Chc$ZXycOy%^==imQL)lq#RhW zh>@py zrmVwTN$vQ$``K{FvR?S|CxqYP#TCBAXZLFN6-7y<13&u8vCQ77I7(8K9*`6;pjJn; zNQ{O(AbMfeo0P)2VyE^HmxEtS$2Ok8=4T8PwvtJq`YRxyJt!pz*H+Ix=Y^1HS_HSaF z;FJ1_3hVh*0bi#*V7-a;?+hWk$VuxVwI^*-Ol-_GYWkVqN)u}sUV%~~0ZPWtFvXDog}}|mlK;}afyM5~D55e} zP-b@nF~@tBcLOojI;WOQG9#?#KMeSyfdRW@K=iUhu*sMK!~`;c7z6&>oX~G}$yQHA zK+PGEs@MQ0^ip(%ffdZ}^_g$omxPtW>~Kbr-}jPW1CzUO4_K9(@S0p3zl^3=m44y}Bnch=iQlSR#f}DASWRNdGH1>~0jvQfoq@8h zSu^5>qm`Onasa{%nBHk=)y7q8i=%2s7*NQiBtW+NPW%u*-7_30#{YPJID}D|gnYeH zY04eX0nO{pQCv(fJC({UIE61h428`7)b@E z*yoYH^WLoF&IU=@iEDR`ew3WPw8_e$6V9w3> zXVBnI8a@ffx4-!a?Q78$!~#HP4zb^D&W6?lg~iP5c+*)mC(<0p-b z+$MZG0y8!{r60&jjs@UK#|~f5|JQXI0b#3?h1dX8LKj>~59{qvTa+1E-@UY+XNHOI z4;He(P``7a@Z%>@3R&29xV&x1oDpF^~jC(9=`BSQox5K_Q$~D4JM?0tVCp6H;=M} zk#F6U4z$d|4bcvhZ2*1$D*z{)L4Opme?qYx_QR^%V+4umw4Soqr3RcAc;)-!N_3Vf ze@ZERciTSP0CfNOwdv8DKj{0I{p=@`r!K#%@rtY4&LyYfx1n82GN0{3<`3T`vHU-M zO*5>+VdaYn)2|$=53du%dg%r)cIQ32lZ2C(5NOr8>Bx2X@bsBGp1rt8-z`LdNCui9 zPSy#_e2-h`iE1eQQ9d#RtXIgS+36l zyv7#7LAJ*7ulZMHTBu`^TLFbMTaZR{K10|&jmB9eavi)3N)b+H`sW>@>@ur4&(ogKj{|mOmjOl!*z1JQ zjhJ(-ppdN`&t&`Zr#+PZ-;^T+J9hh9X5nv|D#Y{W@d+kBa zKD5=z%56bo$SrUDbYywstBvK0uPW+GXz!m;0z{uZxYfzc-J}vBhr&f8a~rwon_9eI zU3&CKt`?pDC%!knry5b@^QWiD;wxW(Mfb#C}}(wt06Oq z%(9%~r_j63?>j$&QD31=G%u~Jw^=-MOQn}q_6pcz63gUTMi#GI%5ej*opV%q_=Xy8 zCOKnt6M3$YpTzZIU7w-n;Txt>Xu30in{e|H1cX5L*ZeG>NprfFC%*AJ#BeezJx5wXIgNVIMlv!jmi-( z-w54>M$l#oNJNB{PbPK{Q-;YL(p#F{(Us1jcdln!e|V9vA=g;VCCC<#z+D=M%%IgE zM6eC_KKa%eal|A+33WCOKRs<;A7r3x&-Y-@6i-@Ec`BIsj^vdslIQ`uxH-Ban-hHOOE9``1{cq{-R*X-kzjL|tGLpSZ zp5-o+_O7gRHam}&ePxR#-wrqV9DbF}DS!MsBGnzvTSdtguQ9pHV1m2+1Gd%WRa`X6 z%F8%8KD<|^{v-A$R-)Rsxq85ExNu%{lR>z5Q*gz-1-j<>YJ`vazeUWxYpeQ`h?w2X zo#(Bg9H>J)49p|zQT?&xwIf*fP6$960-3XO5s0sCf$;!Vd+coTE-D3qZ&LICI7?s1 zSROgrX5sHSI?wR)A(Nqtng4i8&2b(h+wK@^#4>*KAZzmcVGCW%VKrr(fy__0l0#>P z(wPA1EXC`?V+u&$Yb_AgBfOft$=ASv%_dy~SaCJXXPRU>gjQ|yifG?lh(Xvc*%|O{ zFWnZ)KN{vsLAZ|m*JUd{Piw^}EK;-*k356`6C9WpJ=t&p(XUrr_5qaeQ>aj^$c;vM zB(7s2yr2YcG!ploZ1km`a=JGVa69xC(z$RGT2p_xx5RQPy-j?HrUy!-0-G*w!-E*k zW9-DC_Y+UuTCFpxP*wPnf{O6m!%NrT*1QT{Q(^K%Dcji#cG)ZS%R}D>UrnzFeO?j# zm=pz%yi?Koc}~@j4(wMM`mpuOoT?#jkwfi+(I+4Oi;B>-1r?!a<$zax-(LA`W>Zd1 zti2*M_wdlStzYuuyNcE?aw-SBUb>~~gTb$pBtqu-$#bHyXp~hi`P%&ww{OvNGP@(|In_6KXxVFWTl~q}`3UzCEMU%& zzH_Ff2r4-00b&4ss`wc9Rcc=CBOUze*DBN8^z|EJHBJ@m#!J^efqhk7NwP=o zGU+tQ$yc^v&MA_LIT2KUnAu=_&l$RqGzQp24m3jN2FE#IT`ZP=#+P!oM<miJo9-Qm3=b4@|!6KHmSxurr6^+BQfTeQZ^x*2i-$UjKs znzWOo(L-_~Cp;58AZ@hu)G5c5H*LED$tWV~g7W~4Vy=PqdD@e6GRqYmZ8VxA1ED$0^%P8RY$ZY4%~1t4To_c}#FYBFm{fSn%x>*YAK5lfL!$~6U4m`eK+#aEgzyw4oFN%;>lG4q`_?d< zOzQ6dr@G^&I2A`5lm-PP_JhAR-Osj4SeOpy54da4NP$t%#B0jqCiHktHf_Wr&c~c+ z=Ej&}WYiBcQFuwislztX!jVSUgU+%_m=bM6dxlaZJzj|G=mOjxT@b~SSs#qX^^fxX z@q@xvVE#4Aq8eOPp72m4Ju1RK>R1{6G3pkdb&3mOG|R=7fMBTJU!~rQ--*_X=k=zo z+|cNZ(iT%+-egbli~|f()9Z#!X_LSo`c(UX9ZznAxXaFllI=vftDut=!>TeGa{b|h za0$$*%bXO&m*Gs*=^W?BzyvMT9nZ=0{KKa+;o?t9l^Sm`X=d4@+x=?QZ^cCKaGucl z9Quu*Iy$G8z4>S#>*>m(ezl>|y|6ze`rd=@7HIQT9S68@LA}J7g?2hu#;YQk+GXTc zIm#dU#N(vSOX5-6GKz2uHSe?z^ppkZNH;XrXi0IS(8X=F!S6HXTntK7g|E%9p8ggm zKnyW4=h#1zXOrI>I4Np;8o_d8q;|&~9c2)5kI zwLPMKj4mi-`PpT4uSK>7*I~6c5T|5DfjGWq|5*rJv>-XCm0!vb^YJLhr#eYPQ85i5UP33CHmmwexOI_Yi*F% zA4qHK9J~$apITrHIp)C2`4#6S?0Z9E`S*S-s@BFz#_|s{4h8j6PnneseCM?E0*HcV z`s(W>wj+>zU@cy#abh>ltLI#X{GSoMHaKN;){u`6>2gEwXss5OgyYP&Hm2pl`@u)z zjz;}GNe9mC&?R|JE)zrFh9u{=%>e{}(&Hv0<(YFVWc=)lE!HWOrkAYwNcB9iM~+Z!947+U)(`g9=+ncgKS@ifB8#XoJ4o&XZN>AY=>D- z(Jj(sCwtS!bTHH*QD4cc2lT97Rhu&tN0{fyM$B^#bA4WDm#%F)hnebFw7vld;Ggw- zZaU*PNUI%-ocN6j)q91w{I2_H;hf~t;_gd3e%Z0;@a~7xlMiPmuWsyq?aUG4ldx*h zCaTvpr;g_IUe3lQ9SglT|0Agar7e@`z)(KpCZ}UjW4r>=8uNfxzliq@pOny|Pq^V( zPIoJL@ym`y1@Wu4;7*_2(Xw1%d&rvLM;S^9TDEoWge4O#2?h7fKOil%u0jj`Zh6ZV z!bzuBv^bgN)>E<2PLO;pWiF(Qoqk{^v*~-IGPH90o57EL)kDZ0X$vXmS}^$ zzc~ZK=Vx&LHEjlWZlAk9l?PjL?6UURs63`Cam&VwS^(#zdA%4$uzN9riACxNrp1Rb zxh=d%*UG_K5X0nD<2*z4r7ah>b(j~LTRUu)w=K9ktG;lq72KUse_(KTX2T)wmRY_u z?Mhniz<-hi;+x_8Iq8q2`0Z$cIFeEu7Ka@K6i1j`7u)2nyDKa0Z0$Co`H|Ka(8sQ) z)Hk5y(3K4&RtMi->|#-!7Ao))V-3n@L<9V$I;{SU%d|Mq{X&1Ju|>nY7LFMR(P7hA ztbYHVEmqNDTlipkixINt`;(qLvc7!&$_?Yz!j^(NGv}g%^$p#~LR^+{C)*aWP0O{V z-DY+J+Lp5g#dVhXE0Ahit}Rv!Ixlt#@T?|na@fHUUu~?^ooHgkL=OLzww#M+Zs=vj z222wzmmDHipTkzsekFXv#s=GI-~7c6Kc{7pB3$HTYRS9@2q8Jng>$%E6hXg{GOA5J4mX?c(hC0V(ODaO*xVYk?wl>=To|$MM@9FM~l@>3}9d{?9q=XLi zsIOu`rpx@6wlJ^XJj4uMtZ&|-v#-!u*wq(2@dn_Z!`Dl0E5-^YpR`_ zD}Xp0fT%w=+8byfg$9q~AmGX&)Tr#?K7K?sr52OpG(q)B+CBH_Q^+gakfxC7X7AS5 zE~1~~TtL!9_mThg>!)TSg4F*{4Zr>XpO*bkpU(M+l`)&MKD?%3<+kq}3Ht?;FHVYW zK*zZTBH*sfv(uk74zML{1i@#tP|s%YM{8X{jQAJV#A&-zho)N{xgi!9&_%o`JGeR) zD4U#De})}S4@6G+l5f&vSPl;rEFI=N)6grevdrPIY&d;FsAx#k3Jmz(j=dCpT`q*N zxb1|VB_x_QLGE{w@rn&cnre2b-f~_<9#cB9tht;>&TqhHO6ENvZv!~903xOJ%8PAs z9)1>k_o+_1%g>3<A%P%;4t`=bQWZ+20wno}WH;2awHvZY+9;Ct8=S zp99==EuOo-d1Z(zWeO1cun2L%%iV~^txkVo1(3uu$qDFzRK-CkJUTOw4ObN-M;I&x zYrxAV_*-#)_vCuAkGBl0K_L9Jh<#=Fkqn_?a>~t;5brIg5-iJgTr?r#lLZEBV*beq z9f%A!vu=lnJI*+wYgLrJRG%wpE->Iz&GZKp8W%pE1^Kd`w0s+#i-|)P4w^)m?8%ut{pWOm({?KV#Fr)-~yr7 zzj?q{W4n_n3;$^PmDcsyLjD4SLy9Xy>q=0$u@UVMk$W~VDc?NMJv?F{7FQlu!$z&m zXKB?;r}fCob~?Va8WDX*#0IkLA@S#VDbJZ~duaT50lzinc6v>rDWEyj#|)VYz>b>=zR=Zin~d@L3_Vn%WPfMfGEx6MvrQhn~}qah>t! zOuy;3o&zA`hzM)y@w#O_qUVKn*}JoU5rEbGb9w=G) z|1$SJ@KIHF-hU%+Kz~AE$0mO-md~x{omlc|?NAP`uO1yue$71g8yG+X-lb%^PIb^)pX1%U2Xat* zlLwhW(biSsE50FAk#imp+Ivag%VCl6Q=jD|km4xJT>S>Ct_wJeq6-tOy~Z_>z@g_C zT$x>K)%}@U*(ysxP^BY(|HT73y#q@6;L=;Yd#g?-(CTT`7vjJJM&wthv*$sOR%xQW z<04bs+AIVZvnt!tNve-+enMuVsI!01!*H0@@#OJK_p0^kNr|^QqOC2ey>zc$wd$|r zh42$4s-O61kafpY?#=5l9Mm69PA(3&PEs@*%@w6j=EA51Ho0LbfkLaS+ZC1{MtL!* zX~y8J_|*3YB;E~txT3_W@8mVKM>UhCG!+kyrfvz)H_5*_8l<4!3^% zG8GMT6;8Adin8%Gf*rv;ZV_+@=4rzo)U0z>ik9pxtUhVU-lFQi8=F1&Y|UrTP)!)j zOlMAJn^niBA;=9fLIiQ-BhbA=!Ej%YVFb4)TXKE{y!841l8FrVgj5^HF zv$Twgl9@jf!W z`@T@WJYf31t07W9)!$I(IrR9clGuPL%C42EAh8a!% zSdy9e=cTPKqNF<=W(1v$hHo{rXkL)<>mTAG@uZ}*fKrk?X|}(_jx7cucqEsFD80~7 zS*w1Dd7*^13#$J<@#KBFsJYZm-94TwmilDwTNC$l!)nn#OKU&=%I};15y zXubrAE#Ve2j9T0sPFjnlh=Y`h3nLEMRA%D;6TSlFUiflSSBGb?mVff4ppnTR>uqGp zcGfd>$pO$@?dgeUMp9T%gPOfrXtN+{O=)Hr7&2D)6BZ4vw(5&vjSV29O4<@lJfC%M z|EU_gTXP!=Y)?F?#s?7+tpcmzCB(I4!gQEA?v?KuF>k36^OASpOO5&sH5Vl-3%d8= z7(11C$%t3%6te2IJ}&gS=fPOeZ8gmZ2e7&td%Bv&*|(xD@9)%hOx#72-OxFU$9! zs3+j3p?}l^jrBkB2l+c5Clg(~CyLOZh(s2AXv}#)Z8-@o3kCRGC)RnFau}>Wk-P(^ zHWMrCn4Zkp@POtCY&~kham)2QeJ%g>KdK3)TQyEY)r%8dh1G+#kyr6@=CfhLsmC1` z5w&}@-BCX@lbc>b9bn=Q0BSsRz-s8A7b3T7hEVvJ3gNa#q(!bhTnWmHJMX#UvIB*8 zK^u~WW5I{@fjr3AvE&2#HjF;=N2sCW^@X4DTgwb>GD(9)x_@mptvdF zdDDaD;+pT-$%L?g$cD+^K*Z)amDafUSgxS@={xPRKwdDcJg<6#Z0S^;sk-K z_YyVzmvohWp!-(Plec(jhx^<&eAfR4BeCRp6*lr6>Q^e6w$t&yuJuGe({r zj<%LSd%zoJr@=FMqn3gtnb>R!4JdQKT7QFt=M)cm2*J24@yrrP06@M!lKgk=fSRl9 z@5@*u1e$)DNWVmP*oepjI@W+QIUE@J0(LVPEfnx(A?DIqlpnJPA+8u5xW z%fjyzWX8b(z&_Z?FPoPJ(r#3e%33x1A;O;M6i1~8D*cz$9?D2*XmWNxq)-kHH;qay zme^Nf-GLf`c?9uFiQ{Zk7pY4zhCefGBrM3|`d?ckb$yBWhL2{WB{Bq2yUs3}4Nbsa zD~188JbE~7D=)-oIof`i{3NhW(O|Q;u`m=FQQ95zI+TG%bT`auxQdpbH=`wLHeAY0 zM9%Et#NHCCVG_5o)W43rzM$X=JM}ajlmZ=h^I>kZNl9M{gz^-4D#p5ZS0zV|KT z>6t$5BG?*+6&t5v$vkQXFjD>w=p9y#h>eow>zC|b@0(txourM~Ul&Q_-u(8dp zhW|1HX-$Yk`{d6oZ|AB5^PkTZ7014?&DXfE$_x` zPWNGzFqB918nW?BPrZ*Q22NqmkMr7-Ih`?#H$#df4X9Qk*?-%{HL#$%y1VOY(o;O@ zWjq0&wzJmV%#{O)lN|vB$gFR1f4B_b^jW&<#&b#3|hw8`bhlM)DJB61FQ592#3OjQ)w7vd_= zFkKDFnE{?~iyIQpZqRat>0n%WG9mNPv{dYK1@Yj!@JlC#4C`f0Ha|ca%W0NJ0XsOd z!T<>+F_p7)RUr|e!XQnQxPqI;r=_lu&baFO1@m!-pM_`Mzx zdNEkw8=}qH0cvX`%P>nE*lps#${5jCa-7SLdBcPX#e(~wKMKrJ=rdBK`!8V97;oC@ zmZ?}+lm3>eO}nvRS2WaYHT*kshPI|=P@G0D&EQ-IaYO%Q?7(W|Uq2Y=HA0Y4W?Y2n zpF>a4&`Y&9>AfNOJXl(J^utZzBJ;NRFh#HAm=UC#9){|mH^c{tnKnZ-^FfeFJh&zv zXhEi#4RiW?ASpAHk*B4#;)})7rGLS7KBEN_yw4tm%;irBezG;U=6J3Uh2nZ}`zcyD zHzz^jAmk54i}N)qnEu0|K+Qz-8^tV4acq<^eXoV4!^{U!3@~P@;~L~X_>TWZ%o)di z`x6=oUs@y!-74+wS#Rl3nZY$D@+spAs&miNw*X=uCwh~BEdVsfgYRh1F?Ad?Aj~De z_uKoUO09;`+7S;4s$Y9snhL9KhgnDr7jO^2-23jfZ5mQ_`5e9!82d=i6HjgyX13~e zRJfUeW7Wn_X(NpFSg?zRu4aH5nW^J&>v!m8M)}Ne_C->K4}>L39e3TgPUIYl;wOwa z#<--~O8*xv;xQ$*X6(O!kU!_&6mQ@LO@eun`H&mp%goI?!$qN2rEySae*)7cIM98e z3I>9apej{aeKTGOR^3FJ4_C*;xF#U|I_*j;S5o0$z>lem2UL;H^)q&Z{MU@vWlMXZ-ASUT;tB)XjjEe`z|3^g z%rMrjuh}izio3_U)g^lf4)Oyz38}|OF(23Jo~=pNcXql@QcD%AJCcU$lU21_ ziNDh62+v5gACQ(Q+jdFK89h!UtqnPUk=BMBADMW+P!!}~pmuuVNduBKUlYxK>P<73 z-JT)|BTzCIOz^#|kp8%orcrO_V3j!GS!Id&TUS?1%qj9emIBFw}7%Q!n`|})w zR+i(^(WJnLXPa}reNpEFj}5%cZe1xB#3-4Q#QP?{YC9lj3`R`c2ovy}yaFjvl-J<7 z6sc6W8-pV|O!zo%s^J(y@}g=eQ<{#@iiM@LYA9Zokhm~>o<1@l&Q5yTK$jZ8LjQtY zWFodDl{z0Nykl5e)I@KXDXV@V8sgjnURDr#G(>J8uJP)qsC%V)a5Pj`ei!%E57FJd zg2=nnopSpq)vsEhF+jAgd=}UGLm|xRNZcqBkRC|t)}OA&AuCK zV&riI?itb=zCN71ul#1sqIR*g3U(+{Jvlc}8~``H4hlUmp!$2YgK@vCK0SROZzT@k zETZ|u?%}0BNY|@)e{uC`Zv8MQHF2NAs8xNN)$l7*uej#ID1DjF*VIR;uieu^ZBKQf zyWpvi===4;{sGk|x@S-Gni|3gywjEMy+}-EUY{=m zpgr{)sgt=Nv40R9U5E}*W2U1)R=xCUyfJ zL)w9O}km;VQaE~ zL6fF{O6K>EG>J~PIA%@i0LF6PRZw%TI)aRm`vTBnk81A`_Oq5qN86gxVh5VhSQS=8 zL!B{e%0cbck@Om+VVmFSsp1Q8C8z+W6_VICW zN^I%%L3g}GQTjr-%G^{M{JqV6j`4dVIGz#Yy3zFIwg6yIkSQ95ny&|Sg&jhae6Z^9N6`|NV z(}DrU+vz7xN>DWrFM8BG(0zsOIp{|(=io~N);byU6+I7&GcZjaRx>;3%5XM9(X?6yH?g2_*0sY}TDG~5ky5F9 zDcczUqC)y>;^E1FI?Sp=cIh6T<~Gi9X+&{`DFQ7CKe$$dGDxR}tbmN0!2*oz@)gWM z%|#jLg*SyU+^2!k+l?CKkebzJ#EX`BQ>T4}=^OW-Xux9y5J=!|%FAjZ_Jzp1H5Z9fx|Pz@75GBjV=fc>ti@yD*T_-Il9N;ezZW{C z%(e>q+2P{SLtQ_iS`K!hzqFso<3%g>35kw2g}Td)SM@e8q{@hMRc_U_`;kH9F%W96nHhxLQIw%@?cHyy2rG<^9gW&ix@2w1@f2+Y@zAqZw5KZhGR2w3QY*5q0 zK;x7^)5OBYDTPfFiyEh(T_5nP%T6qqm@K}Fn1N)WGo_fK$0$OHau@Ei3Laq!2%A}f zAVp+jB3%;2CH)!`M>)4Z6-6uDm%>@GF)9PE;rqzCejUEsGDZGxsGnGr<>uD!RKNgv9Wt!L7Q4s7JoOuC&4x7+AL(aLpo{AdEf zTWC?E!7jd>lJ4PLarm$9s(m|#tFqIo;q=o(c%~gZC?AMd6lQbzW#LPOoxm>FmfO=( zqdyx9y>H$AUuHLq<%9`_4XTmhc(pMcD*HF)d2n;w84TH8FhzHx(CbRy`-tfFoG2&f2Dik52dAcrKQHy~ocYHYJ@roa zjP`-Xj7hi{;mZf&!H?WyDT+F;hmBzavv<-5_DHfdc2Z^K6%@Q??nW^ z!VY$M-;2mRKxug z+0Kt2;%B8{n*#;4XW6NSM=9`LpjGTmee0qVE-9!!%MQLUHC1ha;k?m)OD zb9{K|+gX|oKOCsg7b@QlQk%y8?m9~Dz{vMJ*8IOrXn zb`e=4whfL3_Dd0oUc!LC@d=gW6b(IZHMnS`!XK^($O&aNJQQ|;j|NzGwA0u0)ac=W zZD~C8fz==wqi1UKlPc$P93I@Pj{l1{-$rsT)|*)Wfpws?OkClc_&8&f zUOcV;XOHkKOhoAFFm81M?ZTQkt{{ReY{CNICkhyFG<8q82av7yQjUKL6zn0>`|k|k zr~W9&b?aUq2<>@TZ;r5+CiKWav~l5C#01$%Q)nOxwPqU==$VYg8KCohhyttr8^9Jl z>yu=HPRF?iI-7A_YcHBWfaHXt>dymLMPb8i2uLztnHx!7UJ!ngs$?r~*@@F&&(_Nl4r&lJ?04Hb%}n#_E9 zbG+xlsi{ZLQGuCl38ep;LEyv(84qv&<(PA~=FFcdquPrF{@h*qu;wooco}`R!3znk zrvB1{8E@Yy9MfkCBi>}K<6{mxnP{jU;rS<+%)98`Oy(lq>u)k^zhBiok&E|1r0|v# zDWv(=^6W9zM_HzalsPi#LW>{ON15nH(e+>(`7B;jtgWlY`iF$Xu$MFb~j2h?7U zC+57U6p9o6UlTawk5OdZW zMJ)3=;6TBrye%y09ELW*gK3v9%d7 zyn_mWAYGSPbw8I2Owu^j=ok^XdqW~y6XV!UTyuj4#dkU}I(*L~g_lc`#>d7+c)XsP z$wbBVYPHTBYMS&sZMa*+GxuI0K%;OOPJbFpiE&l6lP7}Ut!WYTJSe!wQx`QHjbHD5 z4U#xFBi+kIh>`@SQOTwfFS%i_3|Zi*@>zb_Ih4gx%gUE<9|_%Be!X?)U7$Q>hIK+s zNU<%Mmfvg}Emzry_7y5kO<1SvIi?2kHNTOjnUL@6kXwj<%H~scC1u5J)?+sp zPDzbEFOsY%4hKGnG|nrZ6-j=vqUpAxxeCFW6G?udqVd-9@fA%!@Ji-Ik|Uccid0x( zs(cS-BSv1_z(V{i(dN^G`vu(jqk-nkg0UOO+ba9S!56AO3;7&8wpj%~K|ZN_X_y9@ zXvRgbZk4VxvvUm?OOE?CO4tY>;KgeTR=j13r7E%+vWC>Xq(#Fm2Q}e6%{bWE*|j9C zq1Mf6*}63n>T(MCTRjv0KYyov%g$pn(n1jqf*+`6IgV9r;~%u8*C$D`G82c8L+6CfB@W z2G*RGKo=sp-`vLSyi*a~NGR+s^UiwSnNdD37T^QWI?$!lBE+M5F?-{?b|6EV-eacLMjPH|LOZan=TGQvCRAV4k}e`0M{Yvb2X{FyC^KVl zcd*SLvXRjJcKr#JSU6If6Mvtru@E?By=_fe9SgREvshnRNTS(h4J)yR*%gRyr^TIb zxpC*~9bh&{23tA(ZLtOHOvxF{eU!Z}DRT@DrO=9nKyB8Y`!N3H@7hSJiskY4DpDr< z(c7ac)1D0{zh7M06ebCa_OUlndRE0VV^oAE3L$W>OHL^^+gjD5#^q={lA!h2_X{gg zzJvpNB8{`PbBFuecy>9P_Ef5B(^fUc%4hZ2u0O<6I2u@!sUdAdeRJ5lXSLa{IxB{) z^^@jl$w%K4G;#1;ul@Rs97KBibsWu1N|l}~F)6XPD1XD=Y&Ptp&*wHQk?3sLH5@N; zG#mC&gPqw1C*|*g)jL3_0pOkuJE#8*`-O?U;p?y)_Ac7WhcAD_uJ$+V0dxnSWW#be z3mdj0H$CoY{!l9-7tSb;S#@V=N&THlMRYeWWQ(3MJJ#9Dp4E1)V&kGy=zP`e)$I}I zS=os_(jeOOij4{zl#CZ`A!Ul1>q7c61w+-4ip~ z0|MQAW>N$%c1@dAzXD+~dLw%kQdt3e5lh}JmLQhAuXqXH6-$jKJ2r$Oo1K~(dPX#~ z!Ab-nqtW2*>Y&kC#DeWnsk7^mXyFiI&IWfB%LJPf54;q2exX<6H$F=T2vJzFl!m3X zn>pPE8n! zR;thn)|D>-i`YbeIbG9Jr8p=1UUKR#X9WK> zucwdKVzTaPE0&s}Q;zv2jQiY2(NBS$)vcYPwLk%>4@z*wx|b6F=TauXXyY~E*-K)fLCALe?ExivzvF`jnlN6=55hjpEqbwsCI+3-B7Lb69Cgs z;_g_W)hZjKv3iQn`R!KOB8K_{hPrS5+v$f?7cFw__@=VPQ<|y*jWYvHRfUZ+3!AEn z8fT&$K55xSCl(}!HW81XEOST{k~-<1D6y}hD7a3#VHW!odM;V`O+I?6^u0l)p0RE_ z{SV^c?c_LW;4vcgu{=jm9cMDOXvf7)O6**#d1F}@G>7D#1z#}T*kjK z!0%@6{hzP_h6(|(?QSROJwQB0KrF?PRrWnRbzMO)Rv8Z_7UdwAJU}C?vM+lO!Q~J^ z#9|*JHr2kJp4Jz5Pbn2-<^%6n4e(lt?}L!?U{|Ae9r|S^ONNPGwwL{7ZdE{k-ZP8B(`?r7xs*P;v;QW(kDZY=$mq{aOxM zhaVnV)4!rR2Yr=rEGqz;9cJD6Gc}NC^???E%>nIoj5}vq0BFfe(tF56FF$^~QQ9+&SNX zoFvGg=RkBn&8PSApKzzpp~0OXOdsyly+H1Meto1Vzy#X#lZQ01?|GQ>+cN0-m@{cG zC;93;v?-Ed(B{J4Kt~=cEv|r0i+hE?xB|LZU!eOJc^LHrbi$bX+?G}_=1ILVrU!lh z&J$sW!$TiO)(vL~55bc_AA`$5-_`yq-f;AI^4jrzp>IAV{Xkz1Pj*Az$Kc7E0fkxv zcKLV`IVcBmw=viXW^)RI?Z%S_z`cF&q**z9Sq!qAj3m&FEVWlFd||-82Ij+HOfreV z7kK#4cEE)<6BTiDSr&dJ9(XU^r8tC~EI1Q43ApIGG>$}KXhum|NS%Mv1*EG&m`L6& zwTK3=h^|I@qQn29ZX`L6X!OK8gQ7RC9+ucw7)#ybb2j%Ci{Y{A1EA?xa+!~npA`EO zO(n&*OiL9XAIG8Oj{il)Xs|P%<-rrbe&NSd(plVDP9x}tYhDf7P}KqUEB`Kvuw0@Ab6Xv^sq}8r^XRZ zhKmrJhOH_~d7CcDvm4q4b;xa1qZnknVmi`xwR>;Z+FR3q;w|mRb$VNDj);T7{~kxv zPC1)1?zVQa0#H#pQN;mEwV-2~$+kJ~!)?T66zncKHx3Ek*l|Jh)6y7 zT!H`=c*^@R(v{Cyfa-mA;mhqk>_QzdXq8RNu?uj_9=p&7v`EvGV;8i9-(*H|OLz!q zEil{YP#)D|7yjWH*ac5=Gy+x+j4k4ch~(iB7R<`o9*hYm_kuB&EC*vZ_)9k5hp}I( z?vY{a{4pN~W1o~y5X;C(Hn6Ape1c$XgeUw>VU#x0INbv*Po8>ND+q-aMZW?EHtFJ| zzw+X8b$7G5Gd2V67MVLm=VoM+HtrSwi#CjEFlU;bW+=T5>n@YLHOvkY7=&YtyWkk# zPMMh_qc=t-RvU28IAWZP(Pm7I6_Yy|2AbpIsc|P~ z2E~%gjTt$ak^$4Wp$HllWpQDRJd&~HCHNej(yp?5 z{jz4S%ot!E^2>fh+1$D3TEpuoz#RRtm${mE9j0pcb8Gk#wHQm5<4fotP7mPRr7~Y3 ztU(C09^tpL>Fb4+$uNoqPa&*9>)HMMMv^yCUb+rNuoS<^uNPOQhMpJ>?2a_fC_le4 zIRx9xjPfr>lBf7eV7783ImA~2k1$WaQrUD#5$fQPMjdQY+stuq+RQ8kR%YhQy#c#Q zi&Vj%A<^z&-TtH*V0-@hZbfip)%BS<@^PMHRKN)H6WnuX0sJ;0@MgwH%Y3)V*Jc z2KM5^7lQ{fkmU=xvcG7G29L^{q8XZ^dwNaLEjUwmPtk6s2%F0WUzNKr7JB6nRj&EG zLh-yPcbFoPkP1&dR5}vIA32~jp1PtP^+F*IbkWf6`G034^OVdViWj7zxkfE>$5Os5 zGg%S_R#j=Tl(zzf<~&JYv&(1soZB3J=Y*@|CeN%IVl~qJi$K^&;4Nvzg;-_CE1ud1 zlB)I>e=dp_HpqX)2&;_rRcpM+o6pMzoYw6vPXwD zS`FlS0=&rMcTlQJbYw&EYeO+Q{}lY%q}CeYeu+G`8rKLTlAE{|#dmo^!3cLKk2OIf zREOEYSA_i3s4ic|P2Q+3JsNx95RrT*TFt}LShLbZ%^X2>xqhT*>_6qHF1JvENd8Z~ zWP=0Us>?6tltCXOlIKY6fukX{MkL=$1coqeJn(!LuE?r?3ojCHN1gtXN#-^>hX@>x z6o3|*dBO2W0e5ZY&QRXth(;CV&5ZM~Y;}2s_FD_XeUt zQFD3Ja-_jnRi;F00qR0Jzi5fitt%Jpv{Sz+zu$~;h5WK}1Qg#$#VT}DP*wLxXmPpX ziE=cwi&u4@qoNXnbf2T6l9b&4ctaaVp)tQgryNZpjYBgv%Zg85_Gd6IU~34erb~sj zexaeHu3vaHg@>Vu{Y~n}($BoMtl<^xoq3wud%ThH5$otTmMUJSGBXCs#FAGw&4Q5H z-GtN(nrH1i>z|NDnrKOBAawSHA9;530wCjF;y+=rY zC_?(IPe{-52yM&p zg}Vi6KH9tmMfJ+>Gxt!`6MfUFdUkK1LyxGA?=h@uusKhN_2nWQ9-HEMLWp4zg>B~7 z^MtscEB69g^6Y_+bKC6+(d^UNF8tCDrL%rM6XOY?Ue%LY6Ty`y1O(TcBDdv54OCes zMnZE><5NXxaegqbL2$Y4l)H>x7dajS&Gl$+=j(>#2D%K%H3WB}(;Dc2zB+3}VaIfC z@d>a6SP1n{#`( z`>fux=VwiU_%>53Z}#@S(0lfd&YEhzU4aRHyZ-En)2WKHHKZtn03VMdxYck@p>A$H z4#{{z5DIM+GSlSF3VoL8<{Xbcf8HFoQi*dg+Lr5l%2*X6t(S=5os2vE2LFlh&BEDE zWEv0md9ugNF27!ymJhFOnr)QQJnQml( zb?1+{>^7$3f7|NOR@d0nPc`$+`fqSI{Yl#8^|-Z0Q+4ICJsW5f?aH~g8Y(9mSvFmO zC{JZsyv0RUO-;ovVi0TXggZj@SdcCNQ!qJZ{+B#k@o031-YeFS%RK;{XI_?0&=>O6h9w{iu=Rd?>+~v#bN5^6;`eZD| zDfnugC$>S(S`#ai!(b$4m%~={cx_F_YfC)FNb|^!G=04I=`cb^uIF^~>D9%EwvJjQoV?@c9ruHaA}V`FP?D(O3K{ZDy}tl=?8%;NJH z-=KMq#~APP7-A%hNN;!%iS-`Uk2C>#hPx1_@EVz!U;}*SLt_3GiTO`-uISvd>goh? zy^;1e85tk`LwtnT3OQ8Tx}Dtlrq52`;pMX(_wRl+8rTSXk>g2nJVp%EmCs{*@$Y)i z-eGx+pRDOUd;f<#hQZnS>_qiNVm1aFqz(4W<0n3A4f(c*u5aqgPw1F|w99|eTnG>M z!q~s@T$%XddwJv`>-%-}sNwUvk+r01_=+*^dhHXV5ok@{YWRv9e7@qlKC+gI-A)mu zU{nI<^{50Ef~bE0qF(H&1iY*t`FemmXzy@{`n-n@LDVDN&rm2t?MeK75Vhw5(l4Su zf(yt|AnGl{`XcHblza+^I_LY*8&NZnt^Dg7QfefAA!=p2_jrr(R{hV7#P4snvsW3R z|2zr(!Z*saXrx!}jkL`B|}bk;GK|i*ocYpUJ(;zc@Y!6RSG>36XgJ> zj0Qas6DSnEJ4`clv=I}-sG8Fye1d?9>z>!9lNMq3DTZw%Z+(ebnq0tyQ7epRE*K$> zp5pG9IBrI|XTvu3jg~mkD>EvFS!M>`b+dFr%B}IVi|7ycMmc0`Jp5tIy7M+Hnlx*) z?dr$y1hycnLhtwEgk9Nm3v~QD-Kqkcda7T=uNO$st#gl{nn&plAs+`JzXU=K7*r<5 zLanP6MR9?zc}GJTNsi40OjMWO5NY~;9w9HIWp{70XiRhFRw)a1^i~$^Kv_Vr!}9`~ zJY|7yGuMhrsfC=fV4nM*G{p?ei{OQQs3W!?InnKi-5oh`RF2qnIY;cAw!jR2f*JfO zRPa?jlw8BhX$u}0>d~SR8Z!FtI^WH|uCJT_F|?HLJ?vBRBWvaT*7}K?$fM+Dpm#rG zSPmaP>|P23jaM3a(Q8$Pc#F(ec*+98L?GX*u68VmCe!GByT44q3Q^c5=|U0)GJa#17cKu zl*H&0DpRx1XF~_Yeb0jXjxC0e@! zB|g&n_uZy_0ws>683HA~+Ry&{TLenn_Y}C)50p4eWK&>BZvZ>&4!w@H`q`nazCMqn zg9rQ5=V|B5bhgZF59#wXpNec!phQn()2=7Ip;q|dL3q;;Ex7d^8^H}o5|EsWwno>y``C$Uc{cQYCEh+-VC6GHHFDk-7Ew- zu`ipUAGJs0zfrw+OvF8EpxdJnx%e=$ar#Co=3*ks{zfqoC4FKdzArU7NV^+r{xcAh zmVkaVF%bq`3Mv6L{p6v`ZuQHh%X@GpX}Ou4$vGcK$>Js?qBe&xJ?qX9LL%aQapm2f zb;kse^+25G;rPf;!Ik|6MEsN|!V8B7y}wyN#ASo}g5I|%=?C;asiWinEFhu-sk}Fa z{67eVkZ`3~2%V*gBw)*X(j2qr3##sv|Mub`{_Mp=C~;Pdc!;Y89xfgN5uyI5;vqi5 zxBO$`A?{>{ZQnC;%i%=<~-#w=N7{e?sP%Tb3zm?P`**_E=qaEP8QXeEA5XNUN&pUwf{f;Z?9 z!8QFMea~Daq+bKk?S=G@V6KX)?vZ_qUoGmj^ZE^jC{!~?9}Kb4%xBJAr3kndeRMar zKfK8*eJ>S1jbI4FLVRp6#CBleV}c=atb>FO@Oj=(o{|2ZM|${&R}BB~DFs7#{KIOI z?tISI=O3y>L;Hq8tiS8yK&dAb;tPHG2UaHMrrtLc;-DeeM~thvGw|`CwA_sOs2PVw zs`n0s;H2_AP{QZ073M)o^}eAHO0sqMPzYSiypXL=7z$xlwW zD1^a5T^Vf;T7yM0Ap4&nPWcPLDG z9KxMQ;vZcn>`_4hUy1TeNxsS=a~6FkAb+li}gVRcRiE& zDaAmP_y&`Yje$rnV=4NNfuIdP1|rwm;bI^jq>&@WKwyM%HipR^4^2(YEaBwg)TBV= z*blu#b!6H6eIPs|?mT~awB_v)V|QG}ai{?UATj6Kats&MCLcI<~R*Kef4WcH4fcZHqiP<8nm3(2uHyS#mF^7I9B6Z^9@Cq|r=;cQ#jseY|^ zZfo&;65p524TrYObxxljwx;cl?J;ob0*+b7<84Yw)I@i8d%$+H|5ruJKUU~G)=FA#3@Os#JBQ%>KJgozd z+Q;&l&y4u_{^1+q0RF@$ga-3%?ZhwwV_=LFO4K4ouy`!I>}(FU5fIUN>|7_(X~3gvVpDNJW2Dm@ z$J;?_-z7XL)y)1n&l(r?vd3{AaN)v>tjDI1dC&?!F1ToEFAKCeEzX+tE`IQw-AztI zXMV9$=u9n1aI6<6Lz}E@oCZ-%*0i>mIhHn>sj?+Il z0PpEMpPCr(z>usjf;H;B9Z}SpqMe@)Yy`}rBw!ZUb%i%>8@og2A;^l>4ha1|;H<7vkPt9}{H^gtPAtg)|0 zo#zE)X!+k>cy7#krg++PL6reCybVc-x-uMc`+}Fv`Q)p$H^zR*fnA|D0j~|2Z=>~{ zcis)COQUB#X9w0#a^}5BzPpvC_(nv=!n|_(%$Cd=`ezW%8xi2^?S)TGww{^r&9OVe zp`DBQtUm!-?-vKwpV<<6ZhjYVwJi!*=<{ zuHoTS?3lMUwj;B&H^w#ztTq|2>S!t+(-_%gpvp}aKSDV`wIcH$J!@-{;(6yT>2&4~ z{M2}jTDTa8hJ#s~xsEx{#z=s_j!S~Rt-9yUMN#$5*|jyZ{j@B%>qiFt#^RtM^%1 zGPcK3;|6!8gU;Fm9fT%MuTS6RTiXE-wtXyj>CwJRfmBPv*Ot zlX%Cflh+`burb^}F`TYA^Ht}J#sbeZZ!fMQD{$0# zwcqaF@AA4Gc)N4U#K&B+) z1=*X!J;8r$^aGcH=ZL11jmb~XY&+x1bJ?k*tt$j{c4(#5aN?(cT#$pN}EUc3K_ zC4r33-b`sW0;`CaOFV5dU5Ec@Qe6*l=!HOFz} zn)?@;^Ns)=z!}~($3mYtt?|coDqcFFJe%E_wHg+37b7cH=!5C0(}(KZ$k}mg@&_?I zsbiyX>*i?R=+c9%N?_ro94cB9XQ!0hR@!Rdk>Y|(t)2W)nL!Vnx;wp?ME`5XHnUNV zUvlfF!6z>)1XX}5-#2My$epSDq8r;2T?igOYwc-92bP|bcv|~`4Adk^=Nq?^Ly5rD zog`QO!y9b*0q)X=&2*((@i|G>%ljw!6TQM=1y=o3AXg{H=&hb6KtW;LNHT495(@!T zlmpjyEG7@@YB{hEV@|!eRzIqMTUu4UGUc+Yn@@C(Kkvk}#+)}}$=@puCoj4+^&5lR z_09;Y%9$p240KO;>o5SMC%jd%cd|YgmNSw&_vBw`)5xLbmnW-BFT7PqP=_~upr?L# zYnNa4mRDvxW`s&r?@yHV?*yCg|C(Q;JAO5nO|2Q^UGa=uJDnUhqgWSMF1^l(|^W%bU4{{8oR} zA+zU-p7_lTnCe@C>p465533ZK>NASmpnoOZ1IsAj;X0U2U^0JDW zgYh=OhLOimiYu3f{FH}`$c)V7I~>zD$zd!n$)UjBOL92Aza)o()m&K4M?3Ro_IiDV zH?#Njo!P5@&dg%U_l#?H=;&N#&49hI9Mi5pt7_&UMiEQ?q9-utRjXlYVL`#gUSQ5p zGNO2aInz^-lf1y374yf+f2M5y7YNKDaMq8^QL+lnm1)tBeGqe&{!m>&_2<|r|Ec10 zNMfq^oSXAAp)^txCQCov@i`R|vTgStS#L-tro$C!9ao%-&!K-mKu0Xkh>s1>nJJ3r z>5oU4_@Q+}1bPJ1672v$?idI%?Boa2N?G#~pVmvMjAAXP3GAD&LK8^~M+&B`+aYC5elYDnP;!WCZMHj@ zwmZqrQ3lf|H3;oj33VPZK{I6r6`*cHn}d zVm^M#Lx>VbZMbLslPnf>N@hEDD@m|^qEH>=a7)HQP1eP! z*h#R5-4Qz@dm?s5&OhG^kv`WdGw%U6e!xym?saJxeYky)*3ur?B6SbpI-;2=uNT=o zmhjw8r8GbV?g(H_nAxMoJsc3eixSTn+`#X6_gOv+_#Gkm{YL}8zsSYyFqB;2&i9#> zD1ke6>h~WTw^P{{k_U<#I1(g}aZmq&2gzgdA$fdv?Ad`^JV+knD+&&ULgkzb24;c$Ph*P{>%x9Gk#5ftxiSem_n>nK z&x0nMN2vUM9{H$TSPN9HALaSzka_}a-km?|L%=A9(i;p)S7?vP@v7J!rTtxC@cB{1 z_Dt=I%tM}MiQzQzcoRD4)8ehj_Goz7?wguO4$v0meHk34Q97GR(r zE8;mdeRK#bvh9e8UXKES?|r*30w45FKM4GzZdT;%qs;4(i}LxXS6&Y|y;lD98|5Pe zKC#3ga3Y8!R(%b;NcYwZ-{pCMY{K;-Cmbc7Ho-bQSw18|^w9OW2^xaO)1hoVdP z^Z-Nl3!fjsk5;ia@H5ZQGIG2!X(^;9N=VNG^P#NbXe6BXL?8Qdy~pbKyiKlQIBbv6 zA!~>lZn5sDqT%$n_zz9OX@_VMmOl!|^+S#;;M6e^WlboTF5x)T-CtCqtfzY=%JNfk zd%3b?5%3fWq_t*F>ZL=7`I-Yyv5==x&^O7?)=Q|BuUOFauuq^>Xuek)NLq!9O~02j zMV^*d+Jb-nN1pc4DkQzKURs4(%05kUMZKNY>fycFM@(;NJc z3G?S^<^Q7IVEHo9x;2N_8=Uc09sxNLVXmX4zcFDRYzEux=?%^k)>cGqjyUJhVgYdqS#$QQm#q$)6USV=q#bruy9br!LSIR|}_OLbzXgC5~m z1p0A)A<)C1%+0#=e&l8hb(XIXiwTK#XK5?-61aYlqs~9_sk0|-<*0LEPvq_7b`p0H zc{|OIytVsMXSv_Yt3yg?sSSpqHu$ng^DwCmjDBFG`&;r3dTN7HRUPF3NuTl+2X|7T zm*PP9o};J8`0+}PUYA)zNaTO;5PIEdl@04r9bCzP=P=-_8L-??j)GoC|J;{e&!prK zf$Ly5y}sZm>Gk#aJ>7({_+T%3J*J0V*D}~e4E8n#+pRi~rYNU6xH6wy|3jk*${n2} z)gMozGi2gg@g7T-0UkV3Z2%3hD2oSo`pO4e$+-5`eny0vbsKurZKW)^|a-H{P zG!)qI#v7VhqBK8#9yq`#RE7*!fJSfhf`CL0R_(BusQL&Wha!U zYHuuc^G9SR84%vMRS8ErlE+u3t_~zta+n>i9t8YypbljH?I&>bE0~lTO4!-dtg|kB z=H5sUQ+>pGW^-le)di*D)TP-}?AYv?n=)nDwP$X!p4k)$ZMd~C*cx~>H8We8`bNOn zG`A&dIbCDd1-tAd!@f5hTorNLxz5ljm7%SR2W6iNuiuyXYuI@<+_JYQe$BIS;t4Oj zwY+2DfH>yV0g1N;W#EMf(Swue!Z6EmN6FB}odyZt`78r8rgH0c?d`es8?1WiUm_gv zynNGAU;(4&8Jt6*gB-dTaq^Zz4*4kDxHGe*WoKEUr7W|_*+&7EIqAtu63s;|I}0yShowbXsputvmI!*$%E)dLfaP}Kev_gaCS9JWMO89vn~?c90|Sl2MPf;Jwq|6a zWl+R9m+7#tc{Z9VK8En(Sg3hn85Q^<4wB{KBQEmb%Gvcei(N3+xnOSV6p}b@Z0Fdf zvCVT^BMmHKW29kVW2`}E8gtC;cFv&YlA>#^FQOP z=k#hkWu$bUSwfm&|G+#>%Y(*-I%+H)@+z@}&0!pCF3{P#E!4($Bpz(xp)yepc3M35 zlkRhKI)ZD}lG;py1o_Ov9f!^7+EJ{o$qPDPLjlfdARFJe10Qmda-?aX_1NS<(UcO- z{LuT>V}q>6W)`)y4|7^@dI=a`m%s}7zqGWM1lFz0cZ->-8Wl|!SdUFNPg|T0>VK}F zU{C=LGP^KKVysRNT(Xz^q!5T0Flxi;~_Ttx|6iwkP%;NY5hvJxZIVY@!XM{Jt6-!-L%#qKjuV*o}Hd1x2 zW8ou%sqxjYvx4a$$x4GJNM+u(DubA)A*#udG{1X0v%^=4z<;G z0?V1V1kY;;`0k31Lpe{vs-dpAE#-%UT|ZHKuM3%yp_`jkuNspL1Sq zoc*&w8`~qnHoQuHRxFF?^XQkZD&%Nfc`@)!F{c{?av<|M4y4qXmsZ^>=FC6j@?^Ha zzCjB|+o>5Rqn*edaEYG?hhq-V_E?!aRZ@nZbiMbgcdlh>BJ`fb;avl2ui!MBjyF#z zn08I^?WFh*XWR1*w&Ylw+`*Q1K$qrVOYhPgZ0TK^gDt&FbFihkJO)c#T{VmP2YE19 zPd^)6!4Y_vd}o%d^tUDFx?`c8Qqsg8N)5dWz0AZSd3ZHVEwqy-+Z(q=umTlL=A`(D zGnu2}x0A-wY=O33Zx-v#3f?S>G}*j45FL*HroG82*f8teqAN-|*E^gfy3vg~MQ#Z=Bbr!I9Ct3$S(js*Ia@pD;syBKbxlFRlCQwi zo@P6oJAyQI2M9v)UC9%LBXsboTm^^CC8>lSlos5w*j~DS7t^uu3mEub76*WudkFoYRyETz7kx-8%+CnC;@_1nWu zGfoLOuOzlw70vG#S2R9atVSD$283>-q2}7x(x+=^xH;-f?vnY(lS^T=wji93Ie6OO z$@E;LT|0F{K*wt?VMLhx0Wg@nRCPJ$I_Qud_up_2#{xDe^jh{7MK{8FS^_5j)xeq zMK6knHZH(3&%Cblj`^%`W0Ct^bGb9zI4R(MD_1X%wKN|O?Xl{F!f@TH|EB323I2U|2yO5N-4N{+aQ`#+;#c+JDDxuzLK_&h zUX%*N|DeqV23Hm`fNUn|?%JO>CCgEh_ctYfX9k~}lH+uDxGDJ@1JQI$U|w=l^3QbX zPsu&z(wmaTTrpE}E7$!`$xDC-Q&RhF_j1$po|*x1XLsi794cO7qoEyBP(9UXYTkD* zppm>e`6vI)bKSo)Z|<&MlY6P6pn8};ABDUmH&ZhocgD%#!a8i{Rq75GOFzawHd0Qb=Pcpy#&;)X>+Vr~{NmQ{4YXy}%XP1eDj@wx z>iYp}`7(n9!cck6c{i+Qy0gf4KHx1#z@w&y)46e*vp3k{w1G4?z8mVW>f5N7ZOPUx zQx6z7mhm&Oaar*ahMedMSaJF&`{1upe-Ew zaKXD{Ka{dbuU4k!20Rk0WV1q16RpQ4oEvdot8})8on6jerz;%Xm#nK(zZ(_Gv zG3T^4+X0t@K*24cwF{1oG?rvnL>j9C@O4@Ga+W=%`pnmY-wNaKwPL~y;<4^1q8rI+ zCDGLBgQCF|Sb#XreFsKxJE^!`85_YSU})}umtmyp5pv;FSd}JR43ONDljAIF`Hh8s zjO4(|t4_b^U+}F&@sDni_W&0Vgph>)xGT z;p=K40Fro3Xl7CVqp$KPn!0pfEP(4821@Po;8vp1W5L(lY56sWsux;*`UCbWBE#^1vp8276FgAV4!;OVwzq*qako&E1wO0l`fyQpw9+3Ae?5J1cW_)Xo6a`LA4w+8L;lf6kSt zok1!|b+>~&XU6lxTphJ@jOu(RSE6yp z619VD^QLQ2!nMUbK%mRqZ~j#%Yp1i?onfxB$Ey95mQ8`YQEG8tRjyivGR^TI5h6CwCh1D=^oGZ}smy)G_ zDS+Ig?X*+j0h!aR$5u+0?mZB(x#o56S+RE4h-hls0lSFg^Zt13&~sM9N%W(1)5At; zy4a_4!^ukc?@0ONCHn%^W0veItf_1&g0rXsxiGUg2Jk>H*R`1Na*!b`c=^Ea8r)tB zGC%qw1f2=krWbT+JAZcPa-ekP8fEN+?Z8L0T7E09nvFn>XmB%?um75PFYBJ(AzDbn zkTxj7UbvA3Gy@M(#i*r`NbDVKHC&~#863qW9oM$0snN%}i&#n}_9`y(K4d)U{K}f$ zVqE+u1gc{b3Tv*7rY0Yxs~PkJf3w$`ICfrz8KA5ZU zn!561RgzBd-yfmSV2Y>A8){JZ?vh=6<#qm7&hWo7-Sd^MzH&GAjX_wKuY~32 zD^s+=SI+4E%46^+rpyk!?0;ykL-$UmQy&*+1SP`|)ZD_JkGv|Hc)yUIX3I%DTUlJ^zaPD`r#pJIK*C>zJa(g+tQc zp{ftN>2K&-V;I}~ga>E$mABKm_tm zh!yVlm{gDZ-NF9X6EGke<_~3_vTbtKG;2pO<@f7Nwh{Z5ML-rLZ#3 zk5Gx1-MJKEP*hQ~Uv!y@lDCrPRQ$Lp+~zI-9-xaO@Xa4i|AzfMSp)Gqgz3f(HzI}w zTqBPqA2na=KFhFSRyJ$EH*->Ey#DnX!kd5NIlu9p`ub>M|JQ1!#6!Cm$N{hr8W*?- zyirhn9O6=@5G_S&*4HwhXL}s5Ln~@e!(;x+BEoVm4M;0z{dR;u%<~)D zb&_t+4880Am9dqd5x0LT#*ES0MVrPX~CJ- zGDW$U#E6r*eLY3fQ{}@Wj-p70#X_!i`_q)g1Dp!KXZ~sfH`7u>c>+WmRkd~deN><~ zd^qPnC{H{93+5y1ZnzxXH6!8#p+wi9#f^kH7%L?WTMgIgrO-SsZ=bD80Bg)2NX~(g zdSg7ehb29>b~qTl6fC{~jpb|dyF!qfC6GnzHQLz3fkCyCnvlaUI^)F?z|*DWBz6fm z#>xZ8)cP$X)s}wAw{_g>FPu;?^_tROamZ}4Bn%}g=I*yBy->6z(L$9X3@`X=6pn=k z7nMXq9}>lwTEKVhS};;h7S0FJ;EP24Bw9-1sp8UDX!XLuv1D;c+$k>2q-8*Nb|LRV z1NH846;0y?RWyzZpsdMkH{WxcHZ&hVQ|tFUn7P?&E6S-Odf^SMwG3mN+CpM|9%2Ac zP1KfSg&@QJy2VrFr$j?<)P7Zp<&&jEEvY`ipZBc$jTr+AGDUIcBW7FcIx=&zkBu^L zCA5MQK>BLQFrLE! zZh5C9u-d+6b+~DCc}4S%qLz2cmcAqPpB-2o4egx2006a97avr}?f?*~9o!iUAoDVr zZky0L@>lIl8H}*7Qz+qom_}_onJ5l3#LgM8Zmj*5!FFND*Up!#d?`0x@)VQ9GKW2=G|xlY?5dJ+ib2)Y7Mn~Qx!1yZ7p9)&Eq#+W{@Gd! z5Q*XM+(#w4^JI;GEWT|zRHBQ!1=Lc zQK!w|ji-E85Jdy7PcOJhIBeN)sI`(PNNg;`zHJ2FfvkfAYmXr)&8*`D^lol#+MnoZ zm228F2uCxEW2tFO@Y~uUU_U-*llxt&>Jt_oXFEl9Yh?lbWHY14!p{7zV1C<_fwj5% z*l1uyG}sc&uF9;A2VWzga!AZMG3I<5L2y->AY)~6I)de(&Nrp-+l7|z|Nm-z<6YHh zCkZ*62sSNlgoYy}TgwTls49#w?IW2Dyx$^$>1g-Y#hk+a4PT;BGJHJ;5_^eP!p{CM zrmt|$_O+eoQ&Yu7n7)h#TfXTlocazyZ{4=9Evy#UBWL?6KBh8tN!D2rK677i zdv+}f^zA6n7aSKRFq)`JY+tRJA=$PwTdikW!=aYj3WJ*>fmb7`n~+@Hxg!JE(znX>MQRgOZVb%F^RcKEgwqJ{L{M|H#zZ{-Le{++ge9q6a zX^f963LTr@9QV_y-&cjU%^76w<+SYxQ=ok3i>B)8o!Xh7y8H@ul6)RPGU$(TC zJyVMlCAfrrh;Qd*PUZ~LLPGz9ZGz2B$oEYtk~LvvcyiQc)jtwT%zi_?dRsku;u5bf zF?+ky%Dr^wN=eI?8QsNJJIQM9{EFw86p|_VRSFQZ)xomfL+ zep-d3!_jrSbFurpK|HUH#om3Glp$xSjusZb)Kj_!CZhA&!0fdbszOhI)!e75UPmE^ z$)&y-(Jp`f_X~VAeUXOq!@ki)snf&p3ybRC7+LoTW%<^^nyKp@wz*OihE80;bYXFZuzj3=S$}s}eIKT25u&KQ*(GJZPD{d* ztZyBR7-FX7+aPNpEzcmsjkv=eKEkMd58NJ+5aeHmZ-r;$?&&bt!CpMb`!V>J=1dl@ zf5V5toeO1@4p9-<_&=$J&YZ#tI<{9&fd>XUpNVbv#`W&m1bDNa2tk(->HRSex3c4YQ6zS}JiaOBSm zUs9F0?v?PQSmJAi;e?gG#8?zpPsC!;@Wqk|;hQ^$4w*0c>s6sQ>#hjf4xdO& z#xB4fC?Ab6#rvht43q43r(ch`ud@tg@649nPOkZp`Y|nHRow0@a-UeHCw`Cm%tJFz z{B5@U6T1GD?$>{qy}pAj4vCxQ28lw^?tGeR@pg{Jsd^D7&7B<2FGe%G36RO`Pf$&z z-F{#xV!e+Ky~@Y(cwqKJsdAe&XZwMr@rgzCM@H7|HrLzr+4s^{zt#KbQ^;aZS%V7$ zmvtF+SH{M9z-C?|ryEyWnX&KdjAHEjt0Zz5`@RTjW{1afgO&J~LWsaDbu7P+x^f2? z8)MK9Cobc{YWr!7`jL15t9~_BefC?-`Z%mWD^)l~X8lo3k=yfA$K&MUW!zf?#$eUo z=vwvHvQ4tBhc~^9Ss$Bzp&SKd%=#Bp;vxdGe%qL)s~_rS)(@v~Qm`gJ652IqGk!Q+ z!+tm%+Wg)O`|X{E{c!8f{yenuI84}n@0{4xM}gUjWZtjw-(SSgpnGz4z!+7*m?UEF z*V5lWCESXIWZ4N=`K`qF-?8e`z3MK((*KJ`1Ueh>0I0Y0?i@pZRD0j#URLX_@~BTq zW9WC2#?bF3jiKL78biNH8bf~#Z?~JFKWtCHXnu(oAz5BgI0=BFJJQ#`_$8)A^9fk$ zL0|1GXm#@EzX5S$2)V+MG{i~7FUmhNo#vF8_-#cw{#cT|77(1hPu}_B!TTGx(#u%l zo4sP8J^qE#TZZjbI`c}LiiRHZFI;8{jOkS)%P*(zn7#AB(xfCkT*vup`Ztf^u*!v< z2kuDf$jj;>M=QH=WkKin7ex>KkpUaf!hn4XQP9^8rF|C1%$6emZx0pBI&4=j5q5+A z6x6)L8drq61|J*y?ezQ}_TTAvAt3Spc7e z_fGVRFB%Cps-(p|^q0j{g{25j#cB@B4=_lde^1=!}yG3e8#;FTz$@{ z%njZE)ls-8 z83m~k<~d&VruMp^n%$@>o5vJ{AJS?|J2w!949*dQd{`s7IO*_GqV^vx`$-+`CowV22~=vP;;426 z{1Bv_+f*}1R0E^Gms_w6)IKPCszTJW?-elvt^A7G&rqjx8oJTgd4q7ttNAUJ!w>azl}kIf8>P8!5%S^Y%rE3)zzkjGPE=gDXBjott)?i`?t&0P#YzB9%ob#(AK=Vr1;fRm#0+w4^a( zOL>4lQGewM4cCHI`Vhc~=IrF2R;)^}t;vjJc>Zu;c*s&Z{5)=sbI8)KPeeK>{oXe- zIHp11nEvyDff@YL5`$lI!Aq&{#u5_^a>?M9zyUz2S?Dmr-~(Huq4l*B1YJT@>F;Yk z87DL0rjp|3lM|K?TmeWX{Y-6f0R%>2XYT(k_eTNL>6~>MO8aDb?F-wNbb z11>{H3a|`aBwA$GR3w0zE*EQU8_qcB@1^?de3s?F9iK@o(n#P$3twUib266sLSk8R zIM=3w_E#nL_F?O=m4r4{pBRo;Ckn&%q(ouIOB_plucaJ$ZMqbJ&48mLiOWHX-DPeI zhu)~Y2$7>#Y$*t9itHZ~L7EXdT_b`4R<$y|@%a z8eu49blL5EJ$t!SmwnI25>sXWK}y)}RAw)}sdd@6Mb=GqT}mfT`)6jaKf`q^&N2_Q zg_nnB996JB*D@=Pp#=Q2g#e@wAskBKBM{98^{TYx6fAWvPicAI9k$mv6HIb@__#Gr zrAcm8@?4UNf>o-JEB(n)-Q_WIgqG=}T836GI_O{YZOx$b*n9l-Uni+OWH>!#OSv>! zzZ%8s4S}`FhuT=b3Q317G$bcTg&zmFV$+NbP5FFxZ|$MW;Qrp~+?2Up8O}m;d$uj3)R^zM z6|m!)c3kOI;Qrp~jCU)r>I(yfO_j=ZMwnVU8fkr#=?zXlw~nUD zwDUNsXd17#vBD(H+gNUr=55?Xl6R17)`!Qi8IY#`$17x@>yIc{w8FpW8`?uq6JoHt zOiA-CON5j;AdHz0leGILXbyA2yrP)>s`D#mvoT^ZjZ_YVKca?~38&t>gs{b2aW7%p zUTWr~^9}E6xw!-=^HuG#am3#go~b9-jDI@Kn%|Fl-;8k5>hY8t6Ut^S5PSaQwW zHIRC(Zfqu6uyS@1cYVY5mBp_-WohkVO5g7T8KGtCi6Z@-8JOpS>*kr2Tl(dS19!Tn zA_`f|#`_2An_@;+xBwWI!?}FEx-Ax{wi3S#+(aoBK-DOtr%u;HLD;w-_9qZ+XE{@o- z8w(=^u|!^KuT0f3>XA-kE+tq5^)noLwDxoUW#{yZB_`dAIQdFAes%OJ$q ziQ=IVd&xaFv0iulA?(|h+V!yd%%VIr5`0Iy13I9y)k_tLgr2TDGiHOd@`b+o4@q;}H zy_eo1Kc-a@5MuF-8dwITRHIT>X&(knIB4Q@t~0U8=I11~Mqfw#o+T}`+Aax%gY6Of zX|tJd>K}AAWrvHMGSuG)B}4mFOg3|Avn*cYv@wZ5LBxI(CnsV5_?NA3t&3P!?Ts(F zOYbz;fhQCy05vpdIYUsaA;|WskP-)OzaICi=;Subz*GQ#ED}toE{orDm##+aHlvn% zPAez=r{ei*BJl!{`$OW=$-T%RPlACGPOk)na3}hTs=Ve{U`lvRWdT~$DzpX9)jeb1 zb&u*Y3WOD8T^*QEeU*RNIG^c8rTum!{>vLw!m>92dFXf%0VEuJz0$Wj;(M-jXHfy4 zd!%V*V9Inpmr1F(2JTY8&54qquw53S#v4B8MDi#!DnGqu%_ueSlc_(j(l9>5QOw#8 zn!!zeQwtDS@BaS9eHaKS<*>iFNIE*W`1k)>isuw$c}) z!M#<%Cu5;x=T<5xsxXZ1S2P=N;4T!P`uMbRegSFJ{qSxzTjonzf%JhIeC2M(pS?bx z>wqiu<>=F3SJjHN-?bNGK%HjpH@m9dqs~0+svEP{D|Elv=zOo3EzbPN?55Gg2!Nj@ zY<{RtX_&$O%lOY`SmqSHphcWza;5Y3A80U(>2WKa*GTdVC3h>AX#j}EY^j`E1-T;! z{e`=w4zFDFjDOMN>Ka?>aDV*@lG;MeH<4&C1H{HB=XL8vUbG7l=pHnkb$+m0kJ>NF z3V1xwhPu}jtMVOC8;hLFOp)EXolR@K)Q78`N@XHvXhdkWsT%~8F0OLQxd`qd;N_xH zT;r6OylPoe-O_eT%=bDfOy|f;W(>O4|00=3)!VMjZuLHB^19R;_3cx=|K3x*36trL zMYg?jyVYy2cD|9V)(2n$<;;3IVS`?H-Wk_ZyoAu7k-qo_quFX}mYwHa=-}9~x&FtEM zCH6a4ksFIkeA(!%qv@Jttw@TDGJV!x!d_vv+S~yDOVem zvRycw+0WhG8{ngB05Nz-ciGt5%j{;8&=l7VyiqbyeD*8`E?{B+0MTW06GE7k(hKVLw9$Rk8l7wAY4%>)FoS z$A2OcufAt0+x6KI`__qe{u~sE%U$ovqmm%ebJUm`-84okz0yB0i{3LlYNb*<50ts&@Ds zt*689qiMJY+`+LWztEJ+Y!yh~y_jDmm`ON|i6b^isx^*K&W`8wb;&y6JZX~b6Dyqc zCb?V5N0ij3$j(qshAJMeJ)^A3=6LIv{iZ^qez||)alC>`(QQ%gg882rsPH$wZdM7l zfv3zO76aVPH=(y{CES^BPOE13aBeY678su+tl}(t9EmC9sAJk+v}@FuB7kw+BKV0g zMKqP&BK@5&n#14FGx@8Wc9VZp_4j+l*{ix#|G&Nb?$z7JsQ$Y>SAW?tsvmWX>Oa?6 zJxyo4%qXmK2AX_rFWQkGdPaRT+sg{)Ztn+&@D?@+j0TZ=nW?lQZ~lEAIJT6Q*GgSW@Hi|iHyK9uC7H42|oPM(ohn73x5fUWNO z&@=>X?KFuna3B_8*SHcQCGha4jL4V8VJk^K6kG zp64(ajW@a$4OYFlXC9${q)W^7*|1hj&t*ak5fdV8m=IHWg>08%LKq_pR?D$0Md7Bg z&>+Ubg1FveK?poQm1l8ke9pP%S?uB8(5aWRzXwm};LDc#v;ng7VkvHT5KtnVaMXFCWFVjOwd z4x-FCb01yliqUOR_=*S!bpmQX?%ws{Y2W@j%5EDiM zbW5Fz)w3`f+Bo}UYW*@4bc{FP7+QBhgIG~@)#j?u_BtTLS0a*Rh#vc#Lwt5UP$8Js zi7$Tb)`4id3b&|B^XW=AUc>+(EQhwjhX6O-u?KEK4jE#f^D8Q*b8J;3uCJ-$*|j2Z z6hspjdd&yt`>2{P@8wUUPq;qynP_4(9cY^^(!@m3AujaMdc3-_o?Nw=uGK-S9M8*M zQ7F;@Lpej^NeoFRh8~~gd6s+&Jw;owH2WJX%mQw3BC$}rf1%Cqaq<)!Mb8WY;0=G{ zr^&L{4wjM{a_d6T7cAeNXy^(5LMeS>1t@rNQ?&3Ren0|{AQC^PH#9h zA(lSf;&13kT`Ki;zFJx9*a4XIFLf9LU&O+aJNp7_@SuQq8NKhP*?bVeU#vS%=>8Jx zydi<=0cOCs@mFVvz7VzdVtyBWp%g2kE8C~AP?sRxJ(>KKPKG_O7jjJIbIbF2if~d7 z1`LLv{tYnn)MU)&8uta~o(^6fOCgz9J<|R~#d;e^?-nD74kZxaOv(FW4M<$WV1ES& zl{zN6})XgF5f=zv~=Sb*BMR~|%NXCXK#ToKirm5P~#-vo$U zUH6Z2PjoKgj9JWpV>!anYi!R+_LZ(%6`zf=CFa{33#O9iD$jjcstrLGq6m~vzX9bQ zr`lc~){+8zxJtvAEBXK??ciVyLOu(Rk9zR<;R{A;K!G3#8lSHrJtj2%KUoshs#-`+ z$AHHFx;r#J>O$kIxb<*l6Hx1z+?z8FON^|!RNR}1l9!%${#`qz zQo^|XwDSijx5k`bE(1pZU&Ecbw<`nZ3NPPTVG!+qf`RjeOf5)dovy#$w*xQab3o;B zq;liw>(J9M`8*bnJeEP?nf$IK9?4xeXOqRUpJ{f@1d(_y^hi8dl=e8cXb6`BD zM9GQ93l2Ra-lE&vNsIFSV(gt}M)Ey5M0*amEAJgy>(Xo==Y*a?)>a<_S$oI{Ficr2 z-!F8i53RQB!a(hPXg`V&<%^{W5Xx5eGmba^%7o6|@J;2%b*AY8vQ-5vJ+a_sju|B$ zwl<5k^*8ufPMsxyMY0u@sUpr49Q3<@Y`4iasE=iz)Gd$k%fpa9`bRDp4C%kKuIgAK zl8q^sc6v*ZD}-&n^CntR*%E{y-EY!lgCYF`X%d|nQh(z$YSlZ`tJ<#M2lr8-b00#GqSkSQz#-_>5r1a8hcKUJQ(GvdR`9$ z@U)cH*#UTzU)}($mye2LfoMW6JqqB~s{WxjX^x~A1I*A*-^PPtpjrk+(S@>+$Nh9p& zKOa7O`0RJ2hdl;-_RC!R8->r_je52R_^i-57<1nve0H{s zgGa+>FXtyBc8AZV`6AuAUuQ+O;(s=Lb})z| zWAj?$l$oRfY@TG22C&(eq_94J5F@Y(a(*DQ7>)^N}v20r^avJ8CI z-j)NPEit(+fL0eeA+$%>blFAhZ61hr55EPXm1*2m3XFCOd8WDykao3~(FvvfU1v20 zOnaNDCfhOtru|{28W%ph-MKDXjhnO8nVG337g8&?Ze5#{c1CCFQX3^|ot>?VoULR! zWo}&p*47)0tpV1~HA(ZHzHO4`J$;>|fVH#Odo`dv0c$VRCglQaE0lcCz}i+#N2w!` zEQ}4b6IlCyyh|wedH~ioc~`pvYiE-yb1#u7O(qFXgh?eptZTKbU>}U4gYN zrbstn?VZX@90OP@(w>ZJxxm`*n>>Ss>ISS8X^%1J3aq_Q#k&J`jbq1d^`3roy&kZ( zsHb`lfQOc7Adqnu0Q~yvlVC|zOOU*qBSbMjrqFa0al}sr=x&Uhzn@Tdk+RX-> z>H%w43zO;sYacL4^R|CW@$sRmlU^ zUT=CKU~P>_Y196eNomvm8madSto`$#P7?u<{I#G?yFUu3QxvrJ`+zzLuipjgbaoF= zr_US>b^11s`G}!TS2Ahd2h{0A;Z<^>PF4?4r*nFQI?d-v9|6?qIxsu$1L|}(Xq7G< z{AV4pyFr}{Fgb(eGEk@6c#0HJL6mVBZ?B){PV_V~3nouf`aMIPD4Yv*0*WiAm-_A4~_Zmn5XakjbolPpzjIuG=|xsh4^F4Qznkx6EYWm9LH`cJNN(C zICc_l{?0K^WoXa|TL>gd6V^C`J6>52@((iGm4ynhb(q*QaQJZ!C&zHG!pHe=>-MPC zx-&nVxF&6{J8(xB|8T=vjC+@G#|w6{(thzzd5F6$*F#*`UjIKtWp}uT z#{CF=#64X1SB666LP0(fY|NWzwLesB%rDFX{_e0be*j{^xO{lnn1${G{%2rg?nS=( zaIi6Nsb;AHWNUpd*qAv-a&Gt_*qD026xk=gZ*0tMGHHGY*qANU`|jA7ASHUh#{4hu z#&^NS?8hXTgN<33JCg4k8}sk7Z~ld`F;7z`ALV!t6x0nHGnA`2*qFQA!pFkKWv};)jkzv+{exg*e&+hplpC_RoFTc`nE58xpe1UQ`!O~~l$cd+ z(9^$LY|I@7=Hy{xgn9C?F+Vm*^R^pF{+(iDrkGv`8&hRc+O$WTls4@UsrQGCQ3MQ+ zh#R_DF#~GG-v_P%$oY}N+Q@eD$BjPx>QtA)I%-dDMx{LZV@QlcsKESVB^vjo34KSndb-xxne)0hi6;GUcG#&CW!)AM6A7w8&@ zi@76J96v@SAS}9odmeMaJu`Xx;1k_=&iA?C9`4QhF>2s3IpCg(WBM_g#eI?HqOlj-THl$D#G&l!(5Iev_Gx!|5z*`DIZXhRmI`AuY=L<=p~=q!Rl-W@nf_XsEzB# zhz=TXj|(2`3hrs66n7bL&+nB6+%q>Pl=CY*l3;Eb$C>(tAEO=orLYI?Ddj++-1%Ov z@I4M`19bI#8fjo%G2uLJG>+_EGVXWf-Ou>izneS!%V!2Ao6zX7f+6@-Gn=-&>f+$1 zh3j<0S*J{Xx0~O%gMZ0crhOj%P?>zLY4B)}Q;*%=XeqA)b4wh;hFW2BVM}wbo|S%F zL7df2xhQ&tzs^pkI$)k1Rf}GzCMf8Gf%)X(5`ScMaq5bU!=uzhv01$U&f`4aKPS3T zkXxXG6A%gy?;}%Xgm=dI&z9Mz5GU&Ea{e=lxC)!XtuNrdXjRo!FK|mVv_T$>CetCD zn)0wrN1e$uW!ORD+MpdQNX#PSBawl9UmchiAMvC34S`!!mgegoLYAEnVaSz7>67He zh!~1#IWi&&=boru^JZtDz%`SlmBG z4C>Gkf4$-9yLpx}+)DAf#n9o86|Pq-_|mvUVQ=|<9y*(Fh%1~W&-BVm{)=hpE^SLV z)Wapzw~8Nb@9f;(cq-RxEcwbX+j%+MRN3FQnMGIgrrFqiaUg#3#KQ-^UR-CW{p z!n-n#jQ$XK7*g7=@3 z9?E0|+vRErA7iJ)5*HF}X$t;+4c6JY3rA)x=_)({1oC)*EUr?%h-9-&(Y;dVr$pRG%PBI65<21QAl1 zfHLj!vQ%cA)M~d%8I?I6i16rK7)Ta~;Im+r1cn@sCE+Q=@r))Wye_XcT|;G+TMJ-* z`G|G(Hup61W#VIrfZdPQ?9f%dob_|^y}((cdwIEc z7{7kTMFdekalK3EtZ3^VFLc(j%d$=);uB2Ztg!#Ln+ql!wkJJULX;1Jk`>gv2s#lT zZzrw$r2Ii3)R?N_wq>Jel~@X>@e*D#`RWOhwZe6{D*4Bp>CR`UV|GFUPt3ku!p?4Y0J?Q#-hv|vlxW>mcf9<~Z6S6&dU@K>Q5UG8;(?K!*HqsiZ(?ybGFakwDx!D|M__wqLuYHB^X_3g%xg2PWLeEiO_uOj z^ssV8tULR;oVy+%ll7{I*4Ll?1>q;|!0g#;4X563Z#SUv}Yt*FCe`KpCUQ*M`OKOUFNlirkxANjgnt0dF z*D~{bWe6HQAHOfs=r8$#!uY?+j8dJe{;J6y~|G>f!_U%SJ40_V!5VLNK@$& zrc#|@tSY1^VlKxOlJAcqokp3vA+S6YkG z)t{69c`H8Bd2+I9{z19(n473@Rw_XQe$U@wEmy1@)V`r&0{$A?+ zo#6c)?){zS{++MILNlXne&^(#-#NMGcTVp4os)ZhW^(JPb{(!&Eqlr=6MNl@n)Z4o zYTDxyWA;i0wLBW9z17HS3h{(+p&ieP6a48FB}>B~{pa?sJ1NZg%|)8N@XLZ?6)vE7 zdWYU+QsFnO_=yrds^2k5EriK=ykm2>QI=Hk8O+n+C{$qi#}ue;e~ic>JUg>9n!=_bMA(!=av$;K zc!(3v>P%1enl-?CaC9)ff0KFSh9P_O4;vU?v}1R4!MwoGH1baEaaHHd3s|+2Q~wyn zbz`~n+@xN4kGLT*5owih_K+22#L8(@O}jTclXub|-BRJ)!SyQq16q7-&O=_|3iY5P zikLjhT6C~_M3iq#9hhOooAk07Cd+Oz3(nvsv)}~rT6vR6`ChZ^`}FR~P}wMLpC(!G z^QMgiu_KhxQZtg8NKsxOBkg%kR!fH`Pvt8y1#~Qp#)yyQb# zy12av534w4t-DYSo}hMGRXPqNt>A0Xf@(T>7+8=i1N}Gm#C&hlKYzo0nJ>vGVTd_4 zL65&Qc`NxAL8yxS4VO_or>X8J;J4m<2WtAzDh_kO_Gl0Xu=sQ>&1n)&U8DZ7D>Rh- zqlC~YH#;N(24O{`KKjWlFgLxP>E(H5_wX-z#$;srq5&+=cIETguIyGR2G0FNdAsh= zXv~t&u?w4ackNnsfG%~9Gr`v+Lxu2h+rqpxO+DU>7~Fd%uG+aeni-f06s(J7--}3A z#9k$OtL0z(ZSDHB#Vj96nDrw$nQW%q3O<(9c_fUme>MpN(G6-^S%ZfJVuNS$q1%J2 z?6WL)Xn9!$wUUGj^brhafh^Bigg;u>n^ru}=KN*%iP&01r{q;o^ z{v|CRX6SawuQQnUp;uh_RcZS*$*)QUS0D(OlznrVxwKrRrPbA`>#q|!`Jc!C{|1Zw z7ApoH;D_fjuCIB(M+=Lc9`8T>{rZgiG7A6$b2KjYW|oAmKI0Z0l{2R^M?T}O=I2p9 z<6Z@J$penY#r~6SK8DY@PiC+EZTXA~2t$hd@GjAqkL4D1fVQTt6oGeG`n4%ye)wmX zArO`Wz1`gz0xmB=QR9cTbi8Q93I*8OJ3T(ciydG8cDiPu{dhKVJWh7*5-%VU+6x+g z$e2!Ez@riSNg~H@+DqX02>!+khV4BnZv5z`nGbf08=r>AwI)BbXU-GZsPP{fCm`cs zmays{J3`(cu7Attzfn%Z6+Z9<|HAu7PFJ*@rOLCP@-N@I;7B@+aq%el`Fsg!R;Xp(CEv0E8o04-mO z0=hbp(4N{8rniwF*4uB%PwlnaBf+O4p>0x0|1HCZ9QCI-4gSy)stVTEuvPO z-`Dkx53k?Z2b)*Ne(J2UHzt2+PIR2wh9OY!MW<`Z>s#5B&uV?6z`AN(G*NgQf?+Jw zf}+-wIQo!ir(}*S;W)6uOL|RrR;Y9GMxPHC^}Qo zGE|TQopk9u7MtvaZ{tIev#I-rh@wEG67C8UP1}Al9B&BBnvs{MkTos)3d1dX^SO0M zxc;SraQ%w~vb>%_1exks!{(Yxz3?!*kv`{1>~&6Kf+T;Z`PSS=nVMwLbX&NsFrXxh zTSSpRBmU^m%d_#6K5Uo!q@*chC!tGdGs=Co&5@V(qqiPq=WHCHLz66-Dy5wUwHmIzUmYB zH^1h()K~PY=1R{hM?o~Nqu=4kQ=5%0(2v^ars-ZoKvPfu(Zz;<8)7EBrXgTr(3n^= z4FLt4NkvUxYx*T$Lzp)Y8xWrVwy*kX{>`uXQu4FBvC0MlB8M1`fhJZa-9~BCQ+LMyZ zXl`bLQ%T;iz4tMWd~{O-(_|s7$QniUc`^wU;Hu$TrlMuv6*z2);&H`4g>`eLJ`{bY zbmSJUn2IQ6z9p}xlKN%b*{?#cc!m4}+@2c`q3+rDc%DEI(u`S>5#wSw_1dl)GZW{ zopLRIi8F&jY>DX~X342H{9V540Ze+xB3qAhl8E~!89$nO1A_&~}vEU|x07`zc$l47>h?%gE;io#5SyRoCD6@8n6FM_`;o zMr~?uIj}TlzhW%9Nwa85xQI&MjV<>{wn7DFyH!Y)SEZgh*x3>@rL02?v-kTObf|J3%qnTi@|j!GCwp$MnPAu&(#|P7 zy3_0Pas0y2D~rn>FZ`@vg$p!cux7V&KR@d$IspNNad#yN7 z&O)zVsVHfHR`Wlqm7Q*{pXB8l(9Ah15_-npAXI`A^=|wOKTP8fIlt#dJ($C1zS{h+ z+!+mR!|nB3>ixsq;cg)cV$@UbKVkSW8K>X<_~rHfVrn`jukVu1-jB=a{RNq9oPM9( zz4!RMZlX@k{25-KiIm;h>+LDi>$*|&xcYqOa<_1X*SD)%PydV3>gnx-eB!Gp%B%TJ zs-IG&c{Pt!39GQ*DK%9PG)fcO>c^r&Bs9Anqf_c6?)AP7&+T>8Ux_TS%IY%pvgW!4 zFPDx&^1+0q)m$h6*(_HXb?Em9Go`UDF<=f4!61pVSgLH)=3qL~&KDS4*@a}v8f%4C z*0#hF4S^D7B?4wKTREk0K-(5${yO(DdZy$jW5GYf;)Q{6iAiTNTdG!^AEqGJr!P-GYtoY{< zJyQ{DV~L3i5cRIJ*pm~ZebG>>f1%9hgjs8ihSt|!Vz1b=2LnNWU-QW=dkVu%CB@Ar zCoB#o95em;nc8A*bem@GzlZw)C4l*O`eBW!b0bneo1{Bm|BifhV@`Y}ic~R4YKk`r zA3ec*YghC7S&t^TXBDlPu>d=`F<&cK2>C^HJI{%kjg*@%W@0io+c{!okPFo6se1v3#2?-?lL3IM$4C=#|=jk*3e3*F>7W?n}KK zu_HGWN7JpTd-*t?V2fdfsXOjRfsNDqX4KUKEWBkFNT#Z&4U7&;vesyhLesE%HD0q8wNNeJYTEKwVnbY2rpK)eUm{-_ zSp(yfJo3@|^UKWIM@%>dx|AQWL?m#s#n*T8fjjtmrZcQ37xP8%5q;eo*t&9kZiB4g zN_|PZ0%Qv9a(qduW|;-eVMUsj!-!t0c&SU z&p?^|P8#^3d+}5*dLB>b(*lFV+V5=7UQcUtllyV^#B0zs+nqcp}NJZ>ubIvlk5cS%e zGnC5-2@m6#-^fwLoEjwZ)jNGu%kWAJ-Q}_KSm^vWuZW$;*~ou$OVJAdqVv>vf<>45 z8;6oiUdM!!7xLkA2qYd0RLBYVOVRo@g#u0?F=zy$^{cTmtuAy9&_`2%m=OXsFm`R0 z-u^Z&uZ0k36t?O;)2bo*& zZjPt%?as_hhWWkGncA(6d}mzOI^HoXf=oMD__sUdoptbgqZGvGa?(UII(TcG=B0od5OLnvmNnK zRp7?OiX(Bbnndc zuDb5T5y5t9tDdZ?*(JZBHX`f0F_@>A79WCgQDstwhM{(1_GE&UMHaQzNHu8Ijs>e) zczW*k{XrLy)6nOb1?=4xkSz$x$6P=FfDE8f*#*Sx4^6E5@xfZN&N*~VOCJb3$xwr}Ipp+3kKwKp|Cc)uCx(QQ zbq{F7RkOX`-cmpBo^$eQ3e)RT2ZkMF!?4n8La)v4S82!YEvzgkz9+RWLWI*oN=Hz3 z3>{`(mwtvr2Wp2PDUA51s>Gy+I0+mM$Ip!1<&YGWjE zvG33(z+%`gBKDTVh#FMo|NSG0LFa};kIoJd5ouVu>RT<5DBD-MjZO0SNIdXxxZ~wYJ8)m> zWj3y@8rQjI)Fbw08gbzEAYpDE45+c_a7!ygPx}`yra`0q%Sx_{2v%Hax9dzyfQw0i zzGP3j(nqQ=LRjCzaIigM?~G4cGPmQU2!8jA6C+NxH_@sRe`8;6;u|Op8`}-LeY`MY zw?^!ZV~AQ?x#(b}fBZh{Tk9fKSM41YUvihL`njiA9XAaOZVjh5P!+P*g8}gu4%~kI ziR{mn!6zz*?TrAT4#Wtwbmge{J$LDH#BLk5jt%!&TtQU_`c^c}OXRPKBno`fBX)Iy zSJ9f<$*`4$?RU~`7bU9iMUQBo&>Rb#5neNC?`o+bG%Mdj z?q_SlUxLxH7PJ+Y(@NliPXLg5eIi@F!;rJZ_tz zf@H8CX)#dfd}X^gFrSaGCbLOP)`MwK@+lo{e7oaR9uq6m}L@=%AD=b^47Gmu5_L-NrbGG&N`AjN6CkkjL$@fA*<9AvJke6kcE202w7$R#&45M>co&MWU333Wv_7t_E2xid5c$ZRK2_PevYbl zlgXuCul#m(bB*(Wva{{woMPI$w5NK1*kirl%hcPoy@ulNa;|~MM676b#|4|P%CUOB3O=u_SSQ5 z4P`X*XbJ6k@2cxMJ|m&6C07#KN;N1eq1|hmCkgFNlahq?ztv7xLM#6>Bs3ojE-Qz3 z#H(Q1BG$8Hv*jMR(^HVJ^p_Mf>71W?j%42TjCV_S5sgZ{Gae{Of5VS7eZ{O%0ucu> z%kV&on>i1?df<-ad=)_U*c=71B`$);0hsz(8D&z=Vq87M+)X1 zw&yL82SkXzE)#^~`er)ON&Y}5&})Np0qerV3ts2=RK$VXv#!7WbjuoyJ39{$K@J_54CFZt%*S?g~Y zsn1@d<5nyd7y10l#^n2#y-~@t=O50m9>u=})itfVvD)s*uix3>XaPBX5K(HS0zvhBWye zw_AB)0Tr-cbCa+2K4c+M>rxlD?moe8^9_jI=3ln<%siSyD}Al}YNbj{c&ZW^G?qZ29eTpw*iP|S;?5>EJ(ym- zjrMfEpyGX;pQ36@^>PjX)N(h8r7CORDXTtA2AT7tZIRDYC#&Ww3}2XWTy#B!>L1Z2 z%GFhpHT(@7T&!sRjv3Ujoz%!>#>&@Pb=A76#McT;YeuQ@J9}4P6}J+T3u1}is$mOu zYIH07%l5_+jS_tLIDLF<>w#OLJWw5RfqmdUZ_Uub)INm=VzI@_mh=} z0XY?7{CzZxSKvngXtl0ty`QO(mnw5F^ydOs1Sim|%6CiX9W$0b1B1ruQ+uxI$M-d6 ziJzEJ^=-%irY-v??%35EC`4OBLAGW8MLm{Ex|i(VsbKP7$u;dg$+UMcYE)MaWfGs7 z`U*48G&%gB8tOJY;%kjv)tWlryXLhzOtZP7Oi)WI5nXWD%$LTEZ|U_O;Y(OeD*T{& z1c%ydeKcVe;qJ5Xg(#%vkIv|JD}56EG*3?Ucs-;8XB zIBJPUD(D6zhr=2T!*vnCWg=~NKUpYf=#mQuVI}TWB^F6xz;IgDWTv`h{q^+^w z7Uz?ktg}3<6{bZgMJ7F(*)mqlmaAj|vMDBZ3#4MBqer4P?3N=jq#gEG)F94IzJ(a_ z81`^!ML0zpp3BhGSSv1`3)I$@*-?P-)e&}40@-AFE~jCC_Ag5EO+#BLQHSb2k6pUT zx1tKF%lUMYg{o#RKm{2t1{%IgvDU7=%o=SGOqwoC7v^LK=cUIdG8<99z0;Lm<&O57 z)yG+F`C<~KP~1%EiC*=}W_Ni10`#g_$joK`qC0rC?okd+2!{!YzlI6Ebn%u*s2VIN$fppwCiW^uUosGliD6{RF3#oCu&xn z$%L5XdJsX6UuB%2`1x{N*Q&l2@G!nANU^TwDTp5%d$ z;atsA-LLL8n#Qr*h)_QzEh-vt#0GsX3oiKL(xER`4+iX}g$prCoK2-NfOq&5ztciy z*>NpmsaP!W9b};|qmtd{9G3mdUcm&{*2==&R5#p;*Q+YLDTudh*SodVn>vE6?ASTA z#e6S{g-G#XbVSQ6Jz&W;>oo$g;alnJV44l}P<vjiF5rmG>0=Kc zS$|Ve@^l6Ove$fi=~SN9h3r*E9!3SoUWp?VV$qvL4g=F8*~=*dJ{SMNP-nZFu$(PQ z@bC@%^~hdrV`njiwfId_RXI$r3hy_aBtJefc_~YXAhREYnl;O#X3c_{HS5&w)U27z z#xB&XcA4yr&O$yQ#h5YFEa*mAYF2eFHETu=HEWjna11qTmS%aDnl&R!&8q&>)T|jt zQ?q6`p=`4r;2~;OE;VaLaw)k-Q?rJ9)U43Fz=Sy-HEXCd>eL)+)^L69&UmuKI2uaL zoz$%HR4S&F<@mWSYSsjumrnNzTWSW>EYvz#Qq@qAs;XU5m2t8nW)fq>KYFQpMn&=) zdaasD5|uNgDz0ZqRc4MQ|3fPsw-*`g?BUslRCTFHRTH|9sx0R_%uV;D{gQh!q^ft= zz|3O=!4!AsQayfJ@+I=6C@AtbL?~{GXeo`dt*Q2k7|b7VdRpk;86J&_UqE5 zuB0lyI*xcO0v@TVB15X$ZtAY)@oKupizziC;PI#|=kDygeO@IQmOEU$lkd;Dl-5_$biLg-!lt zvkFl8(%)qYuT0UafRd*RQtmQ2^y|{Bfq*Jb`@=D zLHpL&e-f`OL+Dc4C3GnjTp>c2$-BAC{8_HjAB4~aR=Ss@zm@)nHs4=F8-ttd^~uE~ z;N~j+)d?{hMAY}+!R|$ zF)Ju|xOGQCur(YHb$rYU;zP?ZSw-7gIZUQq(6zsDJQ4^VmfBinPdCwc&X)``C2SO8 zioP?s5^d8mU-%NXnj|<7>sYvBXADB#C8qGOy%Q6c`G#%A2ze8AMC_S? z8&Cr@g%g*e?cN4?s;Tx%7-k1e28{YF9_V>f2NVbg7K-tZf53k4 ze`Lr-kzvgFRX|B5@f@zzI@Tani+8yl8+o$DAz4<7ftNwoRVx}>+k@S zAQh|U`IjN08-+IZrz(V* zIzb0;_MB>2Aon|4&Dq#RTYf@ExX{ye1Jn?M{Mzq4fqa<4osD@SV%FSFC7(+VLx1Ke zuu$!JqJ%L(o9$NAc8FqZ!mgc?zE673r3xg$JTQoVRR1Xh^Qa1|F@SI`On@ln*7qYF zKd8^GDvzp6&89xLvfidC51d0yhS|fL<3UvVlv`=OD&v8wuiOcDsqb#)mC@R92ktqg z5UK5#`~$hJz^4P%1d$-iMaa^y=s&$mR0n#8TteA5Nzej*n%DIW)ya&U3lC^q;vD>E z?TH2P)Bwwe0peY9h;J~=noPQ#yiEEjFYO<|VZzyvjf2peS_Koih3m#lyU+Rc9~l~+ zU7`G6oBVywPrOX#=YxU!yv*y!bXzHKjI#k>R0dyu7w2x%=Ks>^J??U5toRc1lyG{Z zmH70;Qbb5TWK{(+M&zG{Knp*Z*%2Uj-Z!q?yG@bmrhM3;z+mFV^}K|RlLzL31d0!8 z8k-pMiLmc=)Ks5D86Aw$HDStk;JIJXaYMaSSd<*NV%NV8> zBYrtOoDtz3Qx0G)wscD+Wg1@-1JN)oT>ti|wY{7exw6yF?R=#hoFim*zO@a`9`CpN zYBxCB^qX1Ne|)0woEW}KLM{HrwM-m$Dh}3E487uC_>7m;ACk}6R^n2;G{VsPH*&`( zhQP^nAo=nmhKCh2Th)Q#u@Ddf|H9kI6w!y(5^c9HYM11DOrLx)eNc;W_%dv{GKD6l zp894p)+P^shE#l|D&~+~Ci2@*eR4(7;1-we^I6wl<3Ogb^MVZsm%bDw`|A#ybNC;f zjhRf#Fnz4ho1*!=l`oplBp^mvKaJ3Qp4OAmvX?cN6lDA~TJ>-DsT5rqi$ zkIf~$n*e;^s`2Hh?=5qq#f|Wr%#E0Y@I3h#t{Nc}7=33wd(`!Ye!jVGb6h`(J zgjS`D8lggOid|$XuWPX08LaTq**md=^z|yT@bS{Wu2kx#ewaUWG_hAe`Wei6RRyPP z!74|+kgiup7}t%}pG&uSi>jQ@Kyq+b>O!<(!r3sxfZsvOFgDji&H*&LQm4A)n-}@z z5l%w7Kp?3(BRGHz_e%d?>J$2*Dc`xxBo7%p?#-EOh$eB;WXgt9m|7-6YAn>@U+6Q_ z3T^m4=bMy3tEx(#fJGuTJdhi34Qb~hE+ul(>K4Ix`}a-{%a=+&9WsmAEY5 zx!JwB8WYpD)Gxdi7ORHisKGg1kz~w+53kbJaFeD zbR`d(WoYx9e~9^Z0qLCohQF4DWrbN-rl%tb_WHi|k@T95U7L>h+EbfRc~-jfR51c~NDBF}us8_ahFR(+9=C& z()rgX&)D?QqmFbX&&=WiE39`7^30XWNVx2x4B5nxXU1fz@W?a&#P6=;nLyXN-gZvR z+>#;Bo5(L%!uZ+w+dIk&H|`40-0^Oh!{>mOOJuw|dgfEnVwL zJB^v!XbVr+?$nauk!SwHFjYMA%r9JmNMtx+G2<_3HTzhM4mX5879q4m^AA|*m0RO zkJo+GmW07=8~e~cuq^EKU2ZK;jv)=K-lNYj#P!=u4T1@4aFue^{$p9vr8 z2>YJFypW;KRO03Pq%rY%Kg}DRC_ZtF9r&5y&%Bj-CX$%q3)|Zx@KS^6;HHT0NZ5W9 z%z0tex1NDLa{!{~r}1WvQ=QP^+J5mN4|nXvJ=pJ4d(*A>>4>DbbE^>=V9*4&M}i$$ z3XMd0X%PmJE|-yJ6A{d>1Co^XZkxV$wW&3?|LhU6?fSUm6+>u$)A( z-zCsMrxBUP_bfn6F=z%FMvY6OvE2im$E885Tv7{{W}eD)a%n^7=Q5{Ehqd!_ZhBl7>$xpYhuG zjEuUOi&h+zjK1J(wR*19dNJP)qBn5rHu?mkeRB>%uQ8=nfgbH|6#Q6^Go?h~x!!wT z5h_7FFTlZ*{_F6)9JB-41uTai*7fLs~e&!Jst8*;%4e# zaZ1}FsRkt!k4qGuVHHpjUbVzbH1H)tB5*0^kp13>HJe18QT;s+z98gZ?TBEZa3(Rg=a&2*D%)HAunn(;lt+R$sVofudoy3}FRh>ty zF=@mHL#*KkBBdeLko*(GnrW)DtMmr&7o_D*aq+ar&*u|&LZ+GMDviM3o%;MK?`l_K zO)t}2h&5_ZR(iYFG|v!gOv(^z)Xu*WvE~QBXU*dCZrta0A=XIT61V17hDF?(g-S&6 zz-Mo%>1zP0Nnu7aJR9Y7iM4|AqLXJ6Jp}*xB9XQBpr02+Dy$J20W@wP76h~Q62j4uTHfwquPaP5cSe2pLWLwrrwQ&v3 zzf-}Fm};ZO9Zj`S!vMaknU`hNuOAN8<}@w9JyUIXI<{rmzo6RiL;sO1?M#++Cd<7f zRGX5#JdbKK$;(tAm`R|7g9i#(@C>FD*|^R58OkzN7Ex{Xy;jJRE?e2jvzfQxg3spg zY`#rsP7v6&Zw|%Co?K|Ro2a10_E`K(wqPDiA6!vZ zGZe3@a;|#f{38X`pB&cm&ia~9<0iHjLCAoAjOhh%6;U-+XvIm}eT+xktd{O*vJU7O zDZ!Ihag%rxb_Z+mvquKdxsBPzt%xP8UeWqDI6j<5Ia$PTZv*G0t|e-}gBu@_co-m9 zj+}&?0xAS->tA$$VK!$Cl%bd_F`>eBgS``6Z;8BfVd9*B5D_%^j`R5~I$5;13&(2R zR=_mvQLh-x*33OPHJiy|>j6p87o{WiTsPD(L(EXUwO1VxUS7%z21VE@K+=KO@! zNGAako5tAkOL0~#%FVFU1f5A-U&OPAD>BSKBE;b7)qq|U73sn%`Cs1l4yL(b>r&^N z4fBGS?{T^UM)ZjWsR26*`Uj{=&VK=)GPNBKY}ab5%%j8U)L^{< ztG-Qdpw7(mewMF|Tchb!skK&cd$je10a5$BnEeeJyQ;qqKr2NBVjl43nI=#&2tS2m z2agT3XmhpSr3C$(p2%6NC|6dN4L4t0*z}Wmq*Pt)$zSv`OivB6fDWYbN zQ=}A}BK-*(PLa73*J|CBQ?%b0FpuUGQLvL!q?-rVd$oyE)LEOyDI(*~LhCjeO`I-yXXPJ=nFly1ll1&ZyMsUVRrPiZ6)8&1&cL_G+trFnPY| zz_n#ga!(;&>9we<($3qYEqipCx_kkTalua=JBUx!r++Lox?;{bR{UD_1wq*E){TrY zcaE;0H_jvO-Rw{;HS!JHLZ^~X@`~F=m+~~m>pZU^+GC2z)zBmtQ6gu9yU>cy0em>I z!g$4@de|{m!JOevH2ZZf;12i6a0Xe38_r-OunI<7R0%#!U6_#cD=&l_+J=DJ1g$$( z91&(B&PwKMfUWrG@+y#4iodie7Fz3H_=+jxZMJI(ztpOs@LL5F%gmc~i9(id^iabS zYV|j^nLE4|$1g0SlbHtJlBEc>t5Dl$cUpUW*N7yq(HW#`!@cfLPzM1xfk@iXl^Im5 z(Et<4bX0()Rl1)ZTcQPx$P9JC=u55hMpyV37wHLYqbKk*HNkvg$pdTwyr31@KEFi5 z2m!=S(uXn_r!KL<`j+f+hO0`urZ-$!R**HA0YE^=(Iqy2ObSAO+aq(R2U3tH3mMtT zGP2VbH@%KpVTIj_l#SrrlI%rf3=~jX5UYO1C6q@{dDhnN@L4`UG)KUSaY#V5v82U1 zZLO7v+WpO; zq;*$$)Td-27s}iu?kIPay2*T!0Ebn;N3zHyAt6uIm|Z}P8>4?C#*kIc3z#T_SZWQ}1t`oHXrG=~Kb-TCKvBb}-m=(9JHoF#fNJjvLd zYe`Fs;rBvSY$e_*KI$4a*JO`aU7O%Czan@7NPKAL88Cvy9HdiGqZgax2&uZ%sQ$5`!h9X~*r~fO~A&2RyYh!^THY>Dh zJ1^i`+;>=qNOYARtwUt6R58~&-mgd%V%!zuRc-A2^ya%pz$n{<7$aiXT z>p1RQ=zT&R$~xpc??IMz$j7_XlX8l3>q$8sux)NHwROmwJaDZ;ejyyH7^z?p;`}Q= z7?HuQb;tsKW?6^K|AOL70!;a*cQpeSX?0#RsvWfm`hV*PEEVQwo8qFCW&Vh`MgKULXA1(BEnMy9AXUn z1TmhKF7-W^$cl$dCh($1v?J+qqwvw5T^#@vZ7@pH#&v5LH_B>Zyt^ zpn`6y*Ry%pUG-X`o_15c9u{KLrQW3TI#0XRyI#?yt}5u|>M8Z+s)~P=Q?I8gmdsq; z>aFjw-pO9QAW~M$$WW$+jH-Af57VmR=aqkrRuzjd-NNifsfr)v2NYCP#Sd`%0jlCb zQs)P&ieFdzdT*-YRqoqdRq?}$El4>J2|#I5{!0a(kn(%fosjaFz}Y8NF)lrxuC_sr z_wnLWVzVvFcPet=Q-~yR`fTD%hDTH==?YFv8xGy?tFaPSQ&#l5k`u*TQ6{H=_@ogP zn2q_7vahy8)4SbTaY=IPr@!)tKjC#^J=3r*x#*9#eEAnv%&G{ULw3C?btsMy1=V}`|JV*t%JjWqt zLZ|y&gJnD{&&iaqZRWjUKlVg#idbhvStPJ#Cj0n0G$%-MNQnew?C! zd#lO$d4d@?Q)WCoICVx_a!6{;8EwY1SP(Yfp6}lt^t}{}e=ilZovB#s-7-Llu>76( z$|`cI5o!DUtBAOV+wr;M%|K!<0r#FWHyutMvez{qA@Ad6O!UGR+)C!iexbm&8U08a znLLsFM3N86b$E}Rzh!^)7)da<0Ax_7t8C#`8Z;I?BoA>tG#=k$&WC2nM|0D>1&lp-{is+3k9mIwqNveVO9tJ zIu+1A2?F zAC^@7jiDJuh?0$kf6|`rJCv4$2tO|l)`hEDZDc(07JyEwj!c1FsK;$D>L za-VT_zc_xbFC6dY?9QWth&a2CR?hAw&hE=SXLqHdmY0i9SI+L^=NZc;N+lBG2WNMZ zn^fWKu8Jv#c?l(HE+O5)qu-`|QWD^o9&z2;SDdN3yNmpyC2VE!es{JH>F(=3*?C)u z6|}Frr5WF=srCbW-GBA!5asKRb}-x3eX{dQw>n+Z5NZ-pwAHh#J70@gtM+uiQ&*W^ zLl0cf`3k4Ttqv8luJKuDyVO_`@imA13DMT$?7p9;dan>BncY;R-%JM^oXndzxXaH9 zh6(4j&EVV=_Wc=85^1}Xg#M(R|Px0?M&16ms!Dsc-^Y)PS9_x>t%18@J6B=e=O+R$39edT2PXH^?UCxys_U7#)dUIU&GFsXy#_>g;~nM zJrq6SIk<}(H&U(GW6FUaYl6CKC&U(ReSpS8sdd`H{Sko#rve$Zu>F|wv&W@eT-l{u zk|2wEfFt5arbkyE$;+_4R9)q{swduW{!W1m|NL_sv;Ep@#jpKgOqz*JuKe1ccuD#; zj6%4!Yu|UutaoCnObd?eauTeqM^3TJ5nE^sBh)N9LzYLtdJJK;gSC zp$FmC>=xLm^R(yssT^m+a7jhZS;VvmOT&pWK9Xl>g0NO_ig}^z7UV6@+7Nq({4ZL8 zW8%tw%ynfi&A75}H5R|Zut<}o%2RxRc#6LsiXI;@JJ72u`zzar`?t}lBbzU(ctlggJp!5AxF_O10_%JF4C){8Iu z3;41VpH*4CB<`Yf+Ac_pHe`6KWTuM}7sH~lJZGu!41%iKD8s{LTaymZSkT^9q$7DE zwJMd_SM-8sF+-*>`FC4We(+)cZY!{E#>d6&oe*7nWN3>}*x5%TSnHlct`Zz2)=+5| zE1Un8&)1<@kO- zebIgI&GG#t>0-L?{rKhf{cF^WXfD_B{aoH_Fa`3{ykB|*4DYA(J>SXWXL=BNcYJ?| zcHEJ86PFAb3C@RVB%a|FCuQ8-dvSdKckf$wG=8ls$aQ?5ldk1|!twpJf41X0L1eX) zwl;&7Wh=o>jfFQr?#y|CJRI3Rrs5jC7!sy$^({Z}5=nlN&2R3D==|)1xxVi@!f|#c z$;$}20G$^kB36H3o8&Z5F6fD4vgVt^flV_nb5lzWdEeBMm-$?HRfTdI3z3J)N+C&j z$(hdqEA0*cpSPx9pSgjAY8#4&l%omu=tgBh~K_tk9|1HA>LTz zmwLK5#S@Z=hY$FSMT5D1kaN7)-W+^Jc&ywUlb8a*I6+hqHW7b>+*E1PKsd9SOF?+W zr3K52opTt2tMnrM1E0hOLplrX^`urvHRCo)@<_&7Y)7!WOC@3yA-3vg$xf{g^RC9_t6kv8&pC zzS>?T`6##SAsyu=R-~Ja62&@a^FT*^aj@~Ge3gu{Ao-Sk>m8CSEcpcVx`y6sqlc9e z;P|+*M?#pB4!|#lNnv}Xvq7DvMOZEYA>vyoJKsfbk2 z=Z$tGo}`Nv4$4d701AAsaq+DJ{duijkxV%d4xVYqwyEC~@JYI{bIEb2Z zl=gU)pC*jPXN_f#6-(pYoL*~0dzyB7oyf1`de7-~A5O1QgZzinYqjrn*Xgweg!i0Y zmyXs>ujgu~*JI-Jdb_XMem!U(HvR93)9X%?g>NHF&Er=&h} zOS0M?z9P9tTwhy)$(Mq5%5{Ckd2~;;|0v=&EZ216$wR+Z!wI-SoF3t$kP%lSVO)F{ z@G8zvQp%lMZFhqABQNF8q)UDFu<~F*xp>1)m@NZI6sGO<9TME{TtPw8y-1uSi}wsV*n4 z+`nXd!yqa-#5Q1`9G`R#MkXzV#Hq@-!;XPatR5q&<<8G?hi$R- z$R=)t5YR?BD*5KuNf3fSFg5U{Kl|)R9`r<(o44l8ucIW>tC5@&m^ezRSrYlSiE+Q@ zC_6^9AWFA2mhle7M;0pASdx1{bh~)RhWt&+I8`(r7%hm0taF~kMc{jNv^E+fIk}90 za*aJGKa^{%k_gBV__Gq>Lp8URm+I6W#;ug#PQ(MDPO-8qF2_<=sy{~*ZTl5lEx?TA z3rFH1=n5p;yfmd+maMf6^E2&vhv=uha3j;wZ7IOhO+{48`=u>u<4kGeD%y~Ps1U>v zx;F!{lJq=ecR4qDwGQQghEFUrIi^^mQWe!pY$6C`DjA9mvSXtV6Tq$~tw3Vto3ROn zc1#2ZJb6i;Y>i!7WZx~q1J1{77J}#&OC@Y%CJ;NclSx21xpechHRsLo`DXP?{6a`E zBGwO}?$?RZMLN@my+gRbu6u`NA3&@?ZYZmx1M9JSH^2oo?=M0PqjN*WYKo1Aw-?kD z*_(`q=M)xq=7l8uX&>WD^BidS$__(~2n=gnFq#OS!ogfaWsjs7u#>H)f%Y_&XKjjWP zaxEc!P~@R)%GF6wH`K-14RgA0Q9SyrV6#L=l?C!4@=Be@$GLf>1jG+=cH5q&Y$DIh zg;kv0qz?Jdb#`Nl$t%SapZ!nED>YRlm+`yR_~tmf=~0ZzC<0kQ8nTSDn|ftGDg|9< zH{d0&6!892@=86a22b)z{gJ!uyix*OcV{;N4A%?+llWKd%KHDq__~Q@lOj!$Q_h0JH#d99e#ETaIZvZ<}%2CniSu5StnxovCMn0Z)|xh>7yia1~X<13No zySHNL-H-dW1|i*SxOpo{T}M9Oyjgy^mgdbmLt>(qsq*oD;TM4z*-!~5NXxxP7RLje zTErZDwEn6NTlibc%bqE_JU=gm_*A_sGfF6kHM}uoUOUancV!`a-U05N0jwkCdM7kC z^~Hy8`D$M3i@#ET@8+-bFPdmpth5NQSXv`u!q~I&B}pw)cRAdMw;noKMT!YhwmI#& zXDpt`QiiKX?LbL zfwvT!_RS?~q~F73(306}fUGggrgjAb4+feSL^twg)}?0j$y#pm>MjYz@1Cya>4{VL zEons_w3cuCbJIg_e|qoakR6@FOKZ7jj=+O?>cK5v9QOT-7q9sS5ANcD1gC4lNmQ^! zF@>SF)yrk@RpLdk2azsRj=MY*g(uX&x_MRX~)}Xp(rtEQC;ChtcpJfUyilp$@70=InD2w0%*XP=s$_sfZbj z@+b-Wk2rJ0YK6iTz@EGr0a@MEq3HTlLc3XrtX}7%bTgSxq9wY z8zMD^EwV5u$Y%SohJH?B@NHpg2{CfEkk7EzxY}p_mzzdr5Z_86l8je-FOdJ{0TcCh?wJW?^@S_oQWC5V6k$aFrD><2<<*0*+K@6D~|4d);MN4r-?? zV!dvz>*qXA`_U(bmiIFnen{C^RDQsdUh}M2;}R6UKa z8GBNY(^|gj#w$+w9Cl7&A93(gryGk`&_p=)Geu!yv0Tanph9RO_70B1)~4oAbJGCK zm=1(|Ys3q)xw$xOJiLZqSOQtit54_2&@lR1EQ~_SJ#!`Oiw;C6W>p@f7QCB7Pfo$e zYBmN|)P?)h!w0ywh*=W%Ypmubxi%pqn-DKP&8keu)3EQQP~}>w=A!tpk6D#uKzg_- z?Au}aI*Dez=k(AM9<{XMv3r3ztNl!K;t)el+#>_((eW?+f|RqOtBa@$@LQzWjZ_T; zpKz;BKCj|PAGg?$qHmU3-`d=1`3|BcW9$m*&yNxQ8=EEa$Y&XhiA5KcWDK{On@&|7 zTyYqCvOhBZ;BzQF5tZ+Tp74gs3Ut(!8q0=NlGGpr%wTStldq%QW6zq9A8K34@jL}c zXXLgcgUB}Cy!VspdAhaq^D>@O#ijVBID?ya7oC+#U6|+F#G|43t<2w@$4P|)-bQ1Q z$g>g&!3_InBN!z+I+?#3CqXJ4cmI-bxW?3T@y|V5sPHJ+AD-tq7^Ct};y;fZbC=Ub zXm}7dd1fT=-0V}yAzAk^MbBX(UV;o4Q=d@2l`H622J^F)1FNrb_AL`6(3gweti2Lo zs=I+xji7cI&wFGMJGVoeYVdUKVFl`%We1EYs^Bf(^JF+PZqm9KrScNPcoT{~C)610 zHxlUJJ*5Z`KfJRkX$B|JJxx3$x~-RH@P6*SG=rjD7Q~y4{#(H~ zDi269$R&C0{I7l)AL3arz;}h?-zARVrJWqyY{lX_?-J5jrrQgK=4Bn^%YUYau;xzR zWcHks*0~!8J2abqmWS~7#L^k=G^}J(u?wAvGC;AJ6_WSy1Za^AN9t}-xAL^Ar>Ck2 zLBMq>oS229z5M++@)c`kKr}~=ra;|mj$GLB8(nt%>zW2UO== z3vm}Fe(!gLiGNxBUC&?V^MZ2G){2#F<3%YCbkJ7&z=E;@+Bx|D0VN+*K zM5zFuCK?3^l_!4AhiJ<4b0(G`G&zhUm;u4yAm0+FWBO!9=awP0y@^F^#>SOlBVsI9 zo9ukPNMY+acUma+Z}Vs_6rana9(R_hp327f9X^ubni`2MmJ*sh)9%iGLhP@b`FYpD z8QTSxy>@U8`E+${h2?yc7dl6OD{juisW9S`!ki^U>8)Sk>3q4YyVzH?r}JUgA6WBL zzfN1xzmhLI7kpMEpgx@aC3F7Vl04bIpOwGW#@M+f%f~5sXgepP{y9q_%PaaQm|?b!D+2;R@cgsIE&2p` z%+tJtoRAe0>qh?gMlklQuursEQ@NQ8EdA;Rgko1%YXIY6d!D;lAKE0FYpD%xW@vvJRCWx@;VQl!&pRfoTq!$b4#$BjGp@#IswjhqUXMn80PaiX3e!WB`w04TaxJV zJW6-bV1J57(yev%)4FP~C!LVDvB z4yCkQv!a)r6HXHRX{o&mSptOQQHnot0)LQ{WCwXafVI@jGs8Z|SXMIcNU_my4dayx z-h+BKFSWXL_bnZ5n>u~X$!&|)8VjpbKBK|6m1RcOc4AGVWh+c&KK~%J~ zmNqG{j4>?rYxq!nfLknw`SRwW9VjF@N*nTpfu|KfFTLb0j|P=y*;QscH$kiykptUR({-Df5ix z;064cd4ilOs_k|0N%^Vd5c7cH+>`vuRLR9-AqYDQ6X_W({#$su9evB*ho@0Uz+ocKOjKa;o0F(ycS#w4^36aXMk@T%rjP-{teYkv=Ouqi1?*= zOnlPkQ%NIu#+qPYNTjKw>7pPANB;Mh!}l&#F58fkOD z6OJq%nzZizR>y#92+pD(OVxI>*|Evg$abh2bTc<4NVGb5ZiN|b1L5{(5KeG58{t$< z$*0H1%R|+^wbj0(t-HU_(FDHH^+EaL;-kwHjP>Vd;G;eyGJSy0KAQNsVBJ~|>ndHW zQ&skWcN-Mm-PSwa(dD{+iMilSq69HTVlaOsh1qH`W_iKmJFy0VNQ@8}-6&zKtKJO~ zti0|d)CC-G_PZG~5@S&BdHaR3Ns?J}4YO{!yr)e{B4u^iq|V@x-lT5G-K1ns%G#sU z7DYge+%4*LX747LTD3(H$?HnJO<`msocp)MIz6*NEu*lzL1BU;Sx8KUPL(OUQ|(b! zW{1g6SwU4 zzw-?3%_F;E^x)}R-VVHDEGnXaf6W-#p{RSI$skL95@YdxcaPfR?NRTOrzD!XbT&!% zPW~bsK522L6cW|~K^h8+p*&d`-G4(gHNa@lCK)GRjX6eknbOB8L)nT)^)=vL$Gg|7 z-Rte{^)C1Nkb8Z@y}sjKOCHnpe9FCk*}YD3uQ$8bU%1!R?sboQ?e}N>eWiOf-D||X z*16X^-0M%>>*MY<1lLQdV2BOG*e~xO+geQy@8{ z{moX44fT=|9hJ}x-Vs7^AB>SdSLYMHw1A)y!6jFbdhV2J-zIj4pnY+Xq}AOUv^Rye zw1+x2hR7h9L#-xV4r3B5KY;zyK-J{y7sbP+ z*rl(<3|XA8Ow{?VBi4_b&7w8Nq75uGUW##@85K56%oj|RhliXlyGblcMb((K%}3PZ z%Y)u`hU1qMnp@r!OP!~0lTbzxc)P%^xq~D24WC48v$808AnbcZ%=@09E+lqS-VO&=%`QYI z@XawxhC@0IVSOGtW6RjaYkq=?Xv>%-*W~#^@XVnzRHqS zLX1RoT`K6?W*;O$y-Ilvep_31TOFINGd7~}j2^ENmy&*UkRr<-Uy`(}*!U9bg7IZD z1~{*=F%ljtc1fufSW|bN{SIA_J6pr1YAdbWz zM%cnx=eTvRn0mzv7s>CCzc~^w9N=80v>tB0uh%$=NV3nOFeZnn&Iqqsehkknylnh% z#F%K3p!iwgQ0cOWvJlZN6#Gl(%W|kk%AmN~pGq}!oFkV?;3rZALL)d5-YsLx?~`9d z;(_0+k~uw@IlT|^E;U=B=v(=T7HJ1?Eb)V_oiRvwgFFnal4FFssj&h_>bBblK^dqF zsha&w!lSg+541O_5%eFnH#EP-JRk9|7Z)4wWGEbHmE0p6pY^lw1?Wd-F7=?JW@gN6 zEN}|dEnWj-eNHFbl6pKg-+7CB9-@s~S(pgQ(t;HLI`Y+$16Pg8e&;$0iS}oqh!UYi zk-*Ewf(ZSTdc=dY+MR<=W8ta1^FT7~jbZ;v(uOLS zj@a83Or1Tzr1Y-tnB2{}U|{nBs~~Z)Ak>>oK^mbXuT4(~^$f_HL8wRgWpzQQOFVcL zLOt69LOqOd@gIdyRyIPhQx!ThshuHh9DCH6rfxeL#~yR8^`0JgF6FjyY$`Fn3pTyu zVp9q46*ir%=I2l-@bXOYbyz|9M5Q-p9nK)i307s0YSP2rRCPnDClNPN>8vZVkZOWW zT(xF}R3ZQ2aA5rhBh{%cQr$^)92@dkE{T5?xILVjB%RWTcN1j85i5pN0B-vm0f5xhqu64XaFg8k}VktyeO?t9$`_Pa~> zatf)XduG-~pnMnfcK8e4ci9N;d(c}7-PY^?UE8dyvexXy-U{jaM(_!DJ)R*w5Z|@2 z_^z>T4={P@z2HHQuB4p9;HLnYy%!jI-5&a#2W-~59rn@I?JJpe+dzvNGW_Aj<|nQY zwA#*`q|r*A^t2s3EGypj{3L%RxZGtssPaJWbvwB4;6Dznx^D+JP`kSwd`;b|?Lblq ztEb1EvE25w9lYz}l#llcr#{oecJNhi+B%%~$S5q+me~%ff9uUwH`Mw)g=IVFf?6MT zJMd8JcB*3n*#+{0f?D?o?B148Beuf zgIba^T0>R?g{;XrtM@hnm- zC{I}w%BV61&K5sA5o9O+#-N(>Zpj}!>lMTRU*O-j2vqTd{#Z~F;LZO2oUpHBLj2s% zh3pmcD2k8Y32Z^X6UAu6{twZ5il2D>eR!4+sQ+mwUUekwKM?jKCdCrz@PPUTb=I6u zqWBqi;6KCQ%;5OBzsQR2Bi7R1d=?P?_rU@J0G)67wuS7QNCz;ZLfy_F((<;5eSJy9 z9#hKGQLv~+^z(r2ysIW-f5;wFsH9 zm_;@jLxSZyrdr0_)x1WH7%XRd9$zJoov9&XZmUs(x+7S=T%L4F!6pip7(+yp#L6m@ z=S5Odo}+z6<|@zI<#~miT1HGYwkel&b@I4!x*R)*5RHIE>TMK8pQ9%#MtRMqZpd%6wJ?1-v>ruX1y!qXVPgurZ#K^D5@& zSlO%>Rr{C3hy92M1Vg3TN5s2z;U)%2h*G1mU^Ta4vX(bIt!@CpSnwx#4S;m;8bXuO z94EH}m?t4}D4dUj*Qnr<>G{U8s)DIO`?kE+-FC;jXo!(!NSSbaKng^Bhq~2MZJ*yd#_o877#DqL%7HJln)gXlzm;apCEv|gO-U22 zV>WfHjrd-T*sq70lV7|zKKv)C&4Ax=F_#? zP-}ii`ZcO`_pfrhHJomZ&D4|Ct*?H#ZprA$DE2sloJ{Y{8tM^M-cVQDUubPv+i@`D zBLZK$7!lu>Rjw$j+#o6UHyKK>=UyrKK#wJriVO1sN@Z77CPA+iY}NLev?lMfD;N=6 zGFiQE-MzL0Xj`xUV@J6BzSir1(s4ui0}SuyX{Jt9NP;f_@ydle&mKHgj*X7P|^ zJoWCO2x=Rm_WV|E-l$$OO9uKjB#nAD&KD%Zv~VwZV4`mh;Io3T|J&t_V(8o$iCq}M zV9aD5;I2JVM(_CYA3nO0Fq)jFKD5JB=Y%Rv9H?Pf~*L#u!ptVwBt}#4ITE^3%qU z??L}&L;2>EaEO}hkz(ZpiDLsIFd@ANaKG%GqE=~l$hUR~xmxt@?QA2*gmW9kX^4b2 z$|`X;c4ZgCg$SFNNfzI(kqPxU!;;yY{Hxnc31I` z+Fr_V<&^TFllvzZlxC&*u1&|W@_<2@8Y`J0Aiu9b3jA(=u(lp6{~4e zY(sKd_lY}M8fLrJ6E~|EMh-F9(k8SH=ZmO!d-MJRyEEiZPvCaNo&^0Q3q9VvM@=AN zZFd4)1OlZlJC5Y>3rynd^SVtONSp{VEzLNm=TC~J+9w*zH0}0DQ)oOlT7g6L zAM08^wR#DSAkzcULj^O+6jv8`b=EN4*U>^D`85{(Nzt43WZLs{eyc3soYmfi#e!;# zXC;k?$APs9$F7_#Tu_F+QjC$T*foj|jfW0_U{Yq4;=o{B)T0XFUPcJfDv_5fR|m@<%9F+wrCsv`0ui{TFcxMV z2P-!}p|~yH-YZ5a=fHsRSYkHaYZ>F@Z@h4xShiE*kuaVy3!mfg$&xi1TGY)Rf=$VB z^nx4Upc?+bt+WTB2IW?f)@)TjS(H=FSm791r0)_3zp?r~mu1qAg-zly0mt9dWIX!= zIxe3;(V8+9@kNvR0*@WVpLMDKXfO32#qTmx3*bn*9MO8Ne5~q4HZU6cW4+XlsasFA z6C0{0&^dl}fqfgm$ckxHk=C=S$_x;GM_JF^4hVMKi&Q?RotDEL2ULBqOCqTe6`StL z$T9W-&A~J(4un#8?Z8~9=-yT8j#bW_x zEka|EW+je4>x3y;(|WxS_WR^>29d0Fb`xKl(RRf@g#24GEJP?a40A;kr0aYF7%Bo- zYS2d>2>QaWJ<-u3qOM1b1=olv$y==SdAG7U>NsV4{DWdKq`V`~?o#Z8@DJ>X*GS$V z(Oz>mA`G+98Ma5mQ`{h$pbSqD7M@~~@DwOkjUksn9Vj7;1w2I!JOwmW>TWWIoNf%c z5uW0EEZphBQ&eS9ng3nA=xO&Nf%s?S9_gE2RP1_)>W)dd_?R7X1G~r1J)HwB;gtSz zI|vOYh5o8K_AhWFyPOv|1Z(zbwQwS~BS|=*KZV2zgqwbzcLm0s{e)qtD=$IeW;FPu zAS{atbXze4MrN1uNkk;caU$O4bbZ8FIGQq|W83O7EUltr+taI#tyJsS;HlV4toY@} zLV?Xjv;&eW?21T6i32F@+)qk1WXjd@dr6HCU;46O!42glW+O39xH{470+tUWRI_n{ z&-888uW!hD&E{3O#4B<<=-W->CC(VHgnE@n5XHs`DS4B4kD-DMDDl*96aGz0n@W=t z1uq#6j_`UoPNb6L1)_OlI1bcR3J20890;NLFg{w{lahon5DtVf5Ehk?6KCo^6Ntun z2tN_kZTgHIt&de>HeQ-a!nW^nR`RlI9R3k{Md04@VG-gfR<}lowaj6){TetS_+U0C zN;FPDZTf^01A*&*0w?Z5vh}_=@xAN<-h^jxq9*Hg&p2_OSKc*-)2n`CiYY?ABv&M3sIq{b55U1_4~k5 zVd~nI(4b9?!GaGG796l@3QXVg3L=_IJRxK`O=FD(>mY&Bt3UH8^zpFj^)wc!^m;N^ zx7Q2Zs#Od82Pa412>vYbcaFo41WWU(_c7Y8`w@Nn2{cMuk zv?0oIvOK-13{lYe%6`k4UTqM1lawRj=RkznpK&L@f%u$)@)>;h&dAI`OG0!g;lSn@ zpLUDari*7yT2%o@K`D;a8hcQcTUNq=N?!?eJAX+&Q8MR!zrZ)ENJIs`HOW(=hcBFc zviw+4#i01sL_4dD@h!sK3DSOwk3TvwI)@|mKZ_VmC8X&81Tor2z|uYuqt>1Zb|Xf= z=u@dVA6QC=(WP#wk3ftn`1JjVQ3s(?yY{+AVzfTHU=}iVAx6LHTd{d=vHx9SbnYF! z5+ezX+m#de2*hYz?4uB)nbP?G05Lj3D5(!YjGjvu&zk>Uh|w=8`;m#!J$&3NF>-_Q z!57VcOQe1x8Xtl9wx6;1r-S(^!R!{_C3hGr8;_sQzZr;c2(1p%tX)YMooLT(7IYFU!| z%06PoI6v=^P@`q2@ii$tNy_++i?nz;7MD){^qa%z_`+iH=|w}|>m<;a>(5?RFG*NC$dz^`J{ zY=iYu+ZIAHOru8`KWXR)v@8#@Gt26PQJ4DXFh;u8Wk+KwR}$FhbYD5#8|Mjd=0Rfjb8vX!r99Y=Q9)o>4It-&lINA44>br%!DS-B#so~p)~lv%CHxR5%aaf@3z$ z#DIUjvy>veK!vkaHdHsM%GCH}pgNunmDMv;l*xhWj0{wAT5>A`pnPA8H0X}kkym?# zER}}L*-ELbS(U?CUSlMsz>+C_jQ8o0qIP`%YrKdOtHqo)J&Q3_ks2#q#-vbsxSW2> ziJCckwR2dHgvssOUYAXKmGc@uf&O-)>wOU-lI#EUfLQ>*aXqkyb_LMV$#Qk8rgg{u%cWF+r$Q!^C4g)o2;~+k- zaVB>C;@&Jc*SgdqqDp=2D?^wfV!I*phGp~)Pom0r8R1*OXq zQpxQyTSa)<>)AR%&(<6@TM`)DiY+al$LLuXEG-v<7d>awo%03Cu&DeR<*i7$Cb-kK z*_CpUr#T$h-iwsWtyLM5&yks%E(i(HyYiS7c+rST1ag_VzjJkGZo1G+=aIj3pS?Ma zk)u>G$GN-9OIFV@H92#fIo)6Bd7I;0>%Q{ljU^|wc_*qlGHpXJsJbyK)3&gD9xx@p zZpHMSb-}`%ktw6Lq-n(-b4TWYR=KTq&sWF8IK7AiMUJVtTa}tch6Bnkvp8KXw)!*l zELy2m&YyO6nMJye;LD1!@t}-RD^9H1X#GB*RMV)8o|(o6cp%fboGW(m?w06Gr^@7| zGLw%;0h!6~e7KoZ6*H6GuCi2ZW>#!uxhzC0u*Haef*NHyPvWYkQ}4%W2YmIVt~0t+ z0pEDhQOM_g0OdT{rAS`mMKZ7M+kfx=R;Jc{d%OEKJ-ZjB+*b*)YI8k2yg81}*K;g= z5|yS-<05n1W!M5#nvSHT56kx2)ie(gsuC&Q(s~+nw)Iv!3-G z@=j)51Seuoy+y5GBDahE-L78Ouc}kcx-@4orcGRBl24@~&Gjsns7rK5TI|@~eVXM< zvvDxr%AK>dOA+2(B*fQ!{pZYU+3oa%QbbR-s^Ld&5pS|(-*Z1tysl?k%6YSW&+U4) zr7y`TGTVBj7G{l94OQxi)+41R`h#3Y+=|phOM^1eODo1H!CUN0SzOzz+(Bg@@-?iMxI4G^ptk*#!gXfsP45n6da zohW65qt{X2g{iMhzdT5YNtdaAK=om-Gc5gbD=$@++Nac93R5p9Z(Z%<@{%zsHJkU9 z2v;wRJls4+J+Sp9K~!`w@Xi3Z=`eTD;Tlz3j9jTf>{c*(5$RTy%iUW{XpPI=OB_Dg z#e}nPie6L`JCFOc1Zs{*T<2gxqshJS>ywcO!iNhdJXzYSa5msy!A70=@FZ7Mi^m!t zN{@wsZ&W>R3;DLlXCs95lSj^7xu4sYOHQq6O7s;h_`Ra>L0exjJCqs~%Ih=6C}$#{ zt3G6bV4p-4+G;IWaDTZh147NKD^X;e({fu>vSlsUkiIb<6{c^y>Y#IIOAmcRptH>b zU%D!vjG$l6DoV?bQQ5Fuj*X$Vb}@aVg(Rn??u_$ew=`Dv>A|yQ>{Q>8U<0cMwsTWg zK#+&`0`rA#y(6;fHFd=RuI9!a`>=1PGo%~LNVOxttSw7S-wPhV!0x=hIcq#9I9SRl z$+sR}F(g#8A>+I(x3H2d3(Qu2W}G+ZagI?`52H60S+ez7Wb5l0UvJEvYu(a)8|Tlt zrPVkqQ=8rf`4{e3RB*QVkvED1S38TnG2;IF+z(vso-ZCk+vc7tIA3ticFz}whqAB& z=W@Q-FLx|p_k6*EoRv?Yfm_SV(YBOu%TZ&p+WMyQLqyNhwgQ^VK^sxKD17A1F_}tO z{w>Zc8?#E~3VhH$$k}7E^F$xY+|!3LH>)zm^QOjp=q3QgshYa=IkDk``@E_TWqzf~^xhv2AF^~UdgdR5 zihb0XPyAh23Ge_+Q@*E>+4?{?EqSG2CpZ_(;G6-7$qQvnX?bJa7p2wJ!eea+`8f@| z!)c(|zX_)d|Hk;R7XXXRSL%r6`L}6g!(>w$Ak1yD5vjW3sR_O6M|7>s+R0 zCeTCtCF=n~2|A_wA6e_7762_~F92|zRUrD8b4CAxLS?-(h~@>bRVw%UD^Hl)Qyz{;MRCJ_>tzYJ~k7r+1vErTeHtwBXWLFWr=1RAu zb4}lheX(!FPE^IbCCLV5A`9bhK?X3Lbh*n2>!54te(rcqlN%Wk$PFX%pDwxi8Q1I) z`FBd@P}%nxk(;y2_C6vL`c~{rRqTDcnuS-32cNP$E5WPAxk5cFTKVRXEUkc zz)n#luXl!~i|68&ZjvRJ+^QIx`is04<*S$1C^>{$wJuRB=&n-64!o;Md7&CmD<;w( zk>EkrUWQz_WbFoS!L>)|BsTU&!wdYDfnF}XhODjOsuAGL- zy6ad0@M2reI_Bu2xNBjVg3vbUhvj=QNR@Ky{8vxK;hr~Zo;>}5b6Z~vPU>61z0Nsq z!Hk-iGZt+1IuAJDOi13tuET9Ccujf%wy7TfZM76pa|U^ z4~=H3bU)oekwe9u*=2K1AHH?G_lEDrz7?x-i>a<=4l=%VnHIBfZ1G?raX025(H46A z4?&{DCLwcagjQs3%Xc)H6P(s$PGh$gq-0^Yy-Jfg54+bu=D_ULg4u*h-4+fUgv_n> zug5J$7%>;6wcJm5vF&M;_M~{E{feJ_sQ{oBA5>0RhTfr9oJZvZo-8WY%i`PH>QT8S z%6Dba6qVcJE<)sTVI`OAnaZgK6qQp8hH1(yK#g`Dkpts2k-LV*JtCKdS`azC=2j&> z&9svEOB1=zriq@?TUbMD7<{>Ay%o|K5_j zh-EhsiBK)%?dPsIg;Tk{btLXo_L8Tx$PmOb?m0_N?{2wY_OaaT_bs^nRd6L-6$Eqic{1urt3($CYVLAoydnwF0(zE{&TdAq;4Tff{R@lsVkqbZXp z5|7sGq9PtqgC*=Mxh1p8{k+$5CgL#>`?zB@(=C`Qw#ccBw3MoSGx{D8drlQ{c2f?n z$O(;Xsssa9-b+Ny6FK>MkVShh`8x>3C7YtCu+*m5F4x#l)Bl_Yh=($X7loqfarI=< zzHe%ZCSPfpwE7+mLbBA`!XxcMY%33OwO8>tg_kX zx-08v&t?&@Y$nacq(r5nUpr^`-4AX`e;{b(N#}eXhObO+7Q`*BuXf9yPkDDZTi)KQXVitp~ zjtYN?oGAm={8&%_Wm^UU*Ephj@r17&0rM8ckEAHS*)%bti|8TFK@5)uF2h<~S8_J~=JXVW9jbFNKKiO4eWirZu? z_?}dYbx)bG;0C$Ho=48~lQHV4j+HqRIaO;ZeT26mauUNOHPU6Gkq~&zsZ78BEbk+} zWAgqH^?s+M>>QGQe**6>iq{e6kP=mKg$Am`{)xg<{*+bmsx zbW(Hy(=0lrbpg|4*hV=kb3e?OZEIbC^j>rUcX8!IOr_lh`?cJmlkzTg@c#AQQ0V0 z7ckA)^JLDT=)QTn00Ce2I{BnZEY6>xwEVELfXPTclqvu+uRG)1;TG-!xqu;?2f6@Y z6lqGoPU>FT4@-xE+7N5(gjR&Zl|ao#vXJ5!cCwH!1&)qnTc-cK8= z7WJixZxK98 zx_$KVzI1zAcBx*v{ii;Zxl@(ty-OZeEIup6DCd|LelW zVaOv4k=XOVz-43J;bk;_p&%uV_gO0d!fCC5+8{tV#k!sK!gX1P(7)0R;wlDYH_A~A z+{*)555l`?8H4QM&RGDU6$AH40g>-&#end=5?(cn@9inPs%JPQrc`=Q*J4Ib>!vl0 zJtziL>;Lvx&MI^FCD}F*o=J6Z(Q*-$<4xIRWw&u1p0r{>EN-NvGq!KVhWD-5-yanK zJ!v^xah77h1uU%?$R6R0VnFrtS*r0yMC&1YPzBdjH6daSinD+`;i z{1e!$6ayM4S26HGs!P|R%~cFY%c2;N`B2NuihuTWAV~X-xrzY=p@_^Zm^c9_OJtUf z3t8|z{zu?br%erCF7f&>iUHMt5}9dmb5@;e;i?Il=V7+qsi1Y?*Sa7UGBc?|l$>X? zy|^A`>z%`oc*S#Z>khBDCKsmdh2LxoQEo(ZoVmcBTfz9cyF3t1=W`Z(sR?rf^F2sm7%T z3a4h~KPZ_#HNa4&*>4D(H0X|q2-9X~7tKD1h*m&U!BXCt*r!tGxTRD_GvX7`3FvOF z%)+k4CkmgXbOLGg`OrE6HCjEOkEU>GR8|!3*~>MBlW#PIQ(wb?b;0Xd4`~W_hf;+} zu=_sh1T-{SC!jhEh119^!jAaKUl9mAQJV6AxI-^CPbnZ3WKlQ`U$=Gl;_p2Qrw6VZ zh3m6CO#>{dPYrI)+H+NPn!=qYay1c?Ipb*Eqi`9-g21^`>?#Fz&Ny32m!?bS;FjAU ziq99-sjYs3hvo9o>klgWCKY~2v6_Mb@>V7~fgOCGw(Ah~$R%@M;TA+}=d~hpB9j*~ z=kP$tTqjqp6ZjT@Xq~_Tc_%u7eH50Y3OVM`z3T*2ok}OrE;X;I)Cn=tX2v5p35qBXWxq5_&&w3 zWb_)Xa*JhXnh4@g*W zS12NJ2tJf1z(o@Ob1n=Xnj~J6}lx5c*7+;1CT14v(JmE#%JBtboXyEBrD4>3YsOKGxv!RiYePULyS8FIlqzq z!o??Tr;8@Q{UW(ZaJH;|ocqBDK5z#_lPpqD^ihu~H7c2ia~hQh9c<(YssO|NDO(7t zfINO`RlvLdrBnfo;iX_G9aP=-ENve6h-x<1*DaeXG zCpv*_-GTkwWkI_+i1?u-=zmE`u_g16{oI!JAeyb$N~5ozj?ORoUjD3s#6@14*bQva z&cfNHi~cgJzdT7^o_db!OU6P;SCBkG?xXLKvg2KTTFvbQmF2TT{4kdFC+m{0u77iT zQP8)>w}u3Uh2#S#iu6=_{Ly9yb9|?yaeOM+IQ}?M{bsFC9Pjqo4)s})`m9-h*(qO} z_~i0=X|VBD|(0rnz$bvQ63d4WcnzmlOMO{!${l$dK5R}ljg z?6cTz?*gs}?w<(1(Ebd=2~39oEfuU4`A}I%IV+vTw@CDh*qRl=D+&w26*Vm5_h61Oe^H3IclARGDkSWUf&`Kubhc zOLH2e%d~^&o4_i2ld#`3Sk$^Z(Sb1)q3guMlSEsj#dCd$HUe4^K9fgt%k^01SRcw9 z??ahX;xDqb63SDJ!K(jY489~$JXH)WaVa$I?Gdpe?od93T~fu+WpN9o%b2PJw$%G` zo5U@&N9a?@&EbM^;N!TmP+-Tbp;mM?A-E11i`tI~VakbWDM*-2SFTh#NjD1!X}piA zB(n405>`vpWMyfc#CEy zK1(NAp-L#7(b=6||575glb< zj?ziK>->BA<&Em)--W2(M^~Z3qLaKW{eC>}(Mg`g2Jnk;18pGO{MEj2tD($Vuf@t};?2nieZ(6nmH#ctBzf zC`jY?D|nnM?^Anc6=gC32<8xgpw^8OFoMtmU{fvs!j7NPS+43T_#6QUv=yZaD4=hh zJXKJ+qU)NWiX%j6`2fRYHl8G!C%JXD|B`_gAUShn#U9wGihZ7MVFcxe^9KsD?csbZ zenRQODz1R%ORs@kNJ$sSw3olc6~Nt!*aI$rUsr{);|fSPfsC8K0`7bYWi_RI5(O9q zumnAzM(5<-0Xv=xSn?M=0G19v-~zT<73u;QVhk_-fCB7S6zVc+jOvVZ^Z_+uw^FE= z5lcrOsCBN$07Y*y9+oP;07K@2^|=gK6w|~}+$>cLf)*8nKtVQuax!Et`P7jEJxeL3 z*}0wJQget(aHg7s{St*>n!4R1F$k{ZwrdQ6PeFs^BuVUnmTbM?E+P*o(^_M}RyPQN zs~02)fdpxUcdAuF{9|g~L}AD7GF@u|Yn*TXJG5140;ehY>nPb@`mPC_tTlnG6(R)) zFD9Bm?aKZ(?a3Y^dkrHd9AJ%dW&i8XGb>I7;zJ2ot6kY^oi$xvrd`=qik%yt^V*~>FFIx@$ z7oW+v41y?avwhd!{aFq|;MC&!t_z=_geAcU z$5}>&$xA$zL(Q6~9mR*akLngxD{O&oQ05Nq#tk5$v+QypT}4N!~@i(rdZ+?$P_;!)icFST($7|KJJ{2KLKnNpI|vZ)hyr4 z7azh?T~(}RS=y9Cq*SZ}`NV}0L^LCKCKG)MS2fXkA9qYz7b=!L&r*x_T9-TLv@S(5 zUhC?0>fUq>8Je2*T31D0c8hqk?Ru@tyM!ciVY=nso9 zZj^$JRH_ibi&C&dS^)tZt~yrW)*pLw-!AWj@Bffd3RInH?xi`I`!!r;rgfA8VUjXY z3U)aYX|d~k%a;-##^pcG>r#YwDnyL?+Q_`_7A3|l^47oUMl$nFP+k4bi&CHl$CU)_ z|EivE>5G;G>5*EPHB!H$NlybvSd~lQkJv=hidUzJ-B>)?qDy*)2 z!}K2t1~$}xYTS~ggQb;f`>)jtH&+|g$!g!;agF+6h=kBDnf50Cwu|G#V%$^*o|}2{ zxOn-Aq3B*xc&r^4EC0`G`})G|~{ZO*19a zm5fWGffInSY@NL=7{BpY^J^uhr0s65u56nBnm`*IxE2#KU_>NTP#6o^;n+wLQwP@F zwl8Gw6yO7|-F5-R#~RD-$QRHNUc}7UMI(dpZ~Ch3Z;c#}XoGCh!N#8t-YO%BsA$$^ zlLS<<29izoVRN~_7k%yMBJy)vYpf}20~_X^&0%1n8j6eK#nI}RIkGxlLwyrRj%mE3 zKq`{-*xOR8gRxIM!Gz>hSEi~O>&gd{yph9Xv8hfxRZDmhj17y0rffI2w40kc{p(Et zsQdEmpXBPR8xN(T6Wr&|st!%TBz$K=5^3|GXx7Ncl-GG#Wh{F)p66tv&OEfp zo5S-)o=2uUSD6a=UP^u}G^H~#CCQY^XO=y>Jmh;NA&j1tYB2*x=AK%;U=buMVu6`azrxaJ+bErtXk0kquKd*~K4V8CB%0U8G#;b!$IYxfToNdl`;k>~u*SgE{Vw zVByAC5=w=i#9TpD=hxinK!yn)BW(u1_zKAF3~-?I5=mzoYyP`E()_K~V=HeCo)BpAD2abITOt=acSj}^}%~(+|K9QAF0##|J75iP{@ius(_^L zMPuV5%eh)X0m``ZWj+`adrbE=F(x+p?x6oQ2B+fUDZjs4W|Xq$8VwSHAZYJKO2E-l zpo_kFI&VgR=6QKr-h^BsY1qw^aP#gGq)Wr{;wyOLQ}7s`|;fKcwTG9ivy&eu$p(5 zS-y3=9O0`QDwq7alVvPwD%ZxolsqY9pCS^?s^r<+h3qSek_Q6o=d#p>-5Ihc-B~1m zScH@AEVZJ|MakELGQ@MIf(4Vu#sox|ami#geZrKb3WFr8#59X@WKqz6m|i?HVaj7q z$|zX{46RvX+Rjb+A;=MXZk_Y)9=6P{naV(Mj@Z6WmoPZfg4BOQ@@@bNhf=G245&Ik zN^5HGE(+SOK{2J_5i%6#QtO2HNG*L+ja%{2%WH1(Irq@ORbP|+ew0){A{8zl20vk@ zp6AX=d`zE8uYri}Q*y56zm~8erSeh(6My#EgRS|kLJ6{{#d2A^R^T{0n|+{iGiruH ztD}S5DDe{#UxZ6)-e07i`PRg0ij9Z27t|Eln~aC&6c&uCY-&#Q^Q{YPH-6l-lJp@y zbKV?ZUY$|BXl-4;!~!%ei37hP6PWtB`Ir2B3XySN zZT3JHs^knPIU>@-R(x0i-(9VG_cmR-7N02d8uME7I`iv^D*)8F`dxQSzDf=C&-CfT zKPJ=wtY82#tRF3A#)y0l=s(Dg^34~hIRCl5kdv+uDVf)S0#$*w_clHb~gi$OAwKd^BL*AOP z!kgCBBMwEj8@69Nbbr{MQljYTh>ARsP_vmtAEOfaFM7;ZHz5=~I$-vI=&}4+UqEml zn^`pft6#o<#9OoW#l{s{@gFdJyKVJ_^ShrN(`aL~MVC{B&@HN#jN47S1qo1A>8`IN z|5K6tDOnj?EUnoMowMjfY#f6AhBbBE+6^1!QZTM0`ixX2Pj=`ROtQGYN3aUFRmz+hvTt5T3lA5Zi%P4SUSkl(%9mW)1<}G{EaOhrS7ZLy*#lSg8W@+ zwW&I(o%=rBy+6 zJ--mzXLisk^E>ESxpDeYW5{lm_ZJu?RARzx$P(DATQ-KwQ}`ikJH$CyV0IQC)5u&u zSde5ma|0iEHF^;M6Qq~8d33setU)Gc<<#?x(-+E63 z=4Iw2yu7Y3ue9vWaE!sTio&rPyp?K8t=RN3D^?5bwMJO6Ind{6V08`I@+OmbZCY(O zHhpqUYWlR)^yz#KZLsX&1U6%XP^U1<-)XIQ;d%X^)v=qLY@z1;D%%wFx&lvV&XCrM zyURmAlK)e}@^7&=CE4~>0^7j$urdC~CGpYEhI~*ERjt(D$vQU{-oSE;1e%QnSF4+K z#)3=L4a&q2H(_>IRzNY?kN8lwu98q&+ZP$B*6X7k$Hp6vkDeQ9Yt|1Q?O4Zy;)}^N ztR9ScuwyF^hFuYATd5!XXU8i%7=E2`dKFc7w(g$av9Iy$ZZ(p4t9ADuJ2p3-*{$xd zy|H!7Z#&*-JfmAHVS7jGm|s!hr@OV6ZfmNq_r|91u1inSt$l-cT{@L+?nd5q>0hS3 z{P$^(cfGd9yI$MlU9asy3cE~CdN8N(uGjW>*K2#c>$SbYO!eHlbMp;u-MP4tsN7(W zpq+}}ha!3(sVOX#*=t{c6|e6X@;jkeg(V3_$#k}_TL<`Lv!pdspX}w6tNCP8C^kf= z06W~VSrD{a-z3kfB$DN`Q1e@S7U~!A?~cSi6^cGj;?ct$yalRm{gxD_VGW^VPqpH= z^Brk6-3+Qg=q`gUV`9Phl^P9aL3(n#oH+NWP@~q;TK)^$AU?FghBnyH1{>O7LmO;p zgAHx4p$#^)!G<>2(`wDHvqKBfy4t)7Hn8^V*Ij$n*RHNz`Hv+&LVc`Q)$|&u0{_U zte<5<)!etsvxuAIehX=e#Tp97M>m9gZB`5m1(#m^mq)Mu-J@4aJ$e;$>D7p-Sya5o zTjTVgkT$Fcm}d+LFoP*vj3)Qi#rYgXgNr3Ua(_jf#7h>`>!nPAl-Z1FuHacOWk9w0 z9dB5^X2Gdm$_$V)`z(6edzt@(=l{m%1Mw#u1E*aIE3`{!UoLg^h$-t#zs(_}F3nW* zl5e}vOP4Y#s;J)PP(`7CBaDV$L+lc*?Rt4#t3dX?8#FMH=IKc zhT5u%c$Kmi?NeflYUsFS1oxV4Rg?IdHl|t06V0cKxKH*spGMk^P_Y#Wn&X`u6axsf zBC>QO{*r>-ij5|`ZEI;FpC@8=h9Es+|3Bi+2R^FeTKs#H4I~h_L8C^cn$*~mLX|E0 z$_h#@xeIq?Q(^(7{%Ls+%fo74d9n*A3c*bvm+Pv1T5DhXTHD$_`)Vt%T0}s|hCc~G zAb<#J6~wB$EdK0NTD;fChq4;lOMjypiQZ2NdbQ>|4p9T2XgH&s+?T5g{ccs6cl~6 zpJ(a6$lKWEPk#laLF~%k-qz2PSliRjpM_e!R**B=vg{n$7_1BDTf_RE+Zf%|0}3f%EW=*QzSWWu zg60f+n|trKoJ&Oa7A1ZO0x5X8{L+?2Ay#6eh-kG_X~eDzuyl zL)VU+sI47&g9dVn)UHIfVTxufJ+NJNU1y3F9~Jb*qOV9P$rfWK&k0n$)|Zeu3E19J{)o`sIJ%?sv!76OUU2KO}|Z2zUb;$aX+*{C~xCb zc=$1_Zt;c++2^AmC}P{1V+|Xf9~o+;8^eC^Qprb=QcMQ=ln5Rj7mp8Ktj6U@eiE1T zkZt&85bxWP-nB#yU1a}fMducI!k4o78(k`c1A)-Im(5*X;tDl`cB(1nYdri%tGP1zDn}Y?XXW8$^UFc`NkfraMA<3 z4iF|GzpE5Pvg3x)m6HH9agXR$hY|tya|;yJz-N0MKxCqkY9R~VM}ZWFRaEmw>LoK zd-VE&%z}_Jrlh)lo#f3fCGQ;aq)ITQ*Y#2bYAAqu=mW?sdcvzOc$b8IsP?X+i5|V~ zZ65fvl213fNsHtvH(5hc)Cd%yZ2h0y-4^B^qL1UBpZQ_bs&QK%0MF^!-RpE?d_l;uOsyJ$C zLxe9`+H|fr8iRN`hV&Q&aaywPtPwlv-Y~71L1_Qt)EUwC9^tE^?WK_sYe&i;r{-7% z8zX~i@4U$q`8Tq()DIo}X8t`*hi2qOk9i{n%_9|2q=qoeJ;BEsUH`!ZAM z2I*Vua*H%9?hbwuZ{&DAd>}`Ksq>adzfxx^O;D;(QE@772~1iRjiMWr=H}~)xSY9A zOgemlU?5Q^8x9imd1zv@ti{b$L-|NZ(OEE^phi*_Qu)c{LL} z+%IodEfHW=b@9B|-29qEscPf7i4;H|mze)mj|ctNTQEDgS@K32b@j3*x-C&5dkw&@ zXMWF8T2CW-6%=(QlwgR#a-V*JhsoY~me!KqRUKPVtKdS>BbrX*S+sYa>ezf)aM5Wd z&Y_K9bcH_3HM3tq|!QOXsw%lyJYM2ckpC6xt2en zM@6BM0nZaDWnba-)-`g})ZBv?o}>ph7W3B2EHLa*PpNFJOR8gYYPw;-XdWd-+Mo&rUAo#HHH`@&_gWVv-YRt$ zc5yc~7S5N+E&6D#=$&68X}dWw^dcdNCPjc;naWZgv>z6-P{a`QKP;4SyB>_qL9FT! zL)w=)!sqN)=H7s-o#9uI7sQ622I1c92NTvY8LxDu+8xqdNn}T`dDJvOR1!*1fNAc* zUr!C@Q7!xi*$&w+1s!R_l`5WA`DynjBvaW)Ut1~@nYpUh=kYZl)g*phM#8yvYS39B z6l!6#cm#$alF;isXGS+UTl9qffqL}MWOkNK%2@$4eKp6Js#lHuiZDN(Z~=e{w@LL{BG1V~{K>wIR5Hm{UjXB&<{gY@5@{Gu9Y4w6tAfMP zwmJ{XoQhn*sUsplbT@Z!=Q8?|=@R$t+oSG%Y`KwHSrS*R>2*OOgsZwSwd^*L8S73u`kzkW%9`ip;oN3Q%JS6J|Q zN+5+j%7lVF%J{$@)e0V6J*)dE1OoHX%qfw3M1-(xAklnD^!Aqjdqv^A#JAW<7&g`v zC^==1;I2kN2W2U1c7$`7m9^BJ7%wL!s9aeXdb<*QQv7LxHhZsFUJnKO?0h9Y1Qqqi z@*0`Bk}jpd>`Yqr4l^=ock>{E1K_}|qki2mVNiC0Jz+fIjlQYTgiK~nttv&8LOcyo z!F3{0O6|4+K?xxxfaIRa@YO8&ihr_sk;Uoy&Yg=KC7n(>t_5AEk&bUc=3?|arDGr5 z;p3#^=m?KuMv>bck;-py#&WN@KJ$CdwMEemedcxk&5>%$LHLUvONR-TaxE#?mbpS< zG{fAdn=j_84=RjQp;if~=Yag`j6 zEEOtc`8s?J)Oi2-P$M_RHb=a$@5UuPc^3ezpcR|l!?$IHaIwS;a3wFLUUOJgeq>>in3lpd+-c`$NbbAWdq&%!GFzyeCdjPBCyK#{MJZH{Wzip}XIyTHz-&!FkV*i+ga zOS@j$6&MrZnbp;9ZsZ%av-2~}e)ULI!NEvbXR`%va}L+6WELaK4&=M7vnNaIGYf5I zV&2O0`gs<5hpxhwLo)lQ%>N{lWsO|qK7_Si;j_{kBWE{{t^@!%V#*|v-(VlT%06g} z2jiS;A~uWZ&v}SK;jg4yB7+R{g_ViX3T%#XQs)O%#?|0YW=&;^`;c}cRTNMUTQF%( zm*&o(xii_H*gfT}t~d`ROJK$F*u}dtA}p$yI%U8dOCy&Mr`Z{ZV%B(?S4P# zUzh3O$gUn!H>;v{yX`&uIy(KdX!f^D4IVq z=KTh@s$$BZ#pA670pE*e*^9moqwIvfo^p@HTYDSY5zL=`9kdW{%`tr&P3@3W9J?%s zmYXEQ*JQ-%zO?Ch<6o)PPMKw`WygK38gZ1lndqRsKi*Q{!@p&V={sna9SLBc-_l!q z%|6a^yd_6ltG#GA;|ldwWVy#py9w+(Zu(lyvMok@L*H1P_Pba9nl#G}2YlP4srZIG zt&KE^9wTGL1DO5x2Q(4zy%!6eq7ut>hw_y49#QF~~?e{=L%zL5X%q}JiJQ%)% zW$)>m0%Zv_2a60X!GIXChy3sKd*?fb9XDcwaBE%HH(_1#|+<#0WBVI zs!9yKMQo^^#`Y9V#naHOQ3edluXya95&uD(rq(PJ;7jp|S+-t=oF=|$+M5Cl2}Gx@ zHOlszzD=ff*su=)fe~-*%d_F*A%}-N?KsvYzC)v8m*x7lLofZw>``_UiyvPzWOeVk z+rHcXkAbol?HI(egaV}_W5fG#hHikub@Z{-&_2-Do4$7fWrt#QC6D}1&mELp9$(j+ zVIe!dE++szmmOANQj&(&0n+U4zN4m(5kCO7eA`KC?O-W3JRib0?RAVbpPDiAO14mivZCHc?6GY?(L!@M@EnMX@~t#TBU^o~Wi4eJpapG*uN5j_656c*2ih23U$dgx zO(0HH-m0AdU9sV3+c<4)iEk_b9kKpb1=v3O)|NHJH}=-{(1AgQzR|ZfzA;DN0N9M_ z8to9wq($p6q0!j#%U9i9IKh6c>{SD*h75dbjIuSp*R%tpV|9bWH?6o`2KhBcH#X>- z_I6@bZz}MuHMBjx?PV`AsHV0bZz|t*hEzLY+S@h89&k7KUNymO*|zv5pao~!A>#O^ z9#HO3gGmeRv=nGb=$toYOtzNZ3_LSQ!%s^dbC_n37?gOKcEElWY8)NAS3B{)uhj}w zJ`Yt=2xzxKie(!}=lNchnLwRjw<>c0%-80XMK3W3K z7$S!z7#Txf=i4wc_KV*C-Q#aR7c;gtCR-T@`GBHsV{y%$WxhCBFo;2r+A8K%d_Bz^ z)ApFYRe`d2d_Aos1J13(Sv$!x;_Lgy*E6lR8v2IOv4_4Ee&^?LCZ5f_S)a#yUT8`C zgR-qW_wcPZw3n-5{m%>7t%iM^Sy7<9Ce#jT1bnN^vNb#eWX{1Uv=lbKgoWwx?S39Z zdxiaU8!JMan2tS4lS6op@9Py`r5l8l_N93DXnaHOA?l~6>H8pHZ_-}159i(n3Ex)! z0)R4{hke_CtL!}zYmD3rR)!wQ{?vrGPC?q z`0EE{$6>CL&{n}yW8Q&Gar;%lyVmGi55}RhK-nfE_uH0lJ=2J$TrghHUIiV=Qoo6hIvU(Bo>URsc!6PiyV6=0NTs;c20p)}Fo&DaQ!3@&6*&%@7{r&ESW< z?@n#I-5SUpIo>EcDl4X9nVU>NUu61r!dG3cxk=b6lXiGdLN1(RH`zOxT5xA=jjst# z-O6aCeNDo7rLiUM!bv+zM5J00-=xOt2_iz|3OAMkgi;@ zs5NpE%k&PlNFM;Sr$N(1qby;-7~%Z^AFmDsG`Jbe(S8TZePLR{U0MnNbQtS<*=EDn zRt66dnd2p>bve({B6Q4REpRLkXvYMPi=>bMvYbRuL(%pkLBk7*wn!{-DSVMj;fCF8 zYO9R0?Xti!pQM|<6o|aB?07(1LfM5^02ewD$&vF;Qr?UWV2SBE^tn0{r z(pP}U9XYA&u&Kp;DF(8)ec0X%d?qIDht0B=fX{@$4rf54M2VtCR$1r}Ho@NCCf-M0oFhbGQ=zx!{E5F{$GP$%Y^()tz8;gE~MEzv+OekKp(R+0lRK- zr$LLTK$r%5$Xd=6kg2dbz99!rzC6B$X#gkRsqI0+Tx}ns%xV#4bAK?k>}BnM?@(;e z74}a299W!vt-hTQpZw_&yX#7iy(Yc^9(oLpzM;4L$ti1spP2{F zf&vzO-%%!m?*Pp-%9Q7Sx+$PEx}a$6J=XYMh2C4B_uI^}4G0ImHL<%c$B=#lY)R0w zL1AV?7iLD-+a<2XCZI`)MA6%~9Z{pKSp*H3`3da=06nkmr`hLu%fx(MkRp%(!6H*T zDt5`M5k;AdBm@gae67w3WWWWTA51f}6QDt4()Y}=ohgHzYU1lq@QH`e1 z_|x*|c^6|XnZb(<9{_}5CK9d7O`FfNd>Lge1mR#ZA$1`0BQDr1H+^Nf%acDn5N%+2 zu^YeSu_@dRgt%46-r}eanT5e(NIwwpM84T)$a0nvoXKjLim&g<1hU^_30}hgZIm?4o&bj`s zvTaC~T8dqKB@718z``~JCO|_>@@*4dg~&iw=iFmoVAyFuLsHT9vrmJQDbPSBpuK`( z_3oeuQmLT-Wxf8-r~q#WX#LA?3TUBnZ$OhUEjTR{8X8Bq29bq}4f0A1-uBO$rLWQl zw_8AqKMkHJp8~5sO%4?|4vKLzLgck6F1@lQ{F8^!SKK3;HwkN3SK89Ke=+>BNjN z#sn+&qe?kn!@2poNmRDhdrqwt8_B7C`_OQI{#Hi%@ENCGi8*}fYh3HiMXA)7dW|z& zDwj8SJD@@5NpIn2XkvmY=!}n6vY9T9ike)U-1gI`sIjK1Gr7@xoH0h=9DMB5nR%RS zPs$#}i4Uc{;Ut5X*yV4b=?wX2cG|tn*@Y^ZnT+9OZpfZqB<3#TR_+2@i68G2eRQKz zm6NU4+2o?;6Ay%}(Mt$37}xG)ro43RUT&lf>4covf5_IQVQR>7ZCxzBKtoT78cAXO zGEIJYp5;E**2*vc$eO5r?WvPUPZfef%cHD#lr_u~fUSDeX$|x4YjVyQ zie34w(U2Q%AnLeL*=LA7(0j@UB)Zpfoh&$3qIy*4nSinWp?Y+WC~2K*Q5Jh6L*?M< z5lSex*4Km1Rj!$N4F^t=o%zY0J1N7K7e`f@6e+XKrh;nt1pm~^x)*;pJE)D z-p%1(I8P3yrX`YB%ei5=m(my~eS-g3_BERvq&cffDZnNhNs`F49h5WKo14V;f0ED*VT9?_aqpCy|0}pFyIF@5g2-+Nkok=4lub;`ByBhiAy=q zvNz4_t$@?(i={)-@u74)+c3xBwL%r6lr=!m9>qD`s7XQpsHrn+Q0#F^R-_JlvGB+C zB9=EVDAdUrq6Ec4W+(~9Mop7MX`<~_b-GXi+!GnE#7xwtQn6RC*;{}Um3XSaJv)~f z6BFA zd`YiskrIpzNNAO>W2YP}T}j32U@2olgIUzj$YPMx4ZP$nLd$daQXr{1hbp~abXXs>*N`u1#*xk7v(t9Yl328 zR5cN^s}cr>8ierWA2p1d1l8*czCr0w1^Rl{oVdQ=BK2`=?J~g*JapWoNRcxme@v{{ zFL+HP;Mw?|a&j#}99c4IEN2W2)WGvw!v!3`>h(L-n`xLk(MI${nrvXL7tCWd4u#f~ zGz+15Qsv;E06T}KN0_@t?OkU{3E-9WN-mD5f5>fQ;^Vmy;yzT>IMed6Bb$%`4@)6gINoGT|zA!l}t0fG}f$O^{B5+%DUD{erPvj>v@VoA$2m$F`XF zy$fx8FwXaijEmTpICqugCqCFAbCiM7b`a{N$Z8gA3eHU{^Qni5j#oxDNj>UFU^|=Y z%oR-U;)tZE4EwU{N--kJalbQjG9NY;F*Rx;Z$^h{GkUmaT^m(I4oB`88>H+t6g>~S z72BkN^f5X+U)L9uNopTQaGdFboWz}U*BIu#6izRFOKQ9~7G9^Rv&AD#!}aDK57ZRV75&iA~raqaUu+BwXhIpN5v+z4}FbdhTj`D~Vl;;lPERvCZm zj7z~n_-l}-97ujyI2zVZ1kwJ^8&Ja1EH8tvK_mXQ8L)maEmTYxP%15dbGXckrpv+? z^4A+K7Krg^j=0AAiMR*-P0{KPa0NFOf7^@7<=mW*p34zRUz8;`a{ zcjc$BubIWtw7LYN$_xTa@TyZ{PBr@nnIFC*YDIGGs+bCHLy6bmwp2HvlSz#T`g_di z>6&AV5L&@-vRWC~SoWU8lWy^^SPo{Vu*zV?wxEB*?QMisVDO=l#N`66f>JvZkczSc zxk?N}XI_P+MulJ|cKOyTk=A2Z?&l|Q*57hHa{C$cPOwma_Paa+zc{* ziBGa1icxm0X_@GU6YJ>}WDW(eo^eV^>)(>rqm4ap!2JDvWz_aQR2VsXWhL~Um_;ZK z*V|C9`xC7g89T!u*czak3}&qjB_V(y)i8OpiBdP=UcH=6i|m+9Kk6p=s!ql3$>x{R zd^SCxTY7LNZBTw_CY^8)?Srx9Djt)9DscxnYv9Z8i#)Ti ztj4&~nO&0jC1u>H8Q=Y7rq|3ft(ci7%c5)Tpj*3AJzTb)Vd-kc??wt384F7xqPreF zi#a8&+wUO_1c~|!^$g=&Sy;aRpdOXrh|ZbOjvo4g-;lI72PYTaAJUGcU&jtt3vx$O z?Olv?xVPJ4vW-HSHF230drDAPZ6Ac8Lg`j)SqaYxG0~ux%D(GIq%9{Z`PQ(ilE@Ma zU9xyj$}Jy!Bx4fo$cf;8yG+LF)Or&?>{j6gq@%-fEaxdzw5ztrm%Cv8SeY6Qj9(?&iAuKRui|>GLRCB}^hHLIe$R2ng%Xdu z8C>JH$IVb(OSAuUJ4vs_yget{m}BQAA5vwOJ<3Okp8a1Ok4`=(k4|5l8W8W?x2Z21&k8$Wp~+`L zk-BwVPm544TT>Xi>Gd*N#3YcNJ91(FGYpCoA%eg)mi=n<&AHar zH-lQL?v+`vVs>a3hU~sU*034gx>r!e#DI@T6cDQ`$TyK5#xEwKj7mRLXSTLFH0|Wade@JBZHsBbV34EJKq=ndtJ!hfF{+0C}i#@^IA3`y!OOf=#75d^aHI)m$fxyS%ibiaZbY)I>*fp^` z2>ol++>t9X(#!Fc0|4%t#1X^;Bjbh9 z80Ipt37%$Ns7MQzottj5YrGg8vdnWmBragtEdrsLCVo4ykWd!5;DExn5<94gO#(x8 z_h1of85!60WF;@~Nz2-*FOnAB5FM;NnH{NYJhD4dc3yOQTz*9M(SmGd6zd`krp8@X zf&(>%lSU+x2RgrsJuHbBXyH<`o9NVR!b;NPhN>+nb@640FCC3?p^7+`htp+%%KwQ0 znk<#aF5e)5Qesz1yp+V2Eoc<6r#-`RhK!9BBPDGn^1P+(C$@#wR6BbBLS?@&-Yoow z4?`Bhj1$UQvv1n7wrYULf?tzps`yY0Vk8i3&nN2~l@)#m`lE|1DN&u5sn>qN!2atW|?ZrV4fO*`=-#8)Recba%MO_KmIlQOP4I1W2EmrqqVVWICInIVGOq>!-X zphQ@q&CA54Z2&s9uBMW=LmjoxJxW`i@YS`?{aO;16O&~?uYa1qh?_r=Y-J z4Phi{LY1B>rfSd+-Xs(f5age*kHP5)DB)bUw!*dbkCLq=MYIH`RaW#lRaUPb?qb>} zK4lrv`(k~uDxT_3(UMG0^|}d^1XO)~NbvuH;H3*GO62dNOi@9-Czvl4u8nQ-zph*Y zpowMcWQHlj*ja8Fd+ zOZjF^0xUF>6W~%pKP`hp+wHBz^Z z(0$OA`-WAOhQAJrkQWH&9;M5(rv==!7u<;+VtBR&H zM<11nP|{8SF|#KE2|}RIiu@y~MwDdYy8c;~tTtQ%WGqka^AbF$l^}X& zKE5iImD&=9m~9Gwm@oxs=I$&avPz@TP-#HPQm0Wn$q+Zgk{gVhk~a^b64Hu3$WT-J z%3VIuo_FcvT(wK5N-jhsMcifm@95EA(VX}xEVw2I`KhT>#Z7d%@qHu`UI;l!yw&6~ zgLxgIyqcNE%@UFPDa}=tnwBc6oo%2xbhRRbDHQFPJ7c`P*_GFcdpPfPkLN-^ zj+J~qqtDu^N>6i@SA^2k@LF8mB5@u?fScFxD=G0+wUZDZvDkDg&9ccj}je1MjGf*u89L>yN-FHw}y7qgFt`ykkC4pwossBTT=#wks*d+NEW}v+9dLwEWt!gM1*hu0JW?rLc zvuH2eM^ynqiQi6s;)!o4r=$9n6jO{;+Q+V$F1rG4^4q+@RgEJzn$N69sF7q3FJ<9& z>2XCC!TCZ3a)L3A~3{{NueyYJcQLmRxp{r9)?nnMr?7M0x z%D_+svR!cgCH+<`Gure1|J{HGPr(yu1C?jqGYwlR~`owm}4mI<__?n z$cgotA)kxMH=pmiM16h{S&4i3T>N#Fz8HRxSh`xk63&oS^FJ;*(K|~$VI@?Cq$cHj z7`yyox2AXaNsN@5VtvksbtZ4de}l-XKIAVePu9m(U4qTODZ%ENg*lI-g&96zCSgpE zubf7i#F;eICE|=&SnY|nrfZK42%lxQwk4yxHEgA$tvS&+*S2lhy4#lcRauUgVR*0$ z_SdfD*Ch;z|AT$Ra(eo<$VDR+2QB|QGrgkfJPIkz`*EGbKR&(lcgr6L#c8QJ6Jn^QXT z#kq8E^MadI4mHIVOeN{t(!5~m52O%KH%)=hdjWv;s`8M>%inj^-y`a8yZYOq{=TpN zo{+z_2l-qj4rLSXW)tGLq+Y2#q!jMR=DeRxh&zcY^RBQ`DRU&75M`~(>BuJD&n8Y} z6XMsP%HY_VsVAE_l1;Q{6CK&a``N^aY(kB^w4Ng*z?ik^^`hNy5jl0LWU8^bQU)c9 z;M;CHHNSbmqY#EhHk9*thH^+Q>PjxjB;5;sHfI#BYVS91Z;O1%Ng+%uR9Xb z{jccrOVArE@#N#M#61G+E^o9@LOwui6$dYJ?}U|wYHB=@hf+Y6pGn$5AD#(pJEqub z?j_##gSqEQm}8?*A?OHD6Ec+DUu=4 z=cqx(Q~rhQOUc0|Z-uZL!(K6qA9DH!?B5HqkW=gCln3mGg=WYRRzw+#WCKYh)duYq zLT6-`lKr%sEF!sFN^pFy*WH8eT*~5^&H~xap#mO~0+?R^ue?%JrPtp`63US-3c-nl zJcq1wi(Y5(D|Au-;K^HfkhN{76?2D2ou(U(Lc-zS8IJ0Hz)>9wII1@RM|B~KBEdVB zRP&|JBuhw2XG!)aDZM0FPEvYF(jqCV0m)F%nJ@iSLr1oBnCw!L(qWQ#<;;J`P2NcI z0XI2O5i89GofXn`3HLA<2dyxN5)Zj??gvW1JA%#*p3ZJq(pc}Y5pmxd(G`N3QTl>c zzbbfoSe{szb`C%c$i^uU+mFY=k>y{mOgi-XgR+qSkuR96dfg@xYOcoL$dA8CyzDgv zTazzQgiLQmS0>7bU3M~{5!nenDRNFc*;{{RsQ%<8`-K0c8D}n)Sz>Rf=!oyhW8txj zQfJs56&otn8|l?k$g6m9iapq+;h7iHa-=9jyTUe;Bbc9`SA)V|lN&$B9t!(T-t;*( z2tV;8_riBRFO>F_24{bc4GKR^_WB$fRBYyFNWULO>25orro|Q&W;mW;T3n$&+03-q zF{AidnHCktB+T!zDR!@94C=FwRjjF4rRGI4&rVcqoML|?8Rms4dVLd}5erF8;==db zO%Ez09*w24gyU_9c=&2n3==A4Zy?MC##cnnmvNHQ4xVm`iE2CfH~ftOzPQ_*Cg{97 zm+d|DfY}`1)0+Ur_A&p(G%Ai$F>58((J!U+De(h&727Jd0)E9Yd(RX* zUu-82ZNB*vz#&TbCaZDKk4%1|Iq1EDZtR5Ss^=C`hom| z@YCUcNuMt}co*-OnO7Va7zFXOEi!I@Q+s)eVLzsD59;c)I zvdYAYH^=vP;YxPQ`jbZ)`PXKgpMl^#Am|+Sg;FAQcEx)YhcOivQEY#n8ZOB{9S~;= z5Q`3fxaXfI5a$RG15XRYZiR)yCJY<2b*xt*?H&D@c`hE>?6s_1eOIbAx0!`XJ0S~J zqI1DoD+|{DN?`+4T}QG5(M)7i`MUsEIG5L}--RBEw`T}YCKk(;(96sk>qulW%&-p@{ zE|sQ#vHy$cb(u6>_JuV4Woi2N`@V=?UnETrJZ;mjtG&ueykAYOPdeEtOjM2XGtdXh z-boz`B2EyhsO^JOyhl0ieo&-(7Bff8Zza)hBaBGtS2y zN4IRH{3q*NgROW-fnS_5mfCeZbck7WN75$-|%V`uQ+DbTS`{JIM1zTk?!w z6ejH=cCJuj=LrOC?O>|dK9SLqh{SEAo9#Un2dCH?$`WNp{4oHODh1`&PYb}??k<3P zO>)5lI|2O}U4QZ&y9N2buM#XOT15fdmbyT~#B3J1U$n0fiM_v~O*M^Yowj|7-P6Fd z?7feJ0}}8gf5&xMA4bII3J1gJNq*^zhXd)|ll%#;K_A8ks`0EY?H}sJ`@51JqtmGu zS0}*S5~(#qfTgOPmGoLoz?pK^JQW&VdaFy%$8|-|^+m+6yc4Z*>`o$%yw7}LYLuRC zk>U`|lYABboKxZ6yssi(zLByf>s)N*1#{uoqMONaFA4Z?`bML zo$M`~Z{b zw0aRKm7%Va)K!>^q5mLCD!nSMAS9Wqu6oN=SM68L#U--EsYl04cd2#{po>9o^;fD< z2geod=pVE=Q@NxES~4j#qZhMWPL@5cVoJ^yvIm!Fv()LaI#yN(%87HZkCy|%M<}L_ zgylZ!$9V`>iJiVWQdZ~57FQ-qA&bj6<&3()+poJO?@_XnFXA?ny*)d*iHFSMhoO}x z`7Ay~YIycDJjd+!GVmt<2_(82q)zowH}su!ns=Gh^Y7H7(ARZ*xb?&1Bz7iQ-PKo4 zJ4R9h(L$nS^iTeYnoj{j-k**`$lY7Xy>#v$10g0ZSs*StEf7*714Mc1A{PQzTa?kH zbt@p!iPHG-TaFPxe>LnbBRzH0^8xa7!2go~f9Yv}7oCz=#+%X;sm`XTFO5A^oSfu5+trMQ7a-jUpci0Upene`s6(npQY6#~^a zP6L$;{tu|~lMKF;J00GKN#)z%CZ|q|j~V=1|KZ?M;keF)K~suVwJe6A9xE_b2&hsrgv^ZID9O5UDMr6~EQ8$NQ)=0SpKck$OaEV+Oa(DPA?Bc-(Z3hmCcQ0_03NGKBJR0NYrO2|ws-$Hl;dE!rv2$EApkep^T z5G=tx0#3I^o=OG*(zK6R{!KFmiX-A{iYay#<2RQV zx1$IzjgnJNNgWPEO&gaP9et zxa_-LJ`HUuiP|zR;wG`Z^p=YY08S@CS_46We1k+0iJ}`Y|5uStvQGZlTk!A^R56Xv z%q8-uiQp^vt0)geZq(VCxSsAQzw*er88@sx(jK?hG}o%_F7L%Rf_=R73qRUU*NC_W zqTS_AV7b zxqOUAwKrnOP>arzSO#Jzo}ajgHjL#`2LOn#%LM^(xWz0ZKT!X7(=LtlObiq_df?XK zx_T?DOC&seo}>G52AJgyak2YX7n=U}hgU{=9x?qNG^Y9upBvH5g(3e3M)Y+e{u~2C zSP!S#R*l0lj_mj@0-V2IWE8}4Y4WEtzbCLcCmHiz#mgLtj$F}Hw$%L8 z!yaQEyZ#X#lwt8*XI~7~MwkU{s3Sa;h8=IX*?+=_CrcWr)ocj)(YFz6HCZI-55#~u zHus|de*GkXBU_T!Q1=b1YK&(EX>KT$o@D*N^8;^U0B9A5pH)F2jrk8SZ-e$aXRMcy z-$ali?s`RwJO0u3ycxN~vk1m2k2~k6>0*{2tXkM#BS$lFrZ#FjG=0G(R56OE?E$>F zE7tqg8PVf;Gy9qTm%@FuE$R5Y-TQ$eb-=e}Z0t78Yb?CU6B~nb&IkJZBrk|VZN)PaP^f;k_){+_+|@1A7~S@(eI7Fo@;C+Qs}YtI^djffx@G_FjfkiQ?K7vuYE72eq+Ckrj;8Sa5Fmk zve7WXLp0Mp-27Br?%UFEx2J*FYL$7Z-qBVql^bm(O#Eic4t)}}A6Im297Q-u4P6&;a|JVT^`+)DkY%`z+XpEgzIZ;$k;oz+hx zgooW1Z!_0%{)X)3fcPwmVn>mc8?lD5p0`)6gV8In(O14;a#=mBWjo%T5@mt=MAs$^ zz!yK*H^DZ;7U>h>O$m2lC1a99tQ}$263JwKlne=*;S38^9OOD>BfSlV5b32nxss2` zTc?JQD_g?*g10tfdDfdiODe>bJ>Cn>#ydX=I$S1~y?_f=teuJTAqcwK z$G1;`{etwHTN+!^sc!(h_y7{2V%{2Y7fR{ktjHan64dE$;uRuYi4IFgR^yrNsZ~5d z1t4NoYDwdPdreU?5QEERqXE<;YI$_sx!+1`yqC4a?FSq@xspd=8bSN{kiBk#dn?^> zV_fZA3sJ=^A1uGycNsP}}pFPKmJWIv$2dVXJ(kypF`AN+Jy9@=Fbv8!6N@y8c zNZdo+zQ)?wK~MO*M)ZT+$i$$3Pq^cA zK|w9DRXz+uUwx)Y%Y)pOf6?JCwEQGi{6}tA#0TMnF2Ul9j|el3Uo#md1=K~Hqc&TsUzr{Fw62!m^Qtq zuQ7Q)pV!`PdBT^d(-~{nPZ$RH-b{50)8|FNTKYW~(nH4-q!Y-XvPXEH}q=aLK; zkBNCNvtmzQE&!|GK1keS@fjj49q|B&Us`Rqf15gHNnpTP<3#vD0ur|omfq6DF`O&} z@k?z5OrJ9WOq^cpCmb|I>hPM(uY*-m%rMska7oE$s#6N1~1cii&zk=xA+NWvt}3dQ~;r9e)#L_|7JLw&Vmq$5*nPQ}qS4%D*5DF<%{=*7|{(s=Ch-foW` z;3s*NJGp--xB^cy8WKvuaVwrs19nu0?Z7O#&sJq4y)uI)u%}?7WyK;H3dDCfG2C_$ zgkzKpQl`8=Fb&Uk+{H4i8^BHql8~7QawV`xW(@PC^q1WnVIhTo5wJzCe*)lxvG17N zpsdDF7&!rp5!4W;cP3^wNP9d8BanDjh>x&m5#Ew7$)|QtH>67}FDkf^$S$Mdqrb8kAeEiT$2j zFty-!Bs*`~?F}-P%11VLG|N@BTy`7F`%jfqRSB!N)It1;2k<>5PKvRFF;|iC{>8Fc zMj3*t!32EhC3QAemh$6it_>H;ujEvz6u;&2Y&J|9#13Xs=j+;uUCEkEvbl1wl(nZ` zmfb!{ESYD;rGzVHit{&jgeEtQ^ben}k8Rbz)nvC;G_mu4YgJd@n|q%mDky6E-e8HJ zRQF%Jvi!pcw@Jdcj~i+gSDDL`#4@cPL85l{ATE6?*6YOCkx*h1uU4)T-7K3bCpS8) z6xO<#9!uOc4z`F8xNuxyLy;4mMi=Zj5VHhfg!L(Siu3^_j+JR|20FB};wl(18t z=a6X&SZ1lo+wG znr?2e$MolFWHWXL5mM9aOJ6;Ar{nZw-5f!`0D`+d!07Zza?B?+T$vd&yhn1 zSe877AF=)20+zEfGVP8GT$}d*8ITqiZ{1^W=4LJZnc?FyktYO1zzYx(5D2S)@T{$S z1j6EbjCt(}LUt1P;Ogc!d)$X1Y~oId*flx!gMwv)K&^FOr)hYWL3r4Dk(z)_BzFbd zM1idya{sKbee=`9mfH=sAJeo8TR7jYs!WP5TmiN+AHep);Bfi3+cS8>JSw3u2f9F? z*Sj?l-&J(68rS9w(n_t#V?bKoFO!DH@ixpmrchQ@Ld*-@Tw_=DM`SWp00F~mz%}fs zAPTn5*p+bo3D86vy+mYDUaj!>?t$vRwm=*?vs(ZXg1thX!_sQqh%CHe2e9U zStqkFoU&t~to&P|$QIMl3~!I}MG3O)`&|RKwjq8#0&1!*&%ltcl!| znLz>n`}+L90GG`BzjZLz?2hd8&Q7D@XEMi&@7#KzYnE?UbAZabroqwdG+5)3+S~3l zb*BQ2RMSY}PFldVBTI0K+@v?M!4>c^p$ITp?^HBr6f_$#BUg1oQISC~#k%`dJ6jC@ zHrjz5%;j12VlQjB^x|yV$aVqh7DK<+y_*v>(K4Tb&=J^EJ)5XVwhPSY9muqh|5`HG2;86FvsVUdg8G>|9b!X*P}TMT#F zn=<2>)iUe(5jBj9I5T!NO#K*-V_@psfV9W-@6zku&ko&Icj)%IBqE&Lze%4zP=Q*0 zUw|;DXb-8DxxP+d5RTJlkb+@7Yl$6zwhaU_))Qc0B>{%aYBDj$w0|xv$BYHL!4Nln zuLroQqHdOgVI6Tu?#eJ~)8DMm$FS2g$|;}!5p6Gm4OH9zux)7T81e?v81OylV0x;kF&vf8tT(6}hYiWjPGD~>C@9#`UaI#%O#=V5vsIM1Sd3zS1d zTzg!RYGWfWkug%-D}|xT=PWPW=ZW zSE_4(Qv+3r3%W|=W=n)6UXbB`AzX?~zEn6Xf&01hFxi@&STBURwDyJ6VpYW}0wOck zMsi*RuQZ+~4%WO%Ek+mT3>0h?2AoKFKzlb(u{vOXzdYc7YlhcI2L{;g zxWY9cDO(MnJ-sqytD$46R@>Et(g>6~QK5o#qhGP3$iEApi`?owC{%HDi>-c#Jvf!8 z$dyi1qY_C&Z#`maKMvK=B!>RbYh zv1j?KEV!Ah*_kX^icij(j=sTt+gzn~9PZ7^-D4pW_ITc2*)=+&xu`|wPGr6QXFN79 zC4pPRFf?Rxon?ba zIe!%JqKRIn^GAV>*)8B;=vC<~6Btc*piO7l&2D~;v+OdJ|66I5f zykaK4n}P*cZYtkd7IIVLon_a+XQgsAZC~>^3)5?ktmzkvGv< z7Isr13Q8BnIt|%unec0 zw0(wsO@8FhJQSrKr+T)Br>*{ay?(|?)j#@~s)tBVTm4kM{+yGlH$GGKazd0r&V@t^ z&md>NaK6~6P0{xJ8CCZ50m&zDV$7mx2kB3WrpFYTei_|AIOrI}l)J-n&+w-YxaEj! zU1ei!vS{2KzFIq?cx$>Xv#uyTlgc7yvrJ$4dNW?Y*PxYHCK(VdU-DLFvR_fZ4>6*hx@^P!z;cEXQdVeUBMeq&Em1_# zY!M0r0qN*?ff^S zSM(9}e}|y4r__JZXQ?0W_0z)t6}|rXb5DkU70;g9e&2?^|zf;|K!h7zc}w_ z>i=^0VFo{i)R#t26_uq+{&gRWBPE}_Gry9-_)i8yIpVu)rmS0IC_5b02)v|#6;ayj z-qylT(bl8V*3W56eC;zG`!sD`@LAdtm-^4p)?e^~|D*)b*)Q>&{|s%7`YdgM3u&u< z-JEk7uJpR*s-fhd(PC}Dm#m?xxce}@p}4{);{$(?VS0>Vg2uAlIsX)rs2b|hL)Fmk zt=#=7TKT=S@@raQW`DX?&iO2@z+AJflzwDi?l6*1L7QD{?Fset$Ci838K-s? z(WYMPdhh=}-*W;vc^my?edDG>cgO^U^t#TmsykCo^*L&ecIb0n;NVVi)>-+Y_O76c zkdrTq8ytKSdk_`~;oxit%!1eK>B7N71Ol3sANh@d@Ly}|a_9(poCNTZVNU!0TQJ-^vdJRANeLqC`(;S_ZVO|_z z0-HR9&$T8yl5N?o4RyWm1zsHG9#lChfTwh4i=)1jO_&!*aGPWauAwX9Ag|_M&YTO? zAm?UK+>-)DxD_L~&oGjkV60tZ+@hX7*%-SBrX}%*S1t9OQ)Vi`L#HWY>waV2Tj{y7 zoR6kj@a)^y9dS2)ind&?Voly)+6nfU_8OWkm1fmg>D|Wa_N!83q(3gfw6iQ_2!_Gw zB$#ohBbcXTaF7Mpn8R)>FS_f$l27yTykpml@_6Rvn+;F&zTo>pM{(}7@^94dk1%S+ zyc6H%^%D7G>SGW3*xEM@1HE_WH;nh*iMa&UEOHD#8-4VgA^PHb&s3GzEek`1cZxNF z9JBYXTzHrF&dP@2JyLrc?mhE)Mh^0C2$kQNY6;XIQ3`!5=PKzhTK?evP2ad}vm`|EGmyJ1s7;Q&o!}6SIfAn}5?;8Ey*$gOvRLT(~amy?9dmmx* zZpHq1*Z(50+OPN;vBoLV@4FAMd|NP=F_x5)Bqn0boc`z$rMGW_dIJ+zLvwh%;I zEM~Zflv;x^M_zMEND%!=>`28%lhez;4wi*{-kN-rE^ zv*MUCkHDsG>s}7W;J{mV5z4h}b?Wvm8hTs0@d@_;?jj~f(gT8%n@xZD{JVdIODJul z1edmvH$)aquOkvrX5wi;S8f!n=HRS&&g$g9tLCyBgCBf~#xop`#s_m*BTbx!Vy-A?%t>uA;cpaq zjw14oVzSq!h+D#|YMc8~^4_lMeoR^DDqk3P#{LqSMPOx+^EuAf7eDQ?4!bP|W!;%J zW7lJ`dd#T6{PS4ujGH)+IAKjrS5ICyYT-k@rB`OdL&M}ZcIOAtJ$bydCT}qpx_P4- z+%naZ*PmK^;X|sSk(m|Aq=}Ix=WAm!TfjlgU;Ki1?cmH+@N*-mreFM7sE2O55%&EeM-ElxznzoA43V6^U8@jj5u=NQ$g8j8r@(2rN9zfq6nlkhciv$<)nLI2s%E=Sqe zJ=}kQMAzo$wdSbUyU0H&&8gT!xgj#TNdrkjhjY6)q}P8C%&= zws8D>HD_L&^TR)Mk5RDAwD+6#zTo6-n@_|F|D?W=XqoCWYw{5*_bI7b4yg6Tmr#lR zOfSF&K&fWo*_{<_s64Vpi{wRjA58U#?$&{}psk^Yo$%i}H1hL|a92CK*kj*1yjfvd zn$qk3AV6~WtUUSG+}=wKN^*SA~gW!*8OsG)Kk)HOm^t+wewz=uBKI^1)H-+(-&Klr;7>5SF8p#dr*K|1JUq4&%Ur1WFw1pkL8-uQ!n{EacIig!EF8u>&Kb>B z{pFSD7hE$KjsacUm(jo=_i~OswHkDfG|8c^m@br2ib?V{>QEcNo^#F@t#&eB@eL70 z_tbXWuGb&uB(nRKJIV7WWr&?RsevEcNM)Y=@CBUAa;y}i+&qP<_p9`~ov!KGA^ zp@R>pkfo7~x>}Om+j<2W{G@$zS18(&v((Sf){j0*Te5ll3~l9pmbPS@lWA)(dphP4 zos~(dHg-z$e+nwqJ=MuaDAKh#Xi!g|Y;*8q8NPd0{u*)2<-?21UrMk14UdT@NGW!V z`tynBd!W2+Nm(^kjD_EUpk zxV*wtKu(J(aHIW{oDY*%Y^#G|@=ENdDLEJ>uiUiV!|A7PBLf?x8h&hbSZvzrc-pkpp)_AjqL>)bDk%4W_v`r`grUTuvO z1Sh{@q*vMA|3oB8y+Pcu)b?iYd_kqiNYVClA_rYH&zwFOscK}V&4<0Iec-aVhc>>4 zTyw+!?GqyhP^EYmob)BKv*-pl-&LH;M+3bNBmQfRcHvJ&3-mV9bM<6^ir;niNXK08 ze$4dbj2!5lKhpNj4+71bTzSLIb?;@&x-o_Lo|tUo_VK0Y?BSlsC}+%2*Z-rrs#4nB zx{IYCbt&0+{jCsEbx&BGxiwqgO4n4%#oKn3d+j=IO_67l_ftl#rn4>6zkBA{cAMOH zTCq0q+0z*kjW z3E#OS@-(wB`vMF5a1j*7t?}B6r_Sh1tpZw`5DWn-CPY32<;w~?1WANS0+ih6zt%oCxlrvh^Zwr7`_h_w z_V?Oruf6u#Ywf)@cT?qn1vxdX)qI1LYX6RE&I)lJ55nbYXLVxQ_>l1@R`beJUeExC zok4NOlHsAP{=%yCE2Xw)yaW4D&aPKw)n3gHT_4T0nQ?L_>tg3qpR5~^n2`U`>u*FD z=^q{baTDumi)mqU$c>Tj0=r~ROyw%agfi(053;9!Rlp=H+$&37glyQyQ$9D%b&@M* z50{)1@}*wqC2C7$E$7R>r`S=XO3eBRs<uLWO z54RUK47_{aZQK~{+tqy`$DLx$f60k8tQ+1i@UaK78{P^hC-NX~-jW>Nqx?8`KpZ&< zb5ZP5w~wpkHrKamQa3y9dafq$k8?xZwdjfYw~tFdXDd?ItqO#lL@le>UT_D1LlnQG z#PUyK1OF)>4JQ_HuAYzB&3abHUcgOpLj#CYUCT+Ki&bePW4*6^+YaJxj_%aN{P))M zgBFX^cJ6j4o07vmj^i&Jhp^0vA}(k!7#3D;1 zG%4DL!tPv!nHy>AcogGg=E#g$cA&RU$<5RW(6O;f@|k0XPLf zhgW=_NIemB15uGUk2~i}-U&pz%*pzD^KS$!q38T6K4J;3oFo?3NZkSuy2#mbUnD~5 zeEuuu7D7O@S1kPy7ubHeUeB~V2`}0CaPK&Ua~x|5 zD(mR+Xo@?|<|H#!j1r!nYQr4Hc^IxU&7*m5bi(XXW|04JnGd9NjTdrA%-~$smfF1a z6C8r6CquPY;*`igw0bmEBVRa3xL0MRC=zPN?6nv=KgLSPod_*Iq)@ zVWPO5BTC%Q(n!}XhQw)pCx`7;tl@Bu-_@`$jD3&ZkC4X@PlT6TK&cL?sEyFlqm^y< z98rc5>~5rMoqMAxc3y~2oOw0bm}{Me)68)mFZHL)y|gL%4qfNn_2HkUN$&f1-9@X4 z(@z&EPIJ$~>0T~BTAca|i~X*u<)`z*4}L~)ksSVcVCj1~YcE@k2d~RO52r_rgP4xZ z*&h~Ov#((BhmTJz%Hb+w;@*-Wl+WWdq-PcjjKBvPJ^@UChkdL>LHaiajA8x&kVY@r z$@NFZgIARue}4Y)iI)zmE!BoDA8Lp#LYB63?oc~7oYl^Rzu6Atlx}APn%}K{4ZP!! zjI>`fQXBmnz55{oO3=G;=~g+49A2~koW*}HcwPEo?dl)UR((KMyLU+Q{=zxZ(`8Pn;t#1MDX)u=%y$RAhahL}piFafRQWS{qwgm@BNF>hCWTNJr3_Pfe~^T##H8 z@)yr(EX-T6p>{au@t6Klp}AV2fm_{M0xTF9D-ajU%puMYtR$fKGl3~qzSRwFqv*w5 zr8Jnvr9Azs>*)}9pR(W;1>hZn0lq(Ytl??!s{W_oP5WT*zDUh+dMJ(>$Fv zn;Usf=Q~}axqhMj?Bi(W2lsQ>lAXK|le{x>T2MAo`6O3N_GWV}uQuM$pI!UeR9kHU z^~b2cdltz5aWi*mLx-=XAD#FZ5#9fW9_<^0l{fTXu=LWTBc&$z2`Rywu$qyqZ#c;Y5%AYfT!!vBE6U=X zu(EoC{P5WGGBl1->l&tk(ij$&VpL1!-$5wYFJ$eJ4j+7x4o?Q#XLNWn9j;FNFTqwq zu@&Pz;n-@3A@v6l>#9RLWCRo16P{fz3pacZJSL_stM<2fiHY+&5A<#GdrOU*ELulseaiz-C+|1WCuyKu=4QQ(RF@UVt`+2QA(Rm3(lXLqe6 zod&XLU_|ZJeC2iDs)Tq11v7BJUkiY-beG@k56}kJ)S0nx5i0Ah)RNEsUrSc|o6|+v z!9Bn;&E>7J(4V8nLmLITOGYwKx4dx1obQgL#HbYTgRBgeTPbD9DQUKH z;sJq;NST?*5a^)-z48B`9MRyO4SAH#wy%NCcFX;WgjT$M;(ee+DD^&Z#LXQ>nUul- z6AeOk;_N%rYUFxj2DSdX)bbd$WOC5(iqGj($am-}C(wp3xd(%DzRdh3^L6P!*HX;# z;rXe|6(n=zFzb-l+{BdPU>g)q+%PHewS3tC$;L-_QL-Zf7R2Qc4=1f}ILx+>xsd8Q zdKBIGv}N1{5z@B_bOB99U%S7y^bil3KN5b9Yngr3+-L90b5 zuxH}eA~!(U1*<^WCQt~<{26mW7k!*YAO8w#_t-YyZ{GxWdta>0r75cOsE)ak&usrF zl_Vz4Wx*{T!-8Acz9i0a%wdLce)|~q^OX~;7GKoxg6Md%bVwVY2fi`DN4Da`Vs4I3 zbIP~#9$V|;;pM&Ai^qqKI-!k~6X%2{Pn^R;&(vJxl&@v12G{@ShH@rM`NTO@E3e1m z&gx&)czqaqB#N`c9Ijw%;3TW_*v}&1g&+Jij}HN~%;T<~@*P0Fn3=4FshSfU`Hi?+ z>PLqeWYxl5Um<^DaS>;=R_vw+8Pd=76#pQa+mS|x-|mK{lsTb^WmU@$df5N=JeBMZSH&WSWR&HIYE zOrC;vH#h}W_}!mRj0(eSvD%%=i6!E?arpJmSsss|Dr$OR-5{p8>wEa9lsJ{wC5FVC zNaUU)aH35Gwh7wfD_C)ACx1|H-&npsrVmiF?QHa_(w(|X`6VE3> zr#@?rX}{~PLE9-BQzx-V)tPeruSV2vJa1Z&macsiJ@F5;O&*b4PzN@$*vEUVC?!$7NqV{Wz~-*%euJ z*E$@Q=DKNJubar@4fy=^S#n9#^)Fdpl_OuV^|?X@U4IW7Rkf7g%9)JCg;FC=&`%i1 zs(oj*5Ej?RK4=f$m7Yo&%^1_wf|P#co$c%?~MFno`3r=0-?Gc z$?2&Vge*GWiaofiHm9SzyN}-joF2wXH&usrafz7|e~-?akn-lV*IiyMJ{CI2FWpkI z)h>mfzkYgU>(cy~zpLw9nPGQF)|I|V|DLEl{Gj;MT@}+-!qxrpzV|} z^!nnem9>#yAOQYz>#(Y-#(P5Z*6X85%+AJYR*K}vA2H!#elCWkY($zs)sHho^@IqO zhoepC!_av#?JC#S9cyv@{_yiDm;E|Z4&&a*P~FGSsiJmwKHZywx^kV5zRRy0YI5uQ zH73ukHyXuR60e}CC9q1dRQ@OA=;Dx(ODRi6#cpxxTc1JQ6I&y>(@x;JrhqPZ5XTI| zSPyfB(}cFWq5kf}PJPNY;MDg>k=61C7mKPYcUe=VLBGi<=*OeuIpOCfa3pgr-{9h=&He(202HJ>DUmnjA$}zj@pX z;bn~ZA;a9xF+uX-BJ{q<4ifw1;iesuf@b5s$X=rQC2Fti1Xxi1BC(vc`6iyT?u_(G zlP77~%O)U?kQs@lM72#jC13rL+V6$lc0=o&P`7^U(vLlEXqOv06%XxjDvxsAl~G4F zq5Bq*Zr@SqzP~-Xg-;OTB)?n3yJXyaaqCY!4XT$Ey7gUxb2S&l#XFmr=kbgHRTsdr zopO#jatQT1PeQXg&g;X^O%BO$ht@L);pgrj#ustfgzQ(2eo4}BsDP|| zKbWszFyA?Y`OY28S2&pOyup0u59SNoeDb%UwWv!BDV}JB+Yo>-D(~&Zt7b352?>Qd zyvjDEBC$cIsYt2DqOI@UG`_I41O#;3?ZkGUMT@_s>o}_}_wGg96DIHXd&!X( zbh^7Kte|yV2H}; zmu#_d0n|)SBMTy4a}*Ho9hc%N^}3w%S=+QmlkbhqK{Mafz5fqX zk#eH_f)nv>q87fq*e!`$N<6H3GKW!l#%6kv zExt8H((KLylCn1$PbI&Ais9=B_;VsA#`NVEXQ#E1{)Ut1FD*q-T@*@A%?B$*xMLmW zbRJ+kv$n|X-0y|9xgpNwc`|cp#Vh4d zM!i*Sf>nQR7$)tQ|E9l*-^!hfuch`1Y3l$j#6#~^Zd#fLZ2rdX3rJZM5;SO=2S~(8 zPOM>bs(fdx^FX!F%xLw-)JEDBP;5-jLDvfHWlJFCl&RnCd@F1|RHv8DU? z?|zNE|0p>om2Z3Sow{o#CJS%yLi;Lrhrjb{=16tuIOlLCue>%ox$)WxEV0#<$Lf03 z244B*;#=wLpUbV3L8h|%O3ERx}(ZnyRVs$^gfgZaFIu*~Cxlan)T3Qhcwtd~Rq|lXC!hw(n z%Q!M8Y9md|h3|Itzyz1?E2%w4iphqin_c9Ge)cP=>x&iL|K)LK@0rEtI{d5(e|sgl zA>aM%o~IPUZ`|@Wze9ytW}Bav+US?v>yBi0`+i7>R ziCasY#B~0ZzVmAAsIRKQH zjmnPB!!Mk~Wx~?hJP!2q?Q{Kgtfk^Vy-yc$WPw%gh^=nl0a?-sHE9U>KtpYWoIW^& zmXhy%A{HPU+#TtK4m_W~omv+!C}>@sZXcyJL|vp&T0_)D=zte$_eSiDho3q;mSbFA zXfGj!ikhVUxW8X!wa;E}yH?y9R7{AfG(^RO09ixr8oD#mMp(*?*iP+-#zwcqVV#nZ zI*~b8<#5#8p|yY&1(p!CXozxz?qsuJ!#jd-8!Lu4Vk1?a1Yn#NX$GI(NL6t;gw;&V zj-cUyJz$hd<*{TnYa5Pqnp%T!QxM(}gxiAfUI~xrq?L^T&V&FBl0-YDN8QrnPWY)E zW8KnTr}SNCVLJqYfOeY){oc+orxJ&R&|18+I%IA>Jl63qiHG)!s33#gd}wSO6;)}k z2o2DDzUSXk1i`sn(+LR9OUx^V;85~>wIsgq&sXFBmph4*A)+gUc#OC3ovS%cT_Ay8 z23;u$WP{M{I^Iw-2n&XY4|n08F9hq*wA=S5N5&Hj$xxuort&OD^E#nkXT(WGZ4_B) z8;L@u6z_Xm7RMbbxk4S%UrQgB78xvPcCS*;A#gLm(7c2Da0pc>cHwF3Tf5&$-uKZg zp(2LKR*^xT#*(KcNH6@<5g|wypqc19glPSKn*&)$5zhM$x6vxHCF9}*v!O$RBeqih zbw6nH$%4mDp zvrzLh@P^OHB|}8%fd&Yul*ZmgCLz&D z6e&3!7r>K?9X(ivU&JgZFW(t6729XCEB|lO(uq$vW3KbYOfB-pOel87Oeo>fDwX6r zFL9rNf0PTctGJ1pr2$)cMx|>8vyHh}aO5|6W2WbOV*rpDI|lg10H>6_i5ZarAfi<+ zvQlnrX85^TIkKU+8Qoi2hf&vuX?l22*JV=IrA`P>!(w+-P=Hiu3-Z|i zF;ZwHOidq=(&U~snr1Ml3$&BZr}QQ4=7~Connyzk(%h%8ZD}BW&-NdY7mN@>$SnTs*ieD;%DNZSl&4FM`=;{=Db;~fk z0RaXhwZF(g`&`i0lE`au`gTT}yhIM_$HH7M+U%5exKWl$BBC6=X=uu4c`mDa^ZhbP zb{};_I@3O7si}aaI{tezUcdy!-S5M)V|D!l9_J&a{?3Fzvmw`OZ4-Ad@kgZ zvyUK0LWeO$J4r6CYnZ%!=5?Yd#`#WjqvjR2_>#9t6Anni)wUA(yqwR}raCr~`?cDG zFNkH+{9q{a3GCP;N#-MB(jLrA%nM>KH}fPjP%P6LddzyVaU@tAiN6?>K+jK%l+fz0 zrv#bJPlxLM{uy-x@C$PA-<&f9$fBXlcb$=0s=Y%pzj-`BPLG*LjsS*ngP8$ky!GKcD0Taj+KUQ=Y%Y90K3`@;*zMDMl;qChw_nllRt`^Q3h0qE?;-|2&b)h+NiH zNM!70FZtDF>`DDYH**$vhT|Wr@sfAcm>xAqFNRq5Yjt}Ff8I%cs|M;m#F~CUmV~Yi z#KvZM$tBCE$Un*x5khoc@+&oH+P&mmW#(7ppacc9n#Z)-dm$-0cEtEL$b(kzZK$~>VY69@K#p1;}i z3nS)xLKDe4+U+q9>Zl9J2uVMuV+nQln2*S3qL6C_qyY6s^G}*MAo*^RQY_&4c0gFi zn4=N1RLdZ$ByXegJw%(Ir3)Q2TXjeoYNpH{^PnaG({A%32@ZpxQ|pLXND8AXoy!>A zz;_^8M${-?5_6m9ziMJ)x#zvb3K@7aHVDmTYhPooBBWhjZ^Yn1m5o#hSFkKWoacj1 zDF{lT*0g&<^Naur5-VgbQ8^f03jX>`hwXtQTgx8vI@We^MNbkKOPLKC=A|+j4M4!( zKg{5_#DWjby$HhhuxOeZt>z>+7ew4Q7?LKg*AP!S>^A>fhe^l-oEd=l^0`Zt10{weR2(TvY+i5K3LRsU24l?SNxXfFmNZ(veG}FO8 zvqdB7YJ@u$Np{E`cBB>1ZNV%Q#4B7wG$Z{M;;7GvQX*SxgkOPN?Z3{`!Rc|CrZ7|J zKc9b1A<-s(E&k$9$|)BvkD?O3xbq~B|1^#i9W~B3*bmmdfxn;ed0BO0EefJ~P+d2v z!H5NywE#>l-8Uip(#*UNZ}0HF)JuhVo%?w*iYJ0Ljojnq1!6%%n*cQjVs z!R7jQ?|Z6zo13f&VM@+hKK>GHN7r9cH@r1B)E#ckA(&cgE5Cn#s#%mhC-UmP+f@f| zo1vn;-z(zoYT@%)S^X(5`+P@%(m)tm__tiz zcvB89m(aLIR5#uIZ-($Jv_V#*qC8QnPL3a&&Pp6&Pp9#%4D)gH5t*)RMlUkG|6Txd-Rql;o? zJ{m8x?`C~|<%cL8*3CwP%JV*GGW?UP^T~u(!tXow8)v;Zp2=!ijfJ1MW4}?cW>cDn z{RJMjl`9B`<$R_v{b$fJddU|f&!Bc>dOFFUMA|9oC7+7OO95sZ+7_K_yUiv(o#cwh zGpxK!QrT9qeiWJC3VTuJmv3|}T-cbrvZ#!!(zN)kw6 zz={|^GmfyV8s|eQE_737x=_T)SB=@j*DB#ovE}1)aROn&4~h+$P@WuQ=hM2ONY(A` zx<^MJ5p<7AqvZKJ9FvH>K?p&HG+^}8XmDOE{8G-}{ns!%I>%2s;g{N-1zR4M8nYQ_ z^K*urDn3RPO%y$=iu`mHA3Ljxbo0%7@B=UTaHL;) zDy#QXk>&cyW2N}QF=37kiSB?|CdAC~f-*DWFl7>?%CUvn0R?SWmpLjv$Ss3+y3^$t zUnA&CE@DYvq0h1g6Q|g$Pv?@Q6OrWEh@vZ4I%%xNJV6#KIWaNiP&-^g#iv$NDX>Go zC3YN;T?K}Gb6XJ4{vJ?B)Rb3EfyCRT@|zr$5x|RukV>@HBj!rdHByW0F|U)U>*Eks zcttIL&qDVE5i>#e$KD6s98uWuM3Ep=vA(d00cC?H2wy>^e+%J1Q^?Ll_~Td_|8EGt zPppwLP+l6z0pbHegq|*{F|(wm0FguJ-XlU*H)oUH51Z!+z@X}EY`!4*EjF*!qMRSf zz^0CoboiAZQFxghJF}dqu2NB$BegP%Gh{L^{LrYO>PA-C`opssIqYF;rClLgVfUgzO|{uWu6^wMw|J#Zf)h!1n)`1Qf15VM z&*KuA9NsO{PPA4XPV|JV>8TA)Upt#}tacQsURij4th9MjMWL8GILR^>pJeiiUh7=! zk_C0^MMk85t@65Gh10i7@FFs;m;6?l`3k)iTuWOb|J@#hn>2jT#05dZ=X=aAjC`ta z{Fr^ ztqI405fxj_J3?jhEU&h;CmmvnZ#Nwhs$VC#%@`PYH7i_{8!kf0>K_P?@Hpo;A}6x^ z&dBHo%t{(yNiJilb&^xcSZiOB&8gfM#-6`EHZz{QtLA3e9|nUabD>06U9!odDYB+{ z4BjTp{AyiFR_K1rP1cnK{374vE0Nd2jgl8VKYRq;Pnm{;f?gi;auOuSjx)V1&wx)! z$~Z{@YF(|1&Hc)BIKrs=1VoP~B0GS>9MX8$w`4~rh!A3~mdb6t2hB>3e#uspfqH;X zU9oyht$a!rmE3#Gu>+FC29d4W0rNH?`JJw114V{;)y7IqA0Mje8a`vG&2_!n2?q0E z>?PGnJU)~?cPRTQ20A0VRJK$yCZCOzfla^@a@b0)RU#wnSoeYVYfUq8u!?IrGsgJ~ zKvkX0Cn-!JB|^QtVmqiM{xPG(Aao{w2(GV6Gori5D0J&z6%rUbxrGwIRw;$DMZ2~IAC0f%{|C0ct<1!9GcjXElsg*NE!<3p1<&9fgi!S?!>7yPUt{&4thoy-UH~B4gk4Ma- zRAG<({M8hV-Quw~6^+W$8aZI-CBL-H>SgK=?|>pWgv3_+sem)|m~FQRRVd@xAY=vM z)R0ZOygCSr;3HJ@>mdAyh7X#5BHZ;^0&=AB?Uf^Q{f?$XIoyklHO`zAiZyzZkgdct zSW?Gc+=xVfWAyk+-eYYF9ZgQn_cu4}>n-0{)ijWUdDp32U-uT6t;(v6+-N4M8X{#% z^tVswd6mr1A`Ksmy-2fJ=0k)gvgf=CBRQk1a=Wm+jsdq}-7xd4YD?J3sr+223{FMv z1gy$!_)DyAt#Ih7Aj7N5gCU&V<|D!^WtQ(T&*`Veju?u4d?@ymNJ5&IbGPOp5~x8) zNdi8WvntduUJ+G0~e^_70TxTB%A1q2BXKB8>Eip{g(_zRhiG&)&%6s2BRHw zo{bieM`87d)$fyznj%{PdVZ6KJZ*g|kU(SW<&d{(33D*z^-Chxxi9ZIZzuf&*3r4q$(CEMws$5%+Cg_kGd z*UFRIWX-p++0KIg3$HyVOOC-U=r8_g9^%VszP@y-fUi@0&1mgSaiEQ_j*Et6A^0~u z@*WWb~aL0>@f?PrG%XIa9mu4E$Fai zI{1<@?t+v}#|?@bdW~2uAKJ>7g<^xPsncE1Zi{Ym7qrfp=v;WfUb zblmm+bTQUB=@Qi8=Fs3_|G1?D>sQZF^Soa zH7RwGsF{-AlNcE#DtF6I@C<9ZkYu65nwxQw#>=Vnhnik~TI7!!soYDBzeF;@<6JI2 zCx0Xv;xNT@MQ-x|6?JHy(0knMa4ckQ^8w%hx^m3QnjBxyXFFZXel9p|+r}l2*0a?j zmU^~Y#J*!`gTdQkN7uv`9I|EZjug8xGFvQdQ0*2w(zLk6mJVo?Or5rLM|?r2EsaR$ z3ej}h(vroNrk+k)dY2tkcJV>!J>G&{w)C6`rz@fLpft1`l-|yl_Ip84dYfar?}m0b z3*MB{PWGsX3u-MEv>NR;;1FjEYq#m$8KZGTO8ujp9#ZLhndK z+~+;!LoUVQkQOM2mv4>xZ~=+fCJ~B00Qtk#>&u+lUS+;`pz4 zwuobkhz7R2%T}s6yz+K6V@oTq*=FUeOt6+oM%Pk3$CCN7SdcFvUMF;jFH5}d@RdRO zZm37V_IKL0I<*7kopBp6&%Z(x#R}opcz~I|i3j%BMYgK{r?>zSt{ChETb$(ppAa4% zfQgvrPpA8T10VEaKL->}6jc`lUC3_y0@o5|@o+b3r!J(Ha|z~fRucl{9ArVKi|w-c zl`++{Rg#PEC$XN+kvDjgv3q7_!@Zf}8UFxs8)Ams3ZaQHT{Z%U4H# zb>s9=jgvn_z-|5uUF5wmy`WJ3I=wS7*ISOkUz3bDmnG);wFw5Zp4hFb#Y|w4)9xLL994WJ>AfJd-kcBf^oPFED zxt!Pa1XoB78melCd=>zPqD-0?M|MF~83o#?unTKklh(#5#3v$ElFW%HjH&> z&>kohfYw;+7Ba3h=9F%8OSd=+n>cL*yv!$#2DYlf%YW8V2cuEJVv99QEoJ_SNRc3M z)nGkWiuMWFi=@jO=na$8OclcZ8;?U-d%_`62UL9VgzA*AYVh^P1#9 z=1}dyLGu=2aaS%^4pZR=^HF;81N1gTrb>&9yQ3&!YrEb&OchGRt>*I?l-gq+ z(zckQq8T{A4uRdH%;L-$jv~PIv3k`XuA-~y`OWlsoM|OKpYmmL>mi6Tne)qJnird= zndYJ?Zqr=PMtb>Gy~$1`A5s0+c%nhvZn_~SCH`$@jS?9eCDkgJ&UD9&Yk?CG^qhtm z{>E`OVenwWljIE!AJj=D4eQ29o)Smq%Ry5>`ITre8`hPeD{1LUO4SXAF^V$D)O^T{ z-(!9cC|C{!svpZpHLR;>>3W4NWLF;>z?D-*FaJn?!`=rP+Nv6-j8?;7KSslV2dZI^ zL*w;_+v%)n*hvM+`-cU)y%mZI^N_>_JMD~Z*sBB=1!a4`a~Oh=0-c; zTp-bBZM2Kb#WwTMMqBoi2ZiX)-ewn@cBRFPZFY&-ZgZZw%`P*)w9&fF9^B4Wm|sgY zW*)Y!GLOfZ`?bbz4I!aPQ1fjY%L;9VXKb23YoqgsMlI25x54IS8_QWdGo*xI|8JvN z2u;o)1nmE9bQnYo#@3h-HkReoc}$lbBTt{D;lh^z|?Bid+C@}Oq*}n2oTU}Zn57S5~O@Om#EYtA7d9Gxy1CveC_?>q z^GV@G&DZXRpI)nn(|1TVIkv6^TD_2o`)|g>Pai^`fJ9`bIQSg*-|)gubDW;9KT^eh(LE%X;@X0qn0BOqc$3ol!cVi^H=h3ru}4I_PFx!S zutPzHd?~2k7LkJlWV_>#l^wlyt%~mxa_reQ*Q%fJKfs$63Im@OkhW~$@zNb0K25hkDBW67&>9j)x-FU!5^!kdas9sI;-q;YtBh8)S92){2DMdz zfL7BOr2A*InubAIwJ^|b0D&N@I0J@~3>X#(3_|n*gHW=-00x37Yq2}u!Z8R_#zMg90-E z1I$6dU`A=sESMHFX?Iy51wO7Va}6-v>LMXii;?+qQ9R${oS3ar=E0dwgR_jL0VJbo zhbDOyivG=^*EU54N`Y#Z(^|>rRh0vFl(sBSvWt!v+98b>Y3W5lXg&h^1vA9c3 zbAynK2~!}*SEi+Ef>4EqoFHeF=0r)WwFn*92Ic;v^jcsA7XZ9NqGX`<1mDu+93des zYMW$KG$dpI0OZ~tSrf()_8QmYTYP2)IdJCn>71*o$1r)j{}Piu;9sap=9 zSftjZ>jwF@LK!Cy&Q?sulQq zX@L$|`cRY}gT1$?^GC_ymcQZ*iKIn(YzZEB1|sT^O>VJ#QBSYz!_+nm-D*yE^2?Q!u1 zfjv%)Bi3rNIlf?%EuCJDG5)COLrr69`p~K}4JX<`wXS)gH{%O-+X|Si*qs7%8tNFn zEbxGoX-kvphD;A$l2s6b54{^0t-R##B*GmuO(_Rat@4S$WM^#^%qnYF@XGtuCZ>5f z_soR1))cS&JrCVYKBk5YyGA@Y9)}Zl5k^ZbMb*%zCK69hTOWXSIfw9{mQK*nOBQTG zqSFq&C+RX>%eiIooPtU+CP7<{qguZmiqyU#h>$6L^C$LVgCcg#g;0~c1Tz`%vw z>P!O{)xBmx-RUlPLrOc@b41k!{k&!&XKY`yZ3EA17V zl3+_?6;m2fc$7vs`)5lJ8P|?E3*NJBW5!f7v-Vr-`5V?XwVMj-bVFE))ab>N5ocK4 z)ZD2y(D${jWthj*lr=<>%8}D1H*Qd|dI?7nlbhzuGQ8u!j5L+P`S-=K}x!W!h{ zqC|$tPDu}%JHzIthB&pk*_>xs*RU-QTGxh9DHb=&S{Q?~aHnHnZL(-s6>n*zq3HyP z+CT0C*|{a=yR;Q9jYljjwqUwv*0jP1q)nC>QZl-U=1vTWI=ghCcFT{U6SNUzlzGOj zHqGIL`fLPedRs3eC4*n^KRMV3i(~gp>d+DO&QCRBNCO z2oUvn(3|6fYSkhpO=(B~HbTc9B*^efx054p7(|4{O!MiY zd6WE_L5!4xA{69;BE>46h~&^x^MT<7@9D}*Y3+JUYkin~tZ8i^Z&Ks3^GLz4M$-p!V+9z5_!=07 ziLYo<<01~5Eket_8{z8$qNUOiT(o(`LM)Vn^nreHVEClQ*%y$Cr40-nAn1&Y6@V4N zSN5dFnoCG5*5Ju>-!G-_h(}o4j>Z~mP_1E>>!SvgC0NL)V!9!m==w!AnlzUgHCtX5`c&iXIfr-#a5i zJoyhL@#L*#piHblwPz%{$uEzKC%;^whKL?>ix@2s?(}f`nz8&tr!Hos&q#u_&^MH1 z$~969Z5fdxiHsrb9nrYkwUXEzwDi^|TGyZDOnm~F#l6ujUg8!cGdaG}=kIW${J&E|PZA>4dJge1`Qz?S z1kuNxsFA=knj6bcHD36Lf5eOGj_et4EItH?WoMZekG997`?Z?t$PQFj!RKRA;z>$K z#ztqX>d5y>ywE`k2=w|c=R=I z?0r%O?|yD{9jar=x5}f$V{R1RGN;7Y)Z|=wgEO|4o|FREDfxU%`a`KUsT_(q?nQxe zbDVh{1p&L<=y4~y$%~?&J?2HZVou$-5O~v#zV7(1$D?n@OS|1DNe8@AO1GZ(k*WEWw#Vc+9w;Geo+^+%Pyl=P_fsE zz8l9)MCsZ%zQaqq;-wsmBtsl1$+K7T5WiWVe_VV|KW;Hb`(p`sSIXdCiElk8fuj~L zIv_$j=%*ns`ighu-3;W|yJ;|bJYIUxiEi|wFMC(wyD1*+bE8|OttZ_mJ=|`~jGZYU z9Tnu!Ed~G_b$}g*GEH>H>EqsflQR}ybaA->z`I1Avm`9Pg95zmAiiJ&YHp6OSj{OO)}!XR{m!*=94ksW(*RXAfw;! zcN}}7Mdqiz0*1Geo8{7XbQgBGBHRP;jJlUBd{cNP-o3?I2t(-82e9Z$WLh!@?_o1v z&XN(ypO&o7&*4(1#<&grIdz-F;F4-_8(yZD2XmcJk2!r34uUeLm)e}l9gBa8Jx?A` z;_`Ux3xJ-+o`O#QqWx*e#V2o;6P2wj(OCIG0{yZXG+G0~)DJPJoURlX;0zvIop5`L z_5k~&$$^WxiE-w;`nwEGK(qNa-z=%J26UCMpfDuZ%8S+z%?5IRi9k`%=K59nEjQy% z+n$m>F+)5J`Nt;VWCetAQPF=pUb(ZjTm%|1xgEeu#BS3dbtG~k)BGINktoTg`PCgI zE-$okyXjSP=mg1%1^O?Y)Q-}<)q}{82Oy&TSJ@5;1_=Ib41gm1s%*5~C(zy!o2hU! z!0$n8Gvuy!!(qLrT_k6@i;n$oSwU_G7%w?3{{`uIJUQwxDwC3Uk(>NRzwpj{^N`#T5)-w? zOaJSLaT}V8x*r1zH9`w5H%FURN z5&O0sUj8e>4J$(spPUjwv2En~r^)?`taX=riF@H95Cl;{6RRf#3KRRO*i{b zDWZeSWyWauRX2*GrI*c4LYThYD67Ic^G8kF<3wB4x-4lZbYO{YwAb^q%~p+J;2rX_ zoUmH>x8<9cBpTkA?~D};PApPomibi>T`XxuFaakD%bHkhz8fTzNdml*x)G}?A+Byx+GMCxU;5pt1{Dq9&(nGWG7pp^v;#UX66Lb!q7hBJHpU}X`Z z8K%tqWgL}9+B_68;vB_x1Te|em7`V2_;MYD^-?5fxg)+0PAR+ou1|nfaV5btfgV!kk~GNTs;tArR(iQ9b8!GVbLxK%dcN7t)R+B_ z82X36F8c3-U1Saj_ef5JYe4@Er_T?ss8aR@rWv-EhnX)j7~$uuBY!6p4=HdiM$y3- zzb{I3{z`#Q*eUYgLf%~EVWT2l8-?6CIg?%^g@SdxK5d<=SYF=A370JH=Lxw~x&EJI zmA*=GAribYGE)s|6TcNYW{WEsdX!4{!#CA$sM#sFuU{wiq+4UQ3{I8$!}gLq`c`3> zMIz(zS{VP4~%(L&?Z`(vR1`}!$1B_Gb~p{Ea?}-%9#}l+geP~)v9N3%6CHE#*OPcgdT4$v zWRA|j67`SBZM(Oq#avWrhg;B_niQae|eju^W*$I_*^W9<~13eq)QHFsS|#feLlPg$E8hL~|q zvhXr&R^m;UWh^iJ!)B*o6W`$<;L~$`zRQ2|2w7=o_y2Me*GJsM`MiDxgX(p#n^bPr z-LiA(N!OnQB<&m}b1Gk1aubruAIZKMhax(Y(+5;V3nSF)u`eIP3@5&rVa#$a7ZGC& z$dfOe;8njO)ggaVWA{@|c?&CN!h4wxj9e!y4_6@3jjl+)?)sc{S_QIi<;zQ7*Hwf$ z>trB3+SKw=6`2rhKxCFHUJK;ka&b59pMd}2r3KetE`B~sIojMNDs*-xr5oH1<6-sV z66tGzzy_W}4u!4OF_`uD6}arot=r!cTZKaiCdPRWZ^E1G@8zw<)e?jE<$v3V{xW&q zVoCV!ax(cxyY?t&cGl;tCr@y_FBi|BjQJVfKqW3yY~qw2QW%Iq(7@q>+xMEsj)`m4 z5>8AmBSKEZa`4TcRMv1Xv}!oj3rQvJYekX&_Kk94y5o>na7Z=_ycg0|x6et`Wnm}C zS{_Y_&qAaNkw1FnNr>eHl||v15%56fCB(!Yq*(jWgN#;WyYFDzFs()!SFrOd~*We&Nro*y*3B~Q{?l9ez-bQr93id6b3 zDpme28n(ftYbB{flTbP;IenkH6kHAO0p2{xH1j+uPisBKSBPkvC9ucT5E6B|Ej>X) zvWy6>CTj@Qm`X}lOF1r)%FqT|Wff$Z9t=f8Q$<>s7582F*@6T)i{kgnGF$_{@siKl z1JDgkbA|gAzhs%h6A>jZax+5h!k4jrzo1lXOV#Y(oZ%)Xf$utjBsDO+M1~vzMkEk97dvW zWst!M2Cba19It;ym!y#qjn-54HRhB^#%u_X%Q&)3w!0&9O@9!{oWb!^k1-Oa0(%?a zWEvJZ9Qy)EYZN&a_5XnD8#(q~gRaftx5PPDR%m?KKiF0~MRrs{?gQoq@scAis@TKi zP~gjqTi441C4on^(R(XQ!hXy(-{zz1mpVL;s$(LQvEsdMws=oym)(cxXXQ{f!?%}w z#*w0+1?iXrNJ1zd(ij4QwS-NZHaz@?Hq#xapIO$$ObFM@+YT*RPYgl`#Xm z{)Om42^qzTP6$<6prB|tTx@y}y`03&@(QHiyo%K}h2aX3ofXc{w&BWPX}eUGwyiBJ z(kjGwiAWz9e~(9+@gm$Ra*8NY2ny5S7Leyd`IvnuH-?o`#TP&4n9S5vt4Kkz+O1|S zk~OI?*hA;m9YZiF&gcW0zh16c$xSE!?Q~zbUEnnQsR?c(r~5@+gOtX8%sdec!Z_K; zRSA1p4ooaXLJ`mCXOH8arBu_A*n0)%6&g66FYg=-t^x5_7=2L z03mL+aUMDAr6@JJ{${)A*jo>XsS4O~_4Q@j7uaqxMR~)3M5tLfx?E-nJn0>GAY%m% zAm!SK8KwJ(7xjh`j>z^j!>7fC6CeuFlD&qJHpA(yFq+3@j_UOywZaI$dqAd^dU2GV zFJhSO-V+v4rn8{ctXDMjVP#YAj>@s%EDEA>t77wnWMP6f>0Dwd*d0vI5_5&l-A5yP z0Yr;1=E@Dq1iVKOsLUw=4;Tn%5e7nIBnlXc2}pdEurDT8yT&tB1PXEImF|d05myKl z%-|9Qe6u-U!@}mMVJ=jseQz}hZBOehu^lnXhCt{gW9+5-1ii0-N^WmO?ib2o;no97 zhqBdmt58Fga)yKEVRkf@r@P57oHF88EMW18p-Ve{B!KQlvP5pOrSPOD@keEq zP2RPGhrO&h3w2>2ehk0;4=Ow#=cntlb#xR$<>q5AdvKlZ^@pv0mbYcWK~TDrQ{M2S zXa6j)Lyt=;%#-?k&`mCyYknf%jD%f%H!~Q?$hToJ)7Qsh5KS-LGI=I;hfI*Y8A(_m9>9h2x)~G(5g?n|JA} zY@N(w!b0hWll%sL)z_Mz5Ect3S7S@tZ{=%9M`Le0iC(|hRMTlMaba|e?2Qtik^M;@ zy47~J84ic3Do+BHD9HVG)eh;l`OxACUgG*rmKgdxxZ=e9Q}S3rIfrm_w#6^)W{)6p zn>U8_=W;nO>5uGWh_S-TPI>iN>x-&e=@P2@!5!o)GsNQ;>INrqj+e-dZkdW9$@PbU zE))T}LDrocuP<&|GHnnL+TSbzyI+TouzIudC9skqHKC{`kS!kKv?!ZvxqR(X@RC+A_!Q8|JF1#WkssuLTs2G~jL@*Mre~wi&_*^za z!|?jznejwqqm#Jr6K|l*j^I=9RJ>h+dPJ3W?#qoI+>U z{O(_!r8O9Q5J72BSdFNw9f;9Md=i^E7lUOi|6(2JK$ETy5pRcV;yk}ReR^Uf^Lczk zNFXggOiheuU%PVsdZG?{qN>{I0S$o%Opm)iA%8rbD-if zm)8NXE{C=$9eE=V{|CIvwTo-wiR&?Ujl#%U8!2Hp2GJwJnIcOO1PVb+=(sl`<&?rv z=75=O;XN11c~+k~gnbNj|K@#gb5ec6u?K2Cc%$xt()a!FZ01~f-{yYZT!`=m)gTI? zFuPne8_7bBmmIp$DZt_Y5frisZtC7Er=656)VL$|Vr(~)vfyZm>mUy5DQITrEE}ux zCa<#9>Lf(qDB*YXwk$(TTU`Y) z!EQMrr0*~t80~Z#%)~ADo$UnWP~~W0#}YJf1T42u^q}sRT|}>2xuJHx>|uJR_C?T( zu`*S2*Z{(47ebwy81h2bYuQQ@e(G6kV zUtI9jyWCj#(Y5ubrrh<_IzD2hTk21Iwf3&N?RP_e?vkQa2rpTZ-`^ecH*^mdZh2fa zZW0;u+a}?#_*#GaRlQit<@Q@os{U1q)O>nT?r@%o{d5gm)w)aN@L1{;*}Kp8+qsC< z^9Q!+Sw%Ru3$NLG`Qj2P3$??J#PnORwqY-h_xp3}&W+*ThlRI09Ni+H2U9)u2lk|P z-&nu@0L7j9lk!uWE7v3ka3#5B?`8LBpbz#v{K*?*S^l_czbeOHlwa*Tg}1f9k69(k z*Yb)%n^(Tkt7O5ugx<13RW^se-&C-+@nTd*?a?h&D~`(}4?jdJ1CesNfxFNgCRytg zY@|pFs}y=p{Iz3;mKRd8FN=l0-{NKS4upR&{QYJx`_}yB9o(ts{l)1;)a+zWEgH${ zwQ=>;fXq1Xz(sLY`1`F+_Jrc9<=de8DqJU<2f!1%6}+B^9G4&d{#w@RP$yL~EkZ$Q zB9Ei6l;Y7X#-oUwBBklu;f1%eLfp*uY*H~ajjg{0Hg-&WY$!8ZoS?QDuR+L<-C| zZ^&Xr(tKet{5q~bfz7|_BPKA=ax=&0DUybDi*AEXjt=TBPYKgHM?hA*6}ju1@L!fP z2`Uuy5L+85kVcAKo=p+y%X}?JBf2(1S#j%=n956Mq|FG@w90ecRn#T_9w37vxXeT~ zM{Oi{Y?{&)KwxgnjMl8kZR9*jpRJ%j79{d=mN=v$@q9^~tBLmpiRVkAGt@81rqnp!%+@Rtl;)-A zB4Kzn=FZFnTIE8LB+NF`G81U=#mI8zn54}$AInU0B&{(>n{O^8O~!PQYfmmLbLHeh z`s$O~;_dxi;)?@auPCiiavuvnhaU2jNKhPTa1;4RGIGhjNw?TcTqofW_qlxYA3+S% z;}j87WHog_kGa@^8a`KSRt9-WoCI0UG2aZrWjI-<7KU$r5K}=6Ss1ukK@3x=MraBV zRANLZv%P^GNN+?y)2^^2%LxLBDG54UW;={<#D|hM5&&5mIJ}W5=Drtfx{76E4&+6w zZ@3&mYLG1~TQF2+Pw1B4{G?p6#7lH*&rXZCAAF*Cil9pLUf+^r+1euw_L%2n)13$& zd^o6TI0i>lT0hb4I76dbQMT_WE@N62H5VGIgXWv65s;AV{N%L_IczCPWfTOm(UX0< zY~~b_R&$*ESQWM9l&T~-N^MmNW*j`3-ByXFA28)M2*9EdHkT0uX@x7A>LAg3=c?lR zxXG4W_3H#D8G=L1@8HNwU&qSAJQm+vo>7dIwpSN4+gEGVo#UTCt!{KPC5HOLZB!I4 znpG4oI$zCqLg4emMLg~XZkN-MaQUOEgI&2IB63)`2-gEYiDb!V`J6}%P8q`G53BM7 z=M2lA(69bRn_1lYs*Cr**%4k-8<~A0vAI+&v2D^s*`1LZj{GF8n_Q7k=2Cx_v)*3c zmT%%B;(|tmy!>!^b)+g>j?RXdaJeM{kQJH4nQ;hXu8e}D#o4-wkrK6E51wd5mDNPF z!z0$uJ)9#NA1T$aH*ej9Z}x47VJ(>y<^4%7GQQeBY93;y#(l#{NkUeeA;Y|!VrHSv zVy2wZ)qs&_Ueth~oAs0^SJYfAWHL!Z5CLkdgXRW8A{;YQi0U!Xi1cb_p#8W~LJ675 zXp~--!M5A~HGC=wK*A|=Om!stEllQnTBGiiIGfdD_FO4-q{Dm6*R_3B#x16rHR3@g zx?$Zv{N}hFNVNd0+rR1fi;;Z#wr>Bar=-~SR#Vbp3z{9t#$&aquGgMy9B4QzcPM~Lu2z496NTO=e$-NC=K zB4SJ+dq@WKmw~j>AvW~vv}T_gnPTaS{s8Ftf%g+4MdVcmyID|thrYB0`y)&Zbm-vER=6Lb@&y;lxZcPM3XWv=qH?mQB0YE z(!q|vE6|Y-g?r2+n$=QU%5;*Xb>L)J6O;ws&8K~Ji7JJnUMK)j=9fd6rw(Pl@vO|j z6HVXH%oOf3AJWXK(!XFZGY}9Hyw2pMGxwNYs8bv5F>mvECK#d%Hlv5YXc@}9>a5Jc z15HOug6jIrk2JG_kr>QO5J-Ars%AFp(z$!g{GqCE=QHrgOn*R0DyAnx%nvoYP?)LI z?E3k4nq8iBl1Ua!>o058{W@KH%p5|&=QN=**i2ct49*lTtBouQk0=X|SX2Zb7xtUU z$8TZFkv_Fnf4F~`)PjVzvJhc%g+6ECzuMH5({M0c)i}PU@!^?YrvlkKH=Hb~dtDgn z(?mp%R}HIRv+KXV%ijHxPb@yGfs(@tRawt!v17l{=T3#~K0+!LDGPok_{PQiicyQC zJ&G4eanaGpIw65$ztL?vCxohHvU6|c^o^y5LR;iY3_3on=38L8n`JZ8eDX$ltp*-L zIesem@ppC{;x?xEi+8dwno%5s`LsokyK?TFM`Xn4?v-*H?F3HUbFPb(woR(Yxn6eC z4FhSX?rY~-r|trtSPd&v3t%wsKMIA>qi}*CYFxBM4>gG$QB^EbyH6CVzuPVP~0f3mc7(L|0;5{N0uyj5n z?Fs|J47f*^GdVm{Y)0!tLY8F>tq*ELC^G*ci3zgFDTNxfr>UL55pav7TPzm`Kg2KM zYnkjbSisdTzej2>Q?A=;UX~od(he*_P%5#=vV`(QTdETDR8XI?dhCHt7f-GAtP8}OB8~eh~k7rY!%q& z*k=W7Tvb_il16u#2HbyV#F)irh3_EDu0&PyW|jn+{y&@$6E6DyXF|x}%WMcHhS0E* ztoaacZZJFE)R7pPA3F!<#{y8~B_AD{AJ8i!K9gPgbV(8lV1Dd0Rhn^dUg)Z^M<}Pr z6sj*X=9rx_nxuy9V)Ii;g5n@^_Q?SwRuYD|cAGaYvqXVvj}{&BEDF|G#DmQ;E!Rj6 zrlU*&>7`5wW#!CC_!mdkWGYyKN8~gs$v-$1gk7-ubF_geVD1tp1*c4?t zL!tjx({omihXa>_+8F?DHKm$^R@3u9u_Z{z3sTZE zf_vc_Df3l617_7{{$2y(6@j~BCE)eg|7MAkMJ!{9LoyW27C!BVaVteNS^j`M2g%kW z-@Jjs!2y|an7^nc@z77GM@}X^Bm?FCLG%&4z?zl#@uP&pWgp$ado8kL$}#6~*~eE) zaHdnxp7`+-WDspSSHBVuJw-rx9(qweNqlB7aUC(34H6IiQOfcB zgbKvNytcr;4J^(; zeO?CMhYt}1WM2LCNsmlA*^8PSS4C97z=e078+Nl0=FB@HL@Ln1# zCslYCqSN*KxBm}&Zv$U-apnIf@)TP1n+RH{x?XH-!}_q~uXdx=nn-|q@m{1Y1+7$4 zv|tsu6alrXBoJ7=y=FJtx?6u+x0~&Dciq4z;(8_AW=TF2`gurH>OH3(rGRs4e{)*Oy-elbGdyWRc#%qW_w4s zlVE3TCs)4mxfvjQd*T`Q?PW_$g0;BcDNhUWK*}fSx^m)Mh-ojlJDlc^d{f`0-SE?3WUS*dr1saR?Df24W_7ygd_pM1rIbh=)Fy zC~4tPFA^O-JsW#OBBNB#x(^Z@-V(7#Ok@lOV{a6OWAc}3q7{&KHqhzAIY5-sKBd$r`__osF4 z_m}yWVQ%5A#8nZe#E+7AfdXp@R49x5^;0^#%sbk}%R_A8jKR~RZ_Fi)H&LQO_&y zt>h&PNh@pyuJlmlj_37?-m?;rV720$#f02SU1C_-y~@}39k}NTlRo^QQrzuezpJd8 zr+Y>38#uiO?Y%qm{(!y1Iv}xCl_y<;s|#CYAVEJ{?lFc3EGZ;w${UtFVOV zRY>$S@qR{OQha84%{zY@P@XP)lyrQZpAg8k0(t)YCeiqWfnVhny^1)u5A%xl^1GG( z<-RRfdsADzqIbNh`@Ly9h4F1-H&e%}y{WqhHht2YcHYl_fc#Fa7dmoMe*_K)$xZ|O zj`F=@1!gP~{ZEnVxDq5S!BHjXP=dRafcUPS__y_*XBih+!H+0nq(vO@Gyc4=$WPD( zWSH`EJ2+R9Jw+IZTP=m5f|j2bK49-Az(+_kx3I{HCq^atL>aa^0dk>Rp~!_EP{>vH zT@v{p6>5m}iVhNa7wv%vxv+UfEduzea6MrOpbMe3povrmm2rn9I_{l+hgIcB%h(2E zw|!C>pS9GKTh&1Br|cbpHueMlT@_FDaJ4?Kwa@Pg?`A!^1!Jcou_6`$Tf&h<9=bTo zz$-dnb;;u>U092x>+ad!))jW1ngw>6Bp;>r?NzOi)Z38^QjIh|5ZI~8n);SYl8zh+ zR*NZ7z%f(b2t8&k5c;+@AUyX!NiXVR^?kgzbszawOMo9x{FBBq7gF(ENF^nivou*i ztVP+up^5hg94Xd^0Wz)CD^GL+UTVp|317|JrJD& zM3*b~tKtewD0)L5_gVELkR*D?D|*xT;a<04+P=|y^C|3fru!NvS#-?1!D|l%y@}hxxoeWEMhS4D0FAQ-BC*0>*u zKVvM@jsR~(J)RZgy`s8+67xHj-{KBJ&y>2Dr>3~yCo1^$iq3oBd+fuh?uNtimL=h{ zb?}Mb7iq6=^0y6eRXHRke3ZXt-ld9c{9S;Aygb_OGT6j`{`Ke+Ekr2LRPK#=vM|9L z`Sz$s*r!LAH)dF&FwpvsK5F{jm~df5CPo=NVisg#qyPfq6)iJq%@(_0!s#TX;j@E5%%TIw7vKQbdf`JXPVbNLS&4pE^j ztw7ws-*y38r-usa)(461P?~l)^a8Pu*;1M^5J49RsqH=)QlbpRjw5B>Qdhm+`Onru zm{6;pyrNF8DCJFk*C46Hlo9RizHL_@8SgEv^84+hF94h|hmq5p`nIK2{g3y~uX=)C zDBOyzP(SW^2-ufU7u-~&xWYmR-pT-lYNmJA_*_A^9`~k6$0JvQ7^!b0-0e+0q{tIw zK!>voj)yp0gAL$oyr~Duy=jBqf7}hdKQaps>6<=TPGOYiNwc9SBn4&b3zTas{r`)K z+3pqjYm?|#6~wyQ0x&K%Me7WX$loMro9(-Vn*cj3M7jdTWd$U<79*ArKz41!ZWk&T zxAh&BYOPnKYJC|x_N#z4Z0osINY<0~=%qKPI1t;W46nm!D0&5DmITstoI*uhm#l7JpVF0O{Wc!HZ?_M>PnzHnw+s+(sELKndUi7a&mslyqntGQaQhwR{Xv68m@JK9 ziP&evYXVbewMd1n1DvwFItmQ%S16okZ1{0-<1{%3g!t@R}lb< zG+Ap5-qDMS|AMvvN4=tbWZ2{=lcoz^N0{l@yBtN{ea(4*B&8@&HKdekXWndYDJ`$b zr6Oi`UhoMhTB^gvt!#p}bY1XH3FLiy^Ym?srttp)GYTt@V>SHz6`~Q|Q+~H#IOanw*cSp9%enV{1+@pyq^F)slUzl?K^zNqFem z;LtVC>Km{5q0#T^D5h9#5qW|`aRI6wONd6UULzELO0XjFNA)=pw{I8^EBG$Gl;8q_ z>RDnd3aj|xO*$xVweC&b3~zPrO$sS*k{*V9&->G-f$N(W(PCxry_uVQLp7BYb9M4Y z!rTTRdu5T-;n3(kGMoow5N3n;uaiZgn(Hs0R5L6;7`q-9ZfrB$1k-(aaP*NdXaB~X z=;Qe$VnV+XlcX%mR9ZqzPW)*jMc^tF8C0aYKv*P)sXBXoEfBuMXRLXbiy1PrTQ=Rv(S@rE@u7;~-z z21u^)h1gQV16bA2_u)^P*(ligx@@Z)(4S>l9V^S~SXov}07=Db)3i2WfqTErF0A_f zyAzD0SM9}7l5OcNm6f+thTULz^nP~ABHYszY@S9G*UBZP}o_9&0&LsoZBw9)4?0Tc4M&St878u8ydYU zIQq@d=tDtHA_LuMyBu*OgB8=RviLKa%!Gy>CA5do_;{6ODLR%ZG_+kxFc${p;&<~J zR|`Fl&}{Dw$Z0Q}k;X8opP_DCa%t-QJ{?ykc2hFL%BsK^g_zu>aQ5g#+M)*DT! z(3&-(n)?F{*Jgn=G$S1`mUbu0$VSj+d$LUg##5A^bS%w-Co1K3`?A}B$gnHIDWScG zF@)+pT)5WW=N2Xm?5p<1(u;k?10PPvXR2XUyyK`VrSb703UJeJI<|z?G>TUHvcd3e zPWQJ_S_q+-jdTWtGeTbNbx#L$(r6q zOH5#$AzH76&1XWf2lBY>#nK#%uz>27z8#5Gj5ILakr)n~LFxd3)9!&GYp+J3guPhFR}*AeaOW{Jkozc(Xy=ZJ(&dY`OhO#~mZBSPYLCoGsxd<3}PbNRvkz ztxm8G9HchVLMV2#o(Unmj&0RZ~95cdtFwgn?zW%;atR?A#x?s5T{j4KlX^t6T8w}qrgZ8pL z-?y(=zjjdR-|gsJ0VC6#J;Z5bmW?Ij`zdsb>4bRNP0hC$8FmKQA~jlPt^|j&KjvL_9&u2J?mp!p_goG) zBXVr*n<~_ z?tH712d*wrl!rnKzh1#(g?~=EjUbc`HpnW~ zvjXDaCJbM9@*gb9wqVyOp%^0S=K;d|#dC!};02w3aB?VJjk#F7Zl~g`O5TfRD+NZ! zyg4IDvP5_-DtSdu@RFY3CwhXz2+DWmR$Ma7uOPVSVV1%<^|iW9cerUAGz1K+f&lhG z53F<&xdtJue*MPew@?&}9QGq3$oNCi%91;f6g7Of(w#i?fL`>4-dYu_Hi->fdo9e% zOtdF|#IfqFS0guwKGK(aLeMYl7y5(Q&>uSm^y$5zPXKzKE!oye(p#8Ya1yET_b>m} za>|UF`~g9E?*`;UpRD!YN_i_yF1I&-|8jPdQ+sRiPdv!9H|8a!-~PO6s18P|aV5l1 zwKRD*sxhfWw&-K-iF9LI_PYGh(@oSSEi~es~Y69NAD*H>jP4CWBYu@U#~3%YC);wZw=52>j}u?yBh_P|6obj^?c1^+s*~Y>)I@a z&!*_qKh7(>?=RWOPL$?_`e)l9dDrC8-U*lZ;p95=MGjN3@}6hkl=P~+O={cN zO7!!>Dq=V+ERP=+qZCs|P)E#m`u?d7etH{4tn_~IX=X;(Y6!yJ9ettsk24JAlGk+sI7_`}k` zlXm99S69!z(z|#C-!M`2guIK(NnQPJj<=##gF*bfI|rBLly$DkVd(HyE+_6wR4)5} zrrk1*{?sa z;A_8`e^=nDU;RH<%zE(Gi@qMXw;V~!m#_Yaa)yqP&2)+?j>B-<&YE3Yo|`BuZYZm7$S==*p{#gsS$!j+*UF09 z%jy%u%5zg?#mCC(>k0Yk@-pcN`RRsa(hbp`YETqHL=iMxUY@(DtoWs}`sabVyR3Le zS^XM99c9IDm({NV>WQ-A_sZ&56Y|pm)lWyrPX~NI9ig>l#cLdtEoH@f9Od0*#cw$( zUoR_u*FpBv0mV;8$WI3pKb`0;g5JxaHvqkb<+;1ciZ?hetST$s?kIn=toVqdva_tX z%W=j}2UI^DAwM1P{d7Z4Z17gmgTXTz^I%UD38q->uEg_Irf>T|vJ#bYiWy z@_JM(u&C^aAe`#Xl%1}zbm1*9`P2N(=ToYIz-&6X)CR@i<7`sLB3WuLA~l4+Tk?5K z5Ac}DX9?6H1nPSXM+B~=L=U=-Jy_#bNW(Sf-NDyz%|&zgVLf2MYJ0x$WpY-ch$w2ykM$BRoT8WJ z6MA7cu70$TDE}iGx_4MrKrGMnzmybVWr{R3t@n`4j%AP)BbYE7~@^U;`u_C)7Mt zIF?~9dfl^XfV}6n<%$X24SH2;S>}-)@oD z>Ge$tQK&vGgr$Sd z!Y|Yby?0unI(irC#HqmJ*z7u?e!$D)a$yIZj9;iu18;@u>|LmCfp65~CDPEd@t}({ z!mVDq@%ro5B7Eu%J;WZLM?KU#bVfZ)%C3^mQ-P;{E6Jf=`UCH3xQBYjETcZvn|gRv zY4t#zAc0X;4^@&ctUL7Bqw;78FGW{vB4+i{O^4krCxX=bddM9t>Uh*sC?^sJ5KP5%Mn zvKBoj6`X zOfXY;5T~~BcZ@Xmmy$-|FZ zc1fl9t+TvvZ0j{-^$U9@taV)V)r-op-U^TW)F4chCL$zWC3QkN8oaa*-seiKKBN#r z+qxS1vIax%;tzxWOsdu@M4e6FI_<+sZ^aiyiii*R;*d>0d%FB;R%w)G*&$WB-o!bS z88U1B`XTstCiMTG5KXZnqb634U39atVQk+z#Fk)nNOH}MmK{o1q18J`RXks+;)qDi z7oDp3iT+hZ>4&I$k4i`}&@^`4-!SXpuUzzxtIy@kfrq~`N^cM5H>`U2D;P(d+83g{-gV@F3;h?n@t8 zb*^4Wd%W`Q03nhduUt^dWZ+xT#_tcpjdj)&-rioPgRMMY3lv_x;KAihG$ z?p8A4j0$H|DTE*@*wF_ng!~VM{9%N$lqbjCG~D#?SFQtdz|^|7bF#40z8Y`nPBi{D z^-9C4ujahocun`Z#{Zo<+_37)IjP2rx?gGhn^dB)W?}oV#^Vc{Ml{y6B?RrN#`C%l zH~wX6UE|7yZw+gFhly0<%C>dcpkB)c^=1at%7yJi1ZouN4b*iRP&EtR8X{1mz_Jd? z3k!MBJ5bcSR1}niipDFtH#h!Es-t05B&W0S((dNQe@LBZST#Q91Q=d}*v%08_OQmo z3pb0{&1qs&5Zer~M}{@Nx^Rn#ZO#VOkqxRl18U{Mw}%Lnh&50m)`6;7cw~q`iP&b! zT@MR=Laymv4-0*MUex_MRIP)mG@mG3nyNRTYBN-&2?k3xsBT!80reVGIZ&|N=MyY< zb$ed714Y?=f+;)PGrqyY3b-eB!omRM-U18#D!#OPCoJ^&c~SSP5Zer~X+BZ7G_h|& zYyx7_qCov+gL)GdWt#_)a&i=WsWz z=hbeto>`k3=goSr@%TOUjfcrre}%GLF>goX@wvMjkI!4xaOX7>js+SHUNd1`al^Q? zC#(QhWdH)nurrA7tMQ}wi{^N)=hKX&`oo0 z?4~(?b=L95$gDMud+&L*al<{G4fTV_RyJr}SL5Ef-Hm(az1DE&c@r9;>AVStp?lth z6m-vrWg;|-|^fyQ@I zlS>=7rRG=oLrr6MfA6P0I98jo}!6>g=@Z))8$(CI)7>0b4E?8ef8>}4;Bcqz3PvtRjoW%Zpz z@kN80SG}F5^6+!tJkyyzgE~N`DrPd`2U=%>BCBU*@LxgVY{sVf=&gu|9H$Whf>Wn_ zLkusp(AE(Gb#nep#Zb<^HR7!}rcyb*Rg|g!^sC8NO^6ckUy?41&f0z|o_hVqDv^F( z>R;>hdon(l{!f-A;U6LVdi6B}@IM6pKmG{#uSors03l(&Ytioq z(*u3qvn)$1|3g{46}wc?-04lNI{K~_eR`Fs@B{OwLf`jD_hI?dm%g)8h6g$StAHSX zczU7#mqt`~rQ7(sVw9u5)TjS=<%ObOuh6d_=of!?5d3}9|7z+7hM_U_y9#0Y&zA=f ze`_GSEB`|vy%pE;l>GAJ>c`5bSII9w$Pb-uYbUk&UtPXSQ$H|_*QEZePMClH<)wcA z)=(_1{BxmLbOU8i5K!5VGpASE;ZDbmglxFX7Zd)LTIl(?cE7%*FT;F ze|pQQQ3%rhlkq5;TtX(Bkx!2$=HX*hsAY9+fB2>+vr(cH_byl((4N*)pjHAv2)}Hj zeemyT6>3*(gDURLP!oXI55Ao3JPNRPMhya}=aJ4G#o# zuYumXHp35;hup=J%DjAzSG+j>7p`UIs(l4(LOm^Wy_e5vtf7-y=5(!JHPb-7>6=>* z<0KHSxv=od%%CMq%%Iz~^ern`?)Z2qmeEvG{2TmKj$pG4mbB<@{;)nr4-v;ozCEYd z6L%WfXQpxpDa$*dnki>_YrXZw$zqaTcgfBH#17#54B3dTyX3$CZ!JgWL~5oCB$Cdl zI9cXln7i(hMAjQ-)* zO7Z&s;y@+RMZTp2mGB|)$E*-gjJ7=mF6Md5*W%BG@n~=vI$KU@&LR%*jX6FXI;*vs zev|e<=T-LWv7q%fn7D<;tZMssR+A~KPOzwzUtZ8;)m|P;6w}buot3=BUfVKwq1XMz zNsC}56@er6ESKypi@lr(m_q{tRJfqUeQUCB*Ygb?mF(H+g9z)Th1fwZnFGva>PA7k zzIGW!?RI9YY>Y$nVCjx0Yj-?nj@5IHESb^h6!gamLo8uSac05@8QD^7v{7vl+NzTn z0t&JDTXuIsujwR$QiW1F{y?_O%E5ZzPR$c5D$hHFr*gJgOy`4#OT6H>SN*&;7F4eq z?5%j4Iw-5TscBM8xZs)2om@@bTAZ!F!e8yc!7^Q;l5H9vQ}bl5v_P-BsCD|@I)(RB z=d}uOrcAhS7=mG(cO4gbvKn^i8S*Kqv1}(9XIst|#U+*fLb9Kww{|_$v6SqwrnrYz zUY78)yN)E2-SsBQemU8#Li@$efi$Pbem&W(&ilpQ@k5eGe?}c2+T3{bS68(f;jQ0;!cYXX+=*t4$@^!REeRtef$T41_eoH)7 zUz+sLGX5S{%L?_&-co%zW7t!a`ix;$w0T*5hx8*AeWo?CCI#nME8D4H)S6j~g7;fH zODb471zAkBdn5l`iXA_irYfrI%*m#Ezoh~VQGFdN3MG5#xKnEdeR{jS>%fOp6OZVH zg%Pq%%;R;i?D3&pUpOU@xbhVtLM%P=5y}V@adZ~qsE?c~U zJMtCS;}y&nkm##k!F*dee$y+!uV5*hjdI3L!GsDPlNb1tQ~HlQulhClF;=h2 z^H%)3wA`9dl?FR{^?}~A54_2&5~p^DirO{g4IS1(ex z_PoX0Ohr*4ydG1D_S7en9FptT4J$F5jb$P@)y#s5N|$9aS!re}duH6uGpxGr}*H z;7ji=*}F^R8_{~Rc(znRK9A^F@N9;GE*_fo9zrZ{?obxA5M z;f=u?$yFaATMFB(I9tzZR;W~8Ur}g^LWdQy3g`44w(cqJL@0i5SE%Mwt7q5ZU&NLU zPTxR)R-W)yd`Wf(-9c(5? zk>__h=GHWboP2LZjp7R!Ij-BcHaGcc87mY#D>)(^9GD!M4(27h)p(U4KY1h_3?%K` z6~&e&WnZ!cRmsii;04Jw>ELIR&k^(ra$*ana8tH!9?z;p^)ED{D@vX|H>b>Yr15s? zB;NRKqSnu9BUF;ps0wUgN&0ARu%?tYA~o;6cNu|LcI+FF0?C0)m8I~Dx+6{slw^`zdM^+P)Rb?@{g`syn-)My6g6>&rN=aY1(Mc(tfCwm3A zS^?VrJ!3y8P{ar0fBpdUZS|f%0Db(d`>{8DljvhBVrb3keCo)VNi=#<>gaj*{j(}@ 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%0A9t4q(#{4ZA_~0ZJG@Uk&R`D-V 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�If;WWiRUPZ#{Y)%v||x=kc< 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�v-n@VH<%i}a><3ji2 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 z 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℘OTv!(|b_TVe2v27Mh6x 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

    bzm;8^)nf#(iGFki+5`0z5xIFV|K- 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 HqtyQa9>^yw literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/log.py b/env/lib/python3.12/site-packages/selenium/webdriver/common/log.py new file mode 100755 index 0000000..74eb105 --- /dev/null +++ b/env/lib/python3.12/site-packages/selenium/webdriver/common/log.py @@ -0,0 +1,152 @@ +# Licensed to the Software Freedom Conservancy (SFC) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The SFC licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import json +import pkgutil +from contextlib import asynccontextmanager +from importlib import import_module +from typing import Any +from typing import AsyncGenerator +from typing import Dict +from typing import Optional + +from selenium.webdriver.common.by import By + +cdp = None + + +def import_cdp(): + global cdp + if not cdp: + cdp = import_module("selenium.webdriver.common.bidi.cdp") + + +class Log: + """This class allows access to logging APIs that use the new WebDriver Bidi + protocol. + + This class is not to be used directly and should be used from the + webdriver base classes. + """ + + def __init__(self, driver, bidi_session) -> None: + self.driver = driver + self.session = bidi_session.session + self.cdp = bidi_session.cdp + self.devtools = bidi_session.devtools + _pkg = ".".join(__name__.split(".")[:-1]) + # Ensure _mutation_listener_js is not None before decoding + _mutation_listener_js_bytes: Optional[bytes] = pkgutil.get_data(_pkg, "mutation-listener.js") + if _mutation_listener_js_bytes is None: + raise ValueError("Failed to load mutation-listener.js") + self._mutation_listener_js = _mutation_listener_js_bytes.decode("utf8").strip() + + @asynccontextmanager + async def mutation_events(self) -> AsyncGenerator[Dict[str, Any], None]: + """Listen for mutation events and emit them as they are found. + + :Usage: + :: + + async with driver.log.mutation_events() as event: + pages.load("dynamic.html") + driver.find_element(By.ID, "reveal").click() + WebDriverWait(driver, 5)\ + .until(EC.visibility_of(driver.find_element(By.ID, "revealed"))) + + assert event["attribute_name"] == "style" + assert event["current_value"] == "" + assert event["old_value"] == "display:none;" + """ + + page = self.cdp.get_session_context("page.enable") + await page.execute(self.devtools.page.enable()) + runtime = self.cdp.get_session_context("runtime.enable") + await runtime.execute(self.devtools.runtime.enable()) + await runtime.execute(self.devtools.runtime.add_binding("__webdriver_attribute")) + self.driver.pin_script(self._mutation_listener_js) + script_key = await page.execute( + self.devtools.page.add_script_to_evaluate_on_new_document(self._mutation_listener_js) + ) + self.driver.pin_script(self._mutation_listener_js, script_key) + self.driver.execute_script(f"return {self._mutation_listener_js}") + + event: Dict[str, Any] = {} + async with runtime.wait_for(self.devtools.runtime.BindingCalled) as evnt: + yield event + + payload = json.loads(evnt.value.payload) + elements: list = self.driver.find_elements(By.CSS_SELECTOR, f"*[data-__webdriver_id={payload['target']}]") + if not elements: + elements.append(None) + event["element"] = elements[0] + event["attribute_name"] = payload["name"] + event["current_value"] = payload["value"] + event["old_value"] = payload["oldValue"] + + @asynccontextmanager + async def add_js_error_listener(self) -> AsyncGenerator[Dict[str, Any], None]: + """Listen for JS errors and when the contextmanager exits check if + there were JS Errors. + + :Usage: + :: + + async with driver.log.add_js_error_listener() as error: + driver.find_element(By.ID, "throwing-mouseover").click() + assert bool(error) + assert error.exception_details.stack_trace.call_frames[0].function_name == "onmouseover" + """ + + session = self.cdp.get_session_context("page.enable") + await session.execute(self.devtools.page.enable()) + session = self.cdp.get_session_context("runtime.enable") + await session.execute(self.devtools.runtime.enable()) + js_exception = self.devtools.runtime.ExceptionThrown(None, None) + async with session.wait_for(self.devtools.runtime.ExceptionThrown) as exception: + yield js_exception + js_exception.timestamp = exception.value.timestamp + js_exception.exception_details = exception.value.exception_details + + @asynccontextmanager + async def add_listener(self, event_type) -> AsyncGenerator[Dict[str, Any], None]: + """Listen for certain events that are passed in. + + :Args: + - event_type: The type of event that we want to look at. + + :Usage: + :: + + async with driver.log.add_listener(Console.log) as messages: + driver.execute_script("console.log('I like cheese')") + assert messages["message"] == "I love cheese" + """ + + from selenium.webdriver.common.bidi.console import Console + + session = self.cdp.get_session_context("page.enable") + await session.execute(self.devtools.page.enable()) + session = self.cdp.get_session_context("runtime.enable") + await session.execute(self.devtools.runtime.enable()) + console: Dict[str, Any] = {"message": None, "level": None} + async with session.wait_for(self.devtools.runtime.ConsoleAPICalled) as messages: + yield console + + if event_type == Console.ALL or event_type.value == messages.value.type_: + console["message"] = messages.value.args[0].value + console["level"] = messages.value.args[0].type_ diff --git a/env/lib/python3.12/site-packages/selenium/webdriver/common/macos/selenium-manager b/env/lib/python3.12/site-packages/selenium/webdriver/common/macos/selenium-manager new file mode 100755 index 0000000000000000000000000000000000000000..675ef2a3f49ff1dfb17cc6470d199ddd5792ffe2 GIT binary patch literal 8235888 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¥Pp`+}Z=l|Gm^bf1B*4*$Gym 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 y+m3r1y1KLKUro16n$xeF4Rjtm9>oX9JFzNsL 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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 "".format(self.encoding, self.fingerprint) + + 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[Optional[str]] = [ + 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) # type: ignore[arg-type] + ), + decoded_string[:8192], + 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: Optional[List[CharsetMatch]] = None): + self._results: List[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: Union[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) -> Optional["CharsetMatch"]: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> Optional["CharsetMatch"]: + """ + 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: Optional[str], + encoding_aliases: List[str], + alternative_encodings: List[str], + language: str, + alphabets: List[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: Optional[str], + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: Optional[str] = unicode_path + self.encoding: Optional[str] = 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/env/lib/python3.12/site-packages/charset_normalizer/py.typed b/env/lib/python3.12/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/charset_normalizer/utils.py b/env/lib/python3.12/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..e5cbbf4 --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/utils.py @@ -0,0 +1,421 @@ +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, List, Optional, Set, Tuple, Union + +from _multibytecodec import MultibyteIncrementalDecoder + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: + 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) -> Optional[str]: + """ + 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: + 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: Optional[str] = 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: Optional[str] = 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: Optional[str] = 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: + 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: + 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: + 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: + 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: + 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: + 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: + return False + + return "ARABIC" in character_name and "ISOLATED FORM" in character_name + + +@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) -> Optional[str]: + """ + 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("encodings.{}".format(name)).IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: Union[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: + 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("Unable to retrieve IANA for '{}'".format(cp_name)) + + return cp_name + + +def range_scan(decoded_sequence: str) -> List[str]: + ranges: Set[str] = set() + + for character in decoded_sequence: + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + continue + + ranges.add(character_range) + + return list(ranges) + + +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( + "encodings.{}".format(iana_name_a) + ).IncrementalDecoder + decoder_b = importlib.import_module( + "encodings.{}".format(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: Optional[str] = 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/env/lib/python3.12/site-packages/charset_normalizer/version.py b/env/lib/python3.12/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..699990e --- /dev/null +++ b/env/lib/python3.12/site-packages/charset_normalizer/version.py @@ -0,0 +1,6 @@ +""" +Expose version +""" + +__version__ = "3.4.0" +VERSION = __version__.split(".") diff --git a/env/lib/python3.12/site-packages/dotenv/__init__.py b/env/lib/python3.12/site-packages/dotenv/__init__.py new file mode 100644 index 0000000..7f4c631 --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/__init__.py @@ -0,0 +1,49 @@ +from typing import Any, Optional + +from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, + unset_key) + + +def load_ipython_extension(ipython: Any) -> None: + from .ipython import load_ipython_extension + load_ipython_extension(ipython) + + +def get_cli_string( + path: Optional[str] = None, + action: Optional[str] = None, + key: Optional[str] = None, + value: Optional[str] = None, + quote: Optional[str] = None, +): + """Returns a string suitable for running as a shell script. + + Useful for converting a arguments passed to a fabric task + to be passed to a `local` or `run` command. + """ + command = ['dotenv'] + if quote: + command.append(f'-q {quote}') + if path: + command.append(f'-f {path}') + if action: + command.append(action) + if key: + command.append(key) + if value: + if ' ' in value: + command.append(f'"{value}"') + else: + command.append(value) + + return ' '.join(command).strip() + + +__all__ = ['get_cli_string', + 'load_dotenv', + 'dotenv_values', + 'get_key', + 'set_key', + 'unset_key', + 'find_dotenv', + 'load_ipython_extension'] diff --git a/env/lib/python3.12/site-packages/dotenv/__main__.py b/env/lib/python3.12/site-packages/dotenv/__main__.py new file mode 100644 index 0000000..3977f55 --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/__main__.py @@ -0,0 +1,6 @@ +"""Entry point for cli, enables execution with `python -m dotenv`""" + +from .cli import cli + +if __name__ == "__main__": + cli() diff --git a/env/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffec37d2ca7380de03373d537c46c556a41b08bf GIT binary patch literal 1706 zcmZ`(&ube;6rS1N(n_)ut8P*!@!;46QRH=MN&|HR#is713T~QePrcm8t7UP1U##Zp02h9O z)qGPbjlX0Kmbirf%xfmf?M7((p5eTNEGi{=?1z@Oqwg3_WCe*@vpuX2Vu@V0LVeq6 zCaU8bXVG97%|zbFmF-3|-1NOfB32j?uVS+FBjc&VJ|~C*l?Y;vNwfrX0I0^{;i?vPPwKO-{G+fuf+KO*R zuH}V+wrYo8L>t!78y{+c9a`mvVQw3BE6@f? zXu58DcBt#~jpm>%t1YwAc?x^r4?*h*?{z+YAzVM90gwm{Biu|R!(?hFJQGn&B~HY9 z5mnq|M;saRQ+-yb4osgq+!bSi6k~DgypBUY=3?Oyc+8!t7K68P`53&$g=Fo`d1H7k zBS&t%g>}9zPd>mx%sWH)K5< zKJU=EzW?)A=^zHkKtV`sua1Jq4vh`RLN%Wt5_ujA8YyAZavT(x#BPN1*({=VH?V4v zlTuCJ+p$QPvXMdRgONfFBM2;vLZ4Qs85_hlQD_9)>9=Wc!}=d%-SJJsSx2<=I<38q zOrMUZhv!p%A`Ry3K3~3vDAZ5_>3gQc(-CSkEDtBbmT!BB$j;IzNo0bal@uAg!(fuZ zyA%?6m^hH=ik$=@a)E6W*kv{yTOY_l5Dl_x6#PhG5A-jA@k`%t?XC9YTvr)8D6|Tl ziO${5YJ2xcnd`~wS@7%5=k54NneEB>VX(b(q+IK%g>G)*pwg;z7LRh%y|H3ZAn|S=SB6(e!7FSC^b=-zVc(|(4nvcuI0%ka;Vtj>KWr(OOBXg`vv literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc b/env/lib/python3.12/site-packages/dotenv/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb8ffae644c01bfd4e4dc001d0df14f1d5e518a8 GIT binary patch literal 370 zcmXw#y-ve05XbE}s1c|e3rI*FsYL1)Mo<@8!32ASZ@3TL|L%Uek7jchI6J3z(tbu(CRw#z@(MT@0uH&CKm~^o z0^xBqI|d*NJRsovMhrpemwsz!-WzC}l{ht0TRbrtjuLr-g=XVKweSA+_4V}-sS{X(~}1uNvns(@0(q^9(yg{lUn+(eXS$SLZUW=c@{239q~A1AR< zf~X>9N-<9QCMuNBHYZooUKeB1?R3IEEA#Mn5?&fEh&x9TIVNj{vv&8Cr8qf1$mX`6oJ9_>Jem5&{1(3!LH~ D_*!U1 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc b/env/lib/python3.12/site-packages/dotenv/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..decea450cf6e776d9cde448cd998e993a114f2a1 GIT binary patch literal 9713 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc b/env/lib/python3.12/site-packages/dotenv/__pycache__/ipython.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9e7b540e214526b981f4c4815fd1c671883b03 GIT binary patch literal 1979 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 W>nrq^fZjKEWMOdr1hVw8sQfSF=ijXW literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc b/env/lib/python3.12/site-packages/dotenv/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d280cdc622fa60d110169885c9d106fb9f0fc21c GIT binary patch literal 222 zcmX@j%ge<81lI8}>0&_oF^B^Lj8MjB4j^MXLkdF_LnWgoQx&VBo`IgBpC;oi?)dn! z)S}|d{Ji-1l?VGBcXXNLm>gSebB!;+GfYd;( p(krOE#bJ}1pHiBWYFEStv=ijeVvs*RFf%eT-ry5$ None: + """This script is used to set, get or unset values from a .env file.""" + ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} + + +@contextmanager +def stream_file(path: os.PathLike) -> Iterator[IO[str]]: + """ + Open a file and yield the corresponding (decoded) stream. + + Exits with error code 2 if the file cannot be opened. + """ + + try: + with open(path) as stream: + yield stream + except OSError as exc: + print(f"Error opening env file: {exc}", file=sys.stderr) + exit(2) + + +@cli.command() +@click.pass_context +@click.option('--format', default='simple', + type=click.Choice(['simple', 'json', 'shell', 'export']), + help="The format in which to display the list. Default format is simple, " + "which displays name=value without quotes.") +def list(ctx: click.Context, format: bool) -> None: + """Display all the stored key/value.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + if format == 'json': + click.echo(json.dumps(values, indent=2, sort_keys=True)) + else: + prefix = 'export ' if format == 'export' else '' + for k in sorted(values): + v = values[k] + if v is not None: + if format in ('export', 'shell'): + v = shlex.quote(v) + click.echo(f'{prefix}{k}={v}') + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +@click.argument('value', required=True) +def set(ctx: click.Context, key: Any, value: Any) -> None: + """Store the given key/value.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + export = ctx.obj['EXPORT'] + success, key, value = set_key(file, key, value, quote, export) + if success: + click.echo(f'{key}={value}') + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def get(ctx: click.Context, key: Any) -> None: + """Retrieve the value for the given key.""" + file = ctx.obj['FILE'] + + with stream_file(file) as stream: + values = dotenv_values(stream=stream) + + stored_value = values.get(key) + if stored_value: + click.echo(stored_value) + else: + exit(1) + + +@cli.command() +@click.pass_context +@click.argument('key', required=True) +def unset(ctx: click.Context, key: Any) -> None: + """Removes the given key.""" + file = ctx.obj['FILE'] + quote = ctx.obj['QUOTE'] + success, key = unset_key(file, key, quote) + if success: + click.echo(f"Successfully removed {key}") + else: + exit(1) + + +@cli.command(context_settings={'ignore_unknown_options': True}) +@click.pass_context +@click.option( + "--override/--no-override", + default=True, + help="Override variables from the environment file with those from the .env file.", +) +@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) +def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: + """Run command with environment variables present.""" + file = ctx.obj['FILE'] + if not os.path.isfile(file): + raise click.BadParameter( + f'Invalid value for \'-f\' "{file}" does not exist.', + ctx=ctx + ) + dotenv_as_dict = { + k: v + for (k, v) in dotenv_values(file).items() + if v is not None and (override or k not in os.environ) + } + + if not commandline: + click.echo('No command given.') + exit(1) + ret = run_command(commandline, dotenv_as_dict) + exit(ret) + + +def run_command(command: List[str], env: Dict[str, str]) -> int: + """Run command in sub process. + + Runs the command in a sub process with the variables from `env` + added in the current environment variables. + + Parameters + ---------- + command: List[str] + The command and it's parameters + env: Dict + The additional environment variables + + Returns + ------- + int + The return code of the command + + """ + # copy the current environment variables and add the vales from + # `env` + cmd_env = os.environ.copy() + cmd_env.update(env) + + p = Popen(command, + universal_newlines=True, + bufsize=0, + shell=False, + env=cmd_env) + _, _ = p.communicate() + + return p.returncode diff --git a/env/lib/python3.12/site-packages/dotenv/ipython.py b/env/lib/python3.12/site-packages/dotenv/ipython.py new file mode 100644 index 0000000..7df727c --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/ipython.py @@ -0,0 +1,39 @@ +from IPython.core.magic import Magics, line_magic, magics_class # type: ignore +from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore + parse_argstring) # type: ignore + +from .main import find_dotenv, load_dotenv + + +@magics_class +class IPythonDotEnv(Magics): + + @magic_arguments() + @argument( + '-o', '--override', action='store_true', + help="Indicate to override existing variables" + ) + @argument( + '-v', '--verbose', action='store_true', + help="Indicate function calls to be verbose" + ) + @argument('dotenv_path', nargs='?', type=str, default='.env', + help='Search in increasingly higher folders for the `dotenv_path`') + @line_magic + def dotenv(self, line): + args = parse_argstring(self.dotenv, line) + # Locate the .env file + dotenv_path = args.dotenv_path + try: + dotenv_path = find_dotenv(dotenv_path, True, True) + except IOError: + print("cannot find .env file") + return + + # Load the .env file + load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) + + +def load_ipython_extension(ipython): + """Register the %dotenv magic.""" + ipython.register_magics(IPythonDotEnv) diff --git a/env/lib/python3.12/site-packages/dotenv/main.py b/env/lib/python3.12/site-packages/dotenv/main.py new file mode 100644 index 0000000..7bc5428 --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/main.py @@ -0,0 +1,392 @@ +import io +import logging +import os +import pathlib +import shutil +import sys +import tempfile +from collections import OrderedDict +from contextlib import contextmanager +from typing import (IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, + Union) + +from .parser import Binding, parse_stream +from .variables import parse_variables + +# A type alias for a string path to be used for the paths in this file. +# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` +# only accepts string paths, not byte paths or file descriptors. See +# https://github.com/python/typeshed/pull/6832. +StrPath = Union[str, 'os.PathLike[str]'] + +logger = logging.getLogger(__name__) + + +def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: + for mapping in mappings: + if mapping.error: + logger.warning( + "Python-dotenv could not parse statement starting at line %s", + mapping.original.line, + ) + yield mapping + + +class DotEnv: + def __init__( + self, + dotenv_path: Optional[StrPath], + stream: Optional[IO[str]] = None, + verbose: bool = False, + encoding: Optional[str] = None, + interpolate: bool = True, + override: bool = True, + ) -> None: + self.dotenv_path: Optional[StrPath] = dotenv_path + self.stream: Optional[IO[str]] = stream + self._dict: Optional[Dict[str, Optional[str]]] = None + self.verbose: bool = verbose + self.encoding: Optional[str] = encoding + self.interpolate: bool = interpolate + self.override: bool = override + + @contextmanager + def _get_stream(self) -> Iterator[IO[str]]: + if self.dotenv_path and os.path.isfile(self.dotenv_path): + with open(self.dotenv_path, encoding=self.encoding) as stream: + yield stream + elif self.stream is not None: + yield self.stream + else: + if self.verbose: + logger.info( + "Python-dotenv could not find configuration file %s.", + self.dotenv_path or '.env', + ) + yield io.StringIO('') + + def dict(self) -> Dict[str, Optional[str]]: + """Return dotenv as dict""" + if self._dict: + return self._dict + + raw_values = self.parse() + + if self.interpolate: + self._dict = OrderedDict(resolve_variables(raw_values, override=self.override)) + else: + self._dict = OrderedDict(raw_values) + + return self._dict + + def parse(self) -> Iterator[Tuple[str, Optional[str]]]: + with self._get_stream() as stream: + for mapping in with_warn_for_invalid_lines(parse_stream(stream)): + if mapping.key is not None: + yield mapping.key, mapping.value + + def set_as_environment_variables(self) -> bool: + """ + Load the current dotenv as system environment variable. + """ + if not self.dict(): + return False + + for k, v in self.dict().items(): + if k in os.environ and not self.override: + continue + if v is not None: + os.environ[k] = v + + return True + + def get(self, key: str) -> Optional[str]: + """ + """ + data = self.dict() + + if key in data: + return data[key] + + if self.verbose: + logger.warning("Key %s not found in %s.", key, self.dotenv_path) + + return None + + +def get_key( + dotenv_path: StrPath, + key_to_get: str, + encoding: Optional[str] = "utf-8", +) -> Optional[str]: + """ + Get the value of a given key from the given .env. + + Returns `None` if the key isn't found or doesn't have a value. + """ + return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) + + +@contextmanager +def rewrite( + path: StrPath, + encoding: Optional[str], +) -> Iterator[Tuple[IO[str], IO[str]]]: + pathlib.Path(path).touch() + + with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: + error = None + try: + with open(path, encoding=encoding) as source: + yield (source, dest) + except BaseException as err: + error = err + + if error is None: + shutil.move(dest.name, path) + else: + os.unlink(dest.name) + raise error from None + + +def set_key( + dotenv_path: StrPath, + key_to_set: str, + value_to_set: str, + quote_mode: str = "always", + export: bool = False, + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str, str]: + """ + Adds or Updates a key/value to the given .env + + If the .env path given doesn't exist, fails instead of risking creating + an orphan .env somewhere in the filesystem + """ + if quote_mode not in ("always", "auto", "never"): + raise ValueError(f"Unknown quote_mode: {quote_mode}") + + quote = ( + quote_mode == "always" + or (quote_mode == "auto" and not value_to_set.isalnum()) + ) + + if quote: + value_out = "'{}'".format(value_to_set.replace("'", "\\'")) + else: + value_out = value_to_set + if export: + line_out = f'export {key_to_set}={value_out}\n' + else: + line_out = f"{key_to_set}={value_out}\n" + + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + replaced = False + missing_newline = False + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_set: + dest.write(line_out) + replaced = True + else: + dest.write(mapping.original.string) + missing_newline = not mapping.original.string.endswith("\n") + if not replaced: + if missing_newline: + dest.write("\n") + dest.write(line_out) + + return True, key_to_set, value_to_set + + +def unset_key( + dotenv_path: StrPath, + key_to_unset: str, + quote_mode: str = "always", + encoding: Optional[str] = "utf-8", +) -> Tuple[Optional[bool], str]: + """ + Removes a given key from the given `.env` file. + + If the .env path given doesn't exist, fails. + If the given key doesn't exist in the .env, fails. + """ + if not os.path.exists(dotenv_path): + logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) + return None, key_to_unset + + removed = False + with rewrite(dotenv_path, encoding=encoding) as (source, dest): + for mapping in with_warn_for_invalid_lines(parse_stream(source)): + if mapping.key == key_to_unset: + removed = True + else: + dest.write(mapping.original.string) + + if not removed: + logger.warning("Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path) + return None, key_to_unset + + return removed, key_to_unset + + +def resolve_variables( + values: Iterable[Tuple[str, Optional[str]]], + override: bool, +) -> Mapping[str, Optional[str]]: + new_values: Dict[str, Optional[str]] = {} + + for (name, value) in values: + if value is None: + result = None + else: + atoms = parse_variables(value) + env: Dict[str, Optional[str]] = {} + if override: + env.update(os.environ) # type: ignore + env.update(new_values) + else: + env.update(new_values) + env.update(os.environ) # type: ignore + result = "".join(atom.resolve(env) for atom in atoms) + + new_values[name] = result + + return new_values + + +def _walk_to_root(path: str) -> Iterator[str]: + """ + Yield directories starting from the given directory up to the root + """ + if not os.path.exists(path): + raise IOError('Starting path not found') + + if os.path.isfile(path): + path = os.path.dirname(path) + + last_dir = None + current_dir = os.path.abspath(path) + while last_dir != current_dir: + yield current_dir + parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) + last_dir, current_dir = current_dir, parent_dir + + +def find_dotenv( + filename: str = '.env', + raise_error_if_not_found: bool = False, + usecwd: bool = False, +) -> str: + """ + Search in increasingly higher folders for the given file + + Returns path to the file if found, or an empty string otherwise + """ + + def _is_interactive(): + """ Decide whether this is running in a REPL or IPython notebook """ + try: + main = __import__('__main__', None, None, fromlist=['__file__']) + except ModuleNotFoundError: + return False + return not hasattr(main, '__file__') + + if usecwd or _is_interactive() or getattr(sys, 'frozen', False): + # Should work without __file__, e.g. in REPL or IPython notebook. + path = os.getcwd() + else: + # will work for .py files + frame = sys._getframe() + current_file = __file__ + + while frame.f_code.co_filename == current_file or not os.path.exists( + frame.f_code.co_filename + ): + assert frame.f_back is not None + frame = frame.f_back + frame_filename = frame.f_code.co_filename + path = os.path.dirname(os.path.abspath(frame_filename)) + + for dirname in _walk_to_root(path): + check_path = os.path.join(dirname, filename) + if os.path.isfile(check_path): + return check_path + + if raise_error_if_not_found: + raise IOError('File not found') + + return '' + + +def load_dotenv( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + override: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> bool: + """Parse a .env file and then load all the variables found as environment variables. + + Parameters: + dotenv_path: Absolute or relative path to .env file. + stream: Text stream (such as `io.StringIO`) with .env content, used if + `dotenv_path` is `None`. + verbose: Whether to output a warning the .env file is missing. + override: Whether to override the system environment variables with the variables + from the `.env` file. + encoding: Encoding to be used to read the file. + Returns: + Bool: True if at least one environment variable is set else False + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + dotenv = DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=override, + encoding=encoding, + ) + return dotenv.set_as_environment_variables() + + +def dotenv_values( + dotenv_path: Optional[StrPath] = None, + stream: Optional[IO[str]] = None, + verbose: bool = False, + interpolate: bool = True, + encoding: Optional[str] = "utf-8", +) -> Dict[str, Optional[str]]: + """ + Parse a .env file and return its content as a dict. + + The returned dict will have `None` values for keys without values in the .env file. + For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in + `{"foo": None}` + + Parameters: + dotenv_path: Absolute or relative path to the .env file. + stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. + verbose: Whether to output a warning if the .env file is missing. + encoding: Encoding to be used to read the file. + + If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the + .env file. + """ + if dotenv_path is None and stream is None: + dotenv_path = find_dotenv() + + return DotEnv( + dotenv_path=dotenv_path, + stream=stream, + verbose=verbose, + interpolate=interpolate, + override=True, + encoding=encoding, + ).dict() diff --git a/env/lib/python3.12/site-packages/dotenv/parser.py b/env/lib/python3.12/site-packages/dotenv/parser.py new file mode 100644 index 0000000..735f14a --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/parser.py @@ -0,0 +1,175 @@ +import codecs +import re +from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 + Pattern, Sequence, Tuple) + + +def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: + return re.compile(string, re.UNICODE | extra_flags) + + +_newline = make_regex(r"(\r\n|\n|\r)") +_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) +_whitespace = make_regex(r"[^\S\r\n]*") +_export = make_regex(r"(?:export[^\S\r\n]+)?") +_single_quoted_key = make_regex(r"'([^']+)'") +_unquoted_key = make_regex(r"([^=\#\s]+)") +_equal_sign = make_regex(r"(=[^\S\r\n]*)") +_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") +_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') +_unquoted_value = make_regex(r"([^\r\n]*)") +_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") +_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") +_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") +_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") +_single_quote_escapes = make_regex(r"\\[\\']") + + +class Original(NamedTuple): + string: str + line: int + + +class Binding(NamedTuple): + key: Optional[str] + value: Optional[str] + original: Original + error: bool + + +class Position: + def __init__(self, chars: int, line: int) -> None: + self.chars = chars + self.line = line + + @classmethod + def start(cls) -> "Position": + return cls(chars=0, line=1) + + def set(self, other: "Position") -> None: + self.chars = other.chars + self.line = other.line + + def advance(self, string: str) -> None: + self.chars += len(string) + self.line += len(re.findall(_newline, string)) + + +class Error(Exception): + pass + + +class Reader: + def __init__(self, stream: IO[str]) -> None: + self.string = stream.read() + self.position = Position.start() + self.mark = Position.start() + + def has_next(self) -> bool: + return self.position.chars < len(self.string) + + def set_mark(self) -> None: + self.mark.set(self.position) + + def get_marked(self) -> Original: + return Original( + string=self.string[self.mark.chars:self.position.chars], + line=self.mark.line, + ) + + def peek(self, count: int) -> str: + return self.string[self.position.chars:self.position.chars + count] + + def read(self, count: int) -> str: + result = self.string[self.position.chars:self.position.chars + count] + if len(result) < count: + raise Error("read: End of string") + self.position.advance(result) + return result + + def read_regex(self, regex: Pattern[str]) -> Sequence[str]: + match = regex.match(self.string, self.position.chars) + if match is None: + raise Error("read_regex: Pattern not found") + self.position.advance(self.string[match.start():match.end()]) + return match.groups() + + +def decode_escapes(regex: Pattern[str], string: str) -> str: + def decode_match(match: Match[str]) -> str: + return codecs.decode(match.group(0), 'unicode-escape') # type: ignore + + return regex.sub(decode_match, string) + + +def parse_key(reader: Reader) -> Optional[str]: + char = reader.peek(1) + if char == "#": + return None + elif char == "'": + (key,) = reader.read_regex(_single_quoted_key) + else: + (key,) = reader.read_regex(_unquoted_key) + return key + + +def parse_unquoted_value(reader: Reader) -> str: + (part,) = reader.read_regex(_unquoted_value) + return re.sub(r"\s+#.*", "", part).rstrip() + + +def parse_value(reader: Reader) -> str: + char = reader.peek(1) + if char == u"'": + (value,) = reader.read_regex(_single_quoted_value) + return decode_escapes(_single_quote_escapes, value) + elif char == u'"': + (value,) = reader.read_regex(_double_quoted_value) + return decode_escapes(_double_quote_escapes, value) + elif char in (u"", u"\n", u"\r"): + return u"" + else: + return parse_unquoted_value(reader) + + +def parse_binding(reader: Reader) -> Binding: + reader.set_mark() + try: + reader.read_regex(_multiline_whitespace) + if not reader.has_next(): + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=False, + ) + reader.read_regex(_export) + key = parse_key(reader) + reader.read_regex(_whitespace) + if reader.peek(1) == "=": + reader.read_regex(_equal_sign) + value: Optional[str] = parse_value(reader) + else: + value = None + reader.read_regex(_comment) + reader.read_regex(_end_of_line) + return Binding( + key=key, + value=value, + original=reader.get_marked(), + error=False, + ) + except Error: + reader.read_regex(_rest_of_line) + return Binding( + key=None, + value=None, + original=reader.get_marked(), + error=True, + ) + + +def parse_stream(stream: IO[str]) -> Iterator[Binding]: + reader = Reader(stream) + while reader.has_next(): + yield parse_binding(reader) diff --git a/env/lib/python3.12/site-packages/dotenv/py.typed b/env/lib/python3.12/site-packages/dotenv/py.typed new file mode 100644 index 0000000..7632ecf --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/py.typed @@ -0,0 +1 @@ +# Marker file for PEP 561 diff --git a/env/lib/python3.12/site-packages/dotenv/variables.py b/env/lib/python3.12/site-packages/dotenv/variables.py new file mode 100644 index 0000000..667f2f2 --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/variables.py @@ -0,0 +1,86 @@ +import re +from abc import ABCMeta, abstractmethod +from typing import Iterator, Mapping, Optional, Pattern + +_posix_variable: Pattern[str] = re.compile( + r""" + \$\{ + (?P[^\}:]*) + (?::- + (?P[^\}]*) + )? + \} + """, + re.VERBOSE, +) + + +class Atom(metaclass=ABCMeta): + def __ne__(self, other: object) -> bool: + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + return not result + + @abstractmethod + def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... + + +class Literal(Atom): + def __init__(self, value: str) -> None: + self.value = value + + def __repr__(self) -> str: + return f"Literal(value={self.value})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return self.value == other.value + + def __hash__(self) -> int: + return hash((self.__class__, self.value)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + return self.value + + +class Variable(Atom): + def __init__(self, name: str, default: Optional[str]) -> None: + self.name = name + self.default = default + + def __repr__(self) -> str: + return f"Variable(name={self.name}, default={self.default})" + + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + return (self.name, self.default) == (other.name, other.default) + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.default)) + + def resolve(self, env: Mapping[str, Optional[str]]) -> str: + default = self.default if self.default is not None else "" + result = env.get(self.name, default) + return result if result is not None else "" + + +def parse_variables(value: str) -> Iterator[Atom]: + cursor = 0 + + for match in _posix_variable.finditer(value): + (start, end) = match.span() + name = match["name"] + default = match["default"] + + if start > cursor: + yield Literal(value=value[cursor:start]) + + yield Variable(name=name, default=default) + cursor = end + + length = len(value) + if cursor < length: + yield Literal(value=value[cursor:length]) diff --git a/env/lib/python3.12/site-packages/dotenv/version.py b/env/lib/python3.12/site-packages/dotenv/version.py new file mode 100644 index 0000000..5c4105c --- /dev/null +++ b/env/lib/python3.12/site-packages/dotenv/version.py @@ -0,0 +1 @@ +__version__ = "1.0.1" diff --git a/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/INSTALLER b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/LICENSE.txt b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..8f080ea --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 Nathaniel J. Smith and other contributors + +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/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/METADATA b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/METADATA new file mode 100644 index 0000000..cf12a82 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/METADATA @@ -0,0 +1,193 @@ +Metadata-Version: 2.1 +Name: h11 +Version: 0.14.0 +Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +Home-page: https://github.com/python-hyper/h11 +Author: Nathaniel J. Smith +Author-email: njs@pobox.com +License: MIT +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +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: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: System :: Networking +Requires-Python: >=3.7 +License-File: LICENSE.txt +Requires-Dist: typing-extensions ; python_version < "3.8" + +h11 +=== + +.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master + :target: https://travis-ci.org/python-hyper/h11 + :alt: Automated test status + +.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg + :target: https://codecov.io/gh/python-hyper/h11 + :alt: Test coverage + +.. image:: https://readthedocs.org/projects/h11/badge/?version=latest + :target: http://h11.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +This is a little HTTP/1.1 library written from scratch in Python, +heavily inspired by `hyper-h2 `_. + +It's a "bring-your-own-I/O" library; h11 contains no IO code +whatsoever. This means you can hook h11 up to your favorite network +API, and that could be anything you want: synchronous, threaded, +asynchronous, or your own implementation of `RFC 6214 +`_ -- h11 won't judge you. +(Compare this to the current state of the art, where every time a `new +network API `_ comes along then someone +gets to start over reimplementing the entire HTTP protocol from +scratch.) Cory Benfield made an `excellent blog post describing the +benefits of this approach +`_, or if you like video +then here's his `PyCon 2016 talk on the same theme +`_. + +This also means that h11 is not immediately useful out of the box: +it's a toolkit for building programs that speak HTTP, not something +that could directly replace ``requests`` or ``twisted.web`` or +whatever. But h11 makes it much easier to implement something like +``requests`` or ``twisted.web``. + +At a high level, working with h11 goes like this: + +1) First, create an ``h11.Connection`` object to track the state of a + single HTTP/1.1 connection. + +2) When you read data off the network, pass it to + ``conn.receive_data(...)``; you'll get back a list of objects + representing high-level HTTP "events". + +3) When you want to send a high-level HTTP event, create the + corresponding "event" object and pass it to ``conn.send(...)``; + this will give you back some bytes that you can then push out + through the network. + +For example, a client might instantiate and then send a +``h11.Request`` object, then zero or more ``h11.Data`` objects for the +request body (e.g., if this is a POST), and then a +``h11.EndOfMessage`` to indicate the end of the message. Then the +server would then send back a ``h11.Response``, some ``h11.Data``, and +its own ``h11.EndOfMessage``. If either side violates the protocol, +you'll get a ``h11.ProtocolError`` exception. + +h11 is suitable for implementing both servers and clients, and has a +pleasantly symmetric API: the events you send as a client are exactly +the ones that you receive as a server and vice-versa. + +`Here's an example of a tiny HTTP client +`_ + +It also has `a fine manual `_. + +FAQ +--- + +*Whyyyyy?* + +I wanted to play with HTTP in `Curio +`__ and `Trio +`__, which at the time didn't have any +HTTP libraries. So I thought, no big deal, Python has, like, a dozen +different implementations of HTTP, surely I can find one that's +reusable. I didn't find one, but I did find Cory's call-to-arms +blog-post. So I figured, well, fine, if I have to implement HTTP from +scratch, at least I can make sure no-one *else* has to ever again. + +*Should I use it?* + +Maybe. You should be aware that it's a very young project. But, it's +feature complete and has an exhaustive test-suite and complete docs, +so the next step is for people to try using it and see how it goes +:-). If you do then please let us know -- if nothing else we'll want +to talk to you before making any incompatible changes! + +*What are the features/limitations?* + +Roughly speaking, it's trying to be a robust, complete, and non-hacky +implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230: +HTTP/1.1 Message Syntax and Routing +`_. That is, it mostly focuses on +implementing HTTP at the level of taking bytes on and off the wire, +and the headers related to that, and tries to be anal about spec +conformance. It doesn't know about higher-level concerns like URL +routing, conditional GETs, cross-origin cookie policies, or content +negotiation. But it does know how to take care of framing, +cross-version differences in keep-alive handling, and the "obsolete +line folding" rule, so you can focus your energies on the hard / +interesting parts for your application, and it tries to support the +full specification in the sense that any useful HTTP/1.1 conformant +application should be able to use h11. + +It's pure Python, and has no dependencies outside of the standard +library. + +It has a test suite with 100.0% coverage for both statements and +branches. + +Currently it supports Python 3 (testing on 3.7-3.10) and PyPy 3. +The last Python 2-compatible version was h11 0.11.x. +(Originally it had a Cython wrapper for `http-parser +`_ and a beautiful nested state +machine implemented with ``yield from`` to postprocess the output. But +I had to take these out -- the new *parser* needs fewer lines-of-code +than the old *parser wrapper*, is written in pure Python, uses no +exotic language syntax, and has more features. It's sad, really; that +old state machine was really slick. I just need a few sentences here +to mourn that.) + +I don't know how fast it is. I haven't benchmarked or profiled it yet, +so it's probably got a few pointless hot spots, and I've been trying +to err on the side of simplicity and robustness instead of +micro-optimization. But at the architectural level I tried hard to +avoid fundamentally bad decisions, e.g., I believe that all the +parsing algorithms remain linear-time even in the face of pathological +input like slowloris, and there are no byte-by-byte loops. (I also +believe that it maintains bounded memory usage in the face of +arbitrary/pathological input.) + +The whole library is ~800 lines-of-code. You can read and understand +the whole thing in less than an hour. Most of the energy invested in +this so far has been spent on trying to keep things simple by +minimizing special-cases and ad hoc state manipulation; even though it +is now quite small and simple, I'm still annoyed that I haven't +figured out how to make it even smaller and simpler. (Unfortunately, +HTTP does not lend itself to simplicity.) + +The API is ~feature complete and I don't expect the general outlines +to change much, but you can't judge an API's ergonomics until you +actually document and use it, so I'd expect some changes in the +details. + +*How do I try it?* + +.. code-block:: sh + + $ pip install h11 + $ git clone git@github.com:python-hyper/h11 + $ cd h11/examples + $ python basic-client.py + +and go from there. + +*License?* + +MIT + +*Code of conduct?* + +Contributors are requested to follow our `code of conduct +`_ in +all project spaces. diff --git a/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/RECORD b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/RECORD new file mode 100644 index 0000000..a63f6cc --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/RECORD @@ -0,0 +1,52 @@ +h11-0.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +h11-0.14.0.dist-info/LICENSE.txt,sha256=N9tbuFkm2yikJ6JYZ_ELEjIAOuob5pzLhRE4rbjm82E,1124 +h11-0.14.0.dist-info/METADATA,sha256=B7pZ0m7WBXNs17vl6hUH9bJTL9s37DaGvY31w7jNxSg,8175 +h11-0.14.0.dist-info/RECORD,, +h11-0.14.0.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +h11-0.14.0.dist-info/top_level.txt,sha256=F7dC4jl3zeh8TGHEPaWJrMbeuoWbS379Gwdi-Yvdcis,4 +h11/__init__.py,sha256=iO1KzkSO42yZ6ffg-VMgbx_ZVTWGUY00nRYEWn-s3kY,1507 +h11/__pycache__/__init__.cpython-312.pyc,, +h11/__pycache__/_abnf.cpython-312.pyc,, +h11/__pycache__/_connection.cpython-312.pyc,, +h11/__pycache__/_events.cpython-312.pyc,, +h11/__pycache__/_headers.cpython-312.pyc,, +h11/__pycache__/_readers.cpython-312.pyc,, +h11/__pycache__/_receivebuffer.cpython-312.pyc,, +h11/__pycache__/_state.cpython-312.pyc,, +h11/__pycache__/_util.cpython-312.pyc,, +h11/__pycache__/_version.cpython-312.pyc,, +h11/__pycache__/_writers.cpython-312.pyc,, +h11/_abnf.py,sha256=ybixr0xsupnkA6GFAyMubuXF6Tc1lb_hF890NgCsfNc,4815 +h11/_connection.py,sha256=eS2sorMD0zKLCFiB9lW9W9F_Nzny2tjHa4e6s1ujr1c,26539 +h11/_events.py,sha256=LEfuvg1AbhHaVRwxCd0I-pFn9-ezUOaoL8o2Kvy1PBA,11816 +h11/_headers.py,sha256=RqB8cd8CN0blYPzcLe5qeCh-phv6D1U_CHj4hs67lgQ,10230 +h11/_readers.py,sha256=EbSed0jzwVUiD1nOPAeUcVE4Flf3wXkxfb8c06-OTBM,8383 +h11/_receivebuffer.py,sha256=xrspsdsNgWFxRfQcTXxR8RrdjRXXTK0Io5cQYWpJ1Ws,5252 +h11/_state.py,sha256=k1VL6SDbaPkSrZ-49ewCXDpuiUS69_46YhbWjuV1qEY,13300 +h11/_util.py,sha256=LWkkjXyJaFlAy6Lt39w73UStklFT5ovcvo0TkY7RYuk,4888 +h11/_version.py,sha256=LVyTdiZRzIIEv79UyOgbM5iUrJUllEzlCWaJEYBY1zc,686 +h11/_writers.py,sha256=oFKm6PtjeHfbj4RLX7VB7KDc1gIY53gXG3_HR9ltmTA,5081 +h11/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 +h11/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +h11/tests/__pycache__/__init__.cpython-312.pyc,, +h11/tests/__pycache__/helpers.cpython-312.pyc,, +h11/tests/__pycache__/test_against_stdlib_http.cpython-312.pyc,, +h11/tests/__pycache__/test_connection.cpython-312.pyc,, +h11/tests/__pycache__/test_events.cpython-312.pyc,, +h11/tests/__pycache__/test_headers.cpython-312.pyc,, +h11/tests/__pycache__/test_helpers.cpython-312.pyc,, +h11/tests/__pycache__/test_io.cpython-312.pyc,, +h11/tests/__pycache__/test_receivebuffer.cpython-312.pyc,, +h11/tests/__pycache__/test_state.cpython-312.pyc,, +h11/tests/__pycache__/test_util.cpython-312.pyc,, +h11/tests/data/test-file,sha256=ZJ03Rqs98oJw29OHzJg7LlMzyGQaRAY0r3AqBeM2wVU,65 +h11/tests/helpers.py,sha256=a1EVG_p7xU4wRsa3tMPTRxuaKCmretok9sxXWvqfmQA,3355 +h11/tests/test_against_stdlib_http.py,sha256=cojCHgHXFQ8gWhNlEEwl3trmOpN-5uDukRoHnElqo3A,3995 +h11/tests/test_connection.py,sha256=ZbPLDPclKvjgjAhgk-WlCPBaf17c4XUIV2tpaW08jOI,38720 +h11/tests/test_events.py,sha256=LPVLbcV-NvPNK9fW3rraR6Bdpz1hAlsWubMtNaJ5gHg,4657 +h11/tests/test_headers.py,sha256=qd8T1Zenuz5GbD6wklSJ5G8VS7trrYgMV0jT-SMvqg8,5612 +h11/tests/test_helpers.py,sha256=kAo0CEM4LGqmyyP2ZFmhsyq3UFJqoFfAbzu3hbWreRM,794 +h11/tests/test_io.py,sha256=uCZVnjarkRBkudfC1ij-KSCQ71XWJhnkgkgWWkKgYPQ,16386 +h11/tests/test_receivebuffer.py,sha256=3jGbeJM36Akqg_pAhPb7XzIn2NS6RhPg-Ryg8Eu6ytk,3454 +h11/tests/test_state.py,sha256=rqll9WqFsJPE0zSrtCn9LH659mPKsDeXZ-DwXwleuBQ,8928 +h11/tests/test_util.py,sha256=VO5L4nSFe4pgtSwKuv6u_6l0H7UeizF5WKuHTWreg70,2970 diff --git a/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/WHEEL b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/top_level.txt b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/top_level.txt new file mode 100644 index 0000000..0d24def --- /dev/null +++ b/env/lib/python3.12/site-packages/h11-0.14.0.dist-info/top_level.txt @@ -0,0 +1 @@ +h11 diff --git a/env/lib/python3.12/site-packages/h11/__init__.py b/env/lib/python3.12/site-packages/h11/__init__.py new file mode 100644 index 0000000..989e92c --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/__init__.py @@ -0,0 +1,62 @@ +# A highish-level implementation of the HTTP/1.1 wire protocol (RFC 7230), +# containing no networking code at all, loosely modelled on hyper-h2's generic +# implementation of HTTP/2 (and in particular the h2.connection.H2Connection +# class). There's still a bunch of subtle details you need to get right if you +# want to make this actually useful, because it doesn't implement all the +# semantics to check that what you're asking to write to the wire is sensible, +# but at least it gets you out of dealing with the wire itself. + +from h11._connection import Connection, NEED_DATA, PAUSED +from h11._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from h11._state import ( + CLIENT, + CLOSED, + DONE, + ERROR, + IDLE, + MIGHT_SWITCH_PROTOCOL, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, + SWITCHED_PROTOCOL, +) +from h11._util import LocalProtocolError, ProtocolError, RemoteProtocolError +from h11._version import __version__ + +PRODUCT_ID = "python-h11/" + __version__ + + +__all__ = ( + "Connection", + "NEED_DATA", + "PAUSED", + "ConnectionClosed", + "Data", + "EndOfMessage", + "Event", + "InformationalResponse", + "Request", + "Response", + "CLIENT", + "CLOSED", + "DONE", + "ERROR", + "IDLE", + "MUST_CLOSE", + "SEND_BODY", + "SEND_RESPONSE", + "SERVER", + "SWITCHED_PROTOCOL", + "ProtocolError", + "LocalProtocolError", + "RemoteProtocolError", +) diff --git a/env/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a44d0142a3dab980638f894f16da75b429d42776 GIT binary patch literal 1085 zcma))OK;Oa5XbF2?7ZB(nx;)DaHtSDq;B8@LP#aH+DJ(pIVp$*Y2_x{CcWN#c9wKpK*KI&WLSiNVJUg>H`=6ctswgRejZ^&g=sYe6=X|ml zksIUcGc!I4Lt!Y|0*FY22#P=yMMdt5*fEHsI7mnW8Oe}92}q(Oq)-adC>^ee+8I!g z0!wHKvM38Vl!H9VLje__h>Ea`mZ5}7u!2^gjLPAjn7s;XXbmc;0_$i!^u_Hvuz@z1 zEs>2ArV8C1%IMxKQBD5fVyjV_YPgO=2Eo{MXtJa08rF9DJ5=iK?Dur7D%0Gb1r6Kv z$&ki0E3jxrcZSAcoA|zUL}*+;CQd+0P3O?{z~bpF+a&(Pb$mi)lf0i2KcI<)tD2@# zqt(mw$FLjgVueY_yp~dNB_6HUv-NkU0_@Ne=#eyfjCK zL*ZEB$a3U3@*G8uWsVZZ3P+h^jboLg!qBPSr&)IT79RZW<6kmpI*b$EApbu!(NwtJ z53GRvTVH`I_?JkU3{y;lv3)Hy6wUS0Oc=SjL2sSAQmil9exr|@8kI4&Y#ZY*!W9b% zKP`3S0#RW)vH+~1s=0$H@Iutxaj-W%Q0v>aEC-C&arBb57g_E;t6dosb>ijry($aRfEOhBY>jc+HE4reTma<*iUb>Z7vEU>%Zais16T8?> z)jDhBD?&o7IB?*EmP^$mC&USHM1uCz$X5GP*w<@tAI z-dg3wa?XkuOGk4BzI1dSmaS-Ur*xFhmyEJC-LBSQLy-IF82`Fx4FgkqbDER*N8*8(Yk{86PxoP7TxZhZcS}G ze!MMUPR%qAq(i71bxmC^qDso8S>JHh2Y9~;&6=hxw*zZ)lX%gT^*v}Vw{`es3mT>r z%+Y4MKb&pRex&xiZM{0nl2ki52RNdpS#L`B=glW7Ifp`r)!(*NQQRd?YX>dTjBR+vq628 zT1(xRjJkzRx%TlP+e^V5<#@T}r@P{dS<*}D)(PN7-7u2hrA%!fs&4GMNiOA!?WTRx zU$GnSy9#cks_9MHbcgmD+OFI%TqfA;ppeHPuaA z?l$TwbmM(ey37sfuJ(LjBoNJwU8~|ouM}|;fg9wbhtP}l0>4`S?Fcok358~>CO4b1 zBCKhZRuf%gLs+ky8?9ZTkk9jL^0C1`s`3v|a|Ng#3XS@%aBz%nnmRvQm=lb;3HbxL zvM=vJL#P!Bf+X*%)!Bn%mtJaWN~-~v^$BzwdS-!9L4Pky5QN8qA=U|d84#UzD31oo zVJGH&NPy^=Lv=279`{e4 zoPLIk6ZdG68u0*0F)vZnk*`1LMoH>!mj+|6eP8!|FANCAy9Z(^C(=nzeK&EDo;t@P z|I^;{IxP!I4H$q_I2Cs+gTcktU~qJofz{(ru8sjWb<1V}%QL;T(?# zzmENO3mKFtNmF?b&=mKQ1=;+`Xg5t$?{`@+zxWI1`#4I%8was*C*mbQGJD3nalvrs zcr2W(pKc<9#7O{V*ok^%h#L1mh)VyP9(y+0rAR8$jevOO8?HNqeO#P=3yJ+dP}=cD literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/__pycache__/_connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33358451e5b7a252f86d8db12df6e835b2bea989 GIT binary patch literal 22612 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/__pycache__/_headers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..330a6f8e5da8614cc86b978f1875977e48d6b8a7 GIT binary patch literal 7858 zcmb_BZEPDycC+LzxgseoB}$g{>9xKr%9dosavVE$V#ks{WjQ_DxeIL{OL3PHWqv5L zOWV>>t#EJwr7>W+xvO}%15QQrLqYmO0SYwzmliD$peV4k*1!nVV3(^FhcHQFxdrKpY z#Sun9RCdE?hti}pLtl>YN(=NmXSq(I)^`!=0{ubFXs|TneX_*e_ue6Q?eCL2oWJci zxYu#NXgW?MX0PbfjuGVvQ!F2BumMWSj<2_`~u)pT3!+o4!W_1jHxVpdnRXk^x`8%u^m zv3F@wPll7RQA(546ag)&gml%WtX&XqiZPMSw$dz@do>uU18DiWAx{ zMO59a&ns2X_dvTE#$3>@fwlx~H?+MVmTKsu>N+jq!)nzqQVY-my|RMBtQr`rn-%<$ z={%=~6qRbB$6zL0GL%zt49>kj7QLm)(FE){5(=xbJ{8jCP%M_bqsiP;??AS85J^&;ruIh@z?l}+qqt5o zJ`&_z%dv9jB9tgc`=9!Qoq~I@1r@dt2@B-z+aarRy_6*cR>!I6^h40%HT*coQi|?YJ+E^ z`nlA^;LyQ?{Uf1St^abQ|8!DO2i3&w!B})+aAp?tB5`P7=(R!6D7;1CTcJr+8=M*% z8VnX>GcYr2iosws5!HjiIqx~^<_#1f5#$6zf(4Rm>0aa?i@Ud=N5Tb%i*2?!wn6mG z%S11YrO9;VK`>-+e}(ZYgf;^RcRi6z#@G?SNwfk?Lll{|L5Pq*|uVN3Qx7db@VRB@IHS3Wr%;jE-f z5-*=4{H{=#o?ufoVR{SU7R<>))&Qr5jxw@51;{-=A|1NArH6*wg>hwKS{#2n{c_= z<~ZCQ*d}|#_Rx0U!;>%%+qKPeR{)DE_3l`g*4jAFHg1Y&b#c=auM~X^DvgJ#yzQ!z zU7o8gZn^}TMSMIw*z)m{o5#l<9UprvUCJIG%l5pnGPTC79bVd&k!Vf8vxpAsexcK<2faaLV~ zhV~aw-6PLzy96oX_)|(6chUDy*t&*S;7v22N#r-^q5K&J%!t#c$y!?|>@P zRciY)XK>iRq9e$U!`&Glw!5+YTBZ}*ujL&!p)I5334B&ktJl^>S8rtZ9oxcwUgU&v zE;GC$tf;HkR$^KCP_||GIZPYpEbftU(>Y~10n-_T_yfYMt8_QOw_P3RTbhP)UM8~z ztvCt2Pi^!ReCRt+ZL^BI5=k0|SYl2MLLd|@2E}v~5dQ>zTPTeM@|1TnX3l(9f^=jD zCAK1~{uD;&8LZG7{2ms3fTWyIEs(rO1o6dnagg1?W~i6RB$y3_%-a|EPz!$1Fo=WwhQFPoL(~fDW631#Q zrCoz%62rDBv`P>v&5LPqy7oo<;>v$!yI;?f`KozQM}Ngix|Gc;j$227rdvmqW<_xp z&+*4xx@sC@tR1De@_gkvqw2GgcECFWN)`%7()NYMv;!=rZ5n;Rj*^B`NjoC;B1Mke z|6gz%j3>I3yvI8Ar;C={MCiST;3~UZiH`H?-FcgVJA%TJ94Z?YbHpbA3Y2{qqL`c~& zrlF$gG?dUHkg>s&KoYaRxsG@$rbi(^lCKuWMhj!b)uR6i)FGR%RWa8OYLHf@wBQu@ z3T7w5Q>nx)Rhc_*IRP2z3#%NH3kY&lleN^$Op@wgaQza+ZBj2(W=*jC@Bk5zDHZzc zOc3CL95Dfe;UR+_#~A`kFik<5iA8nz=rlS*{kS0BKhr*woH6Tyg+s(Z5DpO+a)f4P z)P%xZm)})3~(2cz|>WiDE!N4} z7$#W7@}B4qnDzd1XlSTBU~C=4*RXIg*W7OKjk(sn2H*6gvHe5$BEP6U6N$I+iLWIy z^6^`XBTwpEGuJ-8yg2&AQ~#46u3R{bDFMi2y z43DnwI+Gn9UF})Ay_|lS{^=hX!=sC5ja_G+NOem`K1ydkcqGYBcJ&(mOY6JF4exla zzGeC1!;2qZV%%*s>|1Rx4vuViMsre!A@${Y_8Z>LoVR7u+mZEltejg_)<%uaV~@RW z=4!iEg^k+&ZL3w+8V&wO)&6HL;_Zf!T>Tqgoqle&HP(UqudU0wNJDdxUQVjdxE@Iz z4DFp$~M?5>=iKN?ac=qNzjhmkKtfzfNT(>XrOp z85Mjf+8iig*?W0%{|7utLs9@K4ZQ$RNC_|-p_j3G7pp(O>MB%zr**IJW|;P5N@qbc zydor15EQZ0L9*HyAhSDe)>;5|oh=ZvEtR*%^g;>&mlECx3Kx~)Bf~$#Pt&1-D|8No z*1T{!*Eh7;cVeUOL{{v9l;YUZALrZ+nfi5iTduu-v;9!E{m^>*;l<0j?%~buW7+Ow zUkv}M`=sIBo9jBf+4W|&>&^A96VNq%UAg+kW%vr%W6EHEr7}SD#*!3J1rVG7$^g!tDTDoG$^h!(h?Lw8 zh-fd02L#^aTBJTzVS5lsI$;}tv2Y5^RC~i}LY%iuVd*&C* zqNjfdgY+6=)Re`|lBgRvauY|Y%14JuN~6*vunu zZ63L>apXc)JhWJoajje~$-8v7Yt|%V&&kK0Q+a{Bagp0{kX`a(RZjG6ip^QEIWzLh z3qQN?^RZRG(K7s4Je;?~_`kdNuIyiT4;cJ_C1@wLp0;T%kl*%@fw3vO_i(8})Grsa z!rg-SlXA1Ras&&QICn=;?8QiEo>Raw+{VWQVO&EJ@D_Q7*&y}q3}kMa2Vw9+hVCkw zV2|~l%GXPFOPE;TH75edrlT+ugW+P@-Z&M~f)+dot1;(?tI=sdlE4&bnEA4tK$JF} zEm>zvCi2MH1y=V-bz5fgm&u*T%vAbnqxqgitFU+vys^KzcIbA7+&+w-?M(7~neEe9S3R$S{1`wdc;t8H1TTW)^X zY_#@gE^M~;XIuMMC)ZnFU#~r~P?M``UFulwd)Q~R4Q8%ywhd<62G^YHZEvjC9bJ%~ zI|jLNZgFZUmASSunz@l}?90~de@+mZS2!Zo=Xi0kVKD`dFX?PmYnE>-0>X=P*{bF& z-(mr@rO};$(~EaM+>_;-@=m+Z^2{zswgq?IOKh&ZjpM|Xvyj+x;@adF%I9&`{L1+a zLbmKh6mZc+^cK^%q;4#Ve5{>y8B=Vndg-S2N9DBt7cx>w%M6ZovbQv`heJAYOrq7OIK_ciY~ dct7ey-|tw6{@0F?$G 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 NQjJe2fo2E}{4Y5AP&ohq literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/__pycache__/_receivebuffer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5570ac027f6ae0a434a0d57b5baccec9e2cc566 GIT binary patch literal 4709 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 Q#QRT2l%l{X5L$omUw>~1wEzGB literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/__pycache__/_state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f4eab710f3a6688bda52b196cd1863ebe7400b3 GIT binary patch literal 8544 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 literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/_abnf.py b/env/lib/python3.12/site-packages/h11/_abnf.py new file mode 100644 index 0000000..933587f --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_abnf.py @@ -0,0 +1,132 @@ +# We use native strings for all the re patterns, to take advantage of string +# formatting, and then convert to bytestrings when compiling the final re +# objects. + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#whitespace +# OWS = *( SP / HTAB ) +# ; optional whitespace +OWS = r"[ \t]*" + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.token.separators +# token = 1*tchar +# +# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" +# / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" +# / DIGIT / ALPHA +# ; any VCHAR, except delimiters +token = r"[-!#$%&'*+.^_`|~0-9a-zA-Z]+" + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#header.fields +# field-name = token +field_name = token + +# The standard says: +# +# field-value = *( field-content / obs-fold ) +# field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] +# field-vchar = VCHAR / obs-text +# obs-fold = CRLF 1*( SP / HTAB ) +# ; obsolete line folding +# ; see Section 3.2.4 +# +# https://tools.ietf.org/html/rfc5234#appendix-B.1 +# +# VCHAR = %x21-7E +# ; visible (printing) characters +# +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.quoted-string +# obs-text = %x80-FF +# +# However, the standard definition of field-content is WRONG! It disallows +# fields containing a single visible character surrounded by whitespace, +# e.g. "foo a bar". +# +# See: https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189 +# +# So our definition of field_content attempts to fix it up... +# +# Also, we allow lots of control characters, because apparently people assume +# that they're legal in practice (e.g., google analytics makes cookies with +# \x01 in them!): +# https://github.com/python-hyper/h11/issues/57 +# We still don't allow NUL or whitespace, because those are often treated as +# meta-characters and letting them through can lead to nasty issues like SSRF. +vchar = r"[\x21-\x7e]" +vchar_or_obs_text = r"[^\x00\s]" +field_vchar = vchar_or_obs_text +field_content = r"{field_vchar}+(?:[ \t]+{field_vchar}+)*".format(**globals()) + +# We handle obs-fold at a different level, and our fixed-up field_content +# already grows to swallow the whole value, so ? instead of * +field_value = r"({field_content})?".format(**globals()) + +# header-field = field-name ":" OWS field-value OWS +header_field = ( + r"(?P{field_name})" + r":" + r"{OWS}" + r"(?P{field_value})" + r"{OWS}".format(**globals()) +) + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#request.line +# +# request-line = method SP request-target SP HTTP-version CRLF +# method = token +# HTTP-version = HTTP-name "/" DIGIT "." DIGIT +# HTTP-name = %x48.54.54.50 ; "HTTP", case-sensitive +# +# request-target is complicated (see RFC 7230 sec 5.3) -- could be path, full +# URL, host+port (for connect), or even "*", but in any case we are guaranteed +# that it contists of the visible printing characters. +method = token +request_target = r"{vchar}+".format(**globals()) +http_version = r"HTTP/(?P[0-9]\.[0-9])" +request_line = ( + r"(?P{method})" + r" " + r"(?P{request_target})" + r" " + r"{http_version}".format(**globals()) +) + +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#status.line +# +# status-line = HTTP-version SP status-code SP reason-phrase CRLF +# status-code = 3DIGIT +# reason-phrase = *( HTAB / SP / VCHAR / obs-text ) +status_code = r"[0-9]{3}" +reason_phrase = r"([ \t]|{vchar_or_obs_text})*".format(**globals()) +status_line = ( + r"{http_version}" + r" " + r"(?P{status_code})" + # However, there are apparently a few too many servers out there that just + # leave out the reason phrase: + # https://github.com/scrapy/scrapy/issues/345#issuecomment-281756036 + # https://github.com/seanmonstar/httparse/issues/29 + # so make it optional. ?: is a non-capturing group. + r"(?: (?P{reason_phrase}))?".format(**globals()) +) + +HEXDIG = r"[0-9A-Fa-f]" +# Actually +# +# chunk-size = 1*HEXDIG +# +# but we impose an upper-limit to avoid ridiculosity. len(str(2**64)) == 20 +chunk_size = r"({HEXDIG}){{1,20}}".format(**globals()) +# Actually +# +# chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) +# +# but we aren't parsing the things so we don't really care. +chunk_ext = r";.*" +chunk_header = ( + r"(?P{chunk_size})" + r"(?P{chunk_ext})?" + r"{OWS}\r\n".format( + **globals() + ) # Even though the specification does not allow for extra whitespaces, + # we are lenient with trailing whitespaces because some servers on the wild use it. +) diff --git a/env/lib/python3.12/site-packages/h11/_connection.py b/env/lib/python3.12/site-packages/h11/_connection.py new file mode 100644 index 0000000..d175270 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_connection.py @@ -0,0 +1,633 @@ +# This contains the main Connection class. Everything in h11 revolves around +# this. +from typing import Any, Callable, cast, Dict, List, Optional, Tuple, Type, Union + +from ._events import ( + ConnectionClosed, + Data, + EndOfMessage, + Event, + InformationalResponse, + Request, + Response, +) +from ._headers import get_comma_header, has_expect_100_continue, set_comma_header +from ._readers import READERS, ReadersType +from ._receivebuffer import ReceiveBuffer +from ._state import ( + _SWITCH_CONNECT, + _SWITCH_UPGRADE, + CLIENT, + ConnectionState, + DONE, + ERROR, + MIGHT_SWITCH_PROTOCOL, + SEND_BODY, + SERVER, + SWITCHED_PROTOCOL, +) +from ._util import ( # Import the internal things we need + LocalProtocolError, + RemoteProtocolError, + Sentinel, +) +from ._writers import WRITERS, WritersType + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = ["Connection", "NEED_DATA", "PAUSED"] + + +class NEED_DATA(Sentinel, metaclass=Sentinel): + pass + + +class PAUSED(Sentinel, metaclass=Sentinel): + pass + + +# If we ever have this much buffered without it making a complete parseable +# event, we error out. The only time we really buffer is when reading the +# request/response line + headers together, so this is effectively the limit on +# the size of that. +# +# Some precedents for defaults: +# - node.js: 80 * 1024 +# - tomcat: 8 * 1024 +# - IIS: 16 * 1024 +# - Apache: <8 KiB per line> +DEFAULT_MAX_INCOMPLETE_EVENT_SIZE = 16 * 1024 + +# RFC 7230's rules for connection lifecycles: +# - If either side says they want to close the connection, then the connection +# must close. +# - HTTP/1.1 defaults to keep-alive unless someone says Connection: close +# - HTTP/1.0 defaults to close unless both sides say Connection: keep-alive +# (and even this is a mess -- e.g. if you're implementing a proxy then +# sending Connection: keep-alive is forbidden). +# +# We simplify life by simply not supporting keep-alive with HTTP/1.0 peers. So +# our rule is: +# - If someone says Connection: close, we will close +# - If someone uses HTTP/1.0, we will close. +def _keep_alive(event: Union[Request, Response]) -> bool: + connection = get_comma_header(event.headers, b"connection") + if b"close" in connection: + return False + if getattr(event, "http_version", b"1.1") < b"1.1": + return False + return True + + +def _body_framing( + request_method: bytes, event: Union[Request, Response] +) -> Tuple[str, Union[Tuple[()], Tuple[int]]]: + # Called when we enter SEND_BODY to figure out framing information for + # this body. + # + # These are the only two events that can trigger a SEND_BODY state: + assert type(event) in (Request, Response) + # Returns one of: + # + # ("content-length", count) + # ("chunked", ()) + # ("http/1.0", ()) + # + # which are (lookup key, *args) for constructing body reader/writer + # objects. + # + # Reference: https://tools.ietf.org/html/rfc7230#section-3.3.3 + # + # Step 1: some responses always have an empty body, regardless of what the + # headers say. + if type(event) is Response: + if ( + event.status_code in (204, 304) + or request_method == b"HEAD" + or (request_method == b"CONNECT" and 200 <= event.status_code < 300) + ): + return ("content-length", (0,)) + # Section 3.3.3 also lists another case -- responses with status_code + # < 200. For us these are InformationalResponses, not Responses, so + # they can't get into this function in the first place. + assert event.status_code >= 200 + + # Step 2: check for Transfer-Encoding (T-E beats C-L): + transfer_encodings = get_comma_header(event.headers, b"transfer-encoding") + if transfer_encodings: + assert transfer_encodings == [b"chunked"] + return ("chunked", ()) + + # Step 3: check for Content-Length + content_lengths = get_comma_header(event.headers, b"content-length") + if content_lengths: + return ("content-length", (int(content_lengths[0]),)) + + # Step 4: no applicable headers; fallback/default depends on type + if type(event) is Request: + return ("content-length", (0,)) + else: + return ("http/1.0", ()) + + +################################################################ +# +# The main Connection class +# +################################################################ + + +class Connection: + """An object encapsulating the state of an HTTP connection. + + Args: + our_role: If you're implementing a client, pass :data:`h11.CLIENT`. If + you're implementing a server, pass :data:`h11.SERVER`. + + max_incomplete_event_size (int): + The maximum number of bytes we're willing to buffer of an + incomplete event. In practice this mostly sets a limit on the + maximum size of the request/response line + headers. If this is + exceeded, then :meth:`next_event` will raise + :exc:`RemoteProtocolError`. + + """ + + def __init__( + self, + our_role: Type[Sentinel], + max_incomplete_event_size: int = DEFAULT_MAX_INCOMPLETE_EVENT_SIZE, + ) -> None: + self._max_incomplete_event_size = max_incomplete_event_size + # State and role tracking + if our_role not in (CLIENT, SERVER): + raise ValueError("expected CLIENT or SERVER, not {!r}".format(our_role)) + self.our_role = our_role + self.their_role: Type[Sentinel] + if our_role is CLIENT: + self.their_role = SERVER + else: + self.their_role = CLIENT + self._cstate = ConnectionState() + + # Callables for converting data->events or vice-versa given the + # current state + self._writer = self._get_io_object(self.our_role, None, WRITERS) + self._reader = self._get_io_object(self.their_role, None, READERS) + + # Holds any unprocessed received data + self._receive_buffer = ReceiveBuffer() + # If this is true, then it indicates that the incoming connection was + # closed *after* the end of whatever's in self._receive_buffer: + self._receive_buffer_closed = False + + # Extra bits of state that don't fit into the state machine. + # + # These two are only used to interpret framing headers for figuring + # out how to read/write response bodies. their_http_version is also + # made available as a convenient public API. + self.their_http_version: Optional[bytes] = None + self._request_method: Optional[bytes] = None + # This is pure flow-control and doesn't at all affect the set of legal + # transitions, so no need to bother ConnectionState with it: + self.client_is_waiting_for_100_continue = False + + @property + def states(self) -> Dict[Type[Sentinel], Type[Sentinel]]: + """A dictionary like:: + + {CLIENT: , SERVER: } + + See :ref:`state-machine` for details. + + """ + return dict(self._cstate.states) + + @property + def our_state(self) -> Type[Sentinel]: + """The current state of whichever role we are playing. See + :ref:`state-machine` for details. + """ + return self._cstate.states[self.our_role] + + @property + def their_state(self) -> Type[Sentinel]: + """The current state of whichever role we are NOT playing. See + :ref:`state-machine` for details. + """ + return self._cstate.states[self.their_role] + + @property + def they_are_waiting_for_100_continue(self) -> bool: + return self.their_role is CLIENT and self.client_is_waiting_for_100_continue + + def start_next_cycle(self) -> None: + """Attempt to reset our connection state for a new request/response + cycle. + + If both client and server are in :data:`DONE` state, then resets them + both to :data:`IDLE` state in preparation for a new request/response + cycle on this same connection. Otherwise, raises a + :exc:`LocalProtocolError`. + + See :ref:`keepalive-and-pipelining`. + + """ + old_states = dict(self._cstate.states) + self._cstate.start_next_cycle() + self._request_method = None + # self.their_http_version gets left alone, since it presumably lasts + # beyond a single request/response cycle + assert not self.client_is_waiting_for_100_continue + self._respond_to_state_changes(old_states) + + def _process_error(self, role: Type[Sentinel]) -> None: + old_states = dict(self._cstate.states) + self._cstate.process_error(role) + self._respond_to_state_changes(old_states) + + def _server_switch_event(self, event: Event) -> Optional[Type[Sentinel]]: + if type(event) is InformationalResponse and event.status_code == 101: + return _SWITCH_UPGRADE + if type(event) is Response: + if ( + _SWITCH_CONNECT in self._cstate.pending_switch_proposals + and 200 <= event.status_code < 300 + ): + return _SWITCH_CONNECT + return None + + # All events go through here + def _process_event(self, role: Type[Sentinel], event: Event) -> None: + # First, pass the event through the state machine to make sure it + # succeeds. + old_states = dict(self._cstate.states) + if role is CLIENT and type(event) is Request: + if event.method == b"CONNECT": + self._cstate.process_client_switch_proposal(_SWITCH_CONNECT) + if get_comma_header(event.headers, b"upgrade"): + self._cstate.process_client_switch_proposal(_SWITCH_UPGRADE) + server_switch_event = None + if role is SERVER: + server_switch_event = self._server_switch_event(event) + self._cstate.process_event(role, type(event), server_switch_event) + + # Then perform the updates triggered by it. + + if type(event) is Request: + self._request_method = event.method + + if role is self.their_role and type(event) in ( + Request, + Response, + InformationalResponse, + ): + event = cast(Union[Request, Response, InformationalResponse], event) + self.their_http_version = event.http_version + + # Keep alive handling + # + # RFC 7230 doesn't really say what one should do if Connection: close + # shows up on a 1xx InformationalResponse. I think the idea is that + # this is not supposed to happen. In any case, if it does happen, we + # ignore it. + if type(event) in (Request, Response) and not _keep_alive( + cast(Union[Request, Response], event) + ): + self._cstate.process_keep_alive_disabled() + + # 100-continue + if type(event) is Request and has_expect_100_continue(event): + self.client_is_waiting_for_100_continue = True + if type(event) in (InformationalResponse, Response): + self.client_is_waiting_for_100_continue = False + if role is CLIENT and type(event) in (Data, EndOfMessage): + self.client_is_waiting_for_100_continue = False + + self._respond_to_state_changes(old_states, event) + + def _get_io_object( + self, + role: Type[Sentinel], + event: Optional[Event], + io_dict: Union[ReadersType, WritersType], + ) -> Optional[Callable[..., Any]]: + # event may be None; it's only used when entering SEND_BODY + state = self._cstate.states[role] + if state is SEND_BODY: + # Special case: the io_dict has a dict of reader/writer factories + # that depend on the request/response framing. + framing_type, args = _body_framing( + cast(bytes, self._request_method), cast(Union[Request, Response], event) + ) + return io_dict[SEND_BODY][framing_type](*args) # type: ignore[index] + else: + # General case: the io_dict just has the appropriate reader/writer + # for this state + return io_dict.get((role, state)) # type: ignore[return-value] + + # This must be called after any action that might have caused + # self._cstate.states to change. + def _respond_to_state_changes( + self, + old_states: Dict[Type[Sentinel], Type[Sentinel]], + event: Optional[Event] = None, + ) -> None: + # Update reader/writer + if self.our_state != old_states[self.our_role]: + self._writer = self._get_io_object(self.our_role, event, WRITERS) + if self.their_state != old_states[self.their_role]: + self._reader = self._get_io_object(self.their_role, event, READERS) + + @property + def trailing_data(self) -> Tuple[bytes, bool]: + """Data that has been received, but not yet processed, represented as + a tuple with two elements, where the first is a byte-string containing + the unprocessed data itself, and the second is a bool that is True if + the receive connection was closed. + + See :ref:`switching-protocols` for discussion of why you'd want this. + """ + return (bytes(self._receive_buffer), self._receive_buffer_closed) + + def receive_data(self, data: bytes) -> None: + """Add data to our internal receive buffer. + + This does not actually do any processing on the data, just stores + it. To trigger processing, you have to call :meth:`next_event`. + + Args: + data (:term:`bytes-like object`): + The new data that was just received. + + Special case: If *data* is an empty byte-string like ``b""``, + then this indicates that the remote side has closed the + connection (end of file). Normally this is convenient, because + standard Python APIs like :meth:`file.read` or + :meth:`socket.recv` use ``b""`` to indicate end-of-file, while + other failures to read are indicated using other mechanisms + like raising :exc:`TimeoutError`. When using such an API you + can just blindly pass through whatever you get from ``read`` + to :meth:`receive_data`, and everything will work. + + But, if you have an API where reading an empty string is a + valid non-EOF condition, then you need to be aware of this and + make sure to check for such strings and avoid passing them to + :meth:`receive_data`. + + Returns: + Nothing, but after calling this you should call :meth:`next_event` + to parse the newly received data. + + Raises: + RuntimeError: + Raised if you pass an empty *data*, indicating EOF, and then + pass a non-empty *data*, indicating more data that somehow + arrived after the EOF. + + (Calling ``receive_data(b"")`` multiple times is fine, + and equivalent to calling it once.) + + """ + if data: + if self._receive_buffer_closed: + raise RuntimeError("received close, then received more data?") + self._receive_buffer += data + else: + self._receive_buffer_closed = True + + def _extract_next_receive_event( + self, + ) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: + state = self.their_state + # We don't pause immediately when they enter DONE, because even in + # DONE state we can still process a ConnectionClosed() event. But + # if we have data in our buffer, then we definitely aren't getting + # a ConnectionClosed() immediately and we need to pause. + if state is DONE and self._receive_buffer: + return PAUSED + if state is MIGHT_SWITCH_PROTOCOL or state is SWITCHED_PROTOCOL: + return PAUSED + assert self._reader is not None + event = self._reader(self._receive_buffer) + if event is None: + if not self._receive_buffer and self._receive_buffer_closed: + # In some unusual cases (basically just HTTP/1.0 bodies), EOF + # triggers an actual protocol event; in that case, we want to + # return that event, and then the state will change and we'll + # get called again to generate the actual ConnectionClosed(). + if hasattr(self._reader, "read_eof"): + event = self._reader.read_eof() # type: ignore[attr-defined] + else: + event = ConnectionClosed() + if event is None: + event = NEED_DATA + return event # type: ignore[no-any-return] + + def next_event(self) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: + """Parse the next event out of our receive buffer, update our internal + state, and return it. + + This is a mutating operation -- think of it like calling :func:`next` + on an iterator. + + Returns: + : One of three things: + + 1) An event object -- see :ref:`events`. + + 2) The special constant :data:`NEED_DATA`, which indicates that + you need to read more data from your socket and pass it to + :meth:`receive_data` before this method will be able to return + any more events. + + 3) The special constant :data:`PAUSED`, which indicates that we + are not in a state where we can process incoming data (usually + because the peer has finished their part of the current + request/response cycle, and you have not yet called + :meth:`start_next_cycle`). See :ref:`flow-control` for details. + + Raises: + RemoteProtocolError: + The peer has misbehaved. You should close the connection + (possibly after sending some kind of 4xx response). + + Once this method returns :class:`ConnectionClosed` once, then all + subsequent calls will also return :class:`ConnectionClosed`. + + If this method raises any exception besides :exc:`RemoteProtocolError` + then that's a bug -- if it happens please file a bug report! + + If this method raises any exception then it also sets + :attr:`Connection.their_state` to :data:`ERROR` -- see + :ref:`error-handling` for discussion. + + """ + + if self.their_state is ERROR: + raise RemoteProtocolError("Can't receive data when peer state is ERROR") + try: + event = self._extract_next_receive_event() + if event not in [NEED_DATA, PAUSED]: + self._process_event(self.their_role, cast(Event, event)) + if event is NEED_DATA: + if len(self._receive_buffer) > self._max_incomplete_event_size: + # 431 is "Request header fields too large" which is pretty + # much the only situation where we can get here + raise RemoteProtocolError( + "Receive buffer too long", error_status_hint=431 + ) + if self._receive_buffer_closed: + # We're still trying to complete some event, but that's + # never going to happen because no more data is coming + raise RemoteProtocolError("peer unexpectedly closed connection") + return event + except BaseException as exc: + self._process_error(self.their_role) + if isinstance(exc, LocalProtocolError): + exc._reraise_as_remote_protocol_error() + else: + raise + + def send(self, event: Event) -> Optional[bytes]: + """Convert a high-level event into bytes that can be sent to the peer, + while updating our internal state machine. + + Args: + event: The :ref:`event ` to send. + + Returns: + If ``type(event) is ConnectionClosed``, then returns + ``None``. Otherwise, returns a :term:`bytes-like object`. + + Raises: + LocalProtocolError: + Sending this event at this time would violate our + understanding of the HTTP/1.1 protocol. + + If this method raises any exception then it also sets + :attr:`Connection.our_state` to :data:`ERROR` -- see + :ref:`error-handling` for discussion. + + """ + data_list = self.send_with_data_passthrough(event) + if data_list is None: + return None + else: + return b"".join(data_list) + + def send_with_data_passthrough(self, event: Event) -> Optional[List[bytes]]: + """Identical to :meth:`send`, except that in situations where + :meth:`send` returns a single :term:`bytes-like object`, this instead + returns a list of them -- and when sending a :class:`Data` event, this + list is guaranteed to contain the exact object you passed in as + :attr:`Data.data`. See :ref:`sendfile` for discussion. + + """ + if self.our_state is ERROR: + raise LocalProtocolError("Can't send data when our state is ERROR") + try: + if type(event) is Response: + event = self._clean_up_response_headers_for_sending(event) + # We want to call _process_event before calling the writer, + # because if someone tries to do something invalid then this will + # give a sensible error message, while our writers all just assume + # they will only receive valid events. But, _process_event might + # change self._writer. So we have to do a little dance: + writer = self._writer + self._process_event(self.our_role, event) + if type(event) is ConnectionClosed: + return None + else: + # In any situation where writer is None, process_event should + # have raised ProtocolError + assert writer is not None + data_list: List[bytes] = [] + writer(event, data_list.append) + return data_list + except: + self._process_error(self.our_role) + raise + + def send_failed(self) -> None: + """Notify the state machine that we failed to send the data it gave + us. + + This causes :attr:`Connection.our_state` to immediately become + :data:`ERROR` -- see :ref:`error-handling` for discussion. + + """ + self._process_error(self.our_role) + + # When sending a Response, we take responsibility for a few things: + # + # - Sometimes you MUST set Connection: close. We take care of those + # times. (You can also set it yourself if you want, and if you do then + # we'll respect that and close the connection at the right time. But you + # don't have to worry about that unless you want to.) + # + # - The user has to set Content-Length if they want it. Otherwise, for + # responses that have bodies (e.g. not HEAD), then we will automatically + # select the right mechanism for streaming a body of unknown length, + # which depends on depending on the peer's HTTP version. + # + # This function's *only* responsibility is making sure headers are set up + # right -- everything downstream just looks at the headers. There are no + # side channels. + def _clean_up_response_headers_for_sending(self, response: Response) -> Response: + assert type(response) is Response + + headers = response.headers + need_close = False + + # HEAD requests need some special handling: they always act like they + # have Content-Length: 0, and that's how _body_framing treats + # them. But their headers are supposed to match what we would send if + # the request was a GET. (Technically there is one deviation allowed: + # we're allowed to leave out the framing headers -- see + # https://tools.ietf.org/html/rfc7231#section-4.3.2 . But it's just as + # easy to get them right.) + method_for_choosing_headers = cast(bytes, self._request_method) + if method_for_choosing_headers == b"HEAD": + method_for_choosing_headers = b"GET" + framing_type, _ = _body_framing(method_for_choosing_headers, response) + if framing_type in ("chunked", "http/1.0"): + # This response has a body of unknown length. + # If our peer is HTTP/1.1, we use Transfer-Encoding: chunked + # If our peer is HTTP/1.0, we use no framing headers, and close the + # connection afterwards. + # + # Make sure to clear Content-Length (in principle user could have + # set both and then we ignored Content-Length b/c + # Transfer-Encoding overwrote it -- this would be naughty of them, + # but the HTTP spec says that if our peer does this then we have + # to fix it instead of erroring out, so we'll accord the user the + # same respect). + headers = set_comma_header(headers, b"content-length", []) + if self.their_http_version is None or self.their_http_version < b"1.1": + # Either we never got a valid request and are sending back an + # error (their_http_version is None), so we assume the worst; + # or else we did get a valid HTTP/1.0 request, so we know that + # they don't understand chunked encoding. + headers = set_comma_header(headers, b"transfer-encoding", []) + # This is actually redundant ATM, since currently we + # unconditionally disable keep-alive when talking to HTTP/1.0 + # peers. But let's be defensive just in case we add + # Connection: keep-alive support later: + if self._request_method != b"HEAD": + need_close = True + else: + headers = set_comma_header(headers, b"transfer-encoding", [b"chunked"]) + + if not self._cstate.keep_alive or need_close: + # Make sure Connection: close is set + connection = set(get_comma_header(headers, b"connection")) + connection.discard(b"keep-alive") + connection.add(b"close") + headers = set_comma_header(headers, b"connection", sorted(connection)) + + return Response( + headers=headers, + status_code=response.status_code, + http_version=response.http_version, + reason=response.reason, + ) diff --git a/env/lib/python3.12/site-packages/h11/_events.py b/env/lib/python3.12/site-packages/h11/_events.py new file mode 100644 index 0000000..075bf8a --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_events.py @@ -0,0 +1,369 @@ +# High level events that make up HTTP/1.1 conversations. Loosely inspired by +# the corresponding events in hyper-h2: +# +# http://python-hyper.org/h2/en/stable/api.html#events +# +# Don't subclass these. Stuff will break. + +import re +from abc import ABC +from dataclasses import dataclass, field +from typing import Any, cast, Dict, List, Tuple, Union + +from ._abnf import method, request_target +from ._headers import Headers, normalize_and_validate +from ._util import bytesify, LocalProtocolError, validate + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = [ + "Event", + "Request", + "InformationalResponse", + "Response", + "Data", + "EndOfMessage", + "ConnectionClosed", +] + +method_re = re.compile(method.encode("ascii")) +request_target_re = re.compile(request_target.encode("ascii")) + + +class Event(ABC): + """ + Base class for h11 events. + """ + + __slots__ = () + + +@dataclass(init=False, frozen=True) +class Request(Event): + """The beginning of an HTTP request. + + Fields: + + .. attribute:: method + + An HTTP method, e.g. ``b"GET"`` or ``b"POST"``. Always a byte + string. :term:`Bytes-like objects ` and native + strings containing only ascii characters will be automatically + converted to byte strings. + + .. attribute:: target + + The target of an HTTP request, e.g. ``b"/index.html"``, or one of the + more exotic formats described in `RFC 7320, section 5.3 + `_. Always a byte + string. :term:`Bytes-like objects ` and native + strings containing only ascii characters will be automatically + converted to byte strings. + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + """ + + __slots__ = ("method", "headers", "target", "http_version") + + method: bytes + headers: Headers + target: bytes + http_version: bytes + + def __init__( + self, + *, + method: Union[bytes, str], + headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], + target: Union[bytes, str], + http_version: Union[bytes, str] = b"1.1", + _parsed: bool = False, + ) -> None: + super().__init__() + if isinstance(headers, Headers): + object.__setattr__(self, "headers", headers) + else: + object.__setattr__( + self, "headers", normalize_and_validate(headers, _parsed=_parsed) + ) + if not _parsed: + object.__setattr__(self, "method", bytesify(method)) + object.__setattr__(self, "target", bytesify(target)) + object.__setattr__(self, "http_version", bytesify(http_version)) + else: + object.__setattr__(self, "method", method) + object.__setattr__(self, "target", target) + object.__setattr__(self, "http_version", http_version) + + # "A server MUST respond with a 400 (Bad Request) status code to any + # HTTP/1.1 request message that lacks a Host header field and to any + # request message that contains more than one Host header field or a + # Host header field with an invalid field-value." + # -- https://tools.ietf.org/html/rfc7230#section-5.4 + host_count = 0 + for name, value in self.headers: + if name == b"host": + host_count += 1 + if self.http_version == b"1.1" and host_count == 0: + raise LocalProtocolError("Missing mandatory Host: header") + if host_count > 1: + raise LocalProtocolError("Found multiple Host: headers") + + validate(method_re, self.method, "Illegal method characters") + validate(request_target_re, self.target, "Illegal target characters") + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class _ResponseBase(Event): + __slots__ = ("headers", "http_version", "reason", "status_code") + + headers: Headers + http_version: bytes + reason: bytes + status_code: int + + def __init__( + self, + *, + headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], + status_code: int, + http_version: Union[bytes, str] = b"1.1", + reason: Union[bytes, str] = b"", + _parsed: bool = False, + ) -> None: + super().__init__() + if isinstance(headers, Headers): + object.__setattr__(self, "headers", headers) + else: + object.__setattr__( + self, "headers", normalize_and_validate(headers, _parsed=_parsed) + ) + if not _parsed: + object.__setattr__(self, "reason", bytesify(reason)) + object.__setattr__(self, "http_version", bytesify(http_version)) + if not isinstance(status_code, int): + raise LocalProtocolError("status code must be integer") + # Because IntEnum objects are instances of int, but aren't + # duck-compatible (sigh), see gh-72. + object.__setattr__(self, "status_code", int(status_code)) + else: + object.__setattr__(self, "reason", reason) + object.__setattr__(self, "http_version", http_version) + object.__setattr__(self, "status_code", status_code) + + self.__post_init__() + + def __post_init__(self) -> None: + pass + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class InformationalResponse(_ResponseBase): + """An HTTP informational response. + + Fields: + + .. attribute:: status_code + + The status code of this response, as an integer. For an + :class:`InformationalResponse`, this is always in the range [100, + 200). + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for + details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + .. attribute:: reason + + The reason phrase of this response, as a byte string. For example: + ``b"OK"``, or ``b"Not Found"``. + + """ + + def __post_init__(self) -> None: + if not (100 <= self.status_code < 200): + raise LocalProtocolError( + "InformationalResponse status_code should be in range " + "[100, 200), not {}".format(self.status_code) + ) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class Response(_ResponseBase): + """The beginning of an HTTP response. + + Fields: + + .. attribute:: status_code + + The status code of this response, as an integer. For an + :class:`Response`, this is always in the range [200, + 1000). + + .. attribute:: headers + + Request headers, represented as a list of (name, value) pairs. See + :ref:`the header normalization rules ` for details. + + .. attribute:: http_version + + The HTTP protocol version, represented as a byte string like + ``b"1.1"``. See :ref:`the HTTP version normalization rules + ` for details. + + .. attribute:: reason + + The reason phrase of this response, as a byte string. For example: + ``b"OK"``, or ``b"Not Found"``. + + """ + + def __post_init__(self) -> None: + if not (200 <= self.status_code < 1000): + raise LocalProtocolError( + "Response status_code should be in range [200, 1000), not {}".format( + self.status_code + ) + ) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(init=False, frozen=True) +class Data(Event): + """Part of an HTTP message body. + + Fields: + + .. attribute:: data + + A :term:`bytes-like object` containing part of a message body. Or, if + using the ``combine=False`` argument to :meth:`Connection.send`, then + any object that your socket writing code knows what to do with, and for + which calling :func:`len` returns the number of bytes that will be + written -- see :ref:`sendfile` for details. + + .. attribute:: chunk_start + + A marker that indicates whether this data object is from the start of a + chunked transfer encoding chunk. This field is ignored when when a Data + event is provided to :meth:`Connection.send`: it is only valid on + events emitted from :meth:`Connection.next_event`. You probably + shouldn't use this attribute at all; see + :ref:`chunk-delimiters-are-bad` for details. + + .. attribute:: chunk_end + + A marker that indicates whether this data object is the last for a + given chunked transfer encoding chunk. This field is ignored when when + a Data event is provided to :meth:`Connection.send`: it is only valid + on events emitted from :meth:`Connection.next_event`. You probably + shouldn't use this attribute at all; see + :ref:`chunk-delimiters-are-bad` for details. + + """ + + __slots__ = ("data", "chunk_start", "chunk_end") + + data: bytes + chunk_start: bool + chunk_end: bool + + def __init__( + self, data: bytes, chunk_start: bool = False, chunk_end: bool = False + ) -> None: + object.__setattr__(self, "data", data) + object.__setattr__(self, "chunk_start", chunk_start) + object.__setattr__(self, "chunk_end", chunk_end) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +# XX FIXME: "A recipient MUST ignore (or consider as an error) any fields that +# are forbidden to be sent in a trailer, since processing them as if they were +# present in the header section might bypass external security filters." +# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#chunked.trailer.part +# Unfortunately, the list of forbidden fields is long and vague :-/ +@dataclass(init=False, frozen=True) +class EndOfMessage(Event): + """The end of an HTTP message. + + Fields: + + .. attribute:: headers + + Default value: ``[]`` + + Any trailing headers attached to this message, represented as a list of + (name, value) pairs. See :ref:`the header normalization rules + ` for details. + + Must be empty unless ``Transfer-Encoding: chunked`` is in use. + + """ + + __slots__ = ("headers",) + + headers: Headers + + def __init__( + self, + *, + headers: Union[ + Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]], None + ] = None, + _parsed: bool = False, + ) -> None: + super().__init__() + if headers is None: + headers = Headers([]) + elif not isinstance(headers, Headers): + headers = normalize_and_validate(headers, _parsed=_parsed) + + object.__setattr__(self, "headers", headers) + + # This is an unhashable type. + __hash__ = None # type: ignore + + +@dataclass(frozen=True) +class ConnectionClosed(Event): + """This event indicates that the sender has closed their outgoing + connection. + + Note that this does not necessarily mean that they can't *receive* further + data, because TCP connections are composed to two one-way channels which + can be closed independently. See :ref:`closing` for details. + + No fields. + """ + + pass diff --git a/env/lib/python3.12/site-packages/h11/_headers.py b/env/lib/python3.12/site-packages/h11/_headers.py new file mode 100644 index 0000000..b97d020 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_headers.py @@ -0,0 +1,278 @@ +import re +from typing import AnyStr, cast, List, overload, Sequence, Tuple, TYPE_CHECKING, Union + +from ._abnf import field_name, field_value +from ._util import bytesify, LocalProtocolError, validate + +if TYPE_CHECKING: + from ._events import Request + +try: + from typing import Literal +except ImportError: + from typing_extensions import Literal # type: ignore + + +# Facts +# ----- +# +# Headers are: +# keys: case-insensitive ascii +# values: mixture of ascii and raw bytes +# +# "Historically, HTTP has allowed field content with text in the ISO-8859-1 +# charset [ISO-8859-1], supporting other charsets only through use of +# [RFC2047] encoding. In practice, most HTTP header field values use only a +# subset of the US-ASCII charset [USASCII]. Newly defined header fields SHOULD +# limit their field values to US-ASCII octets. A recipient SHOULD treat other +# octets in field content (obs-text) as opaque data." +# And it deprecates all non-ascii values +# +# Leading/trailing whitespace in header names is forbidden +# +# Values get leading/trailing whitespace stripped +# +# Content-Disposition actually needs to contain unicode semantically; to +# accomplish this it has a terrifically weird way of encoding the filename +# itself as ascii (and even this still has lots of cross-browser +# incompatibilities) +# +# Order is important: +# "a proxy MUST NOT change the order of these field values when forwarding a +# message" +# (and there are several headers where the order indicates a preference) +# +# Multiple occurences of the same header: +# "A sender MUST NOT generate multiple header fields with the same field name +# in a message unless either the entire field value for that header field is +# defined as a comma-separated list [or the header is Set-Cookie which gets a +# special exception]" - RFC 7230. (cookies are in RFC 6265) +# +# So every header aside from Set-Cookie can be merged by b", ".join if it +# occurs repeatedly. But, of course, they can't necessarily be split by +# .split(b","), because quoting. +# +# Given all this mess (case insensitive, duplicates allowed, order is +# important, ...), there doesn't appear to be any standard way to handle +# headers in Python -- they're almost like dicts, but... actually just +# aren't. For now we punt and just use a super simple representation: headers +# are a list of pairs +# +# [(name1, value1), (name2, value2), ...] +# +# where all entries are bytestrings, names are lowercase and have no +# leading/trailing whitespace, and values are bytestrings with no +# leading/trailing whitespace. Searching and updating are done via naive O(n) +# methods. +# +# Maybe a dict-of-lists would be better? + +_content_length_re = re.compile(rb"[0-9]+") +_field_name_re = re.compile(field_name.encode("ascii")) +_field_value_re = re.compile(field_value.encode("ascii")) + + +class Headers(Sequence[Tuple[bytes, bytes]]): + """ + A list-like interface that allows iterating over headers as byte-pairs + of (lowercased-name, value). + + Internally we actually store the representation as three-tuples, + including both the raw original casing, in order to preserve casing + over-the-wire, and the lowercased name, for case-insensitive comparisions. + + r = Request( + method="GET", + target="/", + headers=[("Host", "example.org"), ("Connection", "keep-alive")], + http_version="1.1", + ) + assert r.headers == [ + (b"host", b"example.org"), + (b"connection", b"keep-alive") + ] + assert r.headers.raw_items() == [ + (b"Host", b"example.org"), + (b"Connection", b"keep-alive") + ] + """ + + __slots__ = "_full_items" + + def __init__(self, full_items: List[Tuple[bytes, bytes, bytes]]) -> None: + self._full_items = full_items + + def __bool__(self) -> bool: + return bool(self._full_items) + + def __eq__(self, other: object) -> bool: + return list(self) == list(other) # type: ignore + + def __len__(self) -> int: + return len(self._full_items) + + def __repr__(self) -> str: + return "" % repr(list(self)) + + def __getitem__(self, idx: int) -> Tuple[bytes, bytes]: # type: ignore[override] + _, name, value = self._full_items[idx] + return (name, value) + + def raw_items(self) -> List[Tuple[bytes, bytes]]: + return [(raw_name, value) for raw_name, _, value in self._full_items] + + +HeaderTypes = Union[ + List[Tuple[bytes, bytes]], + List[Tuple[bytes, str]], + List[Tuple[str, bytes]], + List[Tuple[str, str]], +] + + +@overload +def normalize_and_validate(headers: Headers, _parsed: Literal[True]) -> Headers: + ... + + +@overload +def normalize_and_validate(headers: HeaderTypes, _parsed: Literal[False]) -> Headers: + ... + + +@overload +def normalize_and_validate( + headers: Union[Headers, HeaderTypes], _parsed: bool = False +) -> Headers: + ... + + +def normalize_and_validate( + headers: Union[Headers, HeaderTypes], _parsed: bool = False +) -> Headers: + new_headers = [] + seen_content_length = None + saw_transfer_encoding = False + for name, value in headers: + # For headers coming out of the parser, we can safely skip some steps, + # because it always returns bytes and has already run these regexes + # over the data: + if not _parsed: + name = bytesify(name) + value = bytesify(value) + validate(_field_name_re, name, "Illegal header name {!r}", name) + validate(_field_value_re, value, "Illegal header value {!r}", value) + assert isinstance(name, bytes) + assert isinstance(value, bytes) + + raw_name = name + name = name.lower() + if name == b"content-length": + lengths = {length.strip() for length in value.split(b",")} + if len(lengths) != 1: + raise LocalProtocolError("conflicting Content-Length headers") + value = lengths.pop() + validate(_content_length_re, value, "bad Content-Length") + if seen_content_length is None: + seen_content_length = value + new_headers.append((raw_name, name, value)) + elif seen_content_length != value: + raise LocalProtocolError("conflicting Content-Length headers") + elif name == b"transfer-encoding": + # "A server that receives a request message with a transfer coding + # it does not understand SHOULD respond with 501 (Not + # Implemented)." + # https://tools.ietf.org/html/rfc7230#section-3.3.1 + if saw_transfer_encoding: + raise LocalProtocolError( + "multiple Transfer-Encoding headers", error_status_hint=501 + ) + # "All transfer-coding names are case-insensitive" + # -- https://tools.ietf.org/html/rfc7230#section-4 + value = value.lower() + if value != b"chunked": + raise LocalProtocolError( + "Only Transfer-Encoding: chunked is supported", + error_status_hint=501, + ) + saw_transfer_encoding = True + new_headers.append((raw_name, name, value)) + else: + new_headers.append((raw_name, name, value)) + return Headers(new_headers) + + +def get_comma_header(headers: Headers, name: bytes) -> List[bytes]: + # Should only be used for headers whose value is a list of + # comma-separated, case-insensitive values. + # + # The header name `name` is expected to be lower-case bytes. + # + # Connection: meets these criteria (including cast insensitivity). + # + # Content-Length: technically is just a single value (1*DIGIT), but the + # standard makes reference to implementations that do multiple values, and + # using this doesn't hurt. Ditto, case insensitivity doesn't things either + # way. + # + # Transfer-Encoding: is more complex (allows for quoted strings), so + # splitting on , is actually wrong. For example, this is legal: + # + # Transfer-Encoding: foo; options="1,2", chunked + # + # and should be parsed as + # + # foo; options="1,2" + # chunked + # + # but this naive function will parse it as + # + # foo; options="1 + # 2" + # chunked + # + # However, this is okay because the only thing we are going to do with + # any Transfer-Encoding is reject ones that aren't just "chunked", so + # both of these will be treated the same anyway. + # + # Expect: the only legal value is the literal string + # "100-continue". Splitting on commas is harmless. Case insensitive. + # + out: List[bytes] = [] + for _, found_name, found_raw_value in headers._full_items: + if found_name == name: + found_raw_value = found_raw_value.lower() + for found_split_value in found_raw_value.split(b","): + found_split_value = found_split_value.strip() + if found_split_value: + out.append(found_split_value) + return out + + +def set_comma_header(headers: Headers, name: bytes, new_values: List[bytes]) -> Headers: + # The header name `name` is expected to be lower-case bytes. + # + # Note that when we store the header we use title casing for the header + # names, in order to match the conventional HTTP header style. + # + # Simply calling `.title()` is a blunt approach, but it's correct + # here given the cases where we're using `set_comma_header`... + # + # Connection, Content-Length, Transfer-Encoding. + new_headers: List[Tuple[bytes, bytes]] = [] + for found_raw_name, found_name, found_raw_value in headers._full_items: + if found_name != name: + new_headers.append((found_raw_name, found_raw_value)) + for new_value in new_values: + new_headers.append((name.title(), new_value)) + return normalize_and_validate(new_headers) + + +def has_expect_100_continue(request: "Request") -> bool: + # https://tools.ietf.org/html/rfc7231#section-5.1.1 + # "A server that receives a 100-continue expectation in an HTTP/1.0 request + # MUST ignore that expectation." + if request.http_version < b"1.1": + return False + expect = get_comma_header(request.headers, b"expect") + return b"100-continue" in expect diff --git a/env/lib/python3.12/site-packages/h11/_readers.py b/env/lib/python3.12/site-packages/h11/_readers.py new file mode 100644 index 0000000..08a9574 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_readers.py @@ -0,0 +1,247 @@ +# Code to read HTTP data +# +# Strategy: each reader is a callable which takes a ReceiveBuffer object, and +# either: +# 1) consumes some of it and returns an Event +# 2) raises a LocalProtocolError (for consistency -- e.g. we call validate() +# and it might raise a LocalProtocolError, so simpler just to always use +# this) +# 3) returns None, meaning "I need more data" +# +# If they have a .read_eof attribute, then this will be called if an EOF is +# received -- but this is optional. Either way, the actual ConnectionClosed +# event will be generated afterwards. +# +# READERS is a dict describing how to pick a reader. It maps states to either: +# - a reader +# - or, for body readers, a dict of per-framing reader factories + +import re +from typing import Any, Callable, Dict, Iterable, NoReturn, Optional, Tuple, Type, Union + +from ._abnf import chunk_header, header_field, request_line, status_line +from ._events import Data, EndOfMessage, InformationalResponse, Request, Response +from ._receivebuffer import ReceiveBuffer +from ._state import ( + CLIENT, + CLOSED, + DONE, + IDLE, + MUST_CLOSE, + SEND_BODY, + SEND_RESPONSE, + SERVER, +) +from ._util import LocalProtocolError, RemoteProtocolError, Sentinel, validate + +__all__ = ["READERS"] + +header_field_re = re.compile(header_field.encode("ascii")) +obs_fold_re = re.compile(rb"[ \t]+") + + +def _obsolete_line_fold(lines: Iterable[bytes]) -> Iterable[bytes]: + it = iter(lines) + last: Optional[bytes] = None + for line in it: + match = obs_fold_re.match(line) + if match: + if last is None: + raise LocalProtocolError("continuation line at start of headers") + if not isinstance(last, bytearray): + # Cast to a mutable type, avoiding copy on append to ensure O(n) time + last = bytearray(last) + last += b" " + last += line[match.end() :] + else: + if last is not None: + yield last + last = line + if last is not None: + yield last + + +def _decode_header_lines( + lines: Iterable[bytes], +) -> Iterable[Tuple[bytes, bytes]]: + for line in _obsolete_line_fold(lines): + matches = validate(header_field_re, line, "illegal header line: {!r}", line) + yield (matches["field_name"], matches["field_value"]) + + +request_line_re = re.compile(request_line.encode("ascii")) + + +def maybe_read_from_IDLE_client(buf: ReceiveBuffer) -> Optional[Request]: + lines = buf.maybe_extract_lines() + if lines is None: + if buf.is_next_line_obviously_invalid_request_line(): + raise LocalProtocolError("illegal request line") + return None + if not lines: + raise LocalProtocolError("no request line received") + matches = validate( + request_line_re, lines[0], "illegal request line: {!r}", lines[0] + ) + return Request( + headers=list(_decode_header_lines(lines[1:])), _parsed=True, **matches + ) + + +status_line_re = re.compile(status_line.encode("ascii")) + + +def maybe_read_from_SEND_RESPONSE_server( + buf: ReceiveBuffer, +) -> Union[InformationalResponse, Response, None]: + lines = buf.maybe_extract_lines() + if lines is None: + if buf.is_next_line_obviously_invalid_request_line(): + raise LocalProtocolError("illegal request line") + return None + if not lines: + raise LocalProtocolError("no response line received") + matches = validate(status_line_re, lines[0], "illegal status line: {!r}", lines[0]) + http_version = ( + b"1.1" if matches["http_version"] is None else matches["http_version"] + ) + reason = b"" if matches["reason"] is None else matches["reason"] + status_code = int(matches["status_code"]) + class_: Union[Type[InformationalResponse], Type[Response]] = ( + InformationalResponse if status_code < 200 else Response + ) + return class_( + headers=list(_decode_header_lines(lines[1:])), + _parsed=True, + status_code=status_code, + reason=reason, + http_version=http_version, + ) + + +class ContentLengthReader: + def __init__(self, length: int) -> None: + self._length = length + self._remaining = length + + def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: + if self._remaining == 0: + return EndOfMessage() + data = buf.maybe_extract_at_most(self._remaining) + if data is None: + return None + self._remaining -= len(data) + return Data(data=data) + + def read_eof(self) -> NoReturn: + raise RemoteProtocolError( + "peer closed connection without sending complete message body " + "(received {} bytes, expected {})".format( + self._length - self._remaining, self._length + ) + ) + + +chunk_header_re = re.compile(chunk_header.encode("ascii")) + + +class ChunkedReader: + def __init__(self) -> None: + self._bytes_in_chunk = 0 + # After reading a chunk, we have to throw away the trailing \r\n; if + # this is >0 then we discard that many bytes before resuming regular + # de-chunkification. + self._bytes_to_discard = 0 + self._reading_trailer = False + + def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: + if self._reading_trailer: + lines = buf.maybe_extract_lines() + if lines is None: + return None + return EndOfMessage(headers=list(_decode_header_lines(lines))) + if self._bytes_to_discard > 0: + data = buf.maybe_extract_at_most(self._bytes_to_discard) + if data is None: + return None + self._bytes_to_discard -= len(data) + if self._bytes_to_discard > 0: + return None + # else, fall through and read some more + assert self._bytes_to_discard == 0 + if self._bytes_in_chunk == 0: + # We need to refill our chunk count + chunk_header = buf.maybe_extract_next_line() + if chunk_header is None: + return None + matches = validate( + chunk_header_re, + chunk_header, + "illegal chunk header: {!r}", + chunk_header, + ) + # XX FIXME: we discard chunk extensions. Does anyone care? + self._bytes_in_chunk = int(matches["chunk_size"], base=16) + if self._bytes_in_chunk == 0: + self._reading_trailer = True + return self(buf) + chunk_start = True + else: + chunk_start = False + assert self._bytes_in_chunk > 0 + data = buf.maybe_extract_at_most(self._bytes_in_chunk) + if data is None: + return None + self._bytes_in_chunk -= len(data) + if self._bytes_in_chunk == 0: + self._bytes_to_discard = 2 + chunk_end = True + else: + chunk_end = False + return Data(data=data, chunk_start=chunk_start, chunk_end=chunk_end) + + def read_eof(self) -> NoReturn: + raise RemoteProtocolError( + "peer closed connection without sending complete message body " + "(incomplete chunked read)" + ) + + +class Http10Reader: + def __call__(self, buf: ReceiveBuffer) -> Optional[Data]: + data = buf.maybe_extract_at_most(999999999) + if data is None: + return None + return Data(data=data) + + def read_eof(self) -> EndOfMessage: + return EndOfMessage() + + +def expect_nothing(buf: ReceiveBuffer) -> None: + if buf: + raise LocalProtocolError("Got data when expecting EOF") + return None + + +ReadersType = Dict[ + Union[Type[Sentinel], Tuple[Type[Sentinel], Type[Sentinel]]], + Union[Callable[..., Any], Dict[str, Callable[..., Any]]], +] + +READERS: ReadersType = { + (CLIENT, IDLE): maybe_read_from_IDLE_client, + (SERVER, IDLE): maybe_read_from_SEND_RESPONSE_server, + (SERVER, SEND_RESPONSE): maybe_read_from_SEND_RESPONSE_server, + (CLIENT, DONE): expect_nothing, + (CLIENT, MUST_CLOSE): expect_nothing, + (CLIENT, CLOSED): expect_nothing, + (SERVER, DONE): expect_nothing, + (SERVER, MUST_CLOSE): expect_nothing, + (SERVER, CLOSED): expect_nothing, + SEND_BODY: { + "chunked": ChunkedReader, + "content-length": ContentLengthReader, + "http/1.0": Http10Reader, + }, +} diff --git a/env/lib/python3.12/site-packages/h11/_receivebuffer.py b/env/lib/python3.12/site-packages/h11/_receivebuffer.py new file mode 100644 index 0000000..e5c4e08 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_receivebuffer.py @@ -0,0 +1,153 @@ +import re +import sys +from typing import List, Optional, Union + +__all__ = ["ReceiveBuffer"] + + +# Operations we want to support: +# - find next \r\n or \r\n\r\n (\n or \n\n are also acceptable), +# or wait until there is one +# - read at-most-N bytes +# Goals: +# - on average, do this fast +# - worst case, do this in O(n) where n is the number of bytes processed +# Plan: +# - store bytearray, offset, how far we've searched for a separator token +# - use the how-far-we've-searched data to avoid rescanning +# - while doing a stream of uninterrupted processing, advance offset instead +# of constantly copying +# WARNING: +# - I haven't benchmarked or profiled any of this yet. +# +# Note that starting in Python 3.4, deleting the initial n bytes from a +# bytearray is amortized O(n), thanks to some excellent work by Antoine +# Martin: +# +# https://bugs.python.org/issue19087 +# +# This means that if we only supported 3.4+, we could get rid of the code here +# involving self._start and self.compress, because it's doing exactly the same +# thing that bytearray now does internally. +# +# BUT unfortunately, we still support 2.7, and reading short segments out of a +# long buffer MUST be O(bytes read) to avoid DoS issues, so we can't actually +# delete this code. Yet: +# +# https://pythonclock.org/ +# +# (Two things to double-check first though: make sure PyPy also has the +# optimization, and benchmark to make sure it's a win, since we do have a +# slightly clever thing where we delay calling compress() until we've +# processed a whole event, which could in theory be slightly more efficient +# than the internal bytearray support.) +blank_line_regex = re.compile(b"\n\r?\n", re.MULTILINE) + + +class ReceiveBuffer: + def __init__(self) -> None: + self._data = bytearray() + self._next_line_search = 0 + self._multiple_lines_search = 0 + + def __iadd__(self, byteslike: Union[bytes, bytearray]) -> "ReceiveBuffer": + self._data += byteslike + return self + + def __bool__(self) -> bool: + return bool(len(self)) + + def __len__(self) -> int: + return len(self._data) + + # for @property unprocessed_data + def __bytes__(self) -> bytes: + return bytes(self._data) + + def _extract(self, count: int) -> bytearray: + # extracting an initial slice of the data buffer and return it + out = self._data[:count] + del self._data[:count] + + self._next_line_search = 0 + self._multiple_lines_search = 0 + + return out + + def maybe_extract_at_most(self, count: int) -> Optional[bytearray]: + """ + Extract a fixed number of bytes from the buffer. + """ + out = self._data[:count] + if not out: + return None + + return self._extract(count) + + def maybe_extract_next_line(self) -> Optional[bytearray]: + """ + Extract the first line, if it is completed in the buffer. + """ + # Only search in buffer space that we've not already looked at. + search_start_index = max(0, self._next_line_search - 1) + partial_idx = self._data.find(b"\r\n", search_start_index) + + if partial_idx == -1: + self._next_line_search = len(self._data) + return None + + # + 2 is to compensate len(b"\r\n") + idx = partial_idx + 2 + + return self._extract(idx) + + def maybe_extract_lines(self) -> Optional[List[bytearray]]: + """ + Extract everything up to the first blank line, and return a list of lines. + """ + # Handle the case where we have an immediate empty line. + if self._data[:1] == b"\n": + self._extract(1) + return [] + + if self._data[:2] == b"\r\n": + self._extract(2) + return [] + + # Only search in buffer space that we've not already looked at. + match = blank_line_regex.search(self._data, self._multiple_lines_search) + if match is None: + self._multiple_lines_search = max(0, len(self._data) - 2) + return None + + # Truncate the buffer and return it. + idx = match.span(0)[-1] + out = self._extract(idx) + lines = out.split(b"\n") + + for line in lines: + if line.endswith(b"\r"): + del line[-1] + + assert lines[-2] == lines[-1] == b"" + + del lines[-2:] + + return lines + + # In theory we should wait until `\r\n` before starting to validate + # incoming data. However it's interesting to detect (very) invalid data + # early given they might not even contain `\r\n` at all (hence only + # timeout will get rid of them). + # This is not a 100% effective detection but more of a cheap sanity check + # allowing for early abort in some useful cases. + # This is especially interesting when peer is messing up with HTTPS and + # sent us a TLS stream where we were expecting plain HTTP given all + # versions of TLS so far start handshake with a 0x16 message type code. + def is_next_line_obviously_invalid_request_line(self) -> bool: + try: + # HTTP header line must not contain non-printable characters + # and should not start with a space + return self._data[0] < 0x21 + except IndexError: + return False diff --git a/env/lib/python3.12/site-packages/h11/_state.py b/env/lib/python3.12/site-packages/h11/_state.py new file mode 100644 index 0000000..3593430 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_state.py @@ -0,0 +1,367 @@ +################################################################ +# The core state machine +################################################################ +# +# Rule 1: everything that affects the state machine and state transitions must +# live here in this file. As much as possible goes into the table-based +# representation, but for the bits that don't quite fit, the actual code and +# state must nonetheless live here. +# +# Rule 2: this file does not know about what role we're playing; it only knows +# about HTTP request/response cycles in the abstract. This ensures that we +# don't cheat and apply different rules to local and remote parties. +# +# +# Theory of operation +# =================== +# +# Possibly the simplest way to think about this is that we actually have 5 +# different state machines here. Yes, 5. These are: +# +# 1) The client state, with its complicated automaton (see the docs) +# 2) The server state, with its complicated automaton (see the docs) +# 3) The keep-alive state, with possible states {True, False} +# 4) The SWITCH_CONNECT state, with possible states {False, True} +# 5) The SWITCH_UPGRADE state, with possible states {False, True} +# +# For (3)-(5), the first state listed is the initial state. +# +# (1)-(3) are stored explicitly in member variables. The last +# two are stored implicitly in the pending_switch_proposals set as: +# (state of 4) == (_SWITCH_CONNECT in pending_switch_proposals) +# (state of 5) == (_SWITCH_UPGRADE in pending_switch_proposals) +# +# And each of these machines has two different kinds of transitions: +# +# a) Event-triggered +# b) State-triggered +# +# Event triggered is the obvious thing that you'd think it is: some event +# happens, and if it's the right event at the right time then a transition +# happens. But there are somewhat complicated rules for which machines can +# "see" which events. (As a rule of thumb, if a machine "sees" an event, this +# means two things: the event can affect the machine, and if the machine is +# not in a state where it expects that event then it's an error.) These rules +# are: +# +# 1) The client machine sees all h11.events objects emitted by the client. +# +# 2) The server machine sees all h11.events objects emitted by the server. +# +# It also sees the client's Request event. +# +# And sometimes, server events are annotated with a _SWITCH_* event. For +# example, we can have a (Response, _SWITCH_CONNECT) event, which is +# different from a regular Response event. +# +# 3) The keep-alive machine sees the process_keep_alive_disabled() event +# (which is derived from Request/Response events), and this event +# transitions it from True -> False, or from False -> False. There's no way +# to transition back. +# +# 4&5) The _SWITCH_* machines transition from False->True when we get a +# Request that proposes the relevant type of switch (via +# process_client_switch_proposals), and they go from True->False when we +# get a Response that has no _SWITCH_* annotation. +# +# So that's event-triggered transitions. +# +# State-triggered transitions are less standard. What they do here is couple +# the machines together. The way this works is, when certain *joint* +# configurations of states are achieved, then we automatically transition to a +# new *joint* state. So, for example, if we're ever in a joint state with +# +# client: DONE +# keep-alive: False +# +# then the client state immediately transitions to: +# +# client: MUST_CLOSE +# +# This is fundamentally different from an event-based transition, because it +# doesn't matter how we arrived at the {client: DONE, keep-alive: False} state +# -- maybe the client transitioned SEND_BODY -> DONE, or keep-alive +# transitioned True -> False. Either way, once this precondition is satisfied, +# this transition is immediately triggered. +# +# What if two conflicting state-based transitions get enabled at the same +# time? In practice there's only one case where this arises (client DONE -> +# MIGHT_SWITCH_PROTOCOL versus DONE -> MUST_CLOSE), and we resolve it by +# explicitly prioritizing the DONE -> MIGHT_SWITCH_PROTOCOL transition. +# +# Implementation +# -------------- +# +# The event-triggered transitions for the server and client machines are all +# stored explicitly in a table. Ditto for the state-triggered transitions that +# involve just the server and client state. +# +# The transitions for the other machines, and the state-triggered transitions +# that involve the other machines, are written out as explicit Python code. +# +# It'd be nice if there were some cleaner way to do all this. This isn't +# *too* terrible, but I feel like it could probably be better. +# +# WARNING +# ------- +# +# The script that generates the state machine diagrams for the docs knows how +# to read out the EVENT_TRIGGERED_TRANSITIONS and STATE_TRIGGERED_TRANSITIONS +# tables. But it can't automatically read the transitions that are written +# directly in Python code. So if you touch those, you need to also update the +# script to keep it in sync! +from typing import cast, Dict, Optional, Set, Tuple, Type, Union + +from ._events import * +from ._util import LocalProtocolError, Sentinel + +# Everything in __all__ gets re-exported as part of the h11 public API. +__all__ = [ + "CLIENT", + "SERVER", + "IDLE", + "SEND_RESPONSE", + "SEND_BODY", + "DONE", + "MUST_CLOSE", + "CLOSED", + "MIGHT_SWITCH_PROTOCOL", + "SWITCHED_PROTOCOL", + "ERROR", +] + + +class CLIENT(Sentinel, metaclass=Sentinel): + pass + + +class SERVER(Sentinel, metaclass=Sentinel): + pass + + +# States +class IDLE(Sentinel, metaclass=Sentinel): + pass + + +class SEND_RESPONSE(Sentinel, metaclass=Sentinel): + pass + + +class SEND_BODY(Sentinel, metaclass=Sentinel): + pass + + +class DONE(Sentinel, metaclass=Sentinel): + pass + + +class MUST_CLOSE(Sentinel, metaclass=Sentinel): + pass + + +class CLOSED(Sentinel, metaclass=Sentinel): + pass + + +class ERROR(Sentinel, metaclass=Sentinel): + pass + + +# Switch types +class MIGHT_SWITCH_PROTOCOL(Sentinel, metaclass=Sentinel): + pass + + +class SWITCHED_PROTOCOL(Sentinel, metaclass=Sentinel): + pass + + +class _SWITCH_UPGRADE(Sentinel, metaclass=Sentinel): + pass + + +class _SWITCH_CONNECT(Sentinel, metaclass=Sentinel): + pass + + +EventTransitionType = Dict[ + Type[Sentinel], + Dict[ + Type[Sentinel], + Dict[Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], Type[Sentinel]], + ], +] + +EVENT_TRIGGERED_TRANSITIONS: EventTransitionType = { + CLIENT: { + IDLE: {Request: SEND_BODY, ConnectionClosed: CLOSED}, + SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, + DONE: {ConnectionClosed: CLOSED}, + MUST_CLOSE: {ConnectionClosed: CLOSED}, + CLOSED: {ConnectionClosed: CLOSED}, + MIGHT_SWITCH_PROTOCOL: {}, + SWITCHED_PROTOCOL: {}, + ERROR: {}, + }, + SERVER: { + IDLE: { + ConnectionClosed: CLOSED, + Response: SEND_BODY, + # Special case: server sees client Request events, in this form + (Request, CLIENT): SEND_RESPONSE, + }, + SEND_RESPONSE: { + InformationalResponse: SEND_RESPONSE, + Response: SEND_BODY, + (InformationalResponse, _SWITCH_UPGRADE): SWITCHED_PROTOCOL, + (Response, _SWITCH_CONNECT): SWITCHED_PROTOCOL, + }, + SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, + DONE: {ConnectionClosed: CLOSED}, + MUST_CLOSE: {ConnectionClosed: CLOSED}, + CLOSED: {ConnectionClosed: CLOSED}, + SWITCHED_PROTOCOL: {}, + ERROR: {}, + }, +} + +StateTransitionType = Dict[ + Tuple[Type[Sentinel], Type[Sentinel]], Dict[Type[Sentinel], Type[Sentinel]] +] + +# NB: there are also some special-case state-triggered transitions hard-coded +# into _fire_state_triggered_transitions below. +STATE_TRIGGERED_TRANSITIONS: StateTransitionType = { + # (Client state, Server state) -> new states + # Protocol negotiation + (MIGHT_SWITCH_PROTOCOL, SWITCHED_PROTOCOL): {CLIENT: SWITCHED_PROTOCOL}, + # Socket shutdown + (CLOSED, DONE): {SERVER: MUST_CLOSE}, + (CLOSED, IDLE): {SERVER: MUST_CLOSE}, + (ERROR, DONE): {SERVER: MUST_CLOSE}, + (DONE, CLOSED): {CLIENT: MUST_CLOSE}, + (IDLE, CLOSED): {CLIENT: MUST_CLOSE}, + (DONE, ERROR): {CLIENT: MUST_CLOSE}, +} + + +class ConnectionState: + def __init__(self) -> None: + # Extra bits of state that don't quite fit into the state model. + + # If this is False then it enables the automatic DONE -> MUST_CLOSE + # transition. Don't set this directly; call .keep_alive_disabled() + self.keep_alive = True + + # This is a subset of {UPGRADE, CONNECT}, containing the proposals + # made by the client for switching protocols. + self.pending_switch_proposals: Set[Type[Sentinel]] = set() + + self.states: Dict[Type[Sentinel], Type[Sentinel]] = {CLIENT: IDLE, SERVER: IDLE} + + def process_error(self, role: Type[Sentinel]) -> None: + self.states[role] = ERROR + self._fire_state_triggered_transitions() + + def process_keep_alive_disabled(self) -> None: + self.keep_alive = False + self._fire_state_triggered_transitions() + + def process_client_switch_proposal(self, switch_event: Type[Sentinel]) -> None: + self.pending_switch_proposals.add(switch_event) + self._fire_state_triggered_transitions() + + def process_event( + self, + role: Type[Sentinel], + event_type: Type[Event], + server_switch_event: Optional[Type[Sentinel]] = None, + ) -> None: + _event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]] = event_type + if server_switch_event is not None: + assert role is SERVER + if server_switch_event not in self.pending_switch_proposals: + raise LocalProtocolError( + "Received server {} event without a pending proposal".format( + server_switch_event + ) + ) + _event_type = (event_type, server_switch_event) + if server_switch_event is None and _event_type is Response: + self.pending_switch_proposals = set() + self._fire_event_triggered_transitions(role, _event_type) + # Special case: the server state does get to see Request + # events. + if _event_type is Request: + assert role is CLIENT + self._fire_event_triggered_transitions(SERVER, (Request, CLIENT)) + self._fire_state_triggered_transitions() + + def _fire_event_triggered_transitions( + self, + role: Type[Sentinel], + event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], + ) -> None: + state = self.states[role] + try: + new_state = EVENT_TRIGGERED_TRANSITIONS[role][state][event_type] + except KeyError: + event_type = cast(Type[Event], event_type) + raise LocalProtocolError( + "can't handle event type {} when role={} and state={}".format( + event_type.__name__, role, self.states[role] + ) + ) from None + self.states[role] = new_state + + def _fire_state_triggered_transitions(self) -> None: + # We apply these rules repeatedly until converging on a fixed point + while True: + start_states = dict(self.states) + + # It could happen that both these special-case transitions are + # enabled at the same time: + # + # DONE -> MIGHT_SWITCH_PROTOCOL + # DONE -> MUST_CLOSE + # + # For example, this will always be true of a HTTP/1.0 client + # requesting CONNECT. If this happens, the protocol switch takes + # priority. From there the client will either go to + # SWITCHED_PROTOCOL, in which case it's none of our business when + # they close the connection, or else the server will deny the + # request, in which case the client will go back to DONE and then + # from there to MUST_CLOSE. + if self.pending_switch_proposals: + if self.states[CLIENT] is DONE: + self.states[CLIENT] = MIGHT_SWITCH_PROTOCOL + + if not self.pending_switch_proposals: + if self.states[CLIENT] is MIGHT_SWITCH_PROTOCOL: + self.states[CLIENT] = DONE + + if not self.keep_alive: + for role in (CLIENT, SERVER): + if self.states[role] is DONE: + self.states[role] = MUST_CLOSE + + # Tabular state-triggered transitions + joint_state = (self.states[CLIENT], self.states[SERVER]) + changes = STATE_TRIGGERED_TRANSITIONS.get(joint_state, {}) + self.states.update(changes) + + if self.states == start_states: + # Fixed point reached + return + + def start_next_cycle(self) -> None: + if self.states != {CLIENT: DONE, SERVER: DONE}: + raise LocalProtocolError( + "not in a reusable state. self.states={}".format(self.states) + ) + # Can't reach DONE/DONE with any of these active, but still, let's be + # sure. + assert self.keep_alive + assert not self.pending_switch_proposals + self.states = {CLIENT: IDLE, SERVER: IDLE} diff --git a/env/lib/python3.12/site-packages/h11/_util.py b/env/lib/python3.12/site-packages/h11/_util.py new file mode 100644 index 0000000..6718445 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_util.py @@ -0,0 +1,135 @@ +from typing import Any, Dict, NoReturn, Pattern, Tuple, Type, TypeVar, Union + +__all__ = [ + "ProtocolError", + "LocalProtocolError", + "RemoteProtocolError", + "validate", + "bytesify", +] + + +class ProtocolError(Exception): + """Exception indicating a violation of the HTTP/1.1 protocol. + + This as an abstract base class, with two concrete base classes: + :exc:`LocalProtocolError`, which indicates that you tried to do something + that HTTP/1.1 says is illegal, and :exc:`RemoteProtocolError`, which + indicates that the remote peer tried to do something that HTTP/1.1 says is + illegal. See :ref:`error-handling` for details. + + In addition to the normal :exc:`Exception` features, it has one attribute: + + .. attribute:: error_status_hint + + This gives a suggestion as to what status code a server might use if + this error occurred as part of a request. + + For a :exc:`RemoteProtocolError`, this is useful as a suggestion for + how you might want to respond to a misbehaving peer, if you're + implementing a server. + + For a :exc:`LocalProtocolError`, this can be taken as a suggestion for + how your peer might have responded to *you* if h11 had allowed you to + continue. + + The default is 400 Bad Request, a generic catch-all for protocol + violations. + + """ + + def __init__(self, msg: str, error_status_hint: int = 400) -> None: + if type(self) is ProtocolError: + raise TypeError("tried to directly instantiate ProtocolError") + Exception.__init__(self, msg) + self.error_status_hint = error_status_hint + + +# Strategy: there are a number of public APIs where a LocalProtocolError can +# be raised (send(), all the different event constructors, ...), and only one +# public API where RemoteProtocolError can be raised +# (receive_data()). Therefore we always raise LocalProtocolError internally, +# and then receive_data will translate this into a RemoteProtocolError. +# +# Internally: +# LocalProtocolError is the generic "ProtocolError". +# Externally: +# LocalProtocolError is for local errors and RemoteProtocolError is for +# remote errors. +class LocalProtocolError(ProtocolError): + def _reraise_as_remote_protocol_error(self) -> NoReturn: + # After catching a LocalProtocolError, use this method to re-raise it + # as a RemoteProtocolError. This method must be called from inside an + # except: block. + # + # An easy way to get an equivalent RemoteProtocolError is just to + # modify 'self' in place. + self.__class__ = RemoteProtocolError # type: ignore + # But the re-raising is somewhat non-trivial -- you might think that + # now that we've modified the in-flight exception object, that just + # doing 'raise' to re-raise it would be enough. But it turns out that + # this doesn't work, because Python tracks the exception type + # (exc_info[0]) separately from the exception object (exc_info[1]), + # and we only modified the latter. So we really do need to re-raise + # the new type explicitly. + # On py3, the traceback is part of the exception object, so our + # in-place modification preserved it and we can just re-raise: + raise self + + +class RemoteProtocolError(ProtocolError): + pass + + +def validate( + regex: Pattern[bytes], data: bytes, msg: str = "malformed data", *format_args: Any +) -> Dict[str, bytes]: + match = regex.fullmatch(data) + if not match: + if format_args: + msg = msg.format(*format_args) + raise LocalProtocolError(msg) + return match.groupdict() + + +# Sentinel values +# +# - Inherit identity-based comparison and hashing from object +# - Have a nice repr +# - Have a *bonus property*: type(sentinel) is sentinel +# +# The bonus property is useful if you want to take the return value from +# next_event() and do some sort of dispatch based on type(event). + +_T_Sentinel = TypeVar("_T_Sentinel", bound="Sentinel") + + +class Sentinel(type): + def __new__( + cls: Type[_T_Sentinel], + name: str, + bases: Tuple[type, ...], + namespace: Dict[str, Any], + **kwds: Any + ) -> _T_Sentinel: + assert bases == (Sentinel,) + v = super().__new__(cls, name, bases, namespace, **kwds) + v.__class__ = v # type: ignore + return v + + def __repr__(self) -> str: + return self.__name__ + + +# Used for methods, request targets, HTTP versions, header names, and header +# values. Accepts ascii-strings, or bytes/bytearray/memoryview/..., and always +# returns bytes. +def bytesify(s: Union[bytes, bytearray, memoryview, int, str]) -> bytes: + # Fast-path: + if type(s) is bytes: + return s + if isinstance(s, str): + s = s.encode("ascii") + if isinstance(s, int): + raise TypeError("expected bytes-like object, not int") + return bytes(s) diff --git a/env/lib/python3.12/site-packages/h11/_version.py b/env/lib/python3.12/site-packages/h11/_version.py new file mode 100644 index 0000000..4c89113 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_version.py @@ -0,0 +1,16 @@ +# This file must be kept very simple, because it is consumed from several +# places -- it is imported by h11/__init__.py, execfile'd by setup.py, etc. + +# We use a simple scheme: +# 1.0.0 -> 1.0.0+dev -> 1.1.0 -> 1.1.0+dev +# where the +dev versions are never released into the wild, they're just what +# we stick into the VCS in between releases. +# +# This is compatible with PEP 440: +# http://legacy.python.org/dev/peps/pep-0440/ +# via the use of the "local suffix" "+dev", which is disallowed on index +# servers and causes 1.0.0+dev to sort after plain 1.0.0, which is what we +# want. (Contrast with the special suffix 1.0.0.dev, which sorts *before* +# 1.0.0.) + +__version__ = "0.14.0" diff --git a/env/lib/python3.12/site-packages/h11/_writers.py b/env/lib/python3.12/site-packages/h11/_writers.py new file mode 100644 index 0000000..939cdb9 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/_writers.py @@ -0,0 +1,145 @@ +# Code to read HTTP data +# +# Strategy: each writer takes an event + a write-some-bytes function, which is +# calls. +# +# WRITERS is a dict describing how to pick a reader. It maps states to either: +# - a writer +# - or, for body writers, a dict of framin-dependent writer factories + +from typing import Any, Callable, Dict, List, Tuple, Type, Union + +from ._events import Data, EndOfMessage, Event, InformationalResponse, Request, Response +from ._headers import Headers +from ._state import CLIENT, IDLE, SEND_BODY, SEND_RESPONSE, SERVER +from ._util import LocalProtocolError, Sentinel + +__all__ = ["WRITERS"] + +Writer = Callable[[bytes], Any] + + +def write_headers(headers: Headers, write: Writer) -> None: + # "Since the Host field-value is critical information for handling a + # request, a user agent SHOULD generate Host as the first header field + # following the request-line." - RFC 7230 + raw_items = headers._full_items + for raw_name, name, value in raw_items: + if name == b"host": + write(b"%s: %s\r\n" % (raw_name, value)) + for raw_name, name, value in raw_items: + if name != b"host": + write(b"%s: %s\r\n" % (raw_name, value)) + write(b"\r\n") + + +def write_request(request: Request, write: Writer) -> None: + if request.http_version != b"1.1": + raise LocalProtocolError("I only send HTTP/1.1") + write(b"%s %s HTTP/1.1\r\n" % (request.method, request.target)) + write_headers(request.headers, write) + + +# Shared between InformationalResponse and Response +def write_any_response( + response: Union[InformationalResponse, Response], write: Writer +) -> None: + if response.http_version != b"1.1": + raise LocalProtocolError("I only send HTTP/1.1") + status_bytes = str(response.status_code).encode("ascii") + # We don't bother sending ascii status messages like "OK"; they're + # optional and ignored by the protocol. (But the space after the numeric + # status code is mandatory.) + # + # XX FIXME: could at least make an effort to pull out the status message + # from stdlib's http.HTTPStatus table. Or maybe just steal their enums + # (either by import or copy/paste). We already accept them as status codes + # since they're of type IntEnum < int. + write(b"HTTP/1.1 %s %s\r\n" % (status_bytes, response.reason)) + write_headers(response.headers, write) + + +class BodyWriter: + def __call__(self, event: Event, write: Writer) -> None: + if type(event) is Data: + self.send_data(event.data, write) + elif type(event) is EndOfMessage: + self.send_eom(event.headers, write) + else: # pragma: no cover + assert False + + def send_data(self, data: bytes, write: Writer) -> None: + pass + + def send_eom(self, headers: Headers, write: Writer) -> None: + pass + + +# +# These are all careful not to do anything to 'data' except call len(data) and +# write(data). This allows us to transparently pass-through funny objects, +# like placeholder objects referring to files on disk that will be sent via +# sendfile(2). +# +class ContentLengthWriter(BodyWriter): + def __init__(self, length: int) -> None: + self._length = length + + def send_data(self, data: bytes, write: Writer) -> None: + self._length -= len(data) + if self._length < 0: + raise LocalProtocolError("Too much data for declared Content-Length") + write(data) + + def send_eom(self, headers: Headers, write: Writer) -> None: + if self._length != 0: + raise LocalProtocolError("Too little data for declared Content-Length") + if headers: + raise LocalProtocolError("Content-Length and trailers don't mix") + + +class ChunkedWriter(BodyWriter): + def send_data(self, data: bytes, write: Writer) -> None: + # if we encoded 0-length data in the naive way, it would look like an + # end-of-message. + if not data: + return + write(b"%x\r\n" % len(data)) + write(data) + write(b"\r\n") + + def send_eom(self, headers: Headers, write: Writer) -> None: + write(b"0\r\n") + write_headers(headers, write) + + +class Http10Writer(BodyWriter): + def send_data(self, data: bytes, write: Writer) -> None: + write(data) + + def send_eom(self, headers: Headers, write: Writer) -> None: + if headers: + raise LocalProtocolError("can't send trailers to HTTP/1.0 client") + # no need to close the socket ourselves, that will be taken care of by + # Connection: close machinery + + +WritersType = Dict[ + Union[Tuple[Type[Sentinel], Type[Sentinel]], Type[Sentinel]], + Union[ + Dict[str, Type[BodyWriter]], + Callable[[Union[InformationalResponse, Response], Writer], None], + Callable[[Request, Writer], None], + ], +] + +WRITERS: WritersType = { + (CLIENT, IDLE): write_request, + (SERVER, IDLE): write_any_response, + (SERVER, SEND_RESPONSE): write_any_response, + SEND_BODY: { + "chunked": ChunkedWriter, + "content-length": ContentLengthWriter, + "http/1.0": Http10Writer, + }, +} diff --git a/env/lib/python3.12/site-packages/h11/py.typed b/env/lib/python3.12/site-packages/h11/py.typed new file mode 100644 index 0000000..f5642f7 --- /dev/null +++ b/env/lib/python3.12/site-packages/h11/py.typed @@ -0,0 +1 @@ +Marker diff --git a/env/lib/python3.12/site-packages/h11/tests/__init__.py b/env/lib/python3.12/site-packages/h11/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/__init__.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..915a0eb1ce6f29a89f4e04bedb37c54fc8d22141 GIT binary patch literal 200 zcmX@j%ge<81P$>q=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJVrR!(p=celCmS!a8 z<|d}-yW}UA=BDPA6zjWZmUxsV=^Gjt=(;3U7VG+_={o19r0S>UmFeeXCg~ScmSp7T z8S5Du=@(~~r0NzVCTAz6rxxpH7#ixAq!t5>h>y?A%PfhH*DI*J#bJ}1pHiBWYFESx Uw3iWxi$RQ!%#4hTMa)1J0LqOs;{X5v literal 0 HcmV?d00001 diff --git a/env/lib/python3.12/site-packages/h11/tests/__pycache__/helpers.cpython-312.pyc b/env/lib/python3.12/site-packages/h11/tests/__pycache__/helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b39f11e24dc7c69e2cf075e6ad1a997f7f6d315 GIT binary patch literal 4391 zcmb^!T}&HCdUm~Que}D_V4GqfKp+s4f}6G^ZPKQf3#NspqzWXxZ12u;y#ttd*K~GC zVq~u9ln3{YQ$eZ(k@7&R=t|T|P4B8x9`2>5KAdzfxKQD4saokCPSw4*B~ng(x%+09 zwcRSchtrMZZ$E$Y&G*fGfAh`X>gqfQ#$w{vJp!b+3WWX?G=4=K%3GlSezy9=~OqzKFi*d@C$i|d%3BDF3^Q=OE)6) z6jX1krS}qAI&~FYb6i4KnP|h;ls(EDTq>#Q26r}1;Y4m08~g<|omCCb#bjmep0u)M0qeWK|WXbUN)Gi^qo&L#HQB8_pL`Ul@-MMO}u!%5Wx=)v#=ELrFbpc;l*k zZt?}JX~`*25Wj*|-3X1SlUbr9skmh3Jl1Bjs)h~MdHgEq)eXTW!7iO=&W^;#Cg}GZ zr~Ev zGC05-@Z0+nfK@bw78p0mqnTQsedc%fzYA=h)%Wd_M9DOvVffM>? zlc~$#eJwV9^k_^62LpyPuoG=yHfPjNVLg$|WUT#bq#N{y;iq8$i>MT6TpTTV>P!CM zs&B=&nQMlr_CTdVoQrnmam37kmt#&6-r@1lWf}fl6nz z764!rPT1i>MJ}`~Z*wiXV)I(}me{_@wUa}1xjU`yTl0JIPUF%%&o#3y(s<9KA@qws zAhf{hm8h?Yxr#L)<~sGt>2w|>nIq56IBmT8wa+dyGV>n$?*2L&`Q&nq9!7T1I%sp( z%v5qA#a?4Uw@}SF_&1`m3{r=y`^oQ1deB}Tyu*3WTUk}f(&`B+bLK5mrBkeWBFgm? zP?p|?oUY_-mAh(51}%Nanbjf6jSWNgQI{KHYI;t+oX{W~bi-}^fjs^C-!P&s(g8e# ziZ%FGa*#LXBJwb$_EXRf07Ugs4o`N@PGoWr2zDA<@f1>Nxy_{Kt>Cj$?IC?CyoX;_cu>A^w>dy4k%pzj5%! zueKrsA9mlF`{R+VNc`jAb|k*r)>#U*ud^$^+zA~nh7NBGzJKEOiDGE5)Y`L7Zj9}; z9xJvUD@D53&)*o>i9A}2JbKT?9jGsiE|cGkmA$C0X~)}E^tP?xPrcpc5Nc>ChpiMh z13U%Wtqi-C?opqvB8((PMiMJ~WCz@n4$R36=CRYfaaozW&e^qGa>4B^%1$g`H=UJT z*n>svr8xFZvL;QarQtf6H|3ad3v%lx1=)R_mwY)k>NV=Cci@Z3G$Axs$G(?=G*`?F zd=rpWqyw}@HI}QiN?vde;HuDUt~8rRiE4)0OKR?@>TOlkVXmsk%I()Go;1RG;-;X9 z0`somv-&h9w;6-eaAs1Y^2o+a*AfEON+I;W_r!lE#C~pYBBKpeL_(tya+>Wok=xg8d zb#4lsRsrUrw@FPK9LZ*|A!?A*`zdEQ@wHj#qf!-{gCJT>%~O41*5%qdSgm_@|DZYY z>=d)W%FF^MvkQElg$fQyyx@e+rB*5kr6bSKh@GkQBqq@Wd8Zva3$DCt(IGn)_@$ma zmv_xW(OKY@9)^m=kt07M7tK7dZc=TgMmsO73PGB!kwJO>|0!9ny@e~4_sxTt_{H%+zc|1zjy$ZQYczHg{hG;hP#nG6CC0RhNr5!~cB#h<3&6a_Sutn0&>vN~-~HNXr(#aFEcqZ9Zv zn!?b`S;M>w2#w$Q#vepBmGB&0@J|4X=$;q(BWp))>D#`COD#QX{e|aCzJ>x<3WN*J z&m)Hlqot;n)!a&MJ-G7PPScTM(~*tQt)}CJ=Sse&O<#MdxoySyl|Q&96#X45Tv